From c83588ab435a0cfab4c326b49e0502ccebf4999f Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 30 Mar 2026 10:11:40 +0700 Subject: [PATCH] 260330:1011 Addied correspondence_revieion_attcahments table table #01 --- ...84e27323b-57a192785d1688a165b9d928bb0781fb | Bin 0 -> 71082 bytes ...ionentity_03bcacbecf6356ec88322fcd4e742bf8 | 87 ++ ...ntity_03bcacbecf6356ec88322fcd4e742bf8.map | 1 + .../03/v7_0337696d223ad4a0d2e2ccf1f3e90187 | 71 ++ .../v7_0337696d223ad4a0d2e2ccf1f3e90187.map | 1 + ...eueentity_09aca5d852ddf329ea3859fa700fea76 | 126 +++ ...ntity_09aca5d852ddf329ea3859fa700fea76.map | 1 + ...actentity_1390c1715867a137b7da11a4b7ed8204 | 63 ++ ...ntity_1390c1715867a137b7da11a4b7ed8204.map | 1 + ...onservice_148599df25d56b76d0e452e06e0ff95d | 178 ++++ ...rvice_148599df25d56b76d0e452e06e0ff95d.map | 1 + ...ionentity_1bfc5c59654699335fcf2bd30c19fda5 | 148 +++ ...ntity_1bfc5c59654699335fcf2bd30c19fda5.map | 1 + ...ndencedto_1ffe9eb57290f42ef24d35e12ae6c00b | 108 +++ ...cedto_1ffe9eb57290f42ef24d35e12ae6c00b.map | 1 + ...odeentity_22da50512210e696d364e85856ebeb20 | 45 + ...ntity_22da50512210e696d364e85856ebeb20.map | 1 + ...euuidpipe_27fae4b4c7eeaf6e9415dda45a125729 | 33 + ...dpipe_27fae4b4c7eeaf6e9415dda45a125729.map | 1 + ...decorator_2b92d6ae24da3e0d039d542d652c8802 | 13 + ...rator_2b92d6ae24da3e0d039d542d652c8802.map | 1 + .../2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2 | 89 ++ .../v1_2b5f3b13f774fcc1223ab82a4f1745e2.map | 1 + .../2c/nil_2c339792b31c51d1d5eddff74de15029 | 5 + .../nil_2c339792b31c51d1d5eddff74de15029.map | 1 + ...ententity_2d8a125b590d09973dae3b1792550cec | 54 ++ ...ntity_2d8a125b590d09973dae3b1792550cec.map | 1 + ...ionentity_2fe043e935c2983788147e3af718507a | 126 +++ ...ntity_2fe043e935c2983788147e3af718507a.map | 1 + ...actiondto_30a11e270c0c4a2c81a08c3fc2f1232d | 80 ++ ...ondto_30a11e270c0c4a2c81a08c3fc2f1232d.map | 1 + ...oryentity_311d9de0ec605cac80a91203ccaa59c2 | 60 ++ ...ntity_311d9de0ec605cac80a91203ccaa59c2.map | 1 + ...ionentity_38f438d3fbfd981312c1f09f78dbd528 | 76 ++ ...ntity_38f438d3fbfd981312c1f09f78dbd528.map | 1 + ...ingentity_3a25923a9148fa55f1f00e8e922378c0 | 92 ++ ...ntity_3a25923a9148fa55f1f00e8e922378c0.map | 1 + ...rorentity_3b7f3e5a2bcc89818af57caf0ed52567 | 66 ++ ...ntity_3b7f3e5a2bcc89818af57caf0ed52567.map | 1 + ...ionentity_3fe225543fa1de9d00166baac9ae7dd6 | 50 + ...ntity_3fe225543fa1de9d00166baac9ae7dd6.map | 1 + ...odeentity_3f1229aa8550150b5508b6fe1264426a | 45 + ...ntity_3f1229aa8550150b5508b6fe1264426a.map | 1 + ...rbacguard_400cdd5edff9bc3988d641b1e0469572 | 54 ++ ...guard_400cdd5edff9bc3988d641b1e0469572.map | 1 + ...maservice_41fb300ce4e5c206370528340f239390 | 115 +++ ...rvice_41fb300ce4e5c206370528340f239390.map | 1 + .../41/v5_415f1cf7e7e293f9c6645ec74faf3d23 | 16 + .../v5_415f1cf7e7e293f9c6645ec74faf3d23.map | 1 + ...ateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4 | 57 ++ ...ntity_42a2dc2bd2510ac1a48f6fedb3ca01d4.map | 1 + ...rationdto_43a9a0c3dbe80e14fc4bee052c493a16 | 108 +++ ...ondto_43a9a0c3dbe80e14fc4bee052c493a16.map | 1 + ...aseentity_48d140ea0a6e51cff418345ab32f3e81 | 31 + ...ntity_48d140ea0a6e51cff418345ab32f3e81.map | 1 + ...ionentity_491343c80877edf2fa63f0d43fb199fc | 152 +++ ...ntity_491343c80877edf2fa63f0d43fb199fc.map | 1 + ...emaentity_4ab6cd7cd909aca219faa639bdeba5b0 | 69 ++ ...ntity_4ab6cd7cd909aca219faa639bdeba5b0.map | 1 + ...decorator_4eb44b87c62eb52836b43ed4d4e5aa72 | 19 + ...rator_4eb44b87c62eb52836b43ed4d4e5aa72.map | 1 + ...jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9 | 40 + ...setup_4fda08179fe6a32d1bea0ac310dcc7f9.map | 1 + .../version_4fb71003f9f588a1e02156158fac91f0 | 12 + ...rsion_4fb71003f9f588a1e02156158fac91f0.map | 1 + ...rfaentity_50ac355b481dd35785689be2a4a7eefa | 60 ++ ...ntity_50ac355b481dd35785689be2a4a7eefa.map | 1 + ...ingentity_5131b8707236fdf86a0c310a794f2479 | 103 ++ ...ntity_5131b8707236fdf86a0c310a794f2479.map | 1 + ...ndencedto_5342b863e6472c198fe125f9c2670260 | 28 + ...cedto_5342b863e6472c198fe125f9c2670260.map | 1 + ...interface_559076d73142ac75ae994e2eddc67451 | 22 + ...rface_559076d73142ac75ae994e2eddc67451.map | 1 + ...equerydto_5944a89cab040beab6d8d094ea709d28 | 51 + ...rydto_5944a89cab040beab6d8d094ea709d28.map | 1 + ...aseentity_59f2b57324454ece33500e1d53c5a042 | 50 + ...ntity_59f2b57324454ece33500e1d53c5a042.map | 1 + .../5b/regex_5be6fba76349e8c2e24fdebc978fcd02 | 5 + ...regex_5be6fba76349e8c2e24fdebc978fcd02.map | 1 + ...toservice_5e927b72fdea5c673aec5d0f79d114e3 | 106 ++ ...rvice_5e927b72fdea5c673aec5d0f79d114e3.map | 1 + ...csservice_6274282700f640060c02badf0682615b | 38 + ...rvice_6274282700f640060c02badf0682615b.map | 1 + .../v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27 | 15 + ...1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27.map | 1 + ...tbatchdto_6730d20e7a0883adb915d65256d6d183 | 44 + ...chdto_6730d20e7a0883adb915d65256d6d183.map | 1 + ...maservice_6765703b4a05bdb892b359106504d3c2 | 317 ++++++ ...rvice_6765703b4a05bdb892b359106504d3c2.map | 1 + ...stringify_6718cb580e6407ba23f44e15fa5f549c | 41 + ...ngify_6718cb580e6407ba23f44e15fa5f549c.map | 1 + ...onservice_690a5698471511d3b44c648da34fdeeb | 167 ++++ ...rvice_690a5698471511d3b44c648da34fdeeb.map | 1 + ...ententity_6c08bec9f4284f2e501944a3c1043352 | 91 ++ ...ntity_6c08bec9f4284f2e501944a3c1043352.map | 1 + ...ceservice_6e8dfea54e797651604b391b91f0bf02 | 918 ++++++++++++++++++ ...rvice_6e8dfea54e797651604b391b91f0bf02.map | 1 + ...nceentity_6f56be445ca1f5393cdf21aec2e09496 | 41 + ...ntity_6f56be445ca1f5393cdf21aec2e09496.map | 1 + ...oryentity_6fdc9993ff00a40e652c39369a986c8d | 58 ++ ...ntity_6fdc9993ff00a40e652c39369a986c8d.map | 1 + ...oryentity_7571b26d19f2bd90122b25c9504bdbea | 60 ++ ...ntity_7571b26d19f2bd90122b25c9504bdbea.map | 1 + ...nceentity_7974b5283b44c525ac220408bcae9833 | 95 ++ ...ntity_7974b5283b44c525ac220408bcae9833.map | 1 + ...ionentity_7b0f0e99a66843abc7a1e9936808bbe7 | 127 +++ ...ntity_7b0f0e99a66843abc7a1e9936808bbe7.map | 1 + ...deservice_7b9238f128ae7fcbbbf80747fc6f0672 | 49 + ...rvice_7b9238f128ae7fcbbbf80747fc6f0672.map | 1 + ...rvicespec_7bc28279d64f4b6df8862834313cd60f | 92 ++ ...espec_7bc28279d64f4b6df8862834313cd60f.map | 1 + ...ndencedto_7bc4e52a3a7d9d90fed5ec54a60395f7 | 10 + ...cedto_7bc4e52a3a7d9d90fed5ec54a60395f7.map | 1 + .../7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec | 16 + .../v3_7b2bb99f75e9a0cef4d4441c2908c7ec.map | 1 + ...ypeentity_7cb927d597fc65cc2920a7c584ef5690 | 67 ++ ...ntity_7cb927d597fc65cc2920a7c584ef5690.map | 1 + ...rvicespec_7eaf3c0d785f09155dbd9f0da330510f | 181 ++++ ...espec_7eaf3c0d785f09155dbd9f0da330510f.map | 1 + ...authguard_7f60f300ab2409c47aed7a7338a1cbf7 | 19 + ...guard_7f60f300ab2409c47aed7a7338a1cbf7.map | 1 + ...tepentity_8168850839465b49c52a800422cf4ea1 | 86 ++ ...ntity_8168850839465b49c52a800422cf4ea1.map | 1 + ...nceentity_8a90fe25ebc7d747c8be0c0026827e21 | 109 +++ ...ntity_8a90fe25ebc7d747c8be0c0026827e21.map | 1 + ...oleentity_8c3ad2bb237f123bec3278c961cd9248 | 64 ++ ...ntity_8c3ad2bb237f123bec3278c961cd9248.map | 1 + ...ntservice_8d3faec06905f14ad474e25693923f7d | 75 ++ ...rvice_8d3faec06905f14ad474e25693923f7d.map | 1 + ...ndencedto_8ec4f87f817182b7164e9e6515cf1bfe | 32 + ...cedto_8ec4f87f817182b7164e9e6515cf1bfe.map | 1 + .../90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7 | 15 + .../rng_904dfc3a5bd0887a6c45cb3d878fa5c7.map | 1 + ...onservice_91acfa9d9eced11413bfd00b1cf7e908 | 535 ++++++++++ ...rvice_91acfa9d9eced11413bfd00b1cf7e908.map | 1 + ...decorator_9256d2962798c77203d8fb44810f8ca3 | 9 + ...rator_9256d2962798c77203d8fb44810f8ca3.map | 1 + ...tusentity_97a32e7d167aa3e187cb27726d61bab7 | 41 + ...ntity_97a32e7d167aa3e187cb27726d61bab7.map | 1 + ...ectentity_9707fed5c8901f41acce5eed06457e70 | 61 ++ ...ntity_9707fed5c8901f41acce5eed06457e70.map | 1 + ...ckservice_9bc5e59087d93dee3598caf55c875291 | 71 ++ ...rvice_9bc5e59087d93dee3598caf55c875291.map | 1 + ...ingentity_9b1bd1c97b8cbc018b22efc9e21f4a04 | 86 ++ ...ntity_9b1bd1c97b8cbc018b22efc9e21f4a04.map | 1 + ...ententity_9c5087d09ec8b700527ffb7c83f91636 | 83 ++ ...ntity_9c5087d09ec8b700527ffb7c83f91636.map | 1 + ...nerrordto_9c87a190d3006b7b975b97854ae143fb | 46 + ...ordto_9c87a190d3006b7b975b97854ae143fb.map | 1 + .../9d/max_9db8a27964de625b0f36563abf6232a7 | 5 + .../max_9db8a27964de625b0f36563abf6232a7.map | 1 + ...rvicespec_a2810b2dce33226f556c08aa01ca2f2b | 201 ++++ ...espec_a2810b2dce33226f556c08aa01ca2f2b.map | 1 + ...tyservice_a80c65ba7eccf9dcb6d35e92983955ec | 108 +++ ...rvice_a80c65ba7eccf9dcb6d35e92983955ec.map | 1 + ...terentity_ac7c837fe0596322eaacc4fdba0240e6 | 71 ++ ...ntity_ac7c837fe0596322eaacc4fdba0240e6.map | 1 + ...ceservice_ad1118bded3627ccd60dfa57cfd690af | 898 +++++++++++++++++ ...rvice_ad1118bded3627ccd60dfa57cfd690af.map | 1 + ...ndencedto_ae633c62db2423c3d35f3355bdfe8a8f | 156 +++ ...cedto_ae633c62db2423c3d35f3355bdfe8a8f.map | 1 + .../validate_ae536be84542361d213e0db90352f872 | 9 + ...idate_ae536be84542361d213e0db90352f872.map | 1 + ...oryentity_ae45cdc722f7fb5008d9c9545adb2602 | 80 ++ ...ntity_ae45cdc722f7fb5008d9c9545adb2602.map | 1 + ...canceldto_b188ef1e37c9aa6e5dfb479a7b13df01 | 29 + ...eldto_b188ef1e37c9aa6e5dfb479a7b13df01.map | 1 + ...ypeentity_b2926735481aee304b6d8e6c648d2486 | 41 + ...ntity_b2926735481aee304b6d8e6c648d2486.map | 1 + ...chservice_b2eb472a97423f29f2b961fef6e04635 | 186 ++++ ...rvice_b2eb472a97423f29f2b961fef6e04635.map | 1 + .../b6/v6_b61d978f58f084d58983295cb79d1da1 | 21 + .../v6_b61d978f58f084d58983295cb79d1da1.map | 1 + .../native_b77b78527393b2531b1a463b25d5082e | 6 + ...ative_b77b78527393b2531b1a463b25d5082e.map | 1 + ...umeentity_bae4c506ae52548a1cf4e9a173bafb90 | 60 ++ ...ntity_bae4c506ae52548a1cf4e9a173bafb90.map | 1 + .../ba/parse_bad41695a1f7cd948f08f7e09b13d54a | 13 + ...parse_bad41695a1f7cd948f08f7e09b13d54a.map | 1 + ...ionentity_bbb192a25e7ecf4868b9d699378da1d9 | 152 +++ ...ntity_bbb192a25e7ecf4868b9d699378da1d9.map | 1 + ...terkeydto_bfc4f2618a9b3598c1c750dcc590874a | 22 + ...eydto_bfc4f2618a9b3598c1c750dcc590874a.map | 1 + ...ongateway_bf874af174d85f24572ec42a74854055 | 49 + ...teway_bf874af174d85f24572ec42a74854055.map | 1 + ...ontroller_c1cdcbcf8a827ce71917eaa54dea5a6b | 319 ++++++ ...oller_c1cdcbcf8a827ce71917eaa54dea5a6b.map | 1 + ...ceservice_c352f059c6548dcde16c17585f69c20e | 918 ++++++++++++++++++ ...rvice_c352f059c6548dcde16c17585f69c20e.map | 1 + ...ndencedto_c4e2a7406d51e6f2bb8a9c2005bff728 | 82 ++ ...cedto_c4e2a7406d51e6f2bb8a9c2005bff728.map | 1 + ...ollerspec_c5f9fd6ae9e36729f949dfdfe469ff44 | 89 ++ ...rspec_c5f9fd6ae9e36729f949dfdfe469ff44.map | 1 + .../c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841 | 15 + .../md5_c7142fbd71a8ecaa5364f4d76e8e2841.map | 1 + .../c8/sha1_c882b159cea7007e924fc360f120c6d0 | 15 + .../sha1_c882b159cea7007e924fc360f120c6d0.map | 1 + ...ineentity_c9e1f009e60f6c576c68cb9d7e742f58 | 62 ++ ...ntity_c9e1f009e60f6c576c68cb9d7e742f58.map | 1 + .../v6ToV1_cffac5e0420b92001be8493a56a8f68a | 15 + ...6ToV1_cffac5e0420b92001be8493a56a8f68a.map | 1 + ...geservice_d1de7c3db6a6360fcaa4b58bb9eaf86f | 316 ++++++ ...rvice_d1de7c3db6a6360fcaa4b58bb9eaf86f.map | 1 + ...lowentity_d3501038ce52cd5dc294a06a69f62231 | 99 ++ ...ntity_d3501038ce52cd5dc294a06a69f62231.map | 1 + ...slservice_d36787ba9683b86dbb8191618e6388d1 | 171 ++++ ...rvice_d36787ba9683b86dbb8191618e6388d1.map | 1 + ...erservice_d427bfc64fffab26d17b944e9694d91a | 159 +++ ...rvice_d427bfc64fffab26d17b944e9694d91a.map | 1 + ...ententity_d782a1e91f757d9e1ad189bad12c6ed0 | 48 + ...ntity_d782a1e91f757d9e1ad189bad12c6ed0.map | 1 + ...neservice_d77fe0bd7e66a5bcb877421ed49eead5 | 345 +++++++ ...rvice_d77fe0bd7e66a5bcb877421ed49eead5.map | 1 + ...matentity_da22f67609371e510a896a8a74de1f37 | 76 ++ ...ntity_da22f67609371e510a896a8a74de1f37.map | 1 + ...serentity_dc28e03d983755869ca5787ce3ebd3b2 | 110 +++ ...ntity_dc28e03d983755869ca5787ce3ebd3b2.map | 1 + ...rvicespec_dd65cc9106ac238963ddf5ec24c97076 | 620 ++++++++++++ ...espec_dd65cc9106ac238963ddf5ec24c97076.map | 1 + ...ollerspec_dd4c82decb258b970afd93c4a7440fc1 | 47 + ...rspec_dd4c82decb258b970afd93c4a7440fc1.map | 1 + ...atservice_df5c1e9f93aedeb4ad8d2031d06cd2dc | 148 +++ ...rvice_df5c1e9f93aedeb4ad8d2031d06cd2dc.map | 1 + ...ionentity_e0b85313b8088d726a438ab9cc2f85a5 | 78 ++ ...ntity_e0b85313b8088d726a438ab9cc2f85a5.map | 1 + ...tagentity_e084a246ab81ebbb0804752cd788d317 | 65 ++ ...ntity_e084a246ab81ebbb0804752cd788d317.map | 1 + ...ngservice_e1f30d9c71a448ed16199c674687b20a | 449 +++++++++ ...rvice_e1f30d9c71a448ed16199c674687b20a.map | 1 + ...oleentity_e199ef2079345958af90c42687a018b5 | 42 + ...ntity_e199ef2079345958af90c42687a018b5.map | 1 + ...erencedto_e2e93fdd7fa68d9b92ea457b24365e9b | 28 + ...cedto_e2e93fdd7fa68d9b92ea457b24365e9b.map | 1 + ...itservice_e2598f39804f4335edbc19499af81322 | 47 + ...rvice_e2598f39804f4335edbc19499af81322.map | 1 + ...oryentity_e36661009314b375ec2d5bbcc85d2749 | 58 ++ ...ntity_e36661009314b375ec2d5bbcc85d2749.map | 1 + ...mapentity_e6c9554e1ccabb45815c38a7fb21edd1 | 56 ++ ...ntity_e6c9554e1ccabb45815c38a7fb21edd1.map | 1 + ...ionentity_e6c1336d09598974caf3216496457214 | 64 ++ ...ntity_e6c1336d09598974caf3216496457214.map | 1 + ...erservice_e92736215f5694b692ef5aa73860c913 | 88 ++ ...rvice_e92736215f5694b692ef5aa73860c913.map | 1 + ...rorentity_ead431100796cc33dbb58d8c9b26e422 | 75 ++ ...ntity_ead431100796cc33dbb58d8c9b26e422.map | 1 + ...ionentity_ea591a1eae98ae8e4c3321bda804eade | 127 +++ ...ntity_ea591a1eae98ae8e4c3321bda804eade.map | 1 + ...mnservice_ed232263455f8d2f2cd64638606de516 | 133 +++ ...rvice_ed232263455f8d2f2cd64638606de516.map | 1 + ...tagentity_ee93e93c3bfb4d1980c001646ec6ace8 | 42 + ...ntity_ee93e93c3bfb4d1980c001646ec6ace8.map | 1 + ...ionentity_ef0b3c735862df86a5f73487e7db8327 | 47 + ...ntity_ef0b3c735862df86a5f73487e7db8327.map | 1 + .../f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa | 31 + .../v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa.map | 1 + ...erservice_f4169b9a0d894f0117413e68a4e609b4 | 111 +++ ...rvice_f4169b9a0d894f0117413e68a4e609b4.map | 1 + ...tementity_f50c2e5deeee1bdd58f2cc1b453855c1 | 66 ++ ...ntity_f50c2e5deeee1bdd58f2cc1b453855c1.map | 1 + ...ontroller_f6a1078a9fc0bcd110945ad01e6756c1 | 207 ++++ ...oller_f6a1078a9fc0bcd110945ad01e6756c1.map | 1 + .../f7/index_f783515cd5debf68fed6d8cafa6133e5 | 33 + ...index_f783515cd5debf68fed6d8cafa6133e5.map | 1 + ...ditentity_f9b076f64c9678d93028c088d672f912 | 144 +++ ...ntity_f9b076f64c9678d93028c088d672f912.map | 1 + ...erservice_f9710ddbca9c43ce35dce6675a3feef5 | 281 ++++++ ...rvice_f9710ddbca9c43ce35dce6675a3feef5.map | 1 + ...owservice_fbaf8c7b016e1d0311d3c712bbc2f237 | 160 +++ ...rvice_fbaf8c7b016e1d0311d3c712bbc2f237.map | 1 + .../fc/v35_fca1af3a7beb257668611362527174bb | 43 + .../v35_fca1af3a7beb257668611362527174bb.map | 1 + ...nceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8 | 54 ++ ...ntity_ffdeaf38ca1cbfa6de2ab4690658d6d8.map | 1 + ...c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 | 1 + backend/src/app.module.ts | 8 + .../correspondence/correspondence.module.ts | 2 + .../correspondence/correspondence.service.ts | 53 +- ...rrespondence-revision-attachment.entity.ts | 40 + .../correspondence-revision.entity.ts | 7 +- .../services/reservation.service.ts | 37 +- .../components/correspondences/detail.tsx | 13 +- frontend/components/correspondences/form.tsx | 28 +- frontend/types/correspondence.ts | 18 +- .../03-01-data-dictionary.md | 42 +- .../lcbp3-v1.8.0-schema-01-drop.sql | 4 +- .../lcbp3-v1.8.0-schema-02-tables.sql | 21 +- .../lcbp3-v1.8.0-schema-03-views-indexes.sql | 14 +- 287 files changed, 15117 insertions(+), 69 deletions(-) create mode 100644 backend/src/.jest-cache/haste-map-51fed4c0665a260afb7eef9c4f4e1366-661f9c4a99782bf15c49c5484e27323b-57a192785d1688a165b9d928bb0781fb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/rfarevisionentity_03bcacbecf6356ec88322fcd4e742bf8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/rfarevisionentity_03bcacbecf6356ec88322fcd4e742bf8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8.map create mode 100644 backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 create mode 100644 backend/src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts diff --git a/backend/src/.jest-cache/haste-map-51fed4c0665a260afb7eef9c4f4e1366-661f9c4a99782bf15c49c5484e27323b-57a192785d1688a165b9d928bb0781fb b/backend/src/.jest-cache/haste-map-51fed4c0665a260afb7eef9c4f4e1366-661f9c4a99782bf15c49c5484e27323b-57a192785d1688a165b9d928bb0781fb new file mode 100644 index 0000000000000000000000000000000000000000..177ba017dcdabf45802475b293f1f4c07af79ce7 GIT binary patch literal 71082 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 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaRevision = void 0; +// File: src/modules/rfa/entities/rfa-revision.entity.ts +const typeorm_1 = require("typeorm"); +const correspondence_revision_entity_1 = require("../../correspondence/entities/correspondence-revision.entity"); +const rfa_approve_code_entity_1 = require("./rfa-approve-code.entity"); +const rfa_item_entity_1 = require("./rfa-item.entity"); +const rfa_status_code_entity_1 = require("./rfa-status-code.entity"); +const rfa_workflow_entity_1 = require("./rfa-workflow.entity"); +let RfaRevision = class RfaRevision { +}; +exports.RfaRevision = RfaRevision; +__decorate([ + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", Number) +], RfaRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => correspondence_revision_entity_1.CorrespondenceRevision, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'id' }), + __metadata("design:type", typeof (_a = typeof correspondence_revision_entity_1.CorrespondenceRevision !== "undefined" && correspondence_revision_entity_1.CorrespondenceRevision) === "function" ? _a : Object) +], RfaRevision.prototype, "correspondenceRevision", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_status_code_id' }), + __metadata("design:type", Number) +], RfaRevision.prototype, "rfaStatusCodeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_approve_code_id', nullable: true }), + __metadata("design:type", Number) +], RfaRevision.prototype, "rfaApproveCodeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approved_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaRevision.prototype, "approvedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], RfaRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], RfaRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_drawing_count', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.drawingCount'))", + nullable: true, + }), + __metadata("design:type", Number) +], RfaRevision.prototype, "vRefDrawingCount", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_status_code_entity_1.RfaStatusCode), + (0, typeorm_1.JoinColumn)({ name: 'rfa_status_code_id' }), + __metadata("design:type", typeof (_c = typeof rfa_status_code_entity_1.RfaStatusCode !== "undefined" && rfa_status_code_entity_1.RfaStatusCode) === "function" ? _c : Object) +], RfaRevision.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_approve_code_entity_1.RfaApproveCode), + (0, typeorm_1.JoinColumn)({ name: 'rfa_approve_code_id' }), + __metadata("design:type", typeof (_d = typeof rfa_approve_code_entity_1.RfaApproveCode !== "undefined" && rfa_approve_code_entity_1.RfaApproveCode) === "function" ? _d : Object) +], RfaRevision.prototype, "approveCode", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_item_entity_1.RfaItem, (item) => item.rfaRevision, { cascade: true }), + __metadata("design:type", Array) +], RfaRevision.prototype, "items", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_workflow_entity_1.RfaWorkflow, (workflow) => workflow.rfaRevision, { + cascade: true, + }), + __metadata("design:type", Array) +], RfaRevision.prototype, "workflows", void 0); +exports.RfaRevision = RfaRevision = __decorate([ + (0, typeorm_1.Entity)('rfa_revisions') +], RfaRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXJldmlzaW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELHFDQVFpQjtBQUNqQixpSEFBc0c7QUFDdEcsdUVBQTJEO0FBQzNELHVEQUE0QztBQUM1QyxxRUFBeUQ7QUFDekQsK0RBQW9EO0FBRzdDLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7Q0FxRHZCLENBQUE7QUFyRFksa0NBQVc7QUFFdEI7SUFEQyxJQUFBLHVCQUFhLEdBQUU7O3VDQUNKO0FBSVo7SUFGQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsdURBQXNCLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDL0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNGLHVEQUFzQixvQkFBdEIsdURBQXNCOzJEQUFDO0FBR2hEO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7O29EQUNkO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7cURBQzlCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJO2lEQUFDO0FBS3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUN4QjtBQUlqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O2tEQUN4QjtBQVV2QjtJQVBDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsSUFBSSxFQUFFLEtBQUs7UUFDWCxhQUFhLEVBQUUsU0FBUztRQUN4QixZQUFZLEVBQUUsdURBQXVEO1FBQ3JFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7cURBQ3dCO0FBTTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHNDQUFhLENBQUM7SUFDOUIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7a0RBQzlCLHNDQUFhLG9CQUFiLHNDQUFhOytDQUFDO0FBSTNCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdDQUFjLENBQUM7SUFDL0IsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUM7a0RBQzlCLHdDQUFjLG9CQUFkLHdDQUFjO2dEQUFDO0FBRzdCO0lBREMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN0RDtBQUtsQjtJQUhDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxpQ0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ2hFLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQzs7OENBQ3dCO3NCQXBEZixXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBcUR2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3JmYS9lbnRpdGllcy9yZmEtcmV2aXNpb24uZW50aXR5LnRzXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBPbmVUb01hbnksXG4gIFByaW1hcnlDb2x1bW4sXG4gIE9uZVRvT25lLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb24gfSBmcm9tICcuLi8uLi9jb3JyZXNwb25kZW5jZS9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgUmZhQXBwcm92ZUNvZGUgfSBmcm9tICcuL3JmYS1hcHByb3ZlLWNvZGUuZW50aXR5JztcbmltcG9ydCB7IFJmYUl0ZW0gfSBmcm9tICcuL3JmYS1pdGVtLmVudGl0eSc7XG5pbXBvcnQgeyBSZmFTdGF0dXNDb2RlIH0gZnJvbSAnLi9yZmEtc3RhdHVzLWNvZGUuZW50aXR5JztcbmltcG9ydCB7IFJmYVdvcmtmbG93IH0gZnJvbSAnLi9yZmEtd29ya2Zsb3cuZW50aXR5JztcblxuQEVudGl0eSgncmZhX3JldmlzaW9ucycpXG5leHBvcnQgY2xhc3MgUmZhUmV2aXNpb24ge1xuICBAUHJpbWFyeUNvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBPbmVUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnaWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlUmV2aXNpb24hOiBDb3JyZXNwb25kZW5jZVJldmlzaW9uO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3N0YXR1c19jb2RlX2lkJyB9KVxuICByZmFTdGF0dXNDb2RlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZmFfYXBwcm92ZV9jb2RlX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmZhQXBwcm92ZUNvZGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FwcHJvdmVkX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFwcHJvdmVkRGF0ZT86IERhdGU7XG5cbiAgLy8gLS0tIEpTT04gJiBTY2hlbWEgU2VjdGlvbiAtLS1cblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXRhaWxzPzogb2JqZWN0OyAvLyBEeW5hbWljIEpTT04g4oCUIHR5cGVkIGFzIGBvYmplY3RgIHBlciBUeXBlT1JNIEpTT04gY29sdW1uIGNvbnZlbnRpb24gKG5vLWFueSwgQURSLTAxOSlcblxuICAvLyDinIUgW05ld10g4LiI4Liz4LmA4Lib4LmH4LiZ4Liq4Liz4Lir4Lij4Lix4LiaIERhdGEgTWlncmF0aW9uIChUMi41LjUpXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2NoZW1hX3ZlcnNpb24nLCBkZWZhdWx0OiAxIH0pXG4gIHNjaGVtYVZlcnNpb24hOiBudW1iZXI7XG5cbiAgLy8g4pyFIFZpcnR1YWwgQ29sdW1uXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X3JlZl9kcmF3aW5nX2NvdW50JyxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQuZHJhd2luZ0NvdW50JykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZEcmF3aW5nQ291bnQ/OiBudW1iZXI7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFJmYVN0YXR1c0NvZGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JmYV9zdGF0dXNfY29kZV9pZCcgfSlcbiAgc3RhdHVzQ29kZSE6IFJmYVN0YXR1c0NvZGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBSZmFBcHByb3ZlQ29kZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncmZhX2FwcHJvdmVfY29kZV9pZCcgfSlcbiAgYXBwcm92ZUNvZGU/OiBSZmFBcHByb3ZlQ29kZTtcblxuICBAT25lVG9NYW55KCgpID0+IFJmYUl0ZW0sIChpdGVtKSA9PiBpdGVtLnJmYVJldmlzaW9uLCB7IGNhc2NhZGU6IHRydWUgfSlcbiAgaXRlbXMhOiBSZmFJdGVtW107XG5cbiAgQE9uZVRvTWFueSgoKSA9PiBSZmFXb3JrZmxvdywgKHdvcmtmbG93KSA9PiB3b3JrZmxvdy5yZmFSZXZpc2lvbiwge1xuICAgIGNhc2NhZGU6IHRydWUsXG4gIH0pXG4gIHdvcmtmbG93cyE6IFJmYVdvcmtmbG93W107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/rfarevisionentity_03bcacbecf6356ec88322fcd4e742bf8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/rfarevisionentity_03bcacbecf6356ec88322fcd4e742bf8.map new file mode 100644 index 0000000..b72a9e3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/rfarevisionentity_03bcacbecf6356ec88322fcd4e742bf8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-revision.entity.ts","mappings":";;;;;;;;;;;;;AAAA,wDAAwD;AACxD,qCAQiB;AACjB,iHAAsG;AACtG,uEAA2D;AAC3D,uDAA4C;AAC5C,qEAAyD;AACzD,+DAAoD;AAG7C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAqDvB,CAAA;AArDY,kCAAW;AAEtB;IADC,IAAA,uBAAa,GAAE;;uCACJ;AAIZ;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,uDAAsB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kDACF,uDAAsB,oBAAtB,uDAAsB;2DAAC;AAGhD;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;;oDACd;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC9B;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;iDAAC;AAKpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACxB;AAIjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;kDACxB;AAUvB;IAPC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,KAAK;QACX,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,uDAAuD;QACrE,QAAQ,EAAE,IAAI;KACf,CAAC;;qDACwB;AAM1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAa,CAAC;IAC9B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;kDAC9B,sCAAa,oBAAb,sCAAa;+CAAC;AAI3B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wCAAc,CAAC;IAC/B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC9B,wCAAc,oBAAd,wCAAc;gDAAC;AAG7B;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yBAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CACtD;AAKlB;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;QAChE,OAAO,EAAE,IAAI;KACd,CAAC;;8CACwB;sBApDf,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CAqDvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-revision.entity.ts"],"sourcesContent":["// File: src/modules/rfa/entities/rfa-revision.entity.ts\nimport {\n Column,\n Entity,\n JoinColumn,\n ManyToOne,\n OneToMany,\n PrimaryColumn,\n OneToOne,\n} from 'typeorm';\nimport { CorrespondenceRevision } from '../../correspondence/entities/correspondence-revision.entity';\nimport { RfaApproveCode } from './rfa-approve-code.entity';\nimport { RfaItem } from './rfa-item.entity';\nimport { RfaStatusCode } from './rfa-status-code.entity';\nimport { RfaWorkflow } from './rfa-workflow.entity';\n\n@Entity('rfa_revisions')\nexport class RfaRevision {\n @PrimaryColumn()\n id!: number;\n\n @OneToOne(() => CorrespondenceRevision, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'id' })\n correspondenceRevision!: CorrespondenceRevision;\n\n @Column({ name: 'rfa_status_code_id' })\n rfaStatusCodeId!: number;\n\n @Column({ name: 'rfa_approve_code_id', nullable: true })\n rfaApproveCodeId?: number;\n\n @Column({ name: 'approved_date', type: 'date', nullable: true })\n approvedDate?: Date;\n\n // --- JSON & Schema Section ---\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n // ✅ [New] จำเป็นสำหรับ Data Migration (T2.5.5)\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ Virtual Column\n @Column({\n name: 'v_ref_drawing_count',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.drawingCount'))\",\n nullable: true,\n })\n vRefDrawingCount?: number;\n\n // --- Relations ---\n\n @ManyToOne(() => RfaStatusCode)\n @JoinColumn({ name: 'rfa_status_code_id' })\n statusCode!: RfaStatusCode;\n\n @ManyToOne(() => RfaApproveCode)\n @JoinColumn({ name: 'rfa_approve_code_id' })\n approveCode?: RfaApproveCode;\n\n @OneToMany(() => RfaItem, (item) => item.rfaRevision, { cascade: true })\n items!: RfaItem[];\n\n @OneToMany(() => RfaWorkflow, (workflow) => workflow.rfaRevision, {\n cascade: true,\n })\n workflows!: RfaWorkflow[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187 new file mode 100644 index 0000000..7c7c69d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187 @@ -0,0 +1,71 @@ +eb3d4006b762ef4be4530cea42e90674 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateV7State = void 0; +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +const _state = {}; +function v7(options, buf, offset) { + let bytes; + if (options) { + bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset); + } + else { + const now = Date.now(); + const rnds = (0, rng_js_1.default)(); + updateV7State(_state, now, rnds); + bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset); + } + return buf ?? (0, stringify_js_1.unsafeStringify)(bytes); +} +function updateV7State(state, now, rnds) { + state.msecs ??= -Infinity; + state.seq ??= 0; + if (now > state.msecs) { + state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; + state.msecs = now; + } + else { + state.seq = (state.seq + 1) | 0; + if (state.seq === 0) { + state.msecs++; + } + } + return state; +} +exports.updateV7State = updateV7State; +function v7Bytes(rnds, msecs, seq, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; + buf[offset++] = (msecs / 0x10000000000) & 0xff; + buf[offset++] = (msecs / 0x100000000) & 0xff; + buf[offset++] = (msecs / 0x1000000) & 0xff; + buf[offset++] = (msecs / 0x10000) & 0xff; + buf[offset++] = (msecs / 0x100) & 0xff; + buf[offset++] = msecs & 0xff; + buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f); + buf[offset++] = (seq >>> 20) & 0xff; + buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f); + buf[offset++] = (seq >>> 6) & 0xff; + buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03); + buf[offset++] = rnds[11]; + buf[offset++] = rnds[12]; + buf[offset++] = rnds[13]; + buf[offset++] = rnds[14]; + buf[offset++] = rnds[15]; + return buf; +} +exports.default = v7; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjcuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUM1QixJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVixLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzSCxDQUFDO1NBQ0ksQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxhQUFhLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxH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Q0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN2QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzdCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN4RCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHY3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGRhdGVWN1N0YXRlID0gdm9pZCAwO1xuY29uc3Qgcm5nX2pzXzEgPSByZXF1aXJlKFwiLi9ybmcuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmNvbnN0IF9zdGF0ZSA9IHt9O1xuZnVuY3Rpb24gdjcob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgICBsZXQgYnl0ZXM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgYnl0ZXMgPSB2N0J5dGVzKG9wdGlvbnMucmFuZG9tID8/IG9wdGlvbnMucm5nPy4oKSA/PyAoMCwgcm5nX2pzXzEuZGVmYXVsdCkoKSwgb3B0aW9ucy5tc2Vjcywgb3B0aW9ucy5zZXEsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJuZHMgPSAoMCwgcm5nX2pzXzEuZGVmYXVsdCkoKTtcbiAgICAgICAgdXBkYXRlVjdTdGF0ZShfc3RhdGUsIG5vdywgcm5kcyk7XG4gICAgICAgIGJ5dGVzID0gdjdCeXRlcyhybmRzLCBfc3RhdGUubXNlY3MsIF9zdGF0ZS5zZXEsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZiA/PyAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG59XG5mdW5jdGlvbiB1cGRhdGVWN1N0YXRlKHN0YXRlLCBub3csIHJuZHMpIHtcbiAgICBzdGF0ZS5tc2VjcyA/Pz0gLUluZmluaXR5O1xuICAgIHN0YXRlLnNlcSA/Pz0gMDtcbiAgICBpZiAobm93ID4gc3RhdGUubXNlY3MpIHtcbiAgICAgICAgc3RhdGUuc2VxID0gKHJuZHNbNl0gPDwgMjMpIHwgKHJuZHNbN10gPDwgMTYpIHwgKHJuZHNbOF0gPDwgOCkgfCBybmRzWzldO1xuICAgICAgICBzdGF0ZS5tc2VjcyA9IG5vdztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0YXRlLnNlcSA9IChzdGF0ZS5zZXEgKyAxKSB8IDA7XG4gICAgICAgIGlmIChzdGF0ZS5zZXEgPT09IDApIHtcbiAgICAgICAgICAgIHN0YXRlLm1zZWNzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuZXhwb3J0cy51cGRhdGVWN1N0YXRlID0gdXBkYXRlVjdTdGF0ZTtcbmZ1bmN0aW9uIHY3Qnl0ZXMocm5kcywgbXNlY3MsIHNlcSwgYnVmLCBvZmZzZXQgPSAwKSB7XG4gICAgaWYgKHJuZHMubGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYW5kb20gYnl0ZXMgbGVuZ3RoIG11c3QgYmUgPj0gMTYnKTtcbiAgICB9XG4gICAgaWYgKCFidWYpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgICAgICBvZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMTYgPiBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVVVJRCBieXRlIHJhbmdlICR7b2Zmc2V0fToke29mZnNldCArIDE1fSBpcyBvdXQgb2YgYnVmZmVyIGJvdW5kc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1zZWNzID8/PSBEYXRlLm5vdygpO1xuICAgIHNlcSA/Pz0gKChybmRzWzZdICogMHg3ZikgPDwgMjQpIHwgKHJuZHNbN10gPDwgMTYpIHwgKHJuZHNbOF0gPDwgOCkgfCBybmRzWzldO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAobXNlY3MgLyAweDEwMDAwMDAwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwMDAwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwMDAwMCkgJiAweGZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAobXNlY3MgLyAweDEwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IG1zZWNzICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gMHg3MCB8ICgoc2VxID4+PiAyOCkgJiAweDBmKTtcbiAgICBidWZbb2Zmc2V0KytdID0gKHNlcSA+Pj4gMjApICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gMHg4MCB8ICgoc2VxID4+PiAxNCkgJiAweDNmKTtcbiAgICBidWZbb2Zmc2V0KytdID0gKHNlcSA+Pj4gNikgJiAweGZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAoKHNlcSA8PCAyKSAmIDB4ZmYpIHwgKHJuZHNbMTBdICYgMHgwMyk7XG4gICAgYnVmW29mZnNldCsrXSA9IHJuZHNbMTFdO1xuICAgIGJ1ZltvZmZzZXQrK10gPSBybmRzWzEyXTtcbiAgICBidWZbb2Zmc2V0KytdID0gcm5kc1sxM107XG4gICAgYnVmW29mZnNldCsrXSA9IHJuZHNbMTRdO1xuICAgIGJ1ZltvZmZzZXQrK10gPSBybmRzWzE1XTtcbiAgICByZXR1cm4gYnVmO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187.map new file mode 100644 index 0000000..172d06c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/v7_0337696d223ad4a0d2e2ccf1f3e90187.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v7.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v7.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV7State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v7(options, buf, offset) {\n let bytes;\n if (options) {\n bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = (0, rng_js_1.default)();\n updateV7State(_state, now, rnds);\n bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset);\n }\n return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV7State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.seq ??= 0;\n if (now > state.msecs) {\n state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n state.msecs = now;\n }\n else {\n state.seq = (state.seq + 1) | 0;\n if (state.seq === 0) {\n state.msecs++;\n }\n }\n return state;\n}\nexports.updateV7State = updateV7State;\nfunction v7Bytes(rnds, msecs, seq, buf, offset = 0) {\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n else {\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n }\n msecs ??= Date.now();\n seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n buf[offset++] = (msecs / 0x10000000000) & 0xff;\n buf[offset++] = (msecs / 0x100000000) & 0xff;\n buf[offset++] = (msecs / 0x1000000) & 0xff;\n buf[offset++] = (msecs / 0x10000) & 0xff;\n buf[offset++] = (msecs / 0x100) & 0xff;\n buf[offset++] = msecs & 0xff;\n buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f);\n buf[offset++] = (seq >>> 20) & 0xff;\n buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f);\n buf[offset++] = (seq >>> 6) & 0xff;\n buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03);\n buf[offset++] = rnds[11];\n buf[offset++] = rnds[12];\n buf[offset++] = rnds[13];\n buf[offset++] = rnds[14];\n buf[offset++] = rnds[15];\n return buf;\n}\nexports.default = v7;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76 new file mode 100644 index 0000000..9f21d83 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76 @@ -0,0 +1,126 @@ +62e1d2e515c13e92150166089ef1908a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationReviewQueue = exports.MigrationReviewStatus = void 0; +const typeorm_1 = require("typeorm"); +var MigrationReviewStatus; +(function (MigrationReviewStatus) { + MigrationReviewStatus["PENDING"] = "PENDING"; + MigrationReviewStatus["APPROVED"] = "APPROVED"; + MigrationReviewStatus["REJECTED"] = "REJECTED"; +})(MigrationReviewStatus || (exports.MigrationReviewStatus = MigrationReviewStatus = {})); +let MigrationReviewQueue = class MigrationReviewQueue { +}; +exports.MigrationReviewQueue = MigrationReviewQueue; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, unique: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'original_subject', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "originalSubject", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_suggested_category', length: 50, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "aiSuggestedCategory", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'ai_confidence', + type: 'decimal', + precision: 4, + scale: 3, + nullable: true, + }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "aiConfidence", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_issues', type: 'json', nullable: true }), + __metadata("design:type", Array) +], MigrationReviewQueue.prototype, "aiIssues", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'review_reason', length: 255, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "reviewReason", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: MigrationReviewStatus, + default: MigrationReviewStatus.PENDING, + }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reviewed_by', length: 100, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "reviewedBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reviewed_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], MigrationReviewQueue.prototype, "reviewedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sender_organization_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "senderOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'receiver_organization_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "receiverOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], MigrationReviewQueue.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], MigrationReviewQueue.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_summary', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "aiSummary", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'extracted_tags', type: 'json', nullable: true }), + __metadata("design:type", Array) +], MigrationReviewQueue.prototype, "extractedTags", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'temp_attachment_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], MigrationReviewQueue.prototype, "createdAt", void 0); +exports.MigrationReviewQueue = MigrationReviewQueue = __decorate([ + (0, typeorm_1.Entity)('migration_review_queue') +], MigrationReviewQueue); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLXJldmlldy1xdWV1ZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUtpQjtBQUVqQixJQUFZLHFCQUlYO0FBSkQsV0FBWSxxQkFBcUI7SUFDL0IsNENBQW1CLENBQUE7SUFDbkIsOENBQXFCLENBQUE7SUFDckIsOENBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBSWhDO0FBR00sSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7Q0E0RWhDLENBQUE7QUE1RVksb0RBQW9CO0FBRS9CO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7Z0RBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NERBQ3ZDO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3FEQUN4QjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkRBQzFDO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUMzQjtBQUdkO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpRUFDekM7QUFTN0I7SUFQQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUs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bWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXGVudGl0aWVzXFxtaWdyYXRpb24tcmV2aWV3LXF1ZXVlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBlbnVtIE1pZ3JhdGlvblJldmlld1N0YXR1cyB7XG4gIFBFTkRJTkcgPSAnUEVORElORycsXG4gIEFQUFJPVkVEID0gJ0FQUFJPVkVEJyxcbiAgUkVKRUNURUQgPSAnUkVKRUNURUQnLFxufVxuXG5ARW50aXR5KCdtaWdyYXRpb25fcmV2aWV3X3F1ZXVlJylcbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25SZXZpZXdRdWV1ZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkb2N1bWVudF9udW1iZXInLCBsZW5ndGg6IDEwMCwgdW5pcXVlOiB0cnVlIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hbF9zdWJqZWN0JywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBvcmlnaW5hbFN1YmplY3Q/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgYm9keT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FpX3N1Z2dlc3RlZF9jYXRlZ29yeScsIGxlbmd0aDogNTAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFpU3VnZ2VzdGVkQ2F0ZWdvcnk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2FpX2NvbmZpZGVuY2UnLFxuICAgIHR5cGU6ICdkZWNpbWFsJyxcbiAgICBwcmVjaXNpb246IDQsXG4gICAgc2NhbGU6IDMsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGFpQ29uZmlkZW5jZT86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FpX2lzc3VlcycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYWlJc3N1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aWV3X3JlYXNvbicsIGxlbmd0aDogMjU1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpZXdSZWFzb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7XG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IE1pZ3JhdGlvblJldmlld1N0YXR1cyxcbiAgICBkZWZhdWx0OiBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORyxcbiAgfSlcbiAgc3RhdHVzITogTWlncmF0aW9uUmV2aWV3U3RhdHVzO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aWV3ZWRfYnknLCBsZW5ndGg6IDEwMCwgbnVsbGFibGU6IHRydWUgfSlcbiAgcmV2aWV3ZWRCeT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Jldmlld2VkX2F0JywgdHlwZTogJ3RpbWVzdGFtcCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJldmlld2VkQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBwcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzZW5kZXJfb3JnYW5pemF0aW9uX2lkJywgdHlwZTogJ2ludCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHNlbmRlck9yZ2FuaXphdGlvbklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVjZWl2ZXJfb3JnYW5pemF0aW9uX2lkJywgdHlwZTogJ2ludCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlY2VpdmVyT3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZWNlaXZlZF9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWNlaXZlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNzdWVkX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlzc3VlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlbWFya3M/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhaV9zdW1tYXJ5JywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBhaVN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdleHRyYWN0ZWRfdGFncycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZXh0cmFjdGVkVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBfYXR0YWNobWVudF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB0ZW1wQXR0YWNobWVudElkPzogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76.map new file mode 100644 index 0000000..3df0ba7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/migrationreviewqueueentity_09aca5d852ddf329ea3859fa700fea76.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-review-queue.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-review-queue.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n} from 'typeorm';\n\nexport enum MigrationReviewStatus {\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n REJECTED = 'REJECTED',\n}\n\n@Entity('migration_review_queue')\nexport class MigrationReviewQueue {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'document_number', length: 100, unique: true })\n documentNumber!: string;\n\n @Column({ type: 'text', nullable: true })\n subject?: string;\n\n @Column({ name: 'original_subject', type: 'text', nullable: true })\n originalSubject?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ name: 'ai_suggested_category', length: 50, nullable: true })\n aiSuggestedCategory?: string;\n\n @Column({\n name: 'ai_confidence',\n type: 'decimal',\n precision: 4,\n scale: 3,\n nullable: true,\n })\n aiConfidence?: number;\n\n @Column({ name: 'ai_issues', type: 'json', nullable: true })\n aiIssues?: Record[];\n\n @Column({ name: 'review_reason', length: 255, nullable: true })\n reviewReason?: string;\n\n @Column({\n type: 'enum',\n enum: MigrationReviewStatus,\n default: MigrationReviewStatus.PENDING,\n })\n status!: MigrationReviewStatus;\n\n @Column({ name: 'reviewed_by', length: 100, nullable: true })\n reviewedBy?: string;\n\n @Column({ name: 'reviewed_at', type: 'timestamp', nullable: true })\n reviewedAt?: Date;\n\n @Column({ name: 'project_id', type: 'int', nullable: true })\n projectId?: number;\n\n @Column({ name: 'sender_organization_id', type: 'int', nullable: true })\n senderOrganizationId?: number;\n\n @Column({ name: 'receiver_organization_id', type: 'int', nullable: true })\n receiverOrganizationId?: number;\n\n @Column({ name: 'received_date', type: 'date', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'issued_date', type: 'date', nullable: true })\n issuedDate?: Date;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ name: 'ai_summary', type: 'text', nullable: true })\n aiSummary?: string;\n\n @Column({ name: 'extracted_tags', type: 'json', nullable: true })\n extractedTags?: Record[];\n\n @Column({ name: 'temp_attachment_id', type: 'int', nullable: true })\n tempAttachmentId?: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204 new file mode 100644 index 0000000..d8b4875 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204 @@ -0,0 +1,63 @@ +a037f6e7bc5eae493261cbf389adbc7e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Contract = void 0; +const typeorm_1 = require("typeorm"); +const class_transformer_1 = require("class-transformer"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +let Contract = class Contract extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Contract = Contract; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Contract.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], Contract.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_code', unique: true, length: 50 }), + __metadata("design:type", String) +], Contract.prototype, "contractCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_name', length: 255 }), + __metadata("design:type", String) +], Contract.prototype, "contractName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Contract.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'start_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Contract.prototype, "startDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'end_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Contract.prototype, "endDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Contract.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], Contract.prototype, "project", void 0); +exports.Contract = Contract = __decorate([ + (0, typeorm_1.Entity)('contracts') +], Contract); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29udHJhY3RcXGVudGl0aWVzXFxjb250cmFjdC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQU1pQjtBQUNqQix5REFBNEM7QUFDNUMsZ0ZBQTJFO0FBQzNFLDBFQUFnRTtBQUd6RCxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxpQ0FBYztDQWdDM0MsQ0FBQTtBQWhDWSw0QkFBUTtBQUduQjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztvQ0FDRTtBQUtaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzsyQ0FDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7OzhDQUN0QztBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDekI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkNBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJOzJDQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJO3lDQUFDO0FBR2Y7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MENBQzFCO0FBS25CO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzt5Q0FBQzttQkEvQlAsUUFBUTtJQURwQixJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDO0dBQ1AsUUFBUSxDQWdDcEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29udHJhY3RcXGVudGl0aWVzXFxjb250cmFjdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgTWFueVRvT25lLFxyXG4gIEpvaW5Db2x1bW4sXHJcbn0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmltcG9ydCB7IFV1aWRCYXNlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudGl0aWVzL3V1aWQtYmFzZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XHJcblxyXG5ARW50aXR5KCdjb250cmFjdHMnKVxyXG5leHBvcnQgY2xhc3MgQ29udHJhY3QgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIEBFeGNsdWRlKClcclxuICBpZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gcHVibGljSWQgaW5oZXJpdGVkIGZyb20gVXVpZEJhc2VFbnRpdHkgKERCIGNvbHVtbjogdXVpZClcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxyXG4gIHByb2plY3RJZCE6IG51bWJlcjtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdjb250cmFjdF9jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgY29udHJhY3RDb2RlITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X25hbWUnLCBsZW5ndGg6IDI1NSB9KVxyXG4gIGNvbnRyYWN0TmFtZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdzdGFydF9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIHN0YXJ0RGF0ZT86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW5kX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgZW5kRGF0ZT86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgLy8gUmVsYXRpb25cclxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcclxuICBwcm9qZWN0PzogUHJvamVjdDtcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204.map new file mode 100644 index 0000000..1b2d1fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/13/contractentity_1390c1715867a137b7da11a4b7ed8204.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\contract\\entities\\contract.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,yDAA4C;AAC5C,gFAA2E;AAC3E,0EAAgE;AAGzD,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,iCAAc;CAgC3C,CAAA;AAhCY,4BAAQ;AAGnB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;oCACE;AAKZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;2CACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;8CACtC;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACzB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;2CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;yCAAC;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CAC1B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;yCAAC;mBA/BP,QAAQ;IADpB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,QAAQ,CAgCpB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\contract\\entities\\contract.entity.ts"],"sourcesContent":["import {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n ManyToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Exclude } from 'class-transformer';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Project } from '../../project/entities/project.entity';\r\n\r\n@Entity('contracts')\r\nexport class Contract extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn()\r\n @Exclude()\r\n id!: number;\r\n\r\n // publicId inherited from UuidBaseEntity (DB column: uuid)\r\n\r\n @Column({ name: 'project_id' })\r\n projectId!: number;\r\n\r\n @Column({ name: 'contract_code', unique: true, length: 50 })\r\n contractCode!: string;\r\n\r\n @Column({ name: 'contract_name', length: 255 })\r\n contractName!: string;\r\n\r\n @Column({ type: 'text', nullable: true })\r\n description?: string;\r\n\r\n @Column({ name: 'start_date', type: 'date', nullable: true })\r\n startDate?: Date;\r\n\r\n @Column({ name: 'end_date', type: 'date', nullable: true })\r\n endDate?: Date;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n // Relation\r\n @ManyToOne(() => Project)\r\n @JoinColumn({ name: 'project_id' })\r\n project?: Project;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d new file mode 100644 index 0000000..0bcb385 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d @@ -0,0 +1,178 @@ +714357ff48f856987e1bde62a395623d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var ReservationService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReservationService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const schedule_1 = require("@nestjs/schedule"); +const uuid_1 = require("uuid"); +const document_number_reservation_entity_1 = require("../entities/document-number-reservation.entity"); +const counter_service_1 = require("./counter.service"); +const format_service_1 = require("./format.service"); +const counter_key_dto_1 = require("../dto/counter-key.dto"); +let ReservationService = ReservationService_1 = class ReservationService { + constructor(reservationRepo, counterService, formatService) { + this.reservationRepo = reservationRepo; + this.counterService = counterService; + this.formatService = formatService; + this.logger = new common_1.Logger(ReservationService_1.name); + this.RESERVATION_TTL_MINUTES = 5; + } + /** + * Reserve a document number (Phase 1 of Two-Phase Commit) + */ + async reserve(dto, userId, ipAddress, userAgent) { + // Build counter key + const counterKey = (0, counter_key_dto_1.buildCounterKey)({ + projectId: dto.projectId, + originatorOrgId: dto.originatorOrganizationId, + recipientOrgId: dto.recipientOrganizationId, + correspondenceTypeId: dto.correspondenceTypeId, + subTypeId: dto.subTypeId, + rfaTypeId: dto.rfaTypeId, + disciplineId: dto.disciplineId, + isRFA: dto.rfaTypeId !== undefined && dto.rfaTypeId > 0, + }); + // Increment counter + const sequence = await this.counterService.incrementCounter(counterKey); + // Format document number + const { previewNumber: documentNumber } = await this.formatService.format({ + ...dto, + sequence, + resetScope: counterKey.resetScope, + }); + // Create reservation + const token = (0, uuid_1.v4)(); + const expiresAt = new Date(Date.now() + this.RESERVATION_TTL_MINUTES * 60 * 1000); + const _reservation = await this.reservationRepo.save({ + token, + documentNumber, + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + expiresAt, + userId, + ipAddress, + userAgent, + projectId: dto.projectId, + correspondenceTypeId: dto.correspondenceTypeId, + originatorOrganizationId: dto.originatorOrganizationId, + recipientOrganizationId: dto.recipientOrganizationId || 0, + metadata: dto.metadata, + }); + this.logger.log(`Reserved: ${documentNumber} for user ${userId} (token: ${token})`); + return { + token, + documentNumber, + expiresAt, + }; + } + /** + * Confirm a reservation (Phase 2 of Two-Phase Commit) + */ + async confirm(dto, userId) { + const reservation = await this.reservationRepo.findOne({ + where: { + token: dto.token, + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + }, + }); + if (!reservation) { + throw new common_1.NotFoundException('Reservation not found or already used'); + } + // Check expiration + if (new Date() > reservation.expiresAt) { + await this.cancel(dto.token, userId, 'Expired'); + throw new common_1.GoneException('Reservation expired. Please reserve a new number.'); + } + // Confirm + reservation.status = document_number_reservation_entity_1.ReservationStatus.CONFIRMED; + reservation.documentId = dto.documentId ?? null; + reservation.confirmedAt = new Date(); + await this.reservationRepo.save(reservation); + this.logger.log(`Confirmed: ${reservation.documentNumber} → document ${dto.documentId}`); + return { + documentNumber: reservation.documentNumber, + confirmedAt: reservation.confirmedAt, + }; + } + /** + * Cancel a reservation + */ + async cancel(token, userId, reason) { + const reservation = await this.reservationRepo.findOne({ + where: { token }, + }); + if (reservation && reservation.status === document_number_reservation_entity_1.ReservationStatus.RESERVED) { + reservation.status = document_number_reservation_entity_1.ReservationStatus.CANCELLED; + reservation.cancelledAt = new Date(); + reservation.metadata = { + ...reservation.metadata, + cancelReason: reason, + cancelledBy: userId, + }; + await this.reservationRepo.save(reservation); + this.logger.log(`Cancelled: ${reservation.documentNumber} by user ${userId}`); + } + } + /** + * Cron job: Cleanup expired reservations every 5 minutes + * ใช้ try/catch เพื่อรองรับ transient ECONNRESET — TypeORM pool จะ reconnect อัตโนมัติใน tick ถัดไป + */ + async cleanupExpired() { + try { + const result = await this.reservationRepo + .createQueryBuilder() + .update() + .set({ + status: document_number_reservation_entity_1.ReservationStatus.CANCELLED, + cancelledAt: () => 'NOW()', + }) + .where('document_number_status = :status', { + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + }) + .andWhere('expires_at < NOW()') + .execute(); + if ((result.affected ?? 0) > 0) { + this.logger.log(`Cleaned up ${result.affected} expired reservations`); + } + } + catch (error) { + // ECONNRESET บน idle connection — TypeORM จะ reconnect pool ใน request ถัดไปโดยอัตโนมัติ + const msg = error instanceof Error ? error.message : String(error); + this.logger.warn(`[cleanupExpired] Transient DB error (will retry next tick): ${msg}`); + } + } + /** + * Get reservation by token + */ + async getByToken(token) { + return this.reservationRepo.findOne({ where: { token } }); + } +}; +exports.ReservationService = ReservationService; +__decorate([ + (0, schedule_1.Cron)('*/5 * * * *'), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", typeof (_d = typeof Promise !== "undefined" && Promise) === "function" ? _d : Object) +], ReservationService.prototype, "cleanupExpired", null); +exports.ReservationService = ReservationService = ReservationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_reservation_entity_1.DocumentNumberReservation)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _b : Object, typeof (_c = typeof format_service_1.FormatService !== "undefined" && format_service_1.FormatService) === "function" ? _c : Object]) +], ReservationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xccmVzZXJ2YXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLCtDQUF3QztBQUN4QywrQkFBb0M7QUFDcEMsdUdBR3dEO0FBU3hELHVEQUFtRDtBQUNuRCxxREFBaUQ7QUFDakQsNERBQXlEO0FBR2xELElBQU0sa0JBQWtCLDBCQUF4QixNQUFNLGtCQUFrQjtJQUk3QixZQUVFLGVBQThELEVBQ3RELGNBQThCLEVBQzlCLGFBQTRCO1FBRjVCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QztRQUN0RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFQckIsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLDRCQUF1QixHQUFHLENBQUMsQ0FBQztJQU8xQyxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUNYLEdBQXFCLEVBQ3JCLE1BQWMsRUFDZCxTQUFpQixFQUNqQixTQUFpQjtRQUVqQixvQkFBb0I7UUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBQSxpQ0FBZSxFQUFDO1lBQ2pDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixlQUFlLEVBQUUsR0FBRyxDQUFDLHdCQUF3QjtZQUM3QyxjQUFjLEVBQUUsR0FBRyxDQUFDLHVCQUF1QjtZQUMzQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsb0JBQW9CO1lBQzlDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1lBQzlCLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMs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YnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXHJlc2VydmF0aW9uLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEdvbmVFeGNlcHRpb24sXG4gIExvZ2dlcixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBDcm9uIH0gZnJvbSAnQG5lc3Rqcy9zY2hlZHVsZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7XG4gIERvY3VtZW50TnVtYmVyUmVzZXJ2YXRpb24sXG4gIFJlc2VydmF0aW9uU3RhdHVzLFxufSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItcmVzZXJ2YXRpb24uZW50aXR5JztcbmltcG9ydCB7XG4gIFJlc2VydmVOdW1iZXJEdG8sXG4gIFJlc2VydmVOdW1iZXJSZXNwb25zZUR0byxcbn0gZnJvbSAnLi4vZHRvL3Jlc2VydmUtbnVtYmVyLmR0byc7XG5pbXBvcnQge1xuICBDb25maXJtUmVzZXJ2YXRpb25EdG8sXG4gIENvbmZpcm1SZXNlcnZhdGlvblJlc3BvbnNlRHRvLFxufSBmcm9tICcuLi9kdG8vY29uZmlybS1yZXNlcnZhdGlvbi5kdG8nO1xuaW1wb3J0IHsgQ291bnRlclNlcnZpY2UgfSBmcm9tICcuL2NvdW50ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvdW50ZXJLZXkgfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlc2VydmF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihSZXNlcnZhdGlvblNlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUkVTRVJWQVRJT05fVFRMX01JTlVURVMgPSA1O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyUmVzZXJ2YXRpb24pXG4gICAgcHJpdmF0ZSByZXNlcnZhdGlvblJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJSZXNlcnZhdGlvbj4sXG4gICAgcHJpdmF0ZSBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogUmVzZXJ2ZSBhIGRvY3VtZW50IG51bWJlciAoUGhhc2UgMSBvZiBUd28tUGhhc2UgQ29tbWl0KVxuICAgKi9cbiAgYXN5bmMgcmVzZXJ2ZShcbiAgICBkdG86IFJlc2VydmVOdW1iZXJEdG8sXG4gICAgdXNlcklkOiBudW1iZXIsXG4gICAgaXBBZGRyZXNzOiBzdHJpbmcsXG4gICAgdXNlckFnZW50OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZXNlcnZlTnVtYmVyUmVzcG9uc2VEdG8+IHtcbiAgICAvLyBCdWlsZCBjb3VudGVyIGtleVxuICAgIGNvbnN0IGNvdW50ZXJLZXkgPSBidWlsZENvdW50ZXJLZXkoe1xuICAgICAgcHJvamVjdElkOiBkdG8ucHJvamVjdElkLFxuICAgICAgb3JpZ2luYXRvck9yZ0lkOiBkdG8ub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxuICAgICAgcmVjaXBpZW50T3JnSWQ6IGR0by5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcbiAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBkdG8uY29ycmVzcG9uZGVuY2VUeXBlSWQsXG4gICAgICBzdWJUeXBlSWQ6IGR0by5zdWJUeXBlSWQsXG4gICAgICByZmFUeXBlSWQ6IGR0by5yZmFUeXBlSWQsXG4gICAgICBkaXNjaXBsaW5lSWQ6IGR0by5kaXNjaXBsaW5lSWQsXG4gICAgICBpc1JGQTogZHRvLnJmYVR5cGVJZCAhPT0gdW5kZWZpbmVkICYmIGR0by5yZmFUeXBlSWQgPiAwLFxuICAgIH0pO1xuXG4gICAgLy8gSW5jcmVtZW50IGNvdW50ZXJcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuaW5jcmVtZW50Q291bnRlcihjb3VudGVyS2V5KTtcblxuICAgIC8vIEZvcm1hdCBkb2N1bWVudCBudW1iZXJcbiAgICBjb25zdCB7IHByZXZpZXdOdW1iZXI6IGRvY3VtZW50TnVtYmVyIH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KHtcbiAgICAgIC4uLmR0byxcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgcmVzZXRTY29wZTogY291bnRlcktleS5yZXNldFNjb3BlLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHJlc2VydmF0aW9uXG4gICAgY29uc3QgdG9rZW4gPSB1dWlkdjQoKTtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShcbiAgICAgIERhdGUubm93KCkgKyB0aGlzLlJFU0VSVkFUSU9OX1RUTF9NSU5VVEVTICogNjAgKiAxMDAwXG4gICAgKTtcblxuICAgIGNvbnN0IF9yZXNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLnNhdmUoe1xuICAgICAgdG9rZW4sXG4gICAgICBkb2N1bWVudE51bWJlcixcbiAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICBleHBpcmVzQXQsXG4gICAgICB1c2VySWQsXG4gICAgICBpcEFkZHJlc3MsXG4gICAgICB1c2VyQWdlbnQsXG4gICAgICBwcm9qZWN0SWQ6IGR0by5wcm9qZWN0SWQsXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogZHRvLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBkdG8ub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGR0by5yZWNpcGllbnRPcmdhbml6YXRpb25JZCB8fCAwLFxuICAgICAgbWV0YWRhdGE6IGR0by5tZXRhZGF0YSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBSZXNlcnZlZDogJHtkb2N1bWVudE51bWJlcn0gZm9yIHVzZXIgJHt1c2VySWR9ICh0b2tlbjogJHt0b2tlbn0pYFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBkb2N1bWVudE51bWJlcixcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSByZXNlcnZhdGlvbiAoUGhhc2UgMiBvZiBUd28tUGhhc2UgQ29tbWl0KVxuICAgKi9cbiAgYXN5bmMgY29uZmlybShcbiAgICBkdG86IENvbmZpcm1SZXNlcnZhdGlvbkR0byxcbiAgICB1c2VySWQ6IG51bWJlclxuICApOiBQcm9taXNlPENvbmZpcm1SZXNlcnZhdGlvblJlc3BvbnNlRHRvPiB7XG4gICAgY29uc3QgcmVzZXJ2YXRpb24gPSBhd2FpdCB0aGlzLnJlc2VydmF0aW9uUmVwby5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHRva2VuOiBkdG8udG9rZW4sXG4gICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNlcnZhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdSZXNlcnZhdGlvbiBub3QgZm91bmQgb3IgYWxyZWFkeSB1c2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZXhwaXJhdGlvblxuICAgIGlmIChuZXcgRGF0ZSgpID4gcmVzZXJ2YXRpb24uZXhwaXJlc0F0KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbmNlbChkdG8udG9rZW4sIHVzZXJJZCwgJ0V4cGlyZWQnKTtcbiAgICAgIHRocm93IG5ldyBHb25lRXhjZXB0aW9uKFxuICAgICAgICAnUmVzZXJ2YXRpb24gZXhwaXJlZC4gUGxlYXNlIHJlc2VydmUgYSBuZXcgbnVtYmVyLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlybVxuICAgIHJlc2VydmF0aW9uLnN0YXR1cyA9IFJlc2VydmF0aW9uU3RhdHVzLkNPTkZJUk1FRDtcbiAgICByZXNlcnZhdGlvbi5kb2N1bWVudElkID0gZHRvLmRvY3VtZW50SWQgPz8gbnVsbDtcbiAgICByZXNlcnZhdGlvbi5jb25maXJtZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgYXdhaXQgdGhpcy5yZXNlcnZhdGlvblJlcG8uc2F2ZShyZXNlcnZhdGlvbik7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgQ29uZmlybWVkOiAke3Jlc2VydmF0aW9uLmRvY3VtZW50TnVtYmVyfSDihpIgZG9jdW1lbnQgJHtkdG8uZG9jdW1lbnRJZH1gXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb2N1bWVudE51bWJlcjogcmVzZXJ2YXRpb24uZG9jdW1lbnROdW1iZXIsXG4gICAgICBjb25maXJtZWRBdDogcmVzZXJ2YXRpb24uY29uZmlybWVkQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYSByZXNlcnZhdGlvblxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKHRva2VuOiBzdHJpbmcsIHVzZXJJZDogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgdG9rZW4gfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNlcnZhdGlvbiAmJiByZXNlcnZhdGlvbi5zdGF0dXMgPT09IFJlc2VydmF0aW9uU3RhdHVzLlJFU0VSVkVEKSB7XG4gICAgICByZXNlcnZhdGlvbi5zdGF0dXMgPSBSZXNlcnZhdGlvblN0YXR1cy5DQU5DRUxMRUQ7XG4gICAgICByZXNlcnZhdGlvbi5jYW5jZWxsZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXNlcnZhdGlvbi5tZXRhZGF0YSA9IHtcbiAgICAgICAgLi4ucmVzZXJ2YXRpb24ubWV0YWRhdGEsXG4gICAgICAgIGNhbmNlbFJlYXNvbjogcmVhc29uLFxuICAgICAgICBjYW5jZWxsZWRCeTogdXNlcklkLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLnNhdmUocmVzZXJ2YXRpb24pO1xuXG4gICAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICAgIGBDYW5jZWxsZWQ6ICR7cmVzZXJ2YXRpb24uZG9jdW1lbnROdW1iZXJ9IGJ5IHVzZXIgJHt1c2VySWR9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JvbiBqb2I6IENsZWFudXAgZXhwaXJlZCByZXNlcnZhdGlvbnMgZXZlcnkgNSBtaW51dGVzXG4gICAqIOC5g+C4iuC5iSB0cnkvY2F0Y2gg4LmA4Lie4Li34LmI4Lit4Lij4Lit4LiH4Lij4Lix4LiaIHRyYW5zaWVudCBFQ09OTlJFU0VUIOKAlCBUeXBlT1JNIHBvb2wg4LiI4LiwIHJlY29ubmVjdCDguK3guLHguJXguYLguJnguKHguLHguJXguLTguYPguJkgdGljayDguJbguLHguJTguYTguJtcbiAgICovXG4gIEBDcm9uKCcqLzUgKiAqICogKicpXG4gIGFzeW5jIGNsZWFudXBFeHBpcmVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlc2VydmF0aW9uUmVwb1xuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgLnVwZGF0ZSgpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuQ0FOQ0VMTEVELFxuICAgICAgICAgIGNhbmNlbGxlZEF0OiAoKSA9PiAnTk9XKCknLFxuICAgICAgICB9KVxuICAgICAgICAud2hlcmUoJ2RvY3VtZW50X251bWJlcl9zdGF0dXMgPSA6c3RhdHVzJywge1xuICAgICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICAgIH0pXG4gICAgICAgIC5hbmRXaGVyZSgnZXhwaXJlc19hdCA8IE5PVygpJylcbiAgICAgICAgLmV4ZWN1dGUoKTtcblxuICAgICAgaWYgKChyZXN1bHQuYWZmZWN0ZWQgPz8gMCkgPiAwKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xlYW5lZCB1cCAke3Jlc3VsdC5hZmZlY3RlZH0gZXhwaXJlZCByZXNlcnZhdGlvbnNgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gRUNPTk5SRVNFVCDguJrguJkgaWRsZSBjb25uZWN0aW9uIOKAlCBUeXBlT1JNIOC4iOC4sCByZWNvbm5lY3QgcG9vbCDguYPguJkgcmVxdWVzdCDguJbguLHguJTguYTguJvguYLguJTguKLguK3guLHguJXguYLguJnguKHguLHguJXguLRcbiAgICAgIGNvbnN0IG1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBbY2xlYW51cEV4cGlyZWRdIFRyYW5zaWVudCBEQiBlcnJvciAod2lsbCByZXRyeSBuZXh0IHRpY2spOiAke21zZ31gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzZXJ2YXRpb24gYnkgdG9rZW5cbiAgICovXG4gIGFzeW5jIGdldEJ5VG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8RG9jdW1lbnROdW1iZXJSZXNlcnZhdGlvbiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNlcnZhdGlvblJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IHRva2VuIH0gfSk7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d.map new file mode 100644 index 0000000..fd0d4c6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/14/reservationservice_148599df25d56b76d0e452e06e0ff95d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\reservation.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\reservation.service.ts"],"sourcesContent":["import {\n Injectable,\n NotFoundException,\n GoneException,\n Logger,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Cron } from '@nestjs/schedule';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n DocumentNumberReservation,\n ReservationStatus,\n} from '../entities/document-number-reservation.entity';\nimport {\n ReserveNumberDto,\n ReserveNumberResponseDto,\n} from '../dto/reserve-number.dto';\nimport {\n ConfirmReservationDto,\n ConfirmReservationResponseDto,\n} from '../dto/confirm-reservation.dto';\nimport { CounterService } from './counter.service';\nimport { FormatService } from './format.service';\nimport { buildCounterKey } from '../dto/counter-key.dto';\n\n@Injectable()\nexport class ReservationService {\n private readonly logger = new Logger(ReservationService.name);\n private readonly RESERVATION_TTL_MINUTES = 5;\n\n constructor(\n @InjectRepository(DocumentNumberReservation)\n private reservationRepo: Repository,\n private counterService: CounterService,\n private formatService: FormatService\n ) {}\n\n /**\n * Reserve a document number (Phase 1 of Two-Phase Commit)\n */\n async reserve(\n dto: ReserveNumberDto,\n userId: number,\n ipAddress: string,\n userAgent: string\n ): Promise {\n // Build counter key\n const counterKey = buildCounterKey({\n projectId: dto.projectId,\n originatorOrgId: dto.originatorOrganizationId,\n recipientOrgId: dto.recipientOrganizationId,\n correspondenceTypeId: dto.correspondenceTypeId,\n subTypeId: dto.subTypeId,\n rfaTypeId: dto.rfaTypeId,\n disciplineId: dto.disciplineId,\n isRFA: dto.rfaTypeId !== undefined && dto.rfaTypeId > 0,\n });\n\n // Increment counter\n const sequence = await this.counterService.incrementCounter(counterKey);\n\n // Format document number\n const { previewNumber: documentNumber } = await this.formatService.format({\n ...dto,\n sequence,\n resetScope: counterKey.resetScope,\n });\n\n // Create reservation\n const token = uuidv4();\n const expiresAt = new Date(\n Date.now() + this.RESERVATION_TTL_MINUTES * 60 * 1000\n );\n\n const _reservation = await this.reservationRepo.save({\n token,\n documentNumber,\n status: ReservationStatus.RESERVED,\n expiresAt,\n userId,\n ipAddress,\n userAgent,\n projectId: dto.projectId,\n correspondenceTypeId: dto.correspondenceTypeId,\n originatorOrganizationId: dto.originatorOrganizationId,\n recipientOrganizationId: dto.recipientOrganizationId || 0,\n metadata: dto.metadata,\n });\n\n this.logger.log(\n `Reserved: ${documentNumber} for user ${userId} (token: ${token})`\n );\n\n return {\n token,\n documentNumber,\n expiresAt,\n };\n }\n\n /**\n * Confirm a reservation (Phase 2 of Two-Phase Commit)\n */\n async confirm(\n dto: ConfirmReservationDto,\n userId: number\n ): Promise {\n const reservation = await this.reservationRepo.findOne({\n where: {\n token: dto.token,\n status: ReservationStatus.RESERVED,\n },\n });\n\n if (!reservation) {\n throw new NotFoundException('Reservation not found or already used');\n }\n\n // Check expiration\n if (new Date() > reservation.expiresAt) {\n await this.cancel(dto.token, userId, 'Expired');\n throw new GoneException(\n 'Reservation expired. Please reserve a new number.'\n );\n }\n\n // Confirm\n reservation.status = ReservationStatus.CONFIRMED;\n reservation.documentId = dto.documentId ?? null;\n reservation.confirmedAt = new Date();\n await this.reservationRepo.save(reservation);\n\n this.logger.log(\n `Confirmed: ${reservation.documentNumber} → document ${dto.documentId}`\n );\n\n return {\n documentNumber: reservation.documentNumber,\n confirmedAt: reservation.confirmedAt,\n };\n }\n\n /**\n * Cancel a reservation\n */\n async cancel(token: string, userId: number, reason?: string): Promise {\n const reservation = await this.reservationRepo.findOne({\n where: { token },\n });\n\n if (reservation && reservation.status === ReservationStatus.RESERVED) {\n reservation.status = ReservationStatus.CANCELLED;\n reservation.cancelledAt = new Date();\n reservation.metadata = {\n ...reservation.metadata,\n cancelReason: reason,\n cancelledBy: userId,\n };\n await this.reservationRepo.save(reservation);\n\n this.logger.log(\n `Cancelled: ${reservation.documentNumber} by user ${userId}`\n );\n }\n }\n\n /**\n * Cron job: Cleanup expired reservations every 5 minutes\n * ใช้ try/catch เพื่อรองรับ transient ECONNRESET — TypeORM pool จะ reconnect อัตโนมัติใน tick ถัดไป\n */\n @Cron('*/5 * * * *')\n async cleanupExpired(): Promise {\n try {\n const result = await this.reservationRepo\n .createQueryBuilder()\n .update()\n .set({\n status: ReservationStatus.CANCELLED,\n cancelledAt: () => 'NOW()',\n })\n .where('document_number_status = :status', {\n status: ReservationStatus.RESERVED,\n })\n .andWhere('expires_at < NOW()')\n .execute();\n\n if ((result.affected ?? 0) > 0) {\n this.logger.log(`Cleaned up ${result.affected} expired reservations`);\n }\n } catch (error: unknown) {\n // ECONNRESET บน idle connection — TypeORM จะ reconnect pool ใน request ถัดไปโดยอัตโนมัติ\n const msg = error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `[cleanupExpired] Transient DB error (will retry next tick): ${msg}`\n );\n }\n }\n\n /**\n * Get reservation by token\n */\n async getByToken(token: string): Promise {\n return this.reservationRepo.findOne({ where: { token } });\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5 new file mode 100644 index 0000000..d9114fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5 @@ -0,0 +1,148 @@ +6df7af8f4ab890dd39cf81713b44adaf +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevision = void 0; +// File: src/modules/correspondence/entities/correspondence-revision.entity.ts +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("../../rfa/entities/rfa-revision.entity"); +const correspondence_entity_1 = require("./correspondence.entity"); +const correspondence_status_entity_1 = require("./correspondence-status.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let CorrespondenceRevision = class CorrespondenceRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.CorrespondenceRevision = CorrespondenceRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', nullable: true, length: 10 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_current', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_status_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "statusId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 500 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], CorrespondenceRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_project_id', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))", + nullable: true, + }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "vRefProjectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_doc_subtype', + type: 'varchar', + length: 50, + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))", + nullable: true, + }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "vRefType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], CorrespondenceRevision.prototype, "documentDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], CorrespondenceRevision.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], CorrespondenceRevision.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'due_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], CorrespondenceRevision.prototype, "dueDate", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], CorrespondenceRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_f = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _f : Object) +], CorrespondenceRevision.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_status_entity_1.CorrespondenceStatus), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_status_id' }), + __metadata("design:type", typeof (_g = typeof correspondence_status_entity_1.CorrespondenceStatus !== "undefined" && correspondence_status_entity_1.CorrespondenceStatus) === "function" ? _g : Object) +], CorrespondenceRevision.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], CorrespondenceRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.correspondenceRevision), + __metadata("design:type", typeof (_j = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _j : Object) +], CorrespondenceRevision.prototype, "rfaRevision", void 0); +exports.CorrespondenceRevision = CorrespondenceRevision = __decorate([ + (0, typeorm_1.Entity)('correspondence_revisions') + // ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น + , + (0, typeorm_1.Index)('idx_corr_rev_v_project', ['vRefProjectId']), + (0, typeorm_1.Index)('idx_corr_rev_v_type', ['vRefType']) +], CorrespondenceRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDhFQUE4RTtBQUM5RSxxQ0FTaUI7QUFDakIsZ0ZBQXFFO0FBQ3JFLG1FQUF5RDtBQUN6RCxpRkFBc0U7QUFDdEUsaUVBQXVEO0FBQ3ZELGdGQUEyRTtBQUMzRSx5REFBNEM7QUFNckMsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxpQ0FBYztDQWdHekQsQ0FBQTtBQWhHWSx3REFBc0I7QUFHakM7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7a0RBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztnRUFDWjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4REFDWjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7NkRBQ3hDO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3lEQUMzQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDOzt3REFDM0I7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3VEQUNQO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEs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RSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFEQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO2tEQUN6RCxpQ0FBVyxvQkFBWCxpQ0FBVzsyREFBQztpQ0EvRmYsc0JBQXNCO0lBSmxDLElBQUEsZ0JBQU0sRUFBQywwQkFBMEIsQ0FBQztJQUNuQyxnRUFBZ0U7O0lBQy9ELElBQUEsZUFBSyxFQUFDLHdCQUF3QixFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsSUFBQSxlQUFLLEVBQUMscUJBQXFCLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztHQUM5QixzQkFBc0IsQ0FnR2xDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJldmlzaW9uLmVudGl0eS50c1xuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgSW5kZXgsXG4gIE9uZVRvT25lLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFJmYVJldmlzaW9uIH0gZnJvbSAnLi4vLi4vcmZhL2VudGl0aWVzL3JmYS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9ucycpXG4vLyDinIUg4LmA4Lie4Li04LmI4LihIEluZGV4IOC4quC4s+C4q+C4o+C4seC4miBWaXJ0dWFsIENvbHVtbnMg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJIFNlYXJjaCDguYDguKPguYfguKfguILguLbguYnguJlcbkBJbmRleCgnaWR4X2NvcnJfcmV2X3ZfcHJvamVjdCcsIFsndlJlZlByb2plY3RJZCddKVxuQEluZGV4KCdpZHhfY29ycl9yZXZfdl90eXBlJywgWyd2UmVmVHlwZSddKVxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbnVtYmVyJyB9KVxuICByZXZpc2lvbk51bWJlciE6IG51bWJlcjsgLy8gMCwgMSwgMi4uLlxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbGFiZWwnLCBudWxsYWJsZTogdHJ1ZSwgbGVuZ3RoOiAxMCB9KVxuICByZXZpc2lvbkxhYmVsPzogc3RyaW5nOyAvLyBBLCBCLCAwMDEuLi5cblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2N1cnJlbnQnLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBpc0N1cnJlbnQhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2Vfc3RhdHVzX2lkJyB9KVxuICBzdGF0dXNJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiA1MDAgfSlcbiAgc3ViamVjdCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2Rlc2NyaXB0aW9uJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBib2R5Pzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlbWFya3M/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGV0YWlscz86IG9iamVjdDsgLy8gRHluYW1pYyBKU09OIOKAlCB0eXBlZCBhcyBgb2JqZWN0YCBwZXIgVHlwZU9STSBKU09OIGNvbHVtbiBjb252ZW50aW9uIChuby1hbnksIEFEUi0wMTkpXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzY2hlbWFfdmVyc2lvbicsIGRlZmF1bHQ6IDEgfSlcbiAgc2NoZW1hVmVyc2lvbiE6IG51bWJlcjtcblxuICAvLyDinIUgW05ld10gVmlydHVhbCBDb2x1bW46IOC4lOC4tuC4hyBQcm9qZWN0IElEIOC4iOC4suC4gSBKU09OIGRldGFpbHNcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3ZfcmVmX3Byb2plY3RfaWQnLFxuICAgIHR5cGU6ICdpbnQnLFxuICAgIGdlbmVyYXRlZFR5cGU6ICdWSVJUVUFMJyxcbiAgICBhc0V4cHJlc3Npb246IFwiSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5wcm9qZWN0SWQnKSlcIixcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgdlJlZlByb2plY3RJZD86IG51bWJlcjtcblxuICAvLyDinIUgW05ld10gVmlydHVhbCBDb2x1bW46IOC4lOC4tuC4hyBEb2N1bWVudCBTdWJUeXBlIOC4iOC4suC4gSBKU09OIGRldGFpbHNcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3ZfZG9jX3N1YnR5cGUnLFxuICAgIHR5cGU6ICd2YXJjaGFyJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGdlbmVyYXRlZFR5cGU6ICdWSVJUVUFMJyxcbiAgICBhc0V4cHJlc3Npb246IFwiSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5zdWJUeXBlJykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZUeXBlPzogc3RyaW5nO1xuXG4gIC8vIERhdGVzXG4gIEBDb2x1bW4oeyBuYW1lOiAnZG9jdW1lbnRfZGF0ZScsIHR5cGU6ICdkYXRlJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZG9jdW1lbnREYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzc3VlZF9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgaXNzdWVkRGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZWNlaXZlZF9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmVjZWl2ZWREYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2R1ZV9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZHVlRGF0ZT86IERhdGU7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2UsIChjb3JyKSA9PiBjb3JyLnJldmlzaW9ucywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZT86IENvcnJlc3BvbmRlbmNlO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2VTdGF0dXMpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3N0YXR1c19pZCcgfSlcbiAgc3RhdHVzPzogQ29ycmVzcG9uZGVuY2VTdGF0dXM7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JyB9KVxuICBjcmVhdG9yPzogVXNlcjtcblxuICAvLyBBZGRlZCBpbnZlcnNlIHJlbGF0aW9uIGZvciBDVEkgbWFwcGluZyB0byBzdWJjbGFzc2VzIChSRkEpXG4gIEBPbmVUb09uZSgoKSA9PiBSZmFSZXZpc2lvbiwgKHJmYVJldikgPT4gcmZhUmV2LmNvcnJlc3BvbmRlbmNlUmV2aXNpb24pXG4gIHJmYVJldmlzaW9uPzogUmZhUmV2aXNpb247XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5.map new file mode 100644 index 0000000..fe5f3c0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1b/correspondencerevisionentity_1bfc5c59654699335fcf2bd30c19fda5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts"],"sourcesContent":["// File: src/modules/correspondence/entities/correspondence-revision.entity.ts\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n Index,\n OneToOne,\n} from 'typeorm';\nimport { RfaRevision } from '../../rfa/entities/rfa-revision.entity';\nimport { Correspondence } from './correspondence.entity';\nimport { CorrespondenceStatus } from './correspondence-status.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('correspondence_revisions')\n// ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น\n@Index('idx_corr_rev_v_project', ['vRefProjectId'])\n@Index('idx_corr_rev_v_type', ['vRefType'])\nexport class CorrespondenceRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_id' })\n correspondenceId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // 0, 1, 2...\n\n @Column({ name: 'revision_label', nullable: true, length: 10 })\n revisionLabel?: string; // A, B, 001...\n\n @Column({ name: 'is_current', default: false })\n isCurrent!: boolean;\n\n @Column({ name: 'correspondence_status_id' })\n statusId!: number;\n\n @Column({ length: 500 })\n subject!: string;\n\n @Column({ name: 'description', type: 'text', nullable: true })\n description?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ [New] Virtual Column: ดึง Project ID จาก JSON details\n @Column({\n name: 'v_ref_project_id',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))\",\n nullable: true,\n })\n vRefProjectId?: number;\n\n // ✅ [New] Virtual Column: ดึง Document SubType จาก JSON details\n @Column({\n name: 'v_doc_subtype',\n type: 'varchar',\n length: 50,\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))\",\n nullable: true,\n })\n vRefType?: string;\n\n // Dates\n @Column({ name: 'document_date', type: 'date', nullable: true })\n documentDate?: Date;\n\n @Column({ name: 'issued_date', type: 'datetime', nullable: true })\n issuedDate?: Date;\n\n @Column({ name: 'received_date', type: 'datetime', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'due_date', type: 'datetime', nullable: true })\n dueDate?: Date;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n // Relations\n @ManyToOne(() => Correspondence, (corr) => corr.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'correspondence_id' })\n correspondence?: Correspondence;\n\n @ManyToOne(() => CorrespondenceStatus)\n @JoinColumn({ name: 'correspondence_status_id' })\n status?: CorrespondenceStatus;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Added inverse relation for CTI mapping to subclasses (RFA)\n @OneToOne(() => RfaRevision, (rfaRev) => rfaRev.correspondenceRevision)\n rfaRevision?: RfaRevision;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b new file mode 100644 index 0000000..be944c4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b @@ -0,0 +1,108 @@ +a58e113d51c4a144640cb12a81ce0c6f +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +class ImportCorrespondenceDto { +} +exports.ImportCorrespondenceDto = ImportCorrespondenceDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "subject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "category", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "sourceFilePath", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "aiConfidence", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], ImportCorrespondenceDto.prototype, "aiIssues", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "migratedBy", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "batchId", void 0); +__decorate([ + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], ImportCorrespondenceDto.prototype, "details", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "issuedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "receivedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "documentDate", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "disciplineId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "senderId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "receiverId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "body", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQU15QjtBQUV6QixNQUFhLHVCQUF1QjtDQXVFbkM7QUF2RUQsMERBdUVDO0FBcEVDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUl4QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFJakI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUl4QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7aUVBQ2E7QUFJMUI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBR3RCO0lBREMsSUFBQSw0QkFBVSxHQUFFOzt5REFDd0I7QUFJckM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzJEQUNPO0FBSXBCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDSTtBQUlqQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTtrREFDSCxNQUFNLG9CQUFOLE1BQU07d0RBQWtCO0FBSWxDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzswREFDTTtBQUluQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7MkRBQ087QUFJcEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBSXRCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzs2REFDUztBQUl0QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFJdEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsyREFDTztBQUlwQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7cURBQ0MiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJc1N0cmluZyxcclxuICBJc05vdEVtcHR5LFxyXG4gIElzT3B0aW9uYWwsXHJcbiAgSXNOdW1iZXIsXHJcbiAgSXNPYmplY3QsXHJcbn0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB7XHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHN1YmplY3QhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIGNhdGVnb3J5ITogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBzb3VyY2VGaWxlUGF0aD86IHN0cmluZztcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgdGVtcEF0dGFjaG1lbnRJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgYWlDb25maWRlbmNlPzogbnVtYmVyO1xyXG5cclxuICBASXNPcHRpb25hbCgpXHJcbiAgYWlJc3N1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICBtaWdyYXRlZEJ5ITogc3RyaW5nOyAvLyBcIlNZU1RFTV9JTVBPUlRcIlxyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICBiYXRjaElkITogc3RyaW5nO1xyXG5cclxuICBASXNPYmplY3QoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHByb2plY3RJZCE6IG51bWJlcjtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgaXNzdWVkRGF0ZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkb2N1bWVudERhdGU/OiBzdHJpbmc7XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGRpc2NpcGxpbmVJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgc2VuZGVySWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHJlY2VpdmVySWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGJvZHk/OiBzdHJpbmc7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b.map new file mode 100644 index 0000000..f6b4cc4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/importcorrespondencedto_1ffe9eb57290f42ef24d35e12ae6c00b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\import-correspondence.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAMyB;AAEzB,MAAa,uBAAuB;CAuEnC;AAvED,0DAuEC;AApEC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;iEACa;AAI1B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAGtB;IADC,IAAA,4BAAU,GAAE;;yDACwB;AAIrC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;wDAAkB;AAIlC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0DACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\import-correspondence.dto.ts"],"sourcesContent":["import {\r\n IsString,\r\n IsNotEmpty,\r\n IsOptional,\r\n IsNumber,\r\n IsObject,\r\n} from 'class-validator';\r\n\r\nexport class ImportCorrespondenceDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n documentNumber!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n subject!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n category!: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n sourceFilePath?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n tempAttachmentId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n aiConfidence?: number;\r\n\r\n @IsOptional()\r\n aiIssues?: Record[];\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n migratedBy!: string; // \"SYSTEM_IMPORT\"\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n batchId!: string;\r\n\r\n @IsObject()\r\n @IsOptional()\r\n details?: Record;\r\n\r\n @IsNumber()\r\n @IsNotEmpty()\r\n projectId!: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n issuedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n receivedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n documentDate?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n disciplineId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n senderId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n receiverId?: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n body?: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20 new file mode 100644 index 0000000..0193139 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20 @@ -0,0 +1,45 @@ +a7dbd19c0168496ba551c2f58fe007d4 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaStatusCode = void 0; +const typeorm_1 = require("typeorm"); +let RfaStatusCode = class RfaStatusCode { +}; +exports.RfaStatusCode = RfaStatusCode; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaStatusCode.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', length: 20, unique: true }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_name', length: 100 }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "statusName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], RfaStatusCode.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaStatusCode.prototype, "isActive", void 0); +exports.RfaStatusCode = RfaStatusCode = __decorate([ + (0, typeorm_1.Entity)('rfa_status_codes') +], RfaStatusCode); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXN0YXR1cy1jb2RlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUU7QUFHMUQsSUFBTSxhQUFhLEdBQW5CLE1BQU0sYUFBYTtDQWtCekIsQ0FBQTtBQWxCWSxzQ0FBYTtBQUV4QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7O3lDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDdEM7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7aURBQ3pCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztnREFDeEI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQzFCO3dCQWpCUixhQUFhO0lBRHpCLElBQUEsZ0JBQU0sRUFBQyxrQkFBa0IsQ0FBQztHQUNkLGFBQWEsQ0FrQnpCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHJmYVxcZW50aXRpZXNcXHJmYS1zdGF0dXMtY29kZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLCBDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgncmZhX3N0YXR1c19jb2RlcycpXG5leHBvcnQgY2xhc3MgUmZhU3RhdHVzQ29kZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGF0dXNfY29kZScsIGxlbmd0aDogMjAsIHVuaXF1ZTogdHJ1ZSB9KVxuICBzdGF0dXNDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3RhdHVzX25hbWUnLCBsZW5ndGg6IDEwMCB9KVxuICBzdGF0dXNOYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc29ydF9vcmRlcicsIGRlZmF1bHQ6IDAgfSlcbiAgc29ydE9yZGVyITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20.map new file mode 100644 index 0000000..a2133bf --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/rfastatuscodeentity_22da50512210e696d364e85856ebeb20.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-status-code.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAkBzB,CAAA;AAlBY,sCAAa;AAExB;IADC,IAAA,gCAAsB,GAAE;;yCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;iDACtC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;iDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;gDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CAC1B;wBAjBR,aAAa;IADzB,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,aAAa,CAkBzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-status-code.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('rfa_status_codes')\nexport class RfaStatusCode {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'status_code', length: 20, unique: true })\n statusCode!: string;\n\n @Column({ name: 'status_name', length: 100 })\n statusName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729 new file mode 100644 index 0000000..455e44f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729 @@ -0,0 +1,33 @@ +c1ad1847c806f3f056d0137b3a0ec189 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ParseUuidPipe = void 0; +const common_1 = require("@nestjs/common"); +const uuid_1 = require("uuid"); +/** + * Validates that a route parameter is a valid UUID string. + * Accepts any UUID version (v1 from DB DEFAULT, v7 from app generation). + * + * Usage: @Param('uuid', ParseUuidPipe) uuid: string + * + * @see ADR-019 Hybrid Identifier Strategy + */ +let ParseUuidPipe = class ParseUuidPipe { + transform(value) { + if (!(0, uuid_1.validate)(value)) { + throw new common_1.BadRequestException(`Invalid UUID format: ${value}`); + } + return value.toLowerCase(); + } +}; +exports.ParseUuidPipe = ParseUuidPipe; +exports.ParseUuidPipe = ParseUuidPipe = __decorate([ + (0, common_1.Injectable)() +], ParseUuidPipe); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxwaXBlc1xccGFyc2UtdXVpZC5waXBlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDJDQUFnRjtBQUNoRiwrQkFBZ0Q7QUFFaEQ7Ozs7Ozs7R0FPRztBQUVJLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFDeEIsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLElBQUEsZUFBWSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLDRCQUFtQixDQUFDLHdCQUF3QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0YsQ0FBQTtBQVBZLHNDQUFhO3dCQUFiLGFBQWE7SUFEekIsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsYUFBYSxDQU96QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXHBpcGVzXFxwYXJzZS11dWlkLnBpcGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZVRyYW5zZm9ybSwgSW5qZWN0YWJsZSwgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IHZhbGlkYXRlIGFzIHV1aWRWYWxpZGF0ZSB9IGZyb20gJ3V1aWQnO1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGEgcm91dGUgcGFyYW1ldGVyIGlzIGEgdmFsaWQgVVVJRCBzdHJpbmcuXG4gKiBBY2NlcHRzIGFueSBVVUlEIHZlcnNpb24gKHYxIGZyb20gREIgREVGQVVMVCwgdjcgZnJvbSBhcHAgZ2VuZXJhdGlvbikuXG4gKlxuICogVXNhZ2U6IEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZ1xuICpcbiAqIEBzZWUgQURSLTAxOSBIeWJyaWQgSWRlbnRpZmllciBTdHJhdGVneVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGFyc2VVdWlkUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm08c3RyaW5nPiB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXV1aWRWYWxpZGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBJbnZhbGlkIFVVSUQgZm9ybWF0OiAke3ZhbHVlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729.map new file mode 100644 index 0000000..11d8858 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/27/parseuuidpipe_27fae4b4c7eeaf6e9415dda45a125729.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.ts","mappings":";;;;;;;;;AAAA,2CAAgF;AAChF,+BAAgD;AAEhD;;;;;;;GAOG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,IAAA,eAAY,EAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,4BAAmB,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AAPY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAOzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.ts"],"sourcesContent":["import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';\nimport { validate as uuidValidate } from 'uuid';\n\n/**\n * Validates that a route parameter is a valid UUID string.\n * Accepts any UUID version (v1 from DB DEFAULT, v7 from app generation).\n *\n * Usage: @Param('uuid', ParseUuidPipe) uuid: string\n *\n * @see ADR-019 Hybrid Identifier Strategy\n */\n@Injectable()\nexport class ParseUuidPipe implements PipeTransform {\n transform(value: string): string {\n if (!uuidValidate(value)) {\n throw new BadRequestException(`Invalid UUID format: ${value}`);\n }\n return value.toLowerCase();\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802 new file mode 100644 index 0000000..54e73b6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802 @@ -0,0 +1,13 @@ +871d624c7966c65172d651a56a6d6b59 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RequirePermission = exports.PERMISSIONS_KEY = void 0; +const common_1 = require("@nestjs/common"); +exports.PERMISSIONS_KEY = 'permissions'; // Changed from PERMISSION_KEY +/** + * Decorator สำหรับกำหนด permissions ที่จำเป็นสำหรับ route + * รองรับ multiple permissions (user ต้องมี ALL permissions) + */ +const RequirePermission = (...permissions) => (0, common_1.SetMetadata)(exports.PERMISSIONS_KEY, permissions); +exports.RequirePermission = RequirePermission; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxyZXF1aXJlLXBlcm1pc3Npb24uZGVjb3JhdG9yLnRzIiwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUE2QztBQUVoQyxRQUFBLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQyw4QkFBOEI7QUFFNUU7OztHQUdHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsV0FBcUIsRUFBRSxFQUFFLENBQzVELElBQUEsb0JBQVcsRUFBQyx1QkFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRC9CLFFBQUEsaUJBQWlCLHFCQUNjIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZGVjb3JhdG9yc1xccmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXRNZXRhZGF0YSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05TX0tFWSA9ICdwZXJtaXNzaW9ucyc7IC8vIENoYW5nZWQgZnJvbSBQRVJNSVNTSU9OX0tFWVxuXG4vKipcbiAqIERlY29yYXRvciDguKrguLPguKvguKPguLHguJrguIHguLPguKvguJnguJQgcGVybWlzc2lvbnMg4LiX4Li14LmI4LiI4Liz4LmA4Lib4LmH4LiZ4Liq4Liz4Lir4Lij4Lix4LiaIHJvdXRlXG4gKiDguKPguK3guIfguKPguLHguJogbXVsdGlwbGUgcGVybWlzc2lvbnMgKHVzZXIg4LiV4LmJ4Lit4LiH4Lih4Li1IEFMTCBwZXJtaXNzaW9ucylcbiAqL1xuZXhwb3J0IGNvbnN0IFJlcXVpcmVQZXJtaXNzaW9uID0gKC4uLnBlcm1pc3Npb25zOiBzdHJpbmdbXSkgPT5cbiAgU2V0TWV0YWRhdGEoUEVSTUlTU0lPTlNfS0VZLCBwZXJtaXNzaW9ucyk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802.map new file mode 100644 index 0000000..3837c1c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/requirepermissiondecorator_2b92d6ae24da3e0d039d542d652c8802.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\require-permission.decorator.ts","mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,eAAe,GAAG,aAAa,CAAC,CAAC,8BAA8B;AAE5E;;;GAGG;AACI,MAAM,iBAAiB,GAAG,CAAC,GAAG,WAAqB,EAAE,EAAE,CAC5D,IAAA,oBAAW,EAAC,uBAAe,EAAE,WAAW,CAAC,CAAC;AAD/B,QAAA,iBAAiB,qBACc","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\require-permission.decorator.ts"],"sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\nexport const PERMISSIONS_KEY = 'permissions'; // Changed from PERMISSION_KEY\n\n/**\n * Decorator สำหรับกำหนด permissions ที่จำเป็นสำหรับ route\n * รองรับ multiple permissions (user ต้องมี ALL permissions)\n */\nexport const RequirePermission = (...permissions: string[]) =>\n SetMetadata(PERMISSIONS_KEY, permissions);\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2 new file mode 100644 index 0000000..08713bd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2 @@ -0,0 +1,89 @@ +10eaccf67b98165b4253a699cd422108 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateV1State = void 0; +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +const _state = {}; +function v1(options, buf, offset) { + let bytes; + const isV6 = options?._v6 ?? false; + if (options) { + const optionsKeys = Object.keys(options); + if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') { + options = undefined; + } + } + if (options) { + bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset); + } + else { + const now = Date.now(); + const rnds = (0, rng_js_1.default)(); + updateV1State(_state, now, rnds); + bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset); + } + return buf ?? (0, stringify_js_1.unsafeStringify)(bytes); +} +function updateV1State(state, now, rnds) { + state.msecs ??= -Infinity; + state.nsecs ??= 0; + if (now === state.msecs) { + state.nsecs++; + if (state.nsecs >= 10000) { + state.node = undefined; + state.nsecs = 0; + } + } + else if (now > state.msecs) { + state.nsecs = 0; + } + else if (now < state.msecs) { + state.node = undefined; + } + if (!state.node) { + state.node = rnds.slice(10, 16); + state.node[0] |= 0x01; + state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff; + } + state.msecs = now; + return state; +} +exports.updateV1State = updateV1State; +function v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + nsecs ??= 0; + clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff; + node ??= rnds.slice(10, 16); + msecs += 12219292800000; + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + buf[offset++] = (tl >>> 24) & 0xff; + buf[offset++] = (tl >>> 16) & 0xff; + buf[offset++] = (tl >>> 8) & 0xff; + buf[offset++] = tl & 0xff; + const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff; + buf[offset++] = (tmh >>> 8) & 0xff; + buf[offset++] = tmh & 0xff; + buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10; + buf[offset++] = (tmh >>> 16) & 0xff; + buf[offset++] = (clockseq >>> 8) | 0x80; + buf[offset++] = clockseq & 0xff; + for (let n = 0; n < 6; ++n) { + buf[offset++] = node[n]; + } + return buf; +} +exports.default = v1; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjEuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUM1QixJQUFJLEtBQUssQ0FBQztJQUNWLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3ZELE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxF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QUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUMzQixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUM1QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwZGF0ZVYxU3RhdGUgPSB2b2lkIDA7XG5jb25zdCBybmdfanNfMSA9IHJlcXVpcmUoXCIuL3JuZy5qc1wiKTtcbmNvbnN0IHN0cmluZ2lmeV9qc18xID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuY29uc3QgX3N0YXRlID0ge307XG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIGxldCBieXRlcztcbiAgICBjb25zdCBpc1Y2ID0gb3B0aW9ucz8uX3Y2ID8/IGZhbHNlO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zS2V5cy5sZW5ndGggPT09IDEgJiYgb3B0aW9uc0tleXNbMF0gPT09ICdfdjYnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGJ5dGVzID0gdjFCeXRlcyhvcHRpb25zLnJhbmRvbSA/PyBvcHRpb25zLnJuZz8uKCkgPz8gKDAsIHJuZ19qc18xLmRlZmF1bHQpKCksIG9wdGlvbnMubXNlY3MsIG9wdGlvbnMubnNlY3MsIG9wdGlvbnMuY2xvY2tzZXEsIG9wdGlvbnMubm9kZSwgYnVmLCBvZmZzZXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgcm5kcyA9ICgwLCBybmdfanNfMS5kZWZhdWx0KSgpO1xuICAgICAgICB1cGRhdGVWMVN0YXRlKF9zdGF0ZSwgbm93LCBybmRzKTtcbiAgICAgICAgYnl0ZXMgPSB2MUJ5dGVzKHJuZHMsIF9zdGF0ZS5tc2VjcywgX3N0YXRlLm5zZWNzLCBpc1Y2ID8gdW5kZWZpbmVkIDogX3N0YXRlLmNsb2Nrc2VxLCBpc1Y2ID8gdW5kZWZpbmVkIDogX3N0YXRlLm5vZGUsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZiA/PyAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG59XG5mdW5jdGlvbiB1cGRhdGVWMVN0YXRlKHN0YXRlLCBub3csIHJuZHMpIHtcbiAgICBzdGF0ZS5tc2VjcyA/Pz0gLUluZmluaXR5O1xuICAgIHN0YXRlLm5zZWNzID8/PSAwO1xuICAgIGlmIChub3cgPT09IHN0YXRlLm1zZWNzKSB7XG4gICAgICAgIHN0YXRlLm5zZWNzKys7XG4gICAgICAgIGlmIChzdGF0ZS5uc2VjcyA+PSAxMDAwMCkge1xuICAgICAgICAgICAgc3RhdGUubm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN0YXRlLm5zZWNzID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub3cgPiBzdGF0ZS5tc2Vjcykge1xuICAgICAgICBzdGF0ZS5uc2VjcyA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vdyA8IHN0YXRlLm1zZWNzKSB7XG4gICAgICAgIHN0YXRlLm5vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghc3RhdGUubm9kZSkge1xuICAgICAgICBzdGF0ZS5ub2RlID0gcm5kcy5zbGljZSgxMCwgMTYpO1xuICAgICAgICBzdGF0ZS5ub2RlWzBdIHw9IDB4MDE7XG4gICAgICAgIHN0YXRlLmNsb2Nrc2VxID0gKChybmRzWzhdIDw8IDgpIHwgcm5kc1s5XSkgJiAweDNmZmY7XG4gICAgfVxuICAgIHN0YXRlLm1zZWNzID0gbm93O1xuICAgIHJldHVybiBzdGF0ZTtcbn1cbmV4cG9ydHMudXBkYXRlVjFTdGF0ZSA9IHVwZGF0ZVYxU3RhdGU7XG5mdW5jdGlvbiB2MUJ5dGVzKHJuZHMsIG1zZWNzLCBuc2VjcywgY2xvY2tzZXEsIG5vZGUsIGJ1Ziwgb2Zmc2V0ID0gMCkge1xuICAgIGlmIChybmRzLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tIGJ5dGVzIGxlbmd0aCBtdXN0IGJlID49IDE2Jyk7XG4gICAgfVxuICAgIGlmICghYnVmKSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDE2ID4gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVVSUQgYnl0ZSByYW5nZSAke29mZnNldH06JHtvZmZzZXQgKyAxNX0gaXMgb3V0IG9mIGJ1ZmZlciBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtc2VjcyA/Pz0gRGF0ZS5ub3coKTtcbiAgICBuc2VjcyA/Pz0gMDtcbiAgICBjbG9ja3NlcSA/Pz0gKChybmRzWzhdIDw8IDgpIHwgcm5kc1s5XSkgJiAweDNmZmY7XG4gICAgbm9kZSA/Pz0gcm5kcy5zbGljZSgxMCwgMTYpO1xuICAgIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwO1xuICAgIGNvbnN0IHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAodGwgPj4+IDI0KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9ICh0bCA+Pj4gMTYpICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gKHRsID4+PiA4KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IHRsICYgMHhmZjtcbiAgICBjb25zdCB0bWggPSAoKG1zZWNzIC8gMHgxMDAwMDAwMDApICogMTAwMDApICYgMHhmZmZmZmZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAodG1oID4+PiA4KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IHRtaCAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9ICgodG1oID4+PiAyNCkgJiAweGYpIHwgMHgxMDtcbiAgICBidWZbb2Zmc2V0KytdID0gKHRtaCA+Pj4gMTYpICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gKGNsb2Nrc2VxID4+PiA4KSB8IDB4ODA7XG4gICAgYnVmW29mZnNldCsrXSA9IGNsb2Nrc2VxICYgMHhmZjtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgICAgICBidWZbb2Zmc2V0KytdID0gbm9kZVtuXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHYxO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2.map new file mode 100644 index 0000000..f0ce856 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2b/v1_2b5f3b13f774fcc1223ab82a4f1745e2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV1State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v1(options, buf, offset) {\n let bytes;\n const isV6 = options?._v6 ?? false;\n if (options) {\n const optionsKeys = Object.keys(options);\n if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n options = undefined;\n }\n }\n if (options) {\n bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = (0, rng_js_1.default)();\n updateV1State(_state, now, rnds);\n bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n }\n return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV1State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.nsecs ??= 0;\n if (now === state.msecs) {\n state.nsecs++;\n if (state.nsecs >= 10000) {\n state.node = undefined;\n state.nsecs = 0;\n }\n }\n else if (now > state.msecs) {\n state.nsecs = 0;\n }\n else if (now < state.msecs) {\n state.node = undefined;\n }\n if (!state.node) {\n state.node = rnds.slice(10, 16);\n state.node[0] |= 0x01;\n state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n }\n state.msecs = now;\n return state;\n}\nexports.updateV1State = updateV1State;\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n else {\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n }\n msecs ??= Date.now();\n nsecs ??= 0;\n clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n node ??= rnds.slice(10, 16);\n msecs += 12219292800000;\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n buf[offset++] = (tl >>> 24) & 0xff;\n buf[offset++] = (tl >>> 16) & 0xff;\n buf[offset++] = (tl >>> 8) & 0xff;\n buf[offset++] = tl & 0xff;\n const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n buf[offset++] = (tmh >>> 8) & 0xff;\n buf[offset++] = tmh & 0xff;\n buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n buf[offset++] = (tmh >>> 16) & 0xff;\n buf[offset++] = (clockseq >>> 8) | 0x80;\n buf[offset++] = clockseq & 0xff;\n for (let n = 0; n < 6; ++n) {\n buf[offset++] = node[n];\n }\n return buf;\n}\nexports.default = v1;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029 new file mode 100644 index 0000000..eee9391 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029 @@ -0,0 +1,5 @@ +c2a712c6b525f286e4effb0ce8a2dc78 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = '00000000-0000-0000-0000-000000000000'; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmlsLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029.map new file mode 100644 index 0000000..44b65a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2c/nil_2c339792b31c51d1d5eddff74de15029.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\nil.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,sCAAsC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\nil.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = '00000000-0000-0000-0000-000000000000';\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec new file mode 100644 index 0000000..8785863 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec @@ -0,0 +1,54 @@ +6d2f265ba29d8a3e05b94094ae7dd371 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevisionAttachment = void 0; +// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts +const typeorm_1 = require("typeorm"); +const correspondence_revision_entity_1 = require("./correspondence-revision.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +/** + * CorrespondenceRevisionAttachment + * + * ตารางเชื่อม correspondence_revisions กับ attachments (M:N) + * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id + * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision + */ +let CorrespondenceRevisionAttachment = class CorrespondenceRevisionAttachment { +}; +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "correspondenceRevisionId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'attachment_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "attachmentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_main_document', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevisionAttachment.prototype, "isMainDocument", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_revision_entity_1.CorrespondenceRevision, (revision) => revision.attachmentLinks, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_revision_entity_1.CorrespondenceRevision !== "undefined" && correspondence_revision_entity_1.CorrespondenceRevision) === "function" ? _a : Object) +], CorrespondenceRevisionAttachment.prototype, "revision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => attachment_entity_1.Attachment, { onDelete: 'CASCADE', eager: false }), + (0, typeorm_1.JoinColumn)({ name: 'attachment_id' }), + __metadata("design:type", typeof (_b = typeof attachment_entity_1.Attachment !== "undefined" && attachment_entity_1.Attachment) === "function" ? _b : Object) +], CorrespondenceRevisionAttachment.prototype, "attachment", void 0); +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment = __decorate([ + (0, typeorm_1.Entity)('correspondence_revision_attachments') +], CorrespondenceRevisionAttachment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi1hdHRhY2htZW50LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXlGO0FBQ3pGLHFDQU1pQjtBQUNqQixxRkFBMEU7QUFDMUUsK0ZBQXFGO0FBRXJGOzs7Ozs7R0FNRztBQUVJLElBQU0sZ0NBQWdDLEdBQXRDLE1BQU0sZ0NBQWdDO0NBMEI1QyxDQUFBO0FBMUJZLDRFQUFnQztBQUczQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDOztrRkFDcEI7QUFJbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O3NFQUNuQjtBQUl0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3dFQUM1QjtBQVN6QjtJQU5DLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyx1REFBc0IsRUFDNUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3RDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUN4QjtJQUNBLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDO2tEQUN4Qyx1REFBc0Isb0JBQXRCLHVEQUFzQjtrRUFBQztBQUtsQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO2tEQUN6Qiw4QkFBVSxvQkFBViw4QkFBVTtvRUFBQzsyQ0F6QmIsZ0NBQWdDO0lBRDVDLElBQUEsZ0JBQU0sRUFBQyxxQ0FBcUMsQ0FBQztHQUNqQyxnQ0FBZ0MsQ0EwQjVDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHNcbmltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIFByaW1hcnlDb2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2VudGl0aWVzL2F0dGFjaG1lbnQuZW50aXR5JztcblxuLyoqXG4gKiBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudFxuICpcbiAqIOC4leC4suC4o+C4suC4h+C5gOC4iuC4t+C5iOC4reC4oSBjb3JyZXNwb25kZW5jZV9yZXZpc2lvbnMg4LiB4Lix4LiaIGF0dGFjaG1lbnRzIChNOk4pXG4gKiBbRklYIHYxLjguMV0gRksg4LiK4Li14LmJ4LmE4LibIGNvcnJlc3BvbmRlbmNlX3JldmlzaW9ucy5pZCDguYTguKHguYjguYPguIrguYggY29ycmVzcG9uZGVuY2VzLmlkXG4gKiDguYDguKvguJXguLjguJzguKU6IOC5hOC4n+C4peC5jOC5geC4meC4muC4nOC4ueC4geC4geC4seC4miByZXZpc2lvbiDguYDguJ7guLfguYjguK3guKPguK3guIfguKPguLHguJrguYTguJ/guKXguYzguJfguLXguYjguJXguYjguLLguIfguIHguLHguJnguYPguJnguYHguJXguYjguKXguLAgcmV2aXNpb25cbiAqL1xuQEVudGl0eSgnY29ycmVzcG9uZGVuY2VfcmV2aXNpb25fYXR0YWNobWVudHMnKVxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50IHtcbiAgLy8g4LiE4Li14Lii4LmM4Lir4Lil4Lix4LiB4LiC4Lit4LiHIHJldmlzaW9uIOC4l+C4teC5iOC4nOC4ueC4geC5hOC4n+C4peC5jOC4meC4teC5iVxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9yZXZpc2lvbl9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkITogbnVtYmVyO1xuXG4gIC8vIOC4hOC4teC4ouC5jOC4q+C4peC4seC4geC4guC4reC4hyBhdHRhY2htZW50XG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ2F0dGFjaG1lbnRfaWQnIH0pXG4gIGF0dGFjaG1lbnRJZCE6IG51bWJlcjtcblxuICAvLyDguYTguJ/guKXguYzguKvguKXguLHguIHguILguK3guIcgcmV2aXNpb24g4LiZ4Li14LmJICjguYDguIrguYjguJkgUERGIOC4q+C4peC4seC4gSlcbiAgQENvbHVtbih7IG5hbWU6ICdpc19tYWluX2RvY3VtZW50JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNNYWluRG9jdW1lbnQhOiBib29sZWFuO1xuXG4gIC8vIFJlbGF0aW9uOiDguKvguKXguLLguKIgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQg4oaSIOC4q+C4meC4tuC5iOC4hyBDb3JyZXNwb25kZW5jZVJldmlzaW9uXG4gIEBNYW55VG9PbmUoXG4gICAgKCkgPT4gQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcbiAgICAocmV2aXNpb24pID0+IHJldmlzaW9uLmF0dGFjaG1lbnRMaW5rcyxcbiAgICB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfVxuICApXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9uX2lkJyB9KVxuICByZXZpc2lvbj86IENvcnJlc3BvbmRlbmNlUmV2aXNpb247XG5cbiAgLy8gUmVsYXRpb246IOC4q+C4peC4suC4oiBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCDihpIg4Lir4LiZ4Li24LmI4LiHIEF0dGFjaG1lbnRcbiAgQE1hbnlUb09uZSgoKSA9PiBBdHRhY2htZW50LCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScsIGVhZ2VyOiBmYWxzZSB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdhdHRhY2htZW50X2lkJyB9KVxuICBhdHRhY2htZW50PzogQXR0YWNobWVudDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec.map new file mode 100644 index 0000000..3dcf725 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2d/correspondencerevisionattachmententity_2d8a125b590d09973dae3b1792550cec.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts","mappings":";;;;;;;;;;;;;AAAA,yFAAyF;AACzF,qCAMiB;AACjB,qFAA0E;AAC1E,+FAAqF;AAErF;;;;;;GAMG;AAEI,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;CA0B5C,CAAA;AA1BY,4EAAgC;AAG3C;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;;kFACpB;AAIlC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;sEACnB;AAItB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;wEAC5B;AASzB;IANC,IAAA,mBAAS,EACR,GAAG,EAAE,CAAC,uDAAsB,EAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EACtC,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB;IACA,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;kDACxC,uDAAsB,oBAAtB,uDAAsB;kEAAC;AAKlC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,8BAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;kDACzB,8BAAU,oBAAV,8BAAU;oEAAC;2CAzBb,gCAAgC;IAD5C,IAAA,gBAAM,EAAC,qCAAqC,CAAC;GACjC,gCAAgC,CA0B5C","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts"],"sourcesContent":["// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts\nimport {\n Entity,\n Column,\n ManyToOne,\n JoinColumn,\n PrimaryColumn,\n} from 'typeorm';\nimport { CorrespondenceRevision } from './correspondence-revision.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\n\n/**\n * CorrespondenceRevisionAttachment\n *\n * ตารางเชื่อม correspondence_revisions กับ attachments (M:N)\n * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id\n * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision\n */\n@Entity('correspondence_revision_attachments')\nexport class CorrespondenceRevisionAttachment {\n // คีย์หลักของ revision ที่ผูกไฟล์นี้\n @PrimaryColumn({ name: 'correspondence_revision_id' })\n correspondenceRevisionId!: number;\n\n // คีย์หลักของ attachment\n @PrimaryColumn({ name: 'attachment_id' })\n attachmentId!: number;\n\n // ไฟล์หลักของ revision นี้ (เช่น PDF หลัก)\n @Column({ name: 'is_main_document', default: false })\n isMainDocument!: boolean;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง CorrespondenceRevision\n @ManyToOne(\n () => CorrespondenceRevision,\n (revision) => revision.attachmentLinks,\n { onDelete: 'CASCADE' }\n )\n @JoinColumn({ name: 'correspondence_revision_id' })\n revision?: CorrespondenceRevision;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง Attachment\n @ManyToOne(() => Attachment, { onDelete: 'CASCADE', eager: false })\n @JoinColumn({ name: 'attachment_id' })\n attachment?: Attachment;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a new file mode 100644 index 0000000..3eb76a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a @@ -0,0 +1,126 @@ +fc5abb1e0c451d2735d26a92e2094427 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberReservation = exports.ReservationStatus = void 0; +const typeorm_1 = require("typeorm"); +var ReservationStatus; +(function (ReservationStatus) { + ReservationStatus["RESERVED"] = "RESERVED"; + ReservationStatus["CONFIRMED"] = "CONFIRMED"; + ReservationStatus["CANCELLED"] = "CANCELLED"; + ReservationStatus["VOID"] = "VOID"; +})(ReservationStatus || (exports.ReservationStatus = ReservationStatus = {})); +let DocumentNumberReservation = class DocumentNumberReservation { +}; +exports.DocumentNumberReservation = DocumentNumberReservation; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ type: 'varchar', length: 36, unique: true }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "token", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ + name: 'document_number', + type: 'varchar', + length: 100, + unique: true, + }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ + name: 'document_number_status', + type: 'enum', + enum: ReservationStatus, + default: ReservationStatus.RESERVED, + }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'document_id', type: 'int', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "documentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_organization_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "originatorOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'recipient_organization_id', type: 'int', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'user_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.CreateDateColumn)({ name: 'reserved_at', type: 'datetime', precision: 6 }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberReservation.prototype, "reservedAt", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'expires_at', type: 'datetime', precision: 6 }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberReservation.prototype, "expiresAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'confirmed_at', + type: 'datetime', + precision: 6, + nullable: true, + }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "confirmedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'cancelled_at', + type: 'datetime', + precision: 6, + nullable: true, + }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "cancelledAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', type: 'varchar', length: 45, nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_agent', type: 'text', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "userAgent", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "metadata", void 0); +exports.DocumentNumberReservation = DocumentNumberReservation = __decorate([ + (0, typeorm_1.Entity)('document_number_reservations'), + (0, typeorm_1.Index)('idx_token', ['token']), + (0, typeorm_1.Index)('idx_status_expires', ['status', 'expiresAt']) +], DocumentNumberReservation); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLXJlc2VydmF0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBRWpCLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUMzQiwwQ0FBcUIsQ0FBQTtJQUNyQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBdUIsQ0FBQTtJQUN2QixrQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBSzVCO0FBS00sSUFBTSx5QkFBeUIsR0FBL0IsTUFBTSx5QkFBeUI7Q0E4RXJDLENBQUE7QUE5RVksOERBQXlCO0FBRXBDO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7cURBQzVCO0FBSVo7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O3dEQUN2QztBQVNmO0lBUEMsSUFBQSxlQUFLLEdBQUU7SUFDUCxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLEdBQUc7UUFDWCxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQUM7O2lFQUNzQjtBQVN4QjtJQVBDLElBQUEsZUFBSyxHQUFFO0lBQ1AsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFFBQVE7S0FDcEMsQ0FBQzs7eURBQ3lCO0FBSTNCO0lBRkMsSUFBQSxlQUFLLEdBQUU7SUFDUCxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs2REFDbEM7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7NERBQ3pCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7dUVBQzFCO0FBRzlCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7MkVBQzFCO0FBR2xDO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzswRUFDdEM7QUFJakM7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOzt5REFDekI7QUFJaEI7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO2tEQUM3RCxJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFJbEI7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7a0RBQ25ELElBQUksb0JBQUosSUFBSTs0REFBQztBQVFqQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxjQUFjO1FBQ3BCLElBQUksRUFBRSxVQUFVO1FBQ2hCLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzs4REFDd0I7QUFRMUI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsY0FBYztRQUNwQixJQUFJLEVBQUUsVUFBVTtRQUNoQixTQUFTLEVBQUUsQ0FBQztRQUNaLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7OERBQ3dCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDbEQ7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDbkM7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MkRBQ0M7b0NBN0UvQix5QkFBeUI7SUFIckMsSUFBQSxnQkFBTSxFQUFDLDhCQUE4QixDQUFDO0lBQ3RDLElBQUEsZUFBSyxFQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLElBQUEsZUFBSyxFQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0dBQ3hDLHlCQUF5QixDQThFckMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLXJlc2VydmF0aW9uLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgSW5kZXgsXG59IGZyb20gJ3R5cGVvcm0nO1xuXG5leHBvcnQgZW51bSBSZXNlcnZhdGlvblN0YXR1cyB7XG4gIFJFU0VSVkVEID0gJ1JFU0VSVkVEJyxcbiAgQ09ORklSTUVEID0gJ0NPTkZJUk1FRCcsXG4gIENBTkNFTExFRCA9ICdDQU5DRUxMRUQnLFxuICBWT0lEID0gJ1ZPSUQnLFxufVxuXG5ARW50aXR5KCdkb2N1bWVudF9udW1iZXJfcmVzZXJ2YXRpb25zJylcbkBJbmRleCgnaWR4X3Rva2VuJywgWyd0b2tlbiddKVxuQEluZGV4KCdpZHhfc3RhdHVzX2V4cGlyZXMnLCBbJ3N0YXR1cycsICdleHBpcmVzQXQnXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlclJlc2VydmF0aW9uIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oeyB0eXBlOiAnaW50JyB9KVxuICBpZCE6IG51bWJlcjtcblxuICBASW5kZXgoKVxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInLCBsZW5ndGg6IDM2LCB1bmlxdWU6IHRydWUgfSlcbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2RvY3VtZW50X251bWJlcicsXG4gICAgdHlwZTogJ3ZhcmNoYXInLFxuICAgIGxlbmd0aDogMTAwLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgfSlcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2RvY3VtZW50X251bWJlcl9zdGF0dXMnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSZXNlcnZhdGlvblN0YXR1cyxcbiAgICBkZWZhdWx0OiBSZXNlcnZhdGlvblN0YXR1cy5SRVNFUlZFRCxcbiAgfSlcbiAgc3RhdHVzITogUmVzZXJ2YXRpb25TdGF0dXM7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7IG5hbWU6ICdkb2N1bWVudF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkb2N1bWVudElkITogbnVtYmVyIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCB0eXBlOiAnaW50JyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJywgdHlwZTogJ2ludCcgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX29yZ2FuaXphdGlvbl9pZCcsIHR5cGU6ICdpbnQnIH0pXG4gIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnLCB0eXBlOiAnaW50JywgZGVmYXVsdDogMCB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBASW5kZXgoKVxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnLCB0eXBlOiAnaW50JyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQEluZGV4KClcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAncmVzZXJ2ZWRfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBwcmVjaXNpb246IDYgfSlcbiAgcmVzZXJ2ZWRBdCE6IERhdGU7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7IG5hbWU6ICdleHBpcmVzX2F0JywgdHlwZTogJ2RhdGV0aW1lJywgcHJlY2lzaW9uOiA2IH0pXG4gIGV4cGlyZXNBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2NvbmZpcm1lZF9hdCcsXG4gICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICBwcmVjaXNpb246IDYsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGNvbmZpcm1lZEF0ITogRGF0ZSB8IG51bGw7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2NhbmNlbGxlZF9hdCcsXG4gICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICBwcmVjaXNpb246IDYsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGNhbmNlbGxlZEF0ITogRGF0ZSB8IG51bGw7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpcF9hZGRyZXNzJywgdHlwZTogJ3ZhcmNoYXInLCBsZW5ndGg6IDQ1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBpcEFkZHJlc3MhOiBzdHJpbmcgfCBudWxsO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXNlcl9hZ2VudCcsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXNlckFnZW50ITogc3RyaW5nIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBtZXRhZGF0YSE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a.map new file mode 100644 index 0000000..7d4e743 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2f/documentnumberreservationentity_2fe043e935c2983788147e3af718507a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-reservation.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-reservation.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\nexport enum ReservationStatus {\n RESERVED = 'RESERVED',\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n VOID = 'VOID',\n}\n\n@Entity('document_number_reservations')\n@Index('idx_token', ['token'])\n@Index('idx_status_expires', ['status', 'expiresAt'])\nexport class DocumentNumberReservation {\n @PrimaryGeneratedColumn({ type: 'int' })\n id!: number;\n\n @Index()\n @Column({ type: 'varchar', length: 36, unique: true })\n token!: string;\n\n @Index()\n @Column({\n name: 'document_number',\n type: 'varchar',\n length: 100,\n unique: true,\n })\n documentNumber!: string;\n\n @Index()\n @Column({\n name: 'document_number_status',\n type: 'enum',\n enum: ReservationStatus,\n default: ReservationStatus.RESERVED,\n })\n status!: ReservationStatus;\n\n @Index()\n @Column({ name: 'document_id', type: 'int', nullable: true })\n documentId!: number | null;\n\n @Column({ name: 'project_id', type: 'int' })\n projectId!: number;\n\n @Column({ name: 'correspondence_type_id', type: 'int' })\n correspondenceTypeId!: number;\n\n @Column({ name: 'originator_organization_id', type: 'int' })\n originatorOrganizationId!: number;\n\n @Column({ name: 'recipient_organization_id', type: 'int', default: 0 })\n recipientOrganizationId!: number;\n\n @Index()\n @Column({ name: 'user_id', type: 'int' })\n userId!: number;\n\n @Index()\n @CreateDateColumn({ name: 'reserved_at', type: 'datetime', precision: 6 })\n reservedAt!: Date;\n\n @Index()\n @Column({ name: 'expires_at', type: 'datetime', precision: 6 })\n expiresAt!: Date;\n\n @Column({\n name: 'confirmed_at',\n type: 'datetime',\n precision: 6,\n nullable: true,\n })\n confirmedAt!: Date | null;\n\n @Column({\n name: 'cancelled_at',\n type: 'datetime',\n precision: 6,\n nullable: true,\n })\n cancelledAt!: Date | null;\n\n @Column({ name: 'ip_address', type: 'varchar', length: 45, nullable: true })\n ipAddress!: string | null;\n\n @Column({ name: 'user_agent', type: 'text', nullable: true })\n userAgent!: string | null;\n\n @Column({ type: 'json', nullable: true })\n metadata!: Record | null;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d new file mode 100644 index 0000000..ecffe63 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d @@ -0,0 +1,80 @@ +397e9fb75dd17b7b0f05a57990aa58d9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowActionDto = void 0; +const class_validator_1 = require("class-validator"); +const workflow_interface_1 = require("../../workflow-engine/interfaces/workflow.interface"); +const swagger_1 = require("@nestjs/swagger"); +/** + * DTO for processing workflow actions + * + * Supports both: + * - New Unified Workflow Engine (uses instanceId) + * - Legacy RFA workflow (uses returnToSequence) + */ +class WorkflowActionDto { +} +exports.WorkflowActionDto = WorkflowActionDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Workflow Instance ID (UUID) - for Unified Workflow Engine', + example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', + }), + (0, class_validator_1.IsUUID)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "instanceId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Workflow Action', + enum: ['APPROVE', 'REJECT', 'RETURN', 'CANCEL', 'ACKNOWLEDGE'], + }), + (0, class_validator_1.IsEnum)(workflow_interface_1.WorkflowAction), + __metadata("design:type", typeof (_a = typeof workflow_interface_1.WorkflowAction !== "undefined" && workflow_interface_1.WorkflowAction) === "function" ? _a : Object) +], WorkflowActionDto.prototype, "action", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Review comments', + example: 'Approved with note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "comment", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Review comments (deprecated, use comment)', + example: 'Approved with note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "comments", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Sequence to return to (only for RETURN action in legacy RFA)', + example: 1, + }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], WorkflowActionDto.prototype, "returnToSequence", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Additional payload data', + example: { priority: 'HIGH' }, + }), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowActionDto.prototype, "payload", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcd29ya2Zsb3ctYWN0aW9uLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBQThFO0FBQzlFLDRGQUFxRjtBQUNyRiw2Q0FBbUU7QUFFbkU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBaUI7Q0FpRDdCO0FBakRELDhDQWlEQztBQTFDQztJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxPQUFPLEVBQUUsc0NBQXNDO0tBQ2hELENBQUM7SUFDRCxJQUFBLHdCQUFNLEdBQUU7SUFDUixJQUFBLDRCQUFVLEdBQUU7O3FEQUNPO0FBT3BCO0lBTEMsSUFBQSxxQkFBVyxFQUFDO1FBQ1gsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO0tBQy9ELENBQUM7SUFDRCxJQUFBLHdCQUFNLEVBQUMsbUNBQWMsQ0FBQztrREFDZCxtQ0FBYyxvQkFBZCxtQ0FBYztpREFBQztBQVF4QjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O2tEQUNJO0FBV2pCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsMkNBQTJDO1FBQ3hELE9BQU8sRUFBRSx1QkFBdUI7S0FDakMsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7bURBQ0s7QUFRbEI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw4REFBOEQ7UUFDM0UsT0FBTyxFQUFFLENBQUM7S0FDWCxDQUFDO0lBQ0QsSUFBQSx1QkFBSyxHQUFFO0lBQ1AsSUFBQSw0QkFBVSxHQUFFOzsyREFDYTtBQU8xQjtJQUxDLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO0tBQzlCLENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7a0RBQ0gsTUFBTSxvQkFBTixNQUFNO2tEQUFrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFx3b3JrZmxvdy1hY3Rpb24uZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzRW51bSwgSXNTdHJpbmcsIElzT3B0aW9uYWwsIElzVVVJRCwgSXNJbnQgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgV29ya2Zsb3dBY3Rpb24gfSBmcm9tICcuLi8uLi93b3JrZmxvdy1lbmdpbmUvaW50ZXJmYWNlcy93b3JrZmxvdy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXBpUHJvcGVydHksIEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG4vKipcbiAqIERUTyBmb3IgcHJvY2Vzc2luZyB3b3JrZmxvdyBhY3Rpb25zXG4gKlxuICogU3VwcG9ydHMgYm90aDpcbiAqIC0gTmV3IFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lICh1c2VzIGluc3RhbmNlSWQpXG4gKiAtIExlZ2FjeSBSRkEgd29ya2Zsb3cgKHVzZXMgcmV0dXJuVG9TZXF1ZW5jZSlcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93QWN0aW9uRHRvIHtcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnV29ya2Zsb3cgSW5zdGFuY2UgSUQgKFVVSUQpIC0gZm9yIFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lJyxcbiAgICBleGFtcGxlOiAnYTFiMmMzZDQtZTVmNi03ODkwLWFiY2QtZWYxMjM0NTY3ODkwJyxcbiAgfSlcbiAgQElzVVVJRCgpXG4gIEBJc09wdGlvbmFsKClcbiAgaW5zdGFuY2VJZD86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHkoe1xuICAgIGRlc2NyaXB0aW9uOiAnV29ya2Zsb3cgQWN0aW9uJyxcbiAgICBlbnVtOiBbJ0FQUFJPVkUnLCAnUkVKRUNUJywgJ1JFVFVSTicsICdDQU5DRUwnLCAnQUNLTk9XTEVER0UnXSxcbiAgfSlcbiAgQElzRW51bShXb3JrZmxvd0FjdGlvbilcbiAgYWN0aW9uITogV29ya2Zsb3dBY3Rpb247XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmV2aWV3IGNvbW1lbnRzJyxcbiAgICBleGFtcGxlOiAnQXBwcm92ZWQgd2l0aCBub3RlLi4uJyxcbiAgfSlcbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBjb21tZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgJ2NvbW1lbnQnIGluc3RlYWRcbiAgICovXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JldmlldyBjb21tZW50cyAoZGVwcmVjYXRlZCwgdXNlIGNvbW1lbnQpJyxcbiAgICBleGFtcGxlOiAnQXBwcm92ZWQgd2l0aCBub3RlLi4uJyxcbiAgfSlcbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBjb21tZW50cz86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdTZXF1ZW5jZSB0byByZXR1cm4gdG8gKG9ubHkgZm9yIFJFVFVSTiBhY3Rpb24gaW4gbGVnYWN5IFJGQSknLFxuICAgIGV4YW1wbGU6IDEsXG4gIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgcmV0dXJuVG9TZXF1ZW5jZT86IG51bWJlcjtcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIHBheWxvYWQgZGF0YScsXG4gICAgZXhhbXBsZTogeyBwcmlvcml0eTogJ0hJR0gnIH0sXG4gIH0pXG4gIEBJc09wdGlvbmFsKClcbiAgcGF5bG9hZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d.map new file mode 100644 index 0000000..a1316c5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/workflowactiondto_30a11e270c0c4a2c81a08c3fc2f1232d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\workflow-action.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAA8E;AAC9E,4FAAqF;AACrF,6CAAmE;AAEnE;;;;;;GAMG;AACH,MAAa,iBAAiB;CAiD7B;AAjDD,8CAiDC;AA1CC;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,sCAAsC;KAChD,CAAC;IACD,IAAA,wBAAM,GAAE;IACR,IAAA,4BAAU,GAAE;;qDACO;AAOpB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC;KAC/D,CAAC;IACD,IAAA,wBAAM,EAAC,mCAAc,CAAC;kDACd,mCAAc,oBAAd,mCAAc;iDAAC;AAQxB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;kDACI;AAWjB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2CAA2C;QACxD,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;mDACK;AAQlB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;2DACa;AAO1B;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAC9B,CAAC;IACD,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;kDAAkB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\workflow-action.dto.ts"],"sourcesContent":["import { IsEnum, IsString, IsOptional, IsUUID, IsInt } from 'class-validator';\nimport { WorkflowAction } from '../../workflow-engine/interfaces/workflow.interface';\nimport { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\n/**\n * DTO for processing workflow actions\n *\n * Supports both:\n * - New Unified Workflow Engine (uses instanceId)\n * - Legacy RFA workflow (uses returnToSequence)\n */\nexport class WorkflowActionDto {\n @ApiPropertyOptional({\n description: 'Workflow Instance ID (UUID) - for Unified Workflow Engine',\n example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',\n })\n @IsUUID()\n @IsOptional()\n instanceId?: string;\n\n @ApiProperty({\n description: 'Workflow Action',\n enum: ['APPROVE', 'REJECT', 'RETURN', 'CANCEL', 'ACKNOWLEDGE'],\n })\n @IsEnum(WorkflowAction)\n action!: WorkflowAction;\n\n @ApiPropertyOptional({\n description: 'Review comments',\n example: 'Approved with note...',\n })\n @IsString()\n @IsOptional()\n comment?: string;\n\n /**\n * @deprecated Use 'comment' instead\n */\n @ApiPropertyOptional({\n description: 'Review comments (deprecated, use comment)',\n example: 'Approved with note...',\n })\n @IsString()\n @IsOptional()\n comments?: string;\n\n @ApiPropertyOptional({\n description: 'Sequence to return to (only for RETURN action in legacy RFA)',\n example: 1,\n })\n @IsInt()\n @IsOptional()\n returnToSequence?: number;\n\n @ApiPropertyOptional({\n description: 'Additional payload data',\n example: { priority: 'HIGH' },\n })\n @IsOptional()\n payload?: Record;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2 new file mode 100644 index 0000000..2321af0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2 @@ -0,0 +1,60 @@ +e32c989e925f8f3b2b2617b90c1e377c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingSubCategory = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingSubCategory = class ContractDrawingSubCategory { +}; +exports.ContractDrawingSubCategory = ContractDrawingSubCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "subCatCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "subCatName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingSubCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingSubCategory.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingSubCategory.prototype, "project", void 0); +exports.ContractDrawingSubCategory = ContractDrawingSubCategory = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_sub_cats') +], ContractDrawingSubCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLDBFQUFnRTtBQUd6RCxJQUFNLDBCQUEwQixHQUFoQyxNQUFNLDBCQUEwQjtDQTRCdEMsQ0FBQTtBQTVCWSxnRUFBMEI7QUFFckM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztzREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzs2REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzs4REFDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7OERBQzFCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzs2REFDeEI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFJakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPOzJEQUFDO3FDQTNCUCwwQkFBMEI7SUFEdEMsSUFBQSxnQkFBTSxFQUFDLDJCQUEyQixDQUFDO0dBQ3ZCLDBCQUEwQixDQTRCdEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ19zdWJfY2F0cycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nU3ViQ2F0ZWdvcnkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9jb2RlJywgbGVuZ3RoOiA1MCB9KVxuICBzdWJDYXRDb2RlITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgc3ViQ2F0TmFtZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZzsgLy8gTnVsbGFibGUg4LmD4LiK4LmJID9cblxuICBAQ29sdW1uKHsgbmFtZTogJ3NvcnRfb3JkZXInLCBkZWZhdWx0OiAwIH0pXG4gIHNvcnRPcmRlciE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDsgLy8g4LmA4LiV4Li04LihICFcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2.map new file mode 100644 index 0000000..90bff9f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/contractdrawingsubcategoryentity_311d9de0ec605cac80a91203ccaa59c2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-sub-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;CA4BtC,CAAA;AA5BY,gEAA0B;AAErC;IADC,IAAA,gCAAsB,GAAE;;sDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;6DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;8DACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8DAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;6DACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6DAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;2DAAC;qCA3BP,0BAA0B;IADtC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,0BAA0B,CA4BtC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-sub-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_sub_cats')\nexport class ContractDrawingSubCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'sub_cat_code', length: 50 })\n subCatCode!: string; // เติม !\n\n @Column({ name: 'sub_cat_name', length: 255 })\n subCatName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // Nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528 new file mode 100644 index 0000000..32243ec --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528 @@ -0,0 +1,76 @@ +a29d09149ab910d378ee6fe2675e46fc +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-definition.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowDefinition = void 0; +const typeorm_1 = require("typeorm"); +/** + * เก็บแม่แบบ (Blueprint) ของ Workflow + * 1 Workflow Code (เช่น RFA) สามารถมีได้หลาย Version + */ +let WorkflowDefinition = class WorkflowDefinition { +}; +exports.WorkflowDefinition = WorkflowDefinition; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, comment: 'รหัส Workflow เช่น RFA, CORR, LEAVE_REQ' }), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "workflow_code", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'int', + default: 1, + comment: 'หมายเลข Version (Running sequence)', + }), + __metadata("design:type", Number) +], WorkflowDefinition.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: 'คำอธิบายเพิ่มเติม' }), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + comment: 'Raw DSL ที่ User/Admin เขียน (เก็บไว้เพื่อดูหรือแก้ไข)', + }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], WorkflowDefinition.prototype, "dsl", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + comment: 'Compiled JSON Structure ที่ผ่านการ Validate และ Optimize สำหรับ Runtime Engine แล้ว', + }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowDefinition.prototype, "compiled", void 0); +__decorate([ + (0, typeorm_1.Column)({ default: true, comment: 'สถานะการใช้งาน (Soft Disable)' }), + __metadata("design:type", Boolean) +], WorkflowDefinition.prototype, "is_active", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowDefinition.prototype, "created_at", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], WorkflowDefinition.prototype, "updated_at", void 0); +exports.WorkflowDefinition = WorkflowDefinition = __decorate([ + (0, typeorm_1.Entity)('workflow_definitions'), + (0, typeorm_1.Unique)(['workflow_code', 'version']) // ป้องกัน Version ซ้ำใน Workflow เดียวกัน + , + (0, typeorm_1.Index)(['workflow_code', 'is_active', 'version']) // เพื่อการ Query หา Active Version ล่าสุดได้เร็ว +], WorkflowDefinition); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDJFQUEyRTs7Ozs7Ozs7Ozs7OztBQUUzRSxxQ0FRaUI7QUFFakI7OztHQUdHO0FBSUksSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBa0I7Q0FzQzlCLENBQUE7QUF0Q1ksZ0RBQWtCO0FBRTdCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxNQUFNLENBQUM7OzhDQUNuQjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsQ0FBQzs7eURBQ3BEO0FBT3ZCO0lBTEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLEtBQUs7UUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxvQ0FBb0M7S0FDOUMsQ0FBQzs7bURBQ2U7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O3VEQUNsRDtBQU1yQjtJQUpDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLHdEQUF3RDtLQUNsRSxDQUFDO2tEQUNJLE1BQU0sb0JBQU4sTUFBTTsrQ0FBa0I7QUFPOUI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsTUFBTTtRQUNaLE9BQU8sRUFDTCxxRkFBcUY7S0FDeEYsQ0FBQztrREFDUyxNQUFNLG9CQUFOLE1BQU07b0RBQWtCO0FBR25DO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsQ0FBQzs7cURBQ2hEO0FBR3BCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDNUIsSUFBSSxvQkFBSixJQUFJO3NEQUFDO0FBR2xCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDNUIsSUFBSSxvQkFBSixJQUFJO3NEQUFDOzZCQXJDUCxrQkFBa0I7SUFIOUIsSUFBQSxnQkFBTSxFQUFDLHNCQUFzQixDQUFDO0lBQzlCLElBQUEsZ0JBQU0sRUFBQyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLDBDQUEwQzs7SUFDL0UsSUFBQSxlQUFLLEVBQUMsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsaURBQWlEO0dBQ3RGLGtCQUFrQixDQXNDOUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvd29ya2Zsb3ctZW5naW5lL2VudGl0aWVzL3dvcmtmbG93LWRlZmluaXRpb24uZW50aXR5LnRzXG5cbmltcG9ydCB7XG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgRW50aXR5LFxuICBJbmRleCxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVW5pcXVlLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcblxuLyoqXG4gKiDguYDguIHguYfguJrguYHguKHguYjguYHguJrguJogKEJsdWVwcmludCkg4LiC4Lit4LiHIFdvcmtmbG93XG4gKiAxIFdvcmtmbG93IENvZGUgKOC5gOC4iuC5iOC4mSBSRkEpIOC4quC4suC4oeC4suC4o+C4luC4oeC4teC5hOC4lOC5ieC4q+C4peC4suC4oiBWZXJzaW9uXG4gKi9cbkBFbnRpdHkoJ3dvcmtmbG93X2RlZmluaXRpb25zJylcbkBVbmlxdWUoWyd3b3JrZmxvd19jb2RlJywgJ3ZlcnNpb24nXSkgLy8g4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFZlcnNpb24g4LiL4LmJ4Liz4LmD4LiZIFdvcmtmbG93IOC5gOC4lOC4teC4ouC4p+C4geC4seC4mVxuQEluZGV4KFsnd29ya2Zsb3dfY29kZScsICdpc19hY3RpdmUnLCAndmVyc2lvbiddKSAvLyDguYDguJ7guLfguYjguK3guIHguLLguKMgUXVlcnkg4Lir4LiyIEFjdGl2ZSBWZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC5hOC4lOC5ieC5gOC4o+C5h+C4p1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVmaW5pdGlvbiB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCd1dWlkJylcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogNTAsIGNvbW1lbnQ6ICfguKPguKvguLHguKogV29ya2Zsb3cg4LmA4LiK4LmI4LiZIFJGQSwgQ09SUiwgTEVBVkVfUkVRJyB9KVxuICB3b3JrZmxvd19jb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdpbnQnLFxuICAgIGRlZmF1bHQ6IDEsXG4gICAgY29tbWVudDogJ+C4q+C4oeC4suC4ouC5gOC4peC4giBWZXJzaW9uIChSdW5uaW5nIHNlcXVlbmNlKScsXG4gIH0pXG4gIHZlcnNpb24hOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUsIGNvbW1lbnQ6ICfguITguLPguK3guJjguLTguJrguLLguKLguYDguJ7guLTguYjguKHguYDguJXguLTguKEnIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdqc29uJyxcbiAgICBjb21tZW50OiAnUmF3IERTTCDguJfguLXguYggVXNlci9BZG1pbiDguYDguILguLXguKLguJkgKOC5gOC4geC5h+C4muC5hOC4p+C5ieC5gOC4nuC4t+C5iOC4reC4lOC4ueC4q+C4o+C4t+C4reC5geC4geC5ieC5hOC4giknLFxuICB9KVxuICBkc2whOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgLy8gUmF3V29ya2Zsb3dEU0wgfCBXb3JrZmxvd0RzbFxuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdqc29uJyxcbiAgICBjb21tZW50OlxuICAgICAgJ0NvbXBpbGVkIEpTT04gU3RydWN0dXJlIOC4l+C4teC5iOC4nOC5iOC4suC4meC4geC4suC4oyBWYWxpZGF0ZSDguYHguKXguLAgT3B0aW1pemUg4Liq4Liz4Lir4Lij4Lix4LiaIFJ1bnRpbWUgRW5naW5lIOC5geC4peC5ieC4pycsXG4gIH0pXG4gIGNvbXBpbGVkITogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IC8vIENvbXBpbGVkV29ya2Zsb3cgfCBXb3JrZmxvd0RzbFxuXG4gIEBDb2x1bW4oeyBkZWZhdWx0OiB0cnVlLCBjb21tZW50OiAn4Liq4LiW4Liy4LiZ4Liw4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZIChTb2Z0IERpc2FibGUpJyB9KVxuICBpc19hY3RpdmUhOiBib29sZWFuO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRfYXQhOiBEYXRlO1xuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRfYXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528.map new file mode 100644 index 0000000..5b878a8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/38/workflowdefinitionentity_38f438d3fbfd981312c1f09f78dbd528.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-definition.entity.ts","mappings":";AAAA,2EAA2E;;;;;;;;;;;;;AAE3E,qCAQiB;AAEjB;;;GAGG;AAII,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAsC9B,CAAA;AAtCY,gDAAkB;AAE7B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;8CACnB;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;;yDACpD;AAOvB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,oCAAoC;KAC9C,CAAC;;mDACe;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;;uDAClD;AAMrB;IAJC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,wDAAwD;KAClE,CAAC;kDACI,MAAM,oBAAN,MAAM;+CAAkB;AAO9B;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,OAAO,EACL,qFAAqF;KACxF,CAAC;kDACS,MAAM,oBAAN,MAAM;oDAAkB;AAGnC;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;;qDAChD;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC5B,IAAI,oBAAJ,IAAI;sDAAC;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC5B,IAAI,oBAAJ,IAAI;sDAAC;6BArCP,kBAAkB;IAH9B,IAAA,gBAAM,EAAC,sBAAsB,CAAC;IAC9B,IAAA,gBAAM,EAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,0CAA0C;;IAC/E,IAAA,eAAK,EAAC,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,iDAAiD;GACtF,kBAAkB,CAsC9B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-definition.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-definition.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\n\n/**\n * เก็บแม่แบบ (Blueprint) ของ Workflow\n * 1 Workflow Code (เช่น RFA) สามารถมีได้หลาย Version\n */\n@Entity('workflow_definitions')\n@Unique(['workflow_code', 'version']) // ป้องกัน Version ซ้ำใน Workflow เดียวกัน\n@Index(['workflow_code', 'is_active', 'version']) // เพื่อการ Query หา Active Version ล่าสุดได้เร็ว\nexport class WorkflowDefinition {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n @Column({ length: 50, comment: 'รหัส Workflow เช่น RFA, CORR, LEAVE_REQ' })\n workflow_code!: string;\n\n @Column({\n type: 'int',\n default: 1,\n comment: 'หมายเลข Version (Running sequence)',\n })\n version!: number;\n\n @Column({ type: 'text', nullable: true, comment: 'คำอธิบายเพิ่มเติม' })\n description?: string;\n\n @Column({\n type: 'json',\n comment: 'Raw DSL ที่ User/Admin เขียน (เก็บไว้เพื่อดูหรือแก้ไข)',\n })\n dsl!: Record; // RawWorkflowDSL | WorkflowDsl\n\n @Column({\n type: 'json',\n comment:\n 'Compiled JSON Structure ที่ผ่านการ Validate และ Optimize สำหรับ Runtime Engine แล้ว',\n })\n compiled!: Record; // CompiledWorkflow | WorkflowDsl\n\n @Column({ default: true, comment: 'สถานะการใช้งาน (Soft Disable)' })\n is_active!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n created_at!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updated_at!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0 new file mode 100644 index 0000000..c892321 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0 @@ -0,0 +1,92 @@ +57fc1daa36d939e71954c042b0b1280a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsBuiltDrawing = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const asbuilt_drawing_revision_entity_1 = require("./asbuilt-drawing-revision.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const shop_drawing_main_category_entity_1 = require("./shop-drawing-main-category.entity"); +const shop_drawing_sub_category_entity_1 = require("./shop-drawing-sub-category.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let AsBuiltDrawing = class AsBuiltDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.AsBuiltDrawing = AsBuiltDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'drawing_number', length: 100, unique: true }), + __metadata("design:type", String) +], AsBuiltDrawing.prototype, "drawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "mainCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], AsBuiltDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], AsBuiltDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], AsBuiltDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], AsBuiltDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_main_category_entity_1.ShopDrawingMainCategory), + (0, typeorm_1.JoinColumn)({ name: 'main_category_id' }), + __metadata("design:type", typeof (_e = typeof shop_drawing_main_category_entity_1.ShopDrawingMainCategory !== "undefined" && shop_drawing_main_category_entity_1.ShopDrawingMainCategory) === "function" ? _e : Object) +], AsBuiltDrawing.prototype, "mainCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_sub_category_entity_1.ShopDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_category_id' }), + __metadata("design:type", typeof (_f = typeof shop_drawing_sub_category_entity_1.ShopDrawingSubCategory !== "undefined" && shop_drawing_sub_category_entity_1.ShopDrawingSubCategory) === "function" ? _f : Object) +], AsBuiltDrawing.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_g = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _g : Object) +], AsBuiltDrawing.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision, (revision) => revision.asBuiltDrawing, { + cascade: true, + }), + __metadata("design:type", Array) +], AsBuiltDrawing.prototype, "revisions", void 0); +exports.AsBuiltDrawing = AsBuiltDrawing = __decorate([ + (0, typeorm_1.Entity)('asbuilt_drawings') +], AsBuiltDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQiwwRUFBZ0U7QUFDaEUsdUZBQTJFO0FBQzNFLGlFQUF1RDtBQUN2RCwyRkFBOEU7QUFDOUUseUZBQTRFO0FBQzVFLGdGQUEyRTtBQUMzRSx5REFBNEM7QUFHckMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBZSxTQUFRLGlDQUFjO0NBc0RqRCxDQUFBO0FBdERZLHdDQUFjO0FBR3pCO0lBRkMsSUFBQSxnQ0FBc0IsR0FBRTtJQUN4QixJQUFBLDJCQUFPLEdBQUU7OzBDQUNFO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O2lEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDdkM7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7c0RBQ2I7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7cURBQ2I7QUFHdkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7aURBQzVCO0FBS25CO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzsrQ0FBQztBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywyREFBdUIsQ0FBQztJQUN4QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztrREFDMUIsMkRBQXVCLG9CQUF2QiwyREFBdUI7b0RBQUM7QUFJdkM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMseURBQXNCLENBQUM7SUFDdkMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7a0RBQzFCLHlEQUFzQixvQkFBdEIseURBQXNCO21EQUFDO0FBSXJDO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLENBQUM7SUFDckIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTsrQ0FBQztBQVNmO0lBUEMsSUFBQSxtQkFBUyxFQUNSLEdBQUcsRUFBRSxDQUFDLHdEQUFzQixFQUM1QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFDckM7UUFDRSxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQ0Y7O2lEQUNvQzt5QkFyRDFCLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQXNEMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgT25lVG9NYW55LFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IEFzQnVpbHREcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuL2FzYnVpbHQtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgU2hvcERyYXdpbmdNYWluQ2F0ZWdvcnkgfSBmcm9tICcuL3Nob3AtZHJhd2luZy1tYWluLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5IH0gZnJvbSAnLi9zaG9wLWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2FzYnVpbHRfZHJhd2luZ3MnKVxuZXhwb3J0IGNsYXNzIEFzQnVpbHREcmF3aW5nIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkcmF3aW5nX251bWJlcicsIGxlbmd0aDogMTAwLCB1bmlxdWU6IHRydWUgfSlcbiAgZHJhd2luZ051bWJlciE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ21haW5fY2F0ZWdvcnlfaWQnIH0pXG4gIG1haW5DYXRlZ29yeUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdGVnb3J5X2lkJyB9KVxuICBzdWJDYXRlZ29yeUlkITogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVwZGF0ZWRCeT86IG51bWJlcjtcblxuICAvLyBSZWxhdGlvbnNcbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDtcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nTWFpbkNhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2lkJyB9KVxuICBtYWluQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ01haW5DYXRlZ29yeTtcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScgfSlcbiAgdXBkYXRlcj86IFVzZXI7XG5cbiAgQE9uZVRvTWFueShcbiAgICAoKSA9PiBBc0J1aWx0RHJhd2luZ1JldmlzaW9uLFxuICAgIChyZXZpc2lvbikgPT4gcmV2aXNpb24uYXNCdWlsdERyYXdpbmcsXG4gICAge1xuICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICB9XG4gIClcbiAgcmV2aXNpb25zITogQXNCdWlsdERyYXdpbmdSZXZpc2lvbltdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0.map new file mode 100644 index 0000000..26a8cd8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3a/asbuiltdrawingentity_3a25923a9148fa55f1f00e8e922378c0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,0EAAgE;AAChE,uFAA2E;AAC3E,iEAAuD;AACvD,2FAA8E;AAC9E,yFAA4E;AAC5E,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,iCAAc;CAsDjD,CAAA;AAtDY,wCAAc;AAGzB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;0CACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;iDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;qDACvC;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;sDACb;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;qDACb;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;+CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;kDAC1B,2DAAuB,oBAAvB,2DAAuB;oDAAC;AAIvC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,yDAAsB,oBAAtB,yDAAsB;mDAAC;AAIrC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;+CAAC;AASf;IAPC,IAAA,mBAAS,EACR,GAAG,EAAE,CAAC,wDAAsB,EAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,EACrC;QACE,OAAO,EAAE,IAAI;KACd,CACF;;iDACoC;yBArD1B,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAsD1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n ManyToOne,\n OneToMany,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { AsBuiltDrawingRevision } from './asbuilt-drawing-revision.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { ShopDrawingMainCategory } from './shop-drawing-main-category.entity';\nimport { ShopDrawingSubCategory } from './shop-drawing-sub-category.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('asbuilt_drawings')\nexport class AsBuiltDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'drawing_number', length: 100, unique: true })\n drawingNumber!: string;\n\n @Column({ name: 'main_category_id' })\n mainCategoryId!: number;\n\n @Column({ name: 'sub_category_id' })\n subCategoryId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n\n @ManyToOne(() => ShopDrawingMainCategory)\n @JoinColumn({ name: 'main_category_id' })\n mainCategory!: ShopDrawingMainCategory;\n\n @ManyToOne(() => ShopDrawingSubCategory)\n @JoinColumn({ name: 'sub_category_id' })\n subCategory!: ShopDrawingSubCategory;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n @OneToMany(\n () => AsBuiltDrawingRevision,\n (revision) => revision.asBuiltDrawing,\n {\n cascade: true,\n }\n )\n revisions!: AsBuiltDrawingRevision[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567 new file mode 100644 index 0000000..e1a98ec --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567 @@ -0,0 +1,66 @@ +32ac68079d2b38007d04eccf43854c98 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationError = exports.MigrationErrorType = void 0; +const typeorm_1 = require("typeorm"); +var MigrationErrorType; +(function (MigrationErrorType) { + MigrationErrorType["FILE_NOT_FOUND"] = "FILE_NOT_FOUND"; + MigrationErrorType["MISSING_FILENAME"] = "MISSING_FILENAME"; + MigrationErrorType["FILE_ERROR"] = "FILE_ERROR"; + MigrationErrorType["AI_PARSE_ERROR"] = "AI_PARSE_ERROR"; + MigrationErrorType["API_ERROR"] = "API_ERROR"; + MigrationErrorType["DB_ERROR"] = "DB_ERROR"; + MigrationErrorType["SECURITY"] = "SECURITY"; + MigrationErrorType["UNKNOWN"] = "UNKNOWN"; +})(MigrationErrorType || (exports.MigrationErrorType = MigrationErrorType = {})); +let MigrationError = class MigrationError { +}; +exports.MigrationError = MigrationError; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], MigrationError.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'batch_id', length: 50, nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "batchId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'error_type', + type: 'enum', + enum: MigrationErrorType, + nullable: true, + }), + __metadata("design:type", String) +], MigrationError.prototype, "errorType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'error_message', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "errorMessage", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'raw_ai_response', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "rawAiResponse", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], MigrationError.prototype, "createdAt", void 0); +exports.MigrationError = MigrationError = __decorate([ + (0, typeorm_1.Entity)('migration_errors') +], MigrationError); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLWVycm9yLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBS2lCO0FBRWpCLElBQVksa0JBU1g7QUFURCxXQUFZLGtCQUFrQjtJQUM1Qix1REFBaUMsQ0FBQTtJQUNqQywyREFBcUMsQ0FBQTtJQUNyQywrQ0FBeUIsQ0FBQTtJQUN6Qix1REFBaUMsQ0FBQTtJQUNqQyw2Q0FBdUIsQ0FBQTtJQUN2QiwyQ0FBcUIsQ0FBQTtJQUNyQiwyQ0FBcUIsQ0FBQTtJQUNyQix5Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVFcsa0JBQWtCLGtDQUFsQixrQkFBa0IsUUFTN0I7QUFHTSxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0NBMEIxQixDQUFBO0FBMUJZLHdDQUFjO0FBRXpCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7MENBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUN4QztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQ3pDO0FBUXhCO0lBTkMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7aURBQzZCO0FBRy9CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7b0RBQzFDO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDM0M7QUFHdkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7eUJBekJOLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQTBCMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLWVycm9yLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBlbnVtIE1pZ3JhdGlvbkVycm9yVHlwZSB7XG4gIEZJTEVfTk9UX0ZPVU5EID0gJ0ZJTEVfTk9UX0ZPVU5EJyxcbiAgTUlTU0lOR19GSUxFTkFNRSA9ICdNSVNTSU5HX0ZJTEVOQU1FJyxcbiAgRklMRV9FUlJPUiA9ICdGSUxFX0VSUk9SJyxcbiAgQUlfUEFSU0VfRVJST1IgPSAnQUlfUEFSU0VfRVJST1InLFxuICBBUElfRVJST1IgPSAnQVBJX0VSUk9SJyxcbiAgREJfRVJST1IgPSAnREJfRVJST1InLFxuICBTRUNVUklUWSA9ICdTRUNVUklUWScsXG4gIFVOS05PV04gPSAnVU5LTk9XTicsXG59XG5cbkBFbnRpdHkoJ21pZ3JhdGlvbl9lcnJvcnMnKVxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvbkVycm9yIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2JhdGNoX2lkJywgbGVuZ3RoOiA1MCwgbnVsbGFibGU6IHRydWUgfSlcbiAgYmF0Y2hJZD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X251bWJlcicsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkb2N1bWVudE51bWJlcj86IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZXJyb3JfdHlwZScsXG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IE1pZ3JhdGlvbkVycm9yVHlwZSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgZXJyb3JUeXBlPzogTWlncmF0aW9uRXJyb3JUeXBlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZXJyb3JfbWVzc2FnZScsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmF3X2FpX3Jlc3BvbnNlJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByYXdBaVJlc3BvbnNlPzogc3RyaW5nO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567.map new file mode 100644 index 0000000..9ff0004 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/migrationerrorentity_3b7f3e5a2bcc89818af57caf0ed52567.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-error.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAKiB;AAEjB,IAAY,kBASX;AATD,WAAY,kBAAkB;IAC5B,uDAAiC,CAAA;IACjC,2DAAqC,CAAA;IACrC,+CAAyB,CAAA;IACzB,uDAAiC,CAAA;IACjC,6CAAuB,CAAA;IACvB,2CAAqB,CAAA;IACrB,2CAAqB,CAAA;IACrB,yCAAmB,CAAA;AACrB,CAAC,EATW,kBAAkB,kCAAlB,kBAAkB,QAS7B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;CA0B1B,CAAA;AA1BY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACxC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACzC;AAQxB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,IAAI;KACf,CAAC;;iDAC6B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oDAC1C;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC3C;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;yBAzBN,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CA0B1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-error.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n} from 'typeorm';\n\nexport enum MigrationErrorType {\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\n MISSING_FILENAME = 'MISSING_FILENAME',\n FILE_ERROR = 'FILE_ERROR',\n AI_PARSE_ERROR = 'AI_PARSE_ERROR',\n API_ERROR = 'API_ERROR',\n DB_ERROR = 'DB_ERROR',\n SECURITY = 'SECURITY',\n UNKNOWN = 'UNKNOWN',\n}\n\n@Entity('migration_errors')\nexport class MigrationError {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'batch_id', length: 50, nullable: true })\n batchId?: string;\n\n @Column({ name: 'document_number', length: 100, nullable: true })\n documentNumber?: string;\n\n @Column({\n name: 'error_type',\n type: 'enum',\n enum: MigrationErrorType,\n nullable: true,\n })\n errorType?: MigrationErrorType;\n\n @Column({ name: 'error_message', type: 'text', nullable: true })\n errorMessage?: string;\n\n @Column({ name: 'raw_ai_response', type: 'text', nullable: true })\n rawAiResponse?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6 new file mode 100644 index 0000000..30b2607 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6 @@ -0,0 +1,50 @@ +4dc6995f8803356fdeda634f4e7937a5 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Permission = void 0; +const typeorm_1 = require("typeorm"); +let Permission = class Permission { +}; +exports.Permission = Permission; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'permission_id' }), + __metadata("design:type", Number) +], Permission.prototype, "permissionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'permission_name', length: 100, unique: true }), + __metadata("design:type", String) +], Permission.prototype, "permissionName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Permission.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, nullable: true }), + __metadata("design:type", String) +], Permission.prototype, "module", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'scope_level', + type: 'enum', + enum: ['GLOBAL', 'ORG', 'PROJECT'], + nullable: true, + }), + __metadata("design:type", String) +], Permission.prototype, "scopeLevel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Permission.prototype, "isActive", void 0); +exports.Permission = Permission = __decorate([ + (0, typeorm_1.Entity)('permissions') +], Permission); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHBlcm1pc3Npb24uZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUcxRCxJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0NBdUJ0QixDQUFBO0FBdkJZLGdDQUFVO0FBRXJCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7Z0RBQzVCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztrREFDdkM7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN2QjtBQVFoQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDbEMsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzs4Q0FDa0I7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzFCO3FCQXRCUixVQUFVO0lBRHRCLElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUM7R0FDVCxVQUFVLENBdUJ0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx1c2VyXFxlbnRpdGllc1xccGVybWlzc2lvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLCBDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgncGVybWlzc2lvbnMnKVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb24ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7IG5hbWU6ICdwZXJtaXNzaW9uX2lkJyB9KVxuICBwZXJtaXNzaW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwZXJtaXNzaW9uX25hbWUnLCBsZW5ndGg6IDEwMCwgdW5pcXVlOiB0cnVlIH0pXG4gIHBlcm1pc3Npb25OYW1lITogc3RyaW5nOyAvLyBlLmcuLCAncmZhLmNyZWF0ZSdcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiA1MCwgbnVsbGFibGU6IHRydWUgfSlcbiAgbW9kdWxlPzogc3RyaW5nOyAvLyBlLmcuLCAncmZhJywgJ3VzZXInXG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3Njb3BlX2xldmVsJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogWydHTE9CQUwnLCAnT1JHJywgJ1BST0pFQ1QnXSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgc2NvcGVMZXZlbD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6.map new file mode 100644 index 0000000..6290667 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/permissionentity_3fe225543fa1de9d00166baac9ae7dd6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\permission.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,UAAU,GAAhB,MAAM,UAAU;CAuBtB,CAAA;AAvBY,gCAAU;AAErB;IADC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;gDAC5B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACvC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACvB;AAQhB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;QAClC,QAAQ,EAAE,IAAI;KACf,CAAC;;8CACkB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;qBAtBR,UAAU;IADtB,IAAA,gBAAM,EAAC,aAAa,CAAC;GACT,UAAU,CAuBtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\permission.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('permissions')\nexport class Permission {\n @PrimaryGeneratedColumn({ name: 'permission_id' })\n permissionId!: number;\n\n @Column({ name: 'permission_name', length: 100, unique: true })\n permissionName!: string; // e.g., 'rfa.create'\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ length: 50, nullable: true })\n module?: string; // e.g., 'rfa', 'user'\n\n @Column({\n name: 'scope_level',\n type: 'enum',\n enum: ['GLOBAL', 'ORG', 'PROJECT'],\n nullable: true,\n })\n scopeLevel?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a new file mode 100644 index 0000000..2eb6d6e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a @@ -0,0 +1,45 @@ +a0270716512918f9ee7c4efee47d37ba +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaApproveCode = void 0; +const typeorm_1 = require("typeorm"); +let RfaApproveCode = class RfaApproveCode { +}; +exports.RfaApproveCode = RfaApproveCode; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaApproveCode.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approve_code', length: 20, unique: true }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "approveCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approve_name', length: 100 }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "approveName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], RfaApproveCode.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaApproveCode.prototype, "isActive", void 0); +exports.RfaApproveCode = RfaApproveCode = __decorate([ + (0, typeorm_1.Entity)('rfa_approve_codes') +], RfaApproveCode); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLWFwcHJvdmUtY29kZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscUNBQWlFO0FBRzFELElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWM7Q0FrQjFCLENBQUE7QUFsQlksd0NBQWM7QUFFekI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOzswQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQ3RDO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O21EQUN6QjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzttREFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7aURBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2dEQUMxQjt5QkFqQlIsY0FBYztJQUQxQixJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUM7R0FDZixjQUFjLENBa0IxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtYXBwcm92ZS1jb2RlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sIENvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdyZmFfYXBwcm92ZV9jb2RlcycpXG5leHBvcnQgY2xhc3MgUmZhQXBwcm92ZUNvZGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXBwcm92ZV9jb2RlJywgbGVuZ3RoOiAyMCwgdW5pcXVlOiB0cnVlIH0pXG4gIGFwcHJvdmVDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXBwcm92ZV9uYW1lJywgbGVuZ3RoOiAxMDAgfSlcbiAgYXBwcm92ZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a.map new file mode 100644 index 0000000..06f4aca --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3f/rfaapprovecodeentity_3f1229aa8550150b5508b6fe1264426a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-approve-code.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,cAAc,GAApB,MAAM,cAAc;CAkB1B,CAAA;AAlBY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;mDACtC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;mDACzB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;iDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;gDAC1B;yBAjBR,cAAc;IAD1B,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,cAAc,CAkB1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-approve-code.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('rfa_approve_codes')\nexport class RfaApproveCode {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'approve_code', length: 20, unique: true })\n approveCode!: string;\n\n @Column({ name: 'approve_name', length: 100 })\n approveName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572 new file mode 100644 index 0000000..e162665 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572 @@ -0,0 +1,54 @@ +282e3ea6d7de7875491738d20d1a1525 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RbacGuard = void 0; +const common_1 = require("@nestjs/common"); +const core_1 = require("@nestjs/core"); +const require_permission_decorator_1 = require("../decorators/require-permission.decorator"); +const user_service_1 = require("../../modules/user/user.service"); +let RbacGuard = class RbacGuard { + constructor(reflector, userService) { + this.reflector = reflector; + this.userService = userService; + } + async canActivate(context) { + // 1. ดูว่า Controller นี้ต้องการสิทธิ์อะไร? + const requiredPermissions = this.reflector.getAllAndOverride(require_permission_decorator_1.PERMISSIONS_KEY, [context.getHandler(), context.getClass()]); + // ถ้าไม่ต้องการสิทธิ์อะไรเลย ก็ปล่อยผ่าน + if (!requiredPermissions || requiredPermissions.length === 0) { + return true; + } + // 2. ดึง User จาก Request (ที่ JwtAuthGuard แปะไว้ให้) + const request = context.switchToHttp().getRequest(); + const user = request.user; + if (!user) { + throw new common_1.ForbiddenException('User not found in request'); + } + // 3. (สำคัญ) ดึงสิทธิ์ทั้งหมดของ User คนนี้จาก Database + const userPermissions = await this.userService.getUserPermissions(user.user_id // ✅ FIX: ใช้ user_id ตาม Entity field name + ); + // 4. ตรวจสอบว่ามีสิทธิ์ที่ต้องการไหม? (User ต้องมีครบทุกสิทธิ์) + const hasPermission = requiredPermissions.every((req) => userPermissions.some((p) => p === req || p === 'system.manage_all' // Superadmin ทะลุทุกสิทธิ์ + )); + if (!hasPermission) { + throw new common_1.ForbiddenException(`You do not have permission: ${requiredPermissions.join(', ')}`); + } + return true; + } +}; +exports.RbacGuard = RbacGuard; +exports.RbacGuard = RbacGuard = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof core_1.Reflector !== "undefined" && core_1.Reflector) === "function" ? _a : Object, typeof (_b = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _b : Object]) +], RbacGuard); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXHJiYWMuZ3VhcmQudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUt3QjtBQUN4Qix1Q0FBeUM7QUFDekMsNkZBQTZFO0FBQzdFLGtFQUE4RDtBQVF2RCxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFDcEIsWUFDVSxTQUFvQixFQUNwQixXQUF3QjtRQUR4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQy9CLENBQUM7SUFFSixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXlCO1FBQ3pDLDRDQUE0QztRQUM1QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQzFELDhDQUFlLEVBQ2YsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQzNDLENBQUM7UUFFRix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBbUIsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLDJDQUEyQztTQUN6RCxDQUFDO1FBRUYsZ0VBQWdFO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3RELGVBQWUsQ0FBQyxJQUFJLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsQ0FBQywyQkFBMkI7U0FDMUUsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSwyQkFBa0IsQ0FDMUIsK0JBQStCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGLENBQUE7QUE3Q1ksOEJBQVM7b0JBQVQsU0FBUztJQURyQixJQUFBLG1CQUFVLEdBQUU7eURBR1UsZ0JBQVMsb0JBQVQsZ0JBQVMsb0RBQ1AsMEJBQVcsb0JBQVgsMEJBQVc7R0FIdkIsU0FBUyxDQTZDckIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXHJiYWMuZ3VhcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2FuQWN0aXZhdGUsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIEZvcmJpZGRlbkV4Y2VwdGlvbixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgUmVmbGVjdG9yIH0gZnJvbSAnQG5lc3Rqcy9jb3JlJztcbmltcG9ydCB7IFBFUk1JU1NJT05TX0tFWSB9IGZyb20gJy4uL2RlY29yYXRvcnMvcmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5cbmludGVyZmFjZSBSZXF1ZXN0V2l0aFVzZXIge1xuICB1c2VyPzogVXNlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJiYWNHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgY2FuQWN0aXZhdGUoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIDEuIOC4lOC4ueC4p+C5iOC4siBDb250cm9sbGVyIOC4meC4teC5ieC4leC5ieC4reC4h+C4geC4suC4o+C4quC4tOC4l+C4mOC4tOC5jOC4reC4sOC5hOC4oz9cbiAgICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUEVSTUlTU0lPTlNfS0VZLFxuICAgICAgW2NvbnRleHQuZ2V0SGFuZGxlcigpLCBjb250ZXh0LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIC8vIOC4luC5ieC4suC5hOC4oeC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4quC4tOC4l+C4mOC4tOC5jOC4reC4sOC5hOC4o+C5gOC4peC4oiDguIHguYfguJvguKXguYjguK3guKLguJzguYjguLLguJlcbiAgICBpZiAoIXJlcXVpcmVkUGVybWlzc2lvbnMgfHwgcmVxdWlyZWRQZXJtaXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDIuIOC4lOC4tuC4hyBVc2VyIOC4iOC4suC4gSBSZXF1ZXN0ICjguJfguLXguYggSnd0QXV0aEd1YXJkIOC5geC4m+C4sOC5hOC4p+C5ieC5g+C4q+C5iSlcbiAgICBjb25zdCByZXF1ZXN0ID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0PFJlcXVlc3RXaXRoVXNlcj4oKTtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdC51c2VyO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbignVXNlciBub3QgZm91bmQgaW4gcmVxdWVzdCcpO1xuICAgIH1cblxuICAgIC8vIDMuICjguKrguLPguITguLHguI0pIOC4lOC4tuC4h+C4quC4tOC4l+C4mOC4tOC5jOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4guC4reC4hyBVc2VyIOC4hOC4meC4meC4teC5ieC4iOC4suC4gSBEYXRhYmFzZVxuICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKFxuICAgICAgdXNlci51c2VyX2lkIC8vIOKchSBGSVg6IOC5g+C4iuC5iSB1c2VyX2lkIOC4leC4suC4oSBFbnRpdHkgZmllbGQgbmFtZVxuICAgICk7XG5cbiAgICAvLyA0LiDguJXguKPguKfguIjguKrguK3guJrguKfguYjguLLguKHguLXguKrguLTguJfguJjguLTguYzguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYTguKvguKE/IChVc2VyIOC4leC5ieC4reC4h+C4oeC4teC4hOC4o+C4muC4l+C4uOC4geC4quC4tOC4l+C4mOC4tOC5jClcbiAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gcmVxdWlyZWRQZXJtaXNzaW9ucy5ldmVyeSgocmVxKSA9PlxuICAgICAgdXNlclBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwKSA9PiBwID09PSByZXEgfHwgcCA9PT0gJ3N5c3RlbS5tYW5hZ2VfYWxsJyAvLyBTdXBlcmFkbWluIOC4l+C4sOC4peC4uOC4l+C4uOC4geC4quC4tOC4l+C4mOC4tOC5jFxuICAgICAgKVxuICAgICk7XG5cbiAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oXG4gICAgICAgIGBZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbjogJHtyZXF1aXJlZFBlcm1pc3Npb25zLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572.map new file mode 100644 index 0000000..6e096eb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/40/rbacguard_400cdd5edff9bc3988d641b1e0469572.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\rbac.guard.ts","mappings":";;;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AACzC,6FAA6E;AAC7E,kEAA8D;AAQvD,IAAM,SAAS,GAAf,MAAM,SAAS;IACpB,YACU,SAAoB,EACpB,WAAwB;QADxB,cAAS,GAAT,SAAS,CAAW;QACpB,gBAAW,GAAX,WAAW,CAAa;IAC/B,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,4CAA4C;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC1D,8CAAe,EACf,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;QAEF,yCAAyC;QACzC,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAmB,CAAC;QACrE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,2BAAkB,CAAC,2BAA2B,CAAC,CAAC;QAC5D,CAAC;QAED,wDAAwD;QACxD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAC/D,IAAI,CAAC,OAAO,CAAC,2CAA2C;SACzD,CAAC;QAEF,gEAAgE;QAChE,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACtD,eAAe,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,mBAAmB,CAAC,2BAA2B;SAC1E,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,2BAAkB,CAC1B,+BAA+B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA7CY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;yDAGU,gBAAS,oBAAT,gBAAS,oDACP,0BAAW,oBAAX,0BAAW;GAHvB,SAAS,CA6CrB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\rbac.guard.ts"],"sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n Injectable,\n ForbiddenException,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { PERMISSIONS_KEY } from '../decorators/require-permission.decorator';\nimport { UserService } from '../../modules/user/user.service';\nimport { User } from '../../modules/user/entities/user.entity';\n\ninterface RequestWithUser {\n user?: User;\n}\n\n@Injectable()\nexport class RbacGuard implements CanActivate {\n constructor(\n private reflector: Reflector,\n private userService: UserService\n ) {}\n\n async canActivate(context: ExecutionContext): Promise {\n // 1. ดูว่า Controller นี้ต้องการสิทธิ์อะไร?\n const requiredPermissions = this.reflector.getAllAndOverride(\n PERMISSIONS_KEY,\n [context.getHandler(), context.getClass()]\n );\n\n // ถ้าไม่ต้องการสิทธิ์อะไรเลย ก็ปล่อยผ่าน\n if (!requiredPermissions || requiredPermissions.length === 0) {\n return true;\n }\n\n // 2. ดึง User จาก Request (ที่ JwtAuthGuard แปะไว้ให้)\n const request = context.switchToHttp().getRequest();\n const user = request.user;\n if (!user) {\n throw new ForbiddenException('User not found in request');\n }\n\n // 3. (สำคัญ) ดึงสิทธิ์ทั้งหมดของ User คนนี้จาก Database\n const userPermissions = await this.userService.getUserPermissions(\n user.user_id // ✅ FIX: ใช้ user_id ตาม Entity field name\n );\n\n // 4. ตรวจสอบว่ามีสิทธิ์ที่ต้องการไหม? (User ต้องมีครบทุกสิทธิ์)\n const hasPermission = requiredPermissions.every((req) =>\n userPermissions.some(\n (p) => p === req || p === 'system.manage_all' // Superadmin ทะลุทุกสิทธิ์\n )\n );\n\n if (!hasPermission) {\n throw new ForbiddenException(\n `You do not have permission: ${requiredPermissions.join(', ')}`\n );\n }\n\n return true;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390 new file mode 100644 index 0000000..cb3c13f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390 @@ -0,0 +1,115 @@ +2c20ac0a8e9c7e0218de0b5e202343d0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var UiSchemaService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UiSchemaService = void 0; +// File: src/modules/json-schema/services/ui-schema.service.ts +const common_1 = require("@nestjs/common"); +let UiSchemaService = UiSchemaService_1 = class UiSchemaService { + constructor() { + this.logger = new common_1.Logger(UiSchemaService_1.name); + } + /** + * ตรวจสอบความถูกต้องของ UI Schema + */ + validateUiSchema(uiSchema, dataSchema) { + if (!uiSchema) + return true; // Optional field + // 1. Validate Structure เบื้องต้น + if (!uiSchema.layout || !uiSchema.fields) { + throw new common_1.BadRequestException('UI Schema must contain "layout" and "fields" properties.'); + } + // 2. ตรวจสอบว่า Fields ใน Layout มีคำนิยามครบถ้วน + const definedFields = new Set(Object.keys(uiSchema.fields)); + const layoutFields = new Set(); + uiSchema.layout.groups.forEach((group) => { + group.fields.forEach((fieldKey) => { + layoutFields.add(fieldKey); + if (!definedFields.has(fieldKey)) { + throw new common_1.BadRequestException(`Field "${fieldKey}" used in layout "${group.title}" is not defined in "fields".`); + } + }); + }); + // 3. (Optional) ตรวจสอบว่า Fields ใน Data Schema (AJV) มีครบใน UI Schema หรือไม่ + // ถ้า Data Schema บอกว่ามี field 'title' แต่ UI Schema ไม่มี -> Frontend อาจจะไม่เรนเดอร์ + if (dataSchema && dataSchema.properties) { + const dataKeys = Object.keys(dataSchema.properties); + const missingFields = dataKeys.filter((key) => !definedFields.has(key)); + if (missingFields.length > 0) { + this.logger.warn(`Data schema properties [${missingFields.join(', ')}] are missing from UI Schema.`); + // ไม่ Throw Error เพราะบางทีเราอาจตั้งใจซ่อน Field (Hidden field) + } + } + return true; + } + /** + * สร้าง UI Schema พื้นฐานจาก Data Schema (AJV) อัตโนมัติ + * ใช้กรณี user ไม่ได้ส่ง UI Schema มาให้ + */ + generateDefaultUiSchema(dataSchema) { + if (!dataSchema || !dataSchema.properties) { + return { + layout: { type: 'stack', groups: [] }, + fields: {}, + }; + } + const fields = {}; + const groupFields = []; + for (const [key, value] of Object.entries(dataSchema.properties)) { + groupFields.push(key); + fields[key] = { + type: value.type || 'string', + title: value.title || this.humanize(key), + description: value.description, + required: (dataSchema.required || []).includes(key), + widget: this.guessWidget(value), + colSpan: 12, // Default full width + }; + } + return { + layout: { + type: 'stack', + groups: [ + { + id: 'default', + title: 'General Information', + type: 'section', + fields: groupFields, + }, + ], + }, + fields, + }; + } + // Helpers + humanize(str) { + return str + .replace(/([A-Z])/g, ' $1') + .replace(/^./, (str) => str.toUpperCase()) + .trim(); + } + guessWidget(schemaProp) { + if (schemaProp.enum) + return 'select'; + if (schemaProp.type === 'boolean') + return 'checkbox'; + if (schemaProp.format === 'date') + return 'date'; + if (schemaProp.format === 'date-time') + return 'datetime'; + if (schemaProp.format === 'binary') + return 'file-upload'; + return 'text'; + } +}; +exports.UiSchemaService = UiSchemaService; +exports.UiSchemaService = UiSchemaService = UiSchemaService_1 = __decorate([ + (0, common_1.Injectable)() +], UiSchemaService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx1aS1zY2hlbWEuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsOERBQThEO0FBQzlELDJDQUF5RTtBQVFsRSxJQUFNLGVBQWUsdUJBQXJCLE1BQU0sZUFBZTtJQUFyQjtRQUNZLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxpQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBZ0g3RCxDQUFDO0lBOUdDOztPQUVHO0lBQ0gsZ0JBQWdCLENBQ2QsUUFBa0IsRUFDbEIsVUFBbUM7UUFFbkMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLGlCQUFpQjtRQUU3QyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLDRCQUFtQixDQUMzQiwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXZDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsVUFBVSxRQUFRLHFCQUFxQixLQUFLLENB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O1FBQ3JELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDaEQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUN6RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRixDQUFBO0FBakhZLDBDQUFlOzBCQUFmLGVBQWU7SUFEM0IsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsZUFBZSxDQWlIM0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx1aS1zY2hlbWEuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9zZXJ2aWNlcy91aS1zY2hlbWEuc2VydmljZS50c1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHtcbiAgVWlTY2hlbWEsXG4gIFVpU2NoZW1hRmllbGQsXG4gIFdpZGdldFR5cGUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvdWktc2NoZW1hLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVaVNjaGVtYVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoVWlTY2hlbWFTZXJ2aWNlLm5hbWUpO1xuXG4gIC8qKlxuICAgKiDguJXguKPguKfguIjguKrguK3guJrguITguKfguLLguKHguJbguLnguIHguJXguYnguK3guIfguILguK3guIcgVUkgU2NoZW1hXG4gICAqL1xuICB2YWxpZGF0ZVVpU2NoZW1hKFxuICAgIHVpU2NoZW1hOiBVaVNjaGVtYSxcbiAgICBkYXRhU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXVpU2NoZW1hKSByZXR1cm4gdHJ1ZTsgLy8gT3B0aW9uYWwgZmllbGRcblxuICAgIC8vIDEuIFZhbGlkYXRlIFN0cnVjdHVyZSDguYDguJrguLfguYnguK3guIfguJXguYnguJlcbiAgICBpZiAoIXVpU2NoZW1hLmxheW91dCB8fCAhdWlTY2hlbWEuZmllbGRzKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgJ1VJIFNjaGVtYSBtdXN0IGNvbnRhaW4gXCJsYXlvdXRcIiBhbmQgXCJmaWVsZHNcIiBwcm9wZXJ0aWVzLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMi4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIEZpZWxkcyDguYPguJkgTGF5b3V0IOC4oeC4teC4hOC4s+C4meC4tOC4ouC4suC4oeC4hOC4o+C4muC4luC5ieC4p+C4mVxuICAgIGNvbnN0IGRlZmluZWRGaWVsZHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHVpU2NoZW1hLmZpZWxkcykpO1xuICAgIGNvbnN0IGxheW91dEZpZWxkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgdWlTY2hlbWEubGF5b3V0Lmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXAuZmllbGRzLmZvckVhY2goKGZpZWxkS2V5KSA9PiB7XG4gICAgICAgIGxheW91dEZpZWxkcy5hZGQoZmllbGRLZXkpO1xuICAgICAgICBpZiAoIWRlZmluZWRGaWVsZHMuaGFzKGZpZWxkS2V5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgICAgYEZpZWxkIFwiJHtmaWVsZEtleX1cIiB1c2VkIGluIGxheW91dCBcIiR7Z3JvdXAudGl0bGV9XCIgaXMgbm90IGRlZmluZWQgaW4gXCJmaWVsZHNcIi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAzLiAoT3B0aW9uYWwpIOC4leC4o+C4p+C4iOC4quC4reC4muC4p+C5iOC4siBGaWVsZHMg4LmD4LiZIERhdGEgU2NoZW1hIChBSlYpIOC4oeC4teC4hOC4o+C4muC5g+C4mSBVSSBTY2hlbWEg4Lir4Lij4Li34Lit4LmE4Lih4LmIXG4gICAgLy8g4LiW4LmJ4LiyIERhdGEgU2NoZW1hIOC4muC4reC4geC4p+C5iOC4suC4oeC4tSBmaWVsZCAndGl0bGUnIOC5geC4leC5iCBVSSBTY2hlbWEg4LmE4Lih4LmI4Lih4Li1IC0+IEZyb250ZW5kIOC4reC4suC4iOC4iOC4sOC5hOC4oeC5iOC5gOC4o+C4meC5gOC4lOC4reC4o+C5jFxuICAgIGlmIChkYXRhU2NoZW1hICYmIGRhdGFTY2hlbWEucHJvcGVydGllcykge1xuICAgICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhU2NoZW1hLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IGRhdGFLZXlzLmZpbHRlcigoa2V5KSA9PiAhZGVmaW5lZEZpZWxkcy5oYXMoa2V5KSk7XG5cbiAgICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgRGF0YSBzY2hlbWEgcHJvcGVydGllcyBbJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9XSBhcmUgbWlzc2luZyBmcm9tIFVJIFNjaGVtYS5gXG4gICAgICAgICk7XG4gICAgICAgIC8vIOC5hOC4oeC5iCBUaHJvdyBFcnJvciDguYDguJ7guKPguLLguLDguJrguLLguIfguJfguLXguYDguKPguLLguK3guLLguIjguJXguLHguYnguIfguYPguIjguIvguYjguK3guJkgRmllbGQgKEhpZGRlbiBmaWVsZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguKrguKPguYnguLLguIcgVUkgU2NoZW1hIOC4nuC4t+C5ieC4meC4kOC4suC4meC4iOC4suC4gSBEYXRhIFNjaGVtYSAoQUpWKSDguK3guLHguJXguYLguJnguKHguLHguJXguLRcbiAgICog4LmD4LiK4LmJ4LiB4Lij4LiT4Li1IHVzZXIg4LmE4Lih4LmI4LmE4LiU4LmJ4Liq4LmI4LiHIFVJIFNjaGVtYSDguKHguLLguYPguKvguYlcbiAgICovXG4gIGdlbmVyYXRlRGVmYXVsdFVpU2NoZW1hKGRhdGFTY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogVWlTY2hlbWEge1xuICAgIGlmICghZGF0YVNjaGVtYSB8fCAhZGF0YVNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IHsgdHlwZTogJ3N0YWNrJywgZ3JvdXBzOiBbXSB9LFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVWlTY2hlbWFGaWVsZCB9ID0ge307XG4gICAgY29uc3QgZ3JvdXBGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIGRhdGFTY2hlbWEucHJvcGVydGllcyBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICApKSB7XG4gICAgICBncm91cEZpZWxkcy5wdXNoKGtleSk7XG5cbiAgICAgIGZpZWxkc1trZXldID0ge1xuICAgICAgICB0eXBlOiAodmFsdWUudHlwZSBhcyBVaVNjaGVtYUZpZWxkWyd0eXBlJ10pIHx8ICdzdHJpbmcnLFxuICAgICAgICB0aXRsZTogKHZhbHVlLnRpdGxlIGFzIHN0cmluZykgfHwgdGhpcy5odW1hbml6ZShrZXkpLFxuICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICByZXF1aXJlZDogKChkYXRhU2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSkuaW5jbHVkZXMoa2V5KSxcbiAgICAgICAgd2lkZ2V0OiB0aGlzLmd1ZXNzV2lkZ2V0KHZhbHVlKSxcbiAgICAgICAgY29sU3BhbjogMTIsIC8vIERlZmF1bHQgZnVsbCB3aWR0aFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0aXRsZTogJ0dlbmVyYWwgSW5mb3JtYXRpb24nLFxuICAgICAgICAgICAgdHlwZTogJ3NlY3Rpb24nLFxuICAgICAgICAgICAgZmllbGRzOiBncm91cEZpZWxkcyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGZpZWxkcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gSGVscGVyc1xuICBwcml2YXRlIGh1bWFuaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3Vlc3NXaWRnZXQoc2NoZW1hUHJvcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBXaWRnZXRUeXBlIHtcbiAgICBpZiAoc2NoZW1hUHJvcC5lbnVtKSByZXR1cm4gJ3NlbGVjdCc7XG4gICAgaWYgKHNjaGVtYVByb3AudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ2NoZWNrYm94JztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdkYXRlJykgcmV0dXJuICdkYXRlJztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdkYXRlLXRpbWUnKSByZXR1cm4gJ2RhdGV0aW1lJztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdiaW5hcnknKSByZXR1cm4gJ2ZpbGUtdXBsb2FkJztcbiAgICByZXR1cm4gJ3RleHQnO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390.map new file mode 100644 index 0000000..937977d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/uischemaservice_41fb300ce4e5c206370528340f239390.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\ui-schema.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\ui-schema.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/ui-schema.service.ts\nimport { Injectable, BadRequestException, Logger } from '@nestjs/common';\nimport {\n UiSchema,\n UiSchemaField,\n WidgetType,\n} from '../interfaces/ui-schema.interface';\n\n@Injectable()\nexport class UiSchemaService {\n private readonly logger = new Logger(UiSchemaService.name);\n\n /**\n * ตรวจสอบความถูกต้องของ UI Schema\n */\n validateUiSchema(\n uiSchema: UiSchema,\n dataSchema: Record\n ): boolean {\n if (!uiSchema) return true; // Optional field\n\n // 1. Validate Structure เบื้องต้น\n if (!uiSchema.layout || !uiSchema.fields) {\n throw new BadRequestException(\n 'UI Schema must contain \"layout\" and \"fields\" properties.'\n );\n }\n\n // 2. ตรวจสอบว่า Fields ใน Layout มีคำนิยามครบถ้วน\n const definedFields = new Set(Object.keys(uiSchema.fields));\n const layoutFields = new Set();\n\n uiSchema.layout.groups.forEach((group) => {\n group.fields.forEach((fieldKey) => {\n layoutFields.add(fieldKey);\n if (!definedFields.has(fieldKey)) {\n throw new BadRequestException(\n `Field \"${fieldKey}\" used in layout \"${group.title}\" is not defined in \"fields\".`\n );\n }\n });\n });\n\n // 3. (Optional) ตรวจสอบว่า Fields ใน Data Schema (AJV) มีครบใน UI Schema หรือไม่\n // ถ้า Data Schema บอกว่ามี field 'title' แต่ UI Schema ไม่มี -> Frontend อาจจะไม่เรนเดอร์\n if (dataSchema && dataSchema.properties) {\n const dataKeys = Object.keys(dataSchema.properties);\n const missingFields = dataKeys.filter((key) => !definedFields.has(key));\n\n if (missingFields.length > 0) {\n this.logger.warn(\n `Data schema properties [${missingFields.join(', ')}] are missing from UI Schema.`\n );\n // ไม่ Throw Error เพราะบางทีเราอาจตั้งใจซ่อน Field (Hidden field)\n }\n }\n\n return true;\n }\n\n /**\n * สร้าง UI Schema พื้นฐานจาก Data Schema (AJV) อัตโนมัติ\n * ใช้กรณี user ไม่ได้ส่ง UI Schema มาให้\n */\n generateDefaultUiSchema(dataSchema: Record): UiSchema {\n if (!dataSchema || !dataSchema.properties) {\n return {\n layout: { type: 'stack', groups: [] },\n fields: {},\n };\n }\n\n const fields: { [key: string]: UiSchemaField } = {};\n const groupFields: string[] = [];\n\n for (const [key, value] of Object.entries(\n dataSchema.properties as Record>\n )) {\n groupFields.push(key);\n\n fields[key] = {\n type: (value.type as UiSchemaField['type']) || 'string',\n title: (value.title as string) || this.humanize(key),\n description: value.description as string | undefined,\n required: ((dataSchema.required as string[]) || []).includes(key),\n widget: this.guessWidget(value),\n colSpan: 12, // Default full width\n };\n }\n\n return {\n layout: {\n type: 'stack',\n groups: [\n {\n id: 'default',\n title: 'General Information',\n type: 'section',\n fields: groupFields,\n },\n ],\n },\n fields,\n };\n }\n\n // Helpers\n private humanize(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n }\n\n private guessWidget(schemaProp: Record): WidgetType {\n if (schemaProp.enum) return 'select';\n if (schemaProp.type === 'boolean') return 'checkbox';\n if (schemaProp.format === 'date') return 'date';\n if (schemaProp.format === 'date-time') return 'datetime';\n if (schemaProp.format === 'binary') return 'file-upload';\n return 'text';\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23 new file mode 100644 index 0000000..e1b192d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23 @@ -0,0 +1,16 @@ +4f0b13d6135bf2c077974b3e858be63c +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = void 0; +const sha1_js_1 = require("./sha1.js"); +const v35_js_1 = require("./v35.js"); +var v35_js_2 = require("./v35.js"); +Object.defineProperty(exports, "DNS", { enumerable: true, get: function () { return v35_js_2.DNS; } }); +Object.defineProperty(exports, "URL", { enumerable: true, get: function () { return v35_js_2.URL; } }); +function v5(value, namespace, buf, offset) { + return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset); +} +v5.DNS = v35_js_1.DNS; +v5.URL = v35_js_1.URL; +exports.default = v5; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2RyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkcsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBQ0QsRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUN0QixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2NS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSB2b2lkIDA7XG5jb25zdCBzaGExX2pzXzEgPSByZXF1aXJlKFwiLi9zaGExLmpzXCIpO1xuY29uc3QgdjM1X2pzXzEgPSByZXF1aXJlKFwiLi92MzUuanNcIik7XG52YXIgdjM1X2pzXzIgPSByZXF1aXJlKFwiLi92MzUuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJETlNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYzNV9qc18yLkROUzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlVSTFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjM1X2pzXzIuVVJMOyB9IH0pO1xuZnVuY3Rpb24gdjUodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gKDAsIHYzNV9qc18xLmRlZmF1bHQpKDB4NTAsIHNoYTFfanNfMS5kZWZhdWx0LCB2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCk7XG59XG52NS5ETlMgPSB2MzVfanNfMS5ETlM7XG52NS5VUkwgPSB2MzVfanNfMS5VUkw7XG5leHBvcnRzLmRlZmF1bHQgPSB2NTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23.map new file mode 100644 index 0000000..20add0e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/41/v5_415f1cf7e7e293f9c6645ec74faf3d23.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v5.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AACnC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACzF,CAAC;AACD,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v5.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst sha1_js_1 = require(\"./sha1.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v5(value, namespace, buf, offset) {\n return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset);\n}\nv5.DNS = v35_js_1.DNS;\nv5.URL = v35_js_1.URL;\nexports.default = v5;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4 new file mode 100644 index 0000000..c3cf734 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4 @@ -0,0 +1,57 @@ +a1c2d0819481fdf8c2ca438feda317f8 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflowTemplate = void 0; +const typeorm_1 = require("typeorm"); +const rfa_workflow_template_step_entity_1 = require("./rfa-workflow-template-step.entity"); +let RfaWorkflowTemplate = class RfaWorkflowTemplate { +}; +exports.RfaWorkflowTemplate = RfaWorkflowTemplate; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflowTemplate.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_name', length: 100 }), + __metadata("design:type", String) +], RfaWorkflowTemplate.prototype, "templateName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaWorkflowTemplate.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaWorkflowTemplate.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], RfaWorkflowTemplate.prototype, "workflowConfig", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaWorkflowTemplate.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], RfaWorkflowTemplate.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_workflow_template_step_entity_1.RfaWorkflowTemplateStep, (step) => step.template, { + cascade: true, + }), + __metadata("design:type", Array) +], RfaWorkflowTemplate.prototype, "steps", void 0); +exports.RfaWorkflowTemplate = RfaWorkflowTemplate = __decorate([ + (0, typeorm_1.Entity)('rfa_workflow_templates') +], RfaWorkflowTemplate); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBT2lCO0FBQ2pCLDJGQUE4RTtBQUd2RSxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFtQjtDQTJCL0IsQ0FBQTtBQTNCWSxrREFBbUI7QUFFOUI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOzsrQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3lEQUN6QjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt3REFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7cURBQzFCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ3hCLE1BQU0sb0JBQU4sTUFBTTsyREFBa0I7QUFHekM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFNakI7SUFIQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMkRBQXVCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDakUsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOztrREFDZ0M7OEJBMUJ2QixtQkFBbUI7SUFEL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0dBQ3BCLG1CQUFtQixDQTJCL0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgT25lVG9NYW55LFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwIH0gZnJvbSAnLi9yZmEtd29ya2Zsb3ctdGVtcGxhdGUtc3RlcC5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dfdGVtcGxhdGVzJylcbmV4cG9ydCBjbGFzcyBSZmFXb3JrZmxvd1RlbXBsYXRlIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX25hbWUnLCBsZW5ndGg6IDEwMCB9KVxuICB0ZW1wbGF0ZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB3b3JrZmxvd0NvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyAvLyBDb25maWd1cmF0aW9uIOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oVxuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICAvLyBSZWxhdGlvbnNcbiAgQE9uZVRvTWFueSgoKSA9PiBSZmFXb3JrZmxvd1RlbXBsYXRlU3RlcCwgKHN0ZXApID0+IHN0ZXAudGVtcGxhdGUsIHtcbiAgICBjYXNjYWRlOiB0cnVlLFxuICB9KVxuICBzdGVwcyE6IFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwW107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4.map new file mode 100644 index 0000000..7c55e1f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/42/rfaworkflowtemplateentity_42a2dc2bd2510ac1a48f6fedb3ca01d4.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,2FAA8E;AAGvE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CA2B/B,CAAA;AA3BY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,GAAE;;+CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yDACzB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;qDAC1B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACxB,MAAM,oBAAN,MAAM;2DAAkB;AAGzC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAMjB;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;QACjE,OAAO,EAAE,IAAI;KACd,CAAC;;kDACgC;8BA1BvB,mBAAmB;IAD/B,IAAA,gBAAM,EAAC,wBAAwB,CAAC;GACpB,mBAAmB,CA2B/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n OneToMany,\n} from 'typeorm';\nimport { RfaWorkflowTemplateStep } from './rfa-workflow-template-step.entity';\n\n@Entity('rfa_workflow_templates')\nexport class RfaWorkflowTemplate {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'template_name', length: 100 })\n templateName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @Column({ type: 'json', nullable: true })\n workflowConfig?: Record; // Configuration เพิ่มเติม\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @OneToMany(() => RfaWorkflowTemplateStep, (step) => step.template, {\n cascade: true,\n })\n steps!: RfaWorkflowTemplateStep[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16 new file mode 100644 index 0000000..c3affad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16 @@ -0,0 +1,108 @@ +b59cb411d4f0e298d3ac75c2d063cc28 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnqueueMigrationDto = void 0; +const class_validator_1 = require("class-validator"); +class EnqueueMigrationDto { +} +exports.EnqueueMigrationDto = EnqueueMigrationDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "subject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "originalSubject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "body", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "category", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "aiSummary", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "projectId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "senderOrgId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "receiverOrgId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "issuedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "receivedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "remarks", void 0); +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], EnqueueMigrationDto.prototype, "extractedTags", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], EnqueueMigrationDto.prototype, "details", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], EnqueueMigrationDto.prototype, "isValid", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "confidence", void 0); +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], EnqueueMigrationDto.prototype, "aiIssues", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGVucXVldWUtbWlncmF0aW9uLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBT3lCO0FBRXpCLE1BQWEsbUJBQW1CO0NBdUUvQjtBQXZFRCxrREF1RUM7QUFwRUM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzJEQUNXO0FBSXhCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztvREFDSTtBQUlqQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NERBQ1k7QUFJekI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O2lEQUNDO0FBSWQ7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3FEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztzREFDTTtBQUluQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7c0RBQ007QUFJbkI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3dEQUNRO0FBSXJCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzswREFDVTtBQUl2QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7dURBQ087QUFJcEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNTO0FBSXRCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztvREFDSTtBQUlqQjtJQUZDLElBQUEseUJBQU8sR0FBRTtJQUNULElBQUEsNEJBQVUsR0FBRTs7MERBQzRCO0FBR3pDO0lBREMsSUFBQSw0QkFBVSxHQUFFO2tEQUNILE1BQU0sb0JBQU4sTUFBTTtvREFBa0I7QUFJbEM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNhO0FBSTFCO0lBRkMsSUFBQSwyQkFBUyxHQUFFO0lBQ1gsSUFBQSw0QkFBVSxHQUFFOztvREFDSztBQUlsQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7dURBQ087QUFJcEI7SUFGQyxJQUFBLHlCQUFPLEdBQUU7SUFDVCxJQUFBLDRCQUFVLEdBQUU7O3FEQUN3QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXGR0b1xcZW5xdWV1ZS1taWdyYXRpb24uZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSXNTdHJpbmcsXHJcbiAgSXNOb3RFbXB0eSxcclxuICBJc09wdGlvbmFsLFxyXG4gIElzTnVtYmVyLFxyXG4gIElzQm9vbGVhbixcclxuICBJc0FycmF5LFxyXG59IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XHJcblxyXG5leHBvcnQgY2xhc3MgRW5xdWV1ZU1pZ3JhdGlvbkR0byB7XHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHN1YmplY3Q/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIG9yaWdpbmFsU3ViamVjdD86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgYm9keT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGFpU3VtbWFyeT86IHN0cmluZztcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcHJvamVjdElkPzogbnVtYmVyO1xyXG5cclxuICBASXNOdW1iZXIoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBzZW5kZXJPcmdJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZXJPcmdJZD86IG51bWJlcjtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgaXNzdWVkRGF0ZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICByZW1hcmtzPzogc3RyaW5nO1xyXG5cclxuICBASXNBcnJheSgpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGV4dHJhY3RlZFRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W107XHJcblxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHRlbXBBdHRhY2htZW50SWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc0Jvb2xlYW4oKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBpc1ZhbGlkPzogYm9vbGVhbjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgY29uZmlkZW5jZT86IG51bWJlcjtcclxuXHJcbiAgQElzQXJyYXkoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBhaUlzc3Vlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16.map new file mode 100644 index 0000000..1dcfb87 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/43/enqueuemigrationdto_43a9a0c3dbe80e14fc4bee052c493a16.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\enqueue-migration.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAOyB;AAEzB,MAAa,mBAAmB;CAuE/B;AAvED,kDAuEC;AApEC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;oDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;4DACY;AAIzB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;iDACC;AAId;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;sDACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;sDACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACQ;AAIrB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0DACU;AAIvB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;oDACI;AAIjB;IAFC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;0DAC4B;AAGzC;IADC,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;oDAAkB;AAIlC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACa;AAI1B;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;oDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACO;AAIpB;IAFC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;qDACwB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\enqueue-migration.dto.ts"],"sourcesContent":["import {\r\n IsString,\r\n IsNotEmpty,\r\n IsOptional,\r\n IsNumber,\r\n IsBoolean,\r\n IsArray,\r\n} from 'class-validator';\r\n\r\nexport class EnqueueMigrationDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n documentNumber!: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n subject?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n originalSubject?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n body?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n category?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n aiSummary?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n projectId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n senderOrgId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n receiverOrgId?: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n issuedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n receivedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n remarks?: string;\r\n\r\n @IsArray()\r\n @IsOptional()\r\n extractedTags?: Record[];\r\n\r\n @IsOptional()\r\n details?: Record;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n tempAttachmentId?: number;\r\n\r\n @IsBoolean()\r\n @IsOptional()\r\n isValid?: boolean;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n confidence?: number;\r\n\r\n @IsArray()\r\n @IsOptional()\r\n aiIssues?: Record[];\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81 new file mode 100644 index 0000000..711d0c1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81 @@ -0,0 +1,31 @@ +9baf01580d92f088080b77b7a4de5a38 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEntity = void 0; +const typeorm_1 = require("typeorm"); +class BaseEntity { +} +exports.BaseEntity = BaseEntity; +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], BaseEntity.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], BaseEntity.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], BaseEntity.prototype, "deletedAt", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxlbnRpdGllc1xcYmFzZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUErRTtBQUUvRSxNQUFzQixVQUFVO0NBWS9CO0FBWkQsZ0NBWUM7QUFQQztJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrREFDNUMsSUFBSSxvQkFBSixJQUFJOzZDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZW50aXRpZXNcXGJhc2UuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyZWF0ZURhdGVDb2x1bW4sIFVwZGF0ZURhdGVDb2x1bW4sIERlbGV0ZURhdGVDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHkge1xuICAvLyBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIC8vIGlkITogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0Jywgc2VsZWN0OiBmYWxzZSB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81.map new file mode 100644 index 0000000..97406ed --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/baseentity_48d140ea0a6e51cff418345ab32f3e81.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\base.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAA+E;AAE/E,MAAsB,UAAU;CAY/B;AAZD,gCAYC;AAPC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;kDAC5C,IAAI,oBAAJ,IAAI;6CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\base.entity.ts"],"sourcesContent":["import { CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from 'typeorm';\n\nexport abstract class BaseEntity {\n // @PrimaryGeneratedColumn()\n // id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at', select: false })\n deletedAt?: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc new file mode 100644 index 0000000..6ed4a21 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc @@ -0,0 +1,152 @@ +9d65398c4dd748113121ec3481c06564 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevision = void 0; +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("../../rfa/entities/rfa-revision.entity"); +const correspondence_entity_1 = require("./correspondence.entity"); +const correspondence_status_entity_1 = require("./correspondence-status.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +const correspondence_revision_attachment_entity_1 = require("./correspondence-revision-attachment.entity"); +let CorrespondenceRevision = class CorrespondenceRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.CorrespondenceRevision = CorrespondenceRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', nullable: true, length: 10 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_current', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_status_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "statusId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 500 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], CorrespondenceRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_project_id', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))", + nullable: true, + }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "vRefProjectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_doc_subtype', + type: 'varchar', + length: 50, + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))", + nullable: true, + }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "vRefType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], CorrespondenceRevision.prototype, "documentDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], CorrespondenceRevision.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], CorrespondenceRevision.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'due_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], CorrespondenceRevision.prototype, "dueDate", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], CorrespondenceRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_f = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _f : Object) +], CorrespondenceRevision.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_status_entity_1.CorrespondenceStatus), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_status_id' }), + __metadata("design:type", typeof (_g = typeof correspondence_status_entity_1.CorrespondenceStatus !== "undefined" && correspondence_status_entity_1.CorrespondenceStatus) === "function" ? _g : Object) +], CorrespondenceRevision.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], CorrespondenceRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.correspondenceRevision), + __metadata("design:type", typeof (_j = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _j : Object) +], CorrespondenceRevision.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, (link) => link.revision), + __metadata("design:type", Array) +], CorrespondenceRevision.prototype, "attachmentLinks", void 0); +exports.CorrespondenceRevision = CorrespondenceRevision = __decorate([ + (0, typeorm_1.Entity)('correspondence_revisions') + // ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น + , + (0, typeorm_1.Index)('idx_corr_rev_v_project', ['vRefProjectId']), + (0, typeorm_1.Index)('idx_corr_rev_v_type', ['vRefType']) +], CorrespondenceRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixnRkFBcUU7QUFDckUsbUVBQXlEO0FBQ3pELGlGQUFzRTtBQUN0RSxpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUM1QywyR0FBK0Y7QUFNeEYsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxpQ0FBYztDQXVHekQsQ0FBQTtBQXZHWSx3REFBc0I7QUFHakM7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7a0RBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztnRUFDWjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4REFDWjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7NkRBQ3hDO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3lEQUMzQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDOzt3REFDM0I7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3VEQUNQO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEs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RSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFEQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO2tEQUN6RCxpQ0FBVyxvQkFBWCxpQ0FBVzsyREFBQztBQU8xQjtJQUpDLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyw0RUFBZ0MsRUFDdEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQ3hCOzsrREFDb0Q7aUNBdEcxQyxzQkFBc0I7SUFKbEMsSUFBQSxnQkFBTSxFQUFDLDBCQUEwQixDQUFDO0lBQ25DLGdFQUFnRTs7SUFDL0QsSUFBQSxlQUFLLEVBQUMsd0JBQXdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxJQUFBLGVBQUssRUFBQyxxQkFBcUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0dBQzlCLHNCQUFzQixDQXVHbEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgSW5kZXgsXG4gIE9uZVRvT25lLFxuICBPbmVUb01hbnksXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgUmZhUmV2aXNpb24gfSBmcm9tICcuLi8uLi9yZmEvZW50aXRpZXMvcmZhLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IFV1aWRCYXNlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudGl0aWVzL3V1aWQtYmFzZS5lbnRpdHknO1xuaW1wb3J0IHsgRXhjbHVkZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50IH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi1hdHRhY2htZW50LmVudGl0eSc7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9ucycpXG4vLyDinIUg4LmA4Lie4Li04LmI4LihIEluZGV4IOC4quC4s+C4q+C4o+C4seC4miBWaXJ0dWFsIENvbHVtbnMg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJIFNlYXJjaCDguYDguKPguYfguKfguILguLbguYnguJlcbkBJbmRleCgnaWR4X2NvcnJfcmV2X3ZfcHJvamVjdCcsIFsndlJlZlByb2plY3RJZCddKVxuQEluZGV4KCdpZHhfY29ycl9yZXZfdl90eXBlJywgWyd2UmVmVHlwZSddKVxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbnVtYmVyJyB9KVxuICByZXZpc2lvbk51bWJlciE6IG51bWJlcjsgLy8gMCwgMSwgMi4uLlxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbGFiZWwnLCBudWxsYWJsZTogdHJ1ZSwgbGVuZ3RoOiAxMCB9KVxuICByZXZpc2lvbkxhYmVsPzogc3RyaW5nOyAvLyBBLCBCLCAwMDEuLi5cblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2N1cnJlbnQnLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBpc0N1cnJlbnQhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2Vfc3RhdHVzX2lkJyB9KVxuICBzdGF0dXNJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiA1MDAgfSlcbiAgc3ViamVjdCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2Rlc2NyaXB0aW9uJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBib2R5Pzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlbWFya3M/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGV0YWlscz86IG9iamVjdDsgLy8gRHluYW1pYyBKU09OIOKAlCB0eXBlZCBhcyBgb2JqZWN0YCBwZXIgVHlwZU9STSBKU09OIGNvbHVtbiBjb252ZW50aW9uIChuby1hbnksIEFEUi0wMTkpXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzY2hlbWFfdmVyc2lvbicsIGRlZmF1bHQ6IDEgfSlcbiAgc2NoZW1hVmVyc2lvbiE6IG51bWJlcjtcblxuICAvLyDinIUgW05ld10gVmlydHVhbCBDb2x1bW46IOC4lOC4tuC4hyBQcm9qZWN0IElEIOC4iOC4suC4gSBKU09OIGRldGFpbHNcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3ZfcmVmX3Byb2plY3RfaWQnLFxuICAgIHR5cGU6ICdpbnQnLFxuICAgIGdlbmVyYXRlZFR5cGU6ICdWSVJUVUFMJyxcbiAgICBhc0V4cHJlc3Npb246IFwiSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5wcm9qZWN0SWQnKSlcIixcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgdlJlZlByb2plY3RJZD86IG51bWJlcjtcblxuICAvLyDinIUgW05ld10gVmlydHVhbCBDb2x1bW46IOC4lOC4tuC4hyBEb2N1bWVudCBTdWJUeXBlIOC4iOC4suC4gSBKU09OIGRldGFpbHNcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3ZfZG9jX3N1YnR5cGUnLFxuICAgIHR5cGU6ICd2YXJjaGFyJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGdlbmVyYXRlZFR5cGU6ICdWSVJUVUFMJyxcbiAgICBhc0V4cHJlc3Npb246IFwiSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5zdWJUeXBlJykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZUeXBlPzogc3RyaW5nO1xuXG4gIC8vIERhdGVzXG4gIEBDb2x1bW4oeyBuYW1lOiAnZG9jdW1lbnRfZGF0ZScsIHR5cGU6ICdkYXRlJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZG9jdW1lbnREYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzc3VlZF9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgaXNzdWVkRGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZWNlaXZlZF9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmVjZWl2ZWREYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2R1ZV9kYXRlJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZHVlRGF0ZT86IERhdGU7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2UsIChjb3JyKSA9PiBjb3JyLnJldmlzaW9ucywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZT86IENvcnJlc3BvbmRlbmNlO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2VTdGF0dXMpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3N0YXR1c19pZCcgfSlcbiAgc3RhdHVzPzogQ29ycmVzcG9uZGVuY2VTdGF0dXM7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JyB9KVxuICBjcmVhdG9yPzogVXNlcjtcblxuICAvLyBBZGRlZCBpbnZlcnNlIHJlbGF0aW9uIGZvciBDVEkgbWFwcGluZyB0byBzdWJjbGFzc2VzIChSRkEpXG4gIEBPbmVUb09uZSgoKSA9PiBSZmFSZXZpc2lvbiwgKHJmYVJldikgPT4gcmZhUmV2LmNvcnJlc3BvbmRlbmNlUmV2aXNpb24pXG4gIHJmYVJldmlzaW9uPzogUmZhUmV2aXNpb247XG5cbiAgLy8gW0ZJWCB2MS44LjFdIFJlbGF0aW9uOiDguYTguJ/guKXguYzguYHguJnguJrguILguK3guIcgcmV2aXNpb24g4LiZ4Li14LmJ4Lic4LmI4Liy4LiZIGp1bmN0aW9uIHRhYmxlXG4gIEBPbmVUb01hbnkoXG4gICAgKCkgPT4gQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQsXG4gICAgKGxpbmspID0+IGxpbmsucmV2aXNpb25cbiAgKVxuICBhdHRhY2htZW50TGlua3M/OiBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudFtdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc.map new file mode 100644 index 0000000..d08cf4d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/correspondencerevisionentity_491343c80877edf2fa63f0d43fb199fc.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n Index,\n OneToOne,\n OneToMany,\n} from 'typeorm';\nimport { RfaRevision } from '../../rfa/entities/rfa-revision.entity';\nimport { Correspondence } from './correspondence.entity';\nimport { CorrespondenceStatus } from './correspondence-status.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\nimport { CorrespondenceRevisionAttachment } from './correspondence-revision-attachment.entity';\n\n@Entity('correspondence_revisions')\n// ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น\n@Index('idx_corr_rev_v_project', ['vRefProjectId'])\n@Index('idx_corr_rev_v_type', ['vRefType'])\nexport class CorrespondenceRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_id' })\n correspondenceId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // 0, 1, 2...\n\n @Column({ name: 'revision_label', nullable: true, length: 10 })\n revisionLabel?: string; // A, B, 001...\n\n @Column({ name: 'is_current', default: false })\n isCurrent!: boolean;\n\n @Column({ name: 'correspondence_status_id' })\n statusId!: number;\n\n @Column({ length: 500 })\n subject!: string;\n\n @Column({ name: 'description', type: 'text', nullable: true })\n description?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ [New] Virtual Column: ดึง Project ID จาก JSON details\n @Column({\n name: 'v_ref_project_id',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))\",\n nullable: true,\n })\n vRefProjectId?: number;\n\n // ✅ [New] Virtual Column: ดึง Document SubType จาก JSON details\n @Column({\n name: 'v_doc_subtype',\n type: 'varchar',\n length: 50,\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))\",\n nullable: true,\n })\n vRefType?: string;\n\n // Dates\n @Column({ name: 'document_date', type: 'date', nullable: true })\n documentDate?: Date;\n\n @Column({ name: 'issued_date', type: 'datetime', nullable: true })\n issuedDate?: Date;\n\n @Column({ name: 'received_date', type: 'datetime', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'due_date', type: 'datetime', nullable: true })\n dueDate?: Date;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n // Relations\n @ManyToOne(() => Correspondence, (corr) => corr.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'correspondence_id' })\n correspondence?: Correspondence;\n\n @ManyToOne(() => CorrespondenceStatus)\n @JoinColumn({ name: 'correspondence_status_id' })\n status?: CorrespondenceStatus;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Added inverse relation for CTI mapping to subclasses (RFA)\n @OneToOne(() => RfaRevision, (rfaRev) => rfaRev.correspondenceRevision)\n rfaRevision?: RfaRevision;\n\n // [FIX v1.8.1] Relation: ไฟล์แนบของ revision นี้ผ่าน junction table\n @OneToMany(\n () => CorrespondenceRevisionAttachment,\n (link) => link.revision\n )\n attachmentLinks?: CorrespondenceRevisionAttachment[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0 new file mode 100644 index 0000000..6c422f7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0 @@ -0,0 +1,69 @@ +e39388ae6bb9b4276d70001bc08b9a22 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSchema = void 0; +// File: src/modules/json-schema/entities/json-schema.entity.ts +const typeorm_1 = require("typeorm"); +let JsonSchema = class JsonSchema { +}; +exports.JsonSchema = JsonSchema; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], JsonSchema.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_code', length: 100 }), + __metadata("design:type", String) +], JsonSchema.prototype, "schemaCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ default: 1 }), + __metadata("design:type", Number) +], JsonSchema.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'table_name', length: 100, nullable: false }) // ✅ เพิ่ม: ระบุตารางเป้าหมาย + , + __metadata("design:type", String) +], JsonSchema.prototype, "tableName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_definition', type: 'json' }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], JsonSchema.prototype, "schemaDefinition", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ui_schema', type: 'json', nullable: true }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], JsonSchema.prototype, "uiSchema", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'virtual_columns', type: 'json', nullable: true }), + __metadata("design:type", Array) +], JsonSchema.prototype, "virtualColumns", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'migration_script', type: 'json', nullable: true }), + __metadata("design:type", typeof (_c = typeof Record !== "undefined" && Record) === "function" ? _c : Object) +], JsonSchema.prototype, "migrationScript", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], JsonSchema.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], JsonSchema.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], JsonSchema.prototype, "updatedAt", void 0); +exports.JsonSchema = JsonSchema = __decorate([ + (0, typeorm_1.Entity)('json_schemas'), + (0, typeorm_1.Index)(['schemaCode', 'version'], { unique: true }) +], JsonSchema); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGVudGl0aWVzXFxqc29uLXNjaGVtYS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLCtEQUErRDtBQUMvRCxxQ0FPaUI7QUFZVixJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0NBaUN0QixDQUFBO0FBakNZLGdDQUFVO0FBRXJCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7c0NBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7OzJDQUNOO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLDZCQUE2Qjs7OzZDQUN4RTtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7a0RBQ2pDLE1BQU0sb0JBQU4sTUFBTTtvREFBa0I7QUFHM0M7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNqRCxNQUFNLG9CQUFOLE1BQU07NENBQWtCO0FBR25DO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztrREFDM0I7QUFHdkM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELE1BQU0sb0JBQU4sTUFBTTttREFBa0I7QUFHMUM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzFCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOzZDQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOzZDQUFDO3FCQWhDTixVQUFVO0lBRnRCLElBQUEsZ0JBQU0sRUFBQyxjQUFjLENBQUM7SUFDdEIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7R0FDdEMsVUFBVSxDQWlDdEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGVudGl0aWVzXFxqc29uLXNjaGVtYS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvanNvbi1zY2hlbWEvZW50aXRpZXMvanNvbi1zY2hlbWEuZW50aXR5LnRzXHJcbmltcG9ydCB7XHJcbiAgRW50aXR5LFxyXG4gIENvbHVtbixcclxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxyXG4gIENyZWF0ZURhdGVDb2x1bW4sXHJcbiAgVXBkYXRlRGF0ZUNvbHVtbixcclxuICBJbmRleCxcclxufSBmcm9tICd0eXBlb3JtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbENvbHVtbkNvbmZpZyB7XHJcbiAganNvblBhdGg6IHN0cmluZztcclxuICBjb2x1bW5OYW1lOiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU6ICdJTlQnIHwgJ1ZBUkNIQVInIHwgJ0JPT0xFQU4nIHwgJ0RBVEUnIHwgJ0RFQ0lNQUwnIHwgJ0RBVEVUSU1FJztcclxuICBpbmRleFR5cGU/OiAnSU5ERVgnIHwgJ1VOSVFVRScgfCAnRlVMTFRFWFQnO1xyXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBFbnRpdHkoJ2pzb25fc2NoZW1hcycpXHJcbkBJbmRleChbJ3NjaGVtYUNvZGUnLCAndmVyc2lvbiddLCB7IHVuaXF1ZTogdHJ1ZSB9KVxyXG5leHBvcnQgY2xhc3MgSnNvblNjaGVtYSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIGlkITogbnVtYmVyO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3NjaGVtYV9jb2RlJywgbGVuZ3RoOiAxMDAgfSlcclxuICBzY2hlbWFDb2RlITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgZGVmYXVsdDogMSB9KVxyXG4gIHZlcnNpb24hOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAndGFibGVfbmFtZScsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogZmFsc2UgfSkgLy8g4pyFIOC5gOC4nuC4tOC5iOC4oTog4Lij4Liw4Lia4Li44LiV4Liy4Lij4Liy4LiH4LmA4Lib4LmJ4Liy4Lir4Lih4Liy4LiiXHJcbiAgdGFibGVOYW1lITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3NjaGVtYV9kZWZpbml0aW9uJywgdHlwZTogJ2pzb24nIH0pXHJcbiAgc2NoZW1hRGVmaW5pdGlvbiE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3VpX3NjaGVtYScsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcclxuICB1aVNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3ZpcnR1YWxfY29sdW1ucycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcclxuICB2aXJ0dWFsQ29sdW1ucz86IFZpcnR1YWxDb2x1bW5Db25maWdbXTtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdtaWdyYXRpb25fc2NyaXB0JywgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIG1pZ3JhdGlvblNjcmlwdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcclxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XHJcblxyXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXHJcbiAgY3JlYXRlZEF0ITogRGF0ZTtcclxuXHJcbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcclxuICB1cGRhdGVkQXQhOiBEYXRlO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0.map new file mode 100644 index 0000000..8847c89 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4a/jsonschemaentity_4ab6cd7cd909aca219faa639bdeba5b0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\entities\\json-schema.entity.ts","mappings":";;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,qCAOiB;AAYV,IAAM,UAAU,GAAhB,MAAM,UAAU;CAiCtB,CAAA;AAjCY,gCAAU;AAErB;IADC,IAAA,gCAAsB,GAAE;;sCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;2CACN;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,6BAA6B;;;6CACxE;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACjC,MAAM,oBAAN,MAAM;oDAAkB;AAG3C;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;4CAAkB;AAGnC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC3B;AAGvC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;mDAAkB;AAG1C;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;qBAhCN,UAAU;IAFtB,IAAA,gBAAM,EAAC,cAAc,CAAC;IACtB,IAAA,eAAK,EAAC,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;GACtC,UAAU,CAiCtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\entities\\json-schema.entity.ts"],"sourcesContent":["// File: src/modules/json-schema/entities/json-schema.entity.ts\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n Index,\r\n} from 'typeorm';\r\n\r\nexport interface VirtualColumnConfig {\r\n jsonPath: string;\r\n columnName: string;\r\n dataType: 'INT' | 'VARCHAR' | 'BOOLEAN' | 'DATE' | 'DECIMAL' | 'DATETIME';\r\n indexType?: 'INDEX' | 'UNIQUE' | 'FULLTEXT';\r\n isRequired: boolean;\r\n}\r\n\r\n@Entity('json_schemas')\r\n@Index(['schemaCode', 'version'], { unique: true })\r\nexport class JsonSchema {\r\n @PrimaryGeneratedColumn()\r\n id!: number;\r\n\r\n @Column({ name: 'schema_code', length: 100 })\r\n schemaCode!: string;\r\n\r\n @Column({ default: 1 })\r\n version!: number;\r\n\r\n @Column({ name: 'table_name', length: 100, nullable: false }) // ✅ เพิ่ม: ระบุตารางเป้าหมาย\r\n tableName!: string;\r\n\r\n @Column({ name: 'schema_definition', type: 'json' })\r\n schemaDefinition!: Record;\r\n\r\n @Column({ name: 'ui_schema', type: 'json', nullable: true })\r\n uiSchema?: Record;\r\n\r\n @Column({ name: 'virtual_columns', type: 'json', nullable: true })\r\n virtualColumns?: VirtualColumnConfig[];\r\n\r\n @Column({ name: 'migration_script', type: 'json', nullable: true })\r\n migrationScript?: Record;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72 new file mode 100644 index 0000000..e317900 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72 @@ -0,0 +1,19 @@ +35b8e07bce844098e15d4509e8b81f88 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CurrentUser = void 0; +const common_1 = require("@nestjs/common"); +/** + * Decorator สำหรับดึงข้อมูล User ปัจจุบันจาก Request Object + * ใช้คู่กับ JwtAuthGuard + * + * ตัวอย่างการใช้: + * @Get() + * findAll(@CurrentUser() user: User) { ... } + */ +exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => { + const request = ctx.switchToHttp().getRequest(); + // request.user ถูก set โดย Passport/JwtStrategy + return request.user; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxjdXJyZW50LXVzZXIuZGVjb3JhdG9yLnRzIiwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3RTtBQUd4RTs7Ozs7OztHQU9HO0FBQ1UsUUFBQSxXQUFXLEdBQUcsSUFBQSw2QkFBb0IsRUFDN0MsQ0FBQyxJQUFhLEVBQUUsR0FBcUIsRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQW1CLENBQUM7SUFDakUsZ0RBQWdEO0lBQ2hELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztBQUN0QixDQUFDLENBQ0YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGRlY29yYXRvcnNcXGN1cnJlbnQtdXNlci5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcblxuLyoqXG4gKiBEZWNvcmF0b3Ig4Liq4Liz4Lir4Lij4Lix4Lia4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54LilIFVzZXIg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZ4LiI4Liy4LiBIFJlcXVlc3QgT2JqZWN0XG4gKiDguYPguIrguYnguITguLnguYjguIHguLHguJogSnd0QXV0aEd1YXJkXG4gKlxuICog4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4LiB4Liy4Lij4LmD4LiK4LmJOlxuICogQEdldCgpXG4gKiBmaW5kQWxsKEBDdXJyZW50VXNlcigpIHVzZXI6IFVzZXIpIHsgLi4uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IEN1cnJlbnRVc2VyID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3Q8eyB1c2VyPzogVXNlciB9PigpO1xuICAgIC8vIHJlcXVlc3QudXNlciDguJbguLnguIEgc2V0IOC5guC4lOC4oiBQYXNzcG9ydC9Kd3RTdHJhdGVneVxuICAgIHJldHVybiByZXF1ZXN0LnVzZXI7XG4gIH1cbik7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72.map new file mode 100644 index 0000000..320635c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4e/currentuserdecorator_4eb44b87c62eb52836b43ed4d4e5aa72.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\current-user.decorator.ts","mappings":";;;AAAA,2CAAwE;AAGxE;;;;;;;GAOG;AACU,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAmB,CAAC;IACjE,gDAAgD;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC,CACF,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\current-user.decorator.ts"],"sourcesContent":["import { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport { User } from '../../modules/user/entities/user.entity';\n\n/**\n * Decorator สำหรับดึงข้อมูล User ปัจจุบันจาก Request Object\n * ใช้คู่กับ JwtAuthGuard\n *\n * ตัวอย่างการใช้:\n * @Get()\n * findAll(@CurrentUser() user: User) { ... }\n */\nexport const CurrentUser = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest<{ user?: User }>();\n // request.user ถูก set โดย Passport/JwtStrategy\n return request.user;\n }\n);\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9 new file mode 100644 index 0000000..96f7f0c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9 @@ -0,0 +1,40 @@ +d591a39eb268253e7b6d6e7cfd633e9b +"use strict"; +/** + * Jest Global Setup + * + * ตั้งค่า global สำหรับทุก test file + * @see specs/05-Engineering-Guidelines/05-04-testing-strategy.md + */ +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +// Global test timeout (30 วินาที) +jest.setTimeout(30000); +// Mock console methods ใน test environment +// ลด noise ใน test output แต่ยังเก็บ error ไว้ +const originalConsole = { + log: console.log, + info: console.info, + warn: console.warn, +}; +global.beforeAll(() => { + // Suppress console.log ใน test (ยกเว้น error) + console.log = jest.fn(); + console.info = jest.fn(); + console.warn = jest.fn(); +}); +global.afterAll(() => { + // Restore original console methods + console.log = originalConsole.log; + console.info = originalConsole.info; + console.warn = originalConsole.warn; +}); +// Clean up mocks หลังจากแต่ละ test +afterEach(() => { + jest.clearAllMocks(); +}); +// Global error handler สำหรับ unhandled promises +process.on('unhandledRejection', (reason) => { + console.error('Unhandled Promise Rejection:', reason); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHRlc3RcXGplc3Quc2V0dXAudHMiLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOztBQUVILDRCQUEwQjtBQUUxQixrQ0FBa0M7QUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV2QiwyQ0FBMkM7QUFDM0MsK0NBQStDO0FBQy9DLE1BQU0sZUFBZSxHQUFHO0lBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztJQUNoQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7SUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0NBQ25CLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNwQiw4Q0FBOEM7SUFDOUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDekIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtJQUNuQixtQ0FBbUM7SUFDbkMsT0FBTyxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztJQUNwQyxPQUFPLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxtQ0FBbUM7QUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7SUFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcdGVzdFxcamVzdC5zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogSmVzdCBHbG9iYWwgU2V0dXBcclxuICpcclxuICog4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIGdsb2JhbCDguKrguLPguKvguKPguLHguJrguJfguLjguIEgdGVzdCBmaWxlXHJcbiAqIEBzZWUgc3BlY3MvMDUtRW5naW5lZXJpbmctR3VpZGVsaW5lcy8wNS0wNC10ZXN0aW5nLXN0cmF0ZWd5Lm1kXHJcbiAqL1xyXG5cclxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcclxuXHJcbi8vIEdsb2JhbCB0ZXN0IHRpbWVvdXQgKDMwIOC4p+C4tOC4meC4suC4l+C4tSlcclxuamVzdC5zZXRUaW1lb3V0KDMwMDAwKTtcclxuXHJcbi8vIE1vY2sgY29uc29sZSBtZXRob2RzIOC5g+C4mSB0ZXN0IGVudmlyb25tZW50XHJcbi8vIOC4peC4lCBub2lzZSDguYPguJkgdGVzdCBvdXRwdXQg4LmB4LiV4LmI4Lii4Lix4LiH4LmA4LiB4LmH4LiaIGVycm9yIOC5hOC4p+C5iVxyXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSB7XHJcbiAgbG9nOiBjb25zb2xlLmxvZyxcclxuICBpbmZvOiBjb25zb2xlLmluZm8sXHJcbiAgd2FybjogY29uc29sZS53YXJuLFxyXG59O1xyXG5cclxuZ2xvYmFsLmJlZm9yZUFsbCgoKSA9PiB7XHJcbiAgLy8gU3VwcHJlc3MgY29uc29sZS5sb2cg4LmD4LiZIHRlc3QgKOC4ouC4geC5gOC4p+C5ieC4mSBlcnJvcilcclxuICBjb25zb2xlLmxvZyA9IGplc3QuZm4oKTtcclxuICBjb25zb2xlLmluZm8gPSBqZXN0LmZuKCk7XHJcbiAgY29uc29sZS53YXJuID0gamVzdC5mbigpO1xyXG59KTtcclxuXHJcbmdsb2JhbC5hZnRlckFsbCgoKSA9PiB7XHJcbiAgLy8gUmVzdG9yZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHNcclxuICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZS5sb2c7XHJcbiAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlLmluZm87XHJcbiAgY29uc29sZS53YXJuID0gb3JpZ2luYWxDb25zb2xlLndhcm47XHJcbn0pO1xyXG5cclxuLy8gQ2xlYW4gdXAgbW9ja3Mg4Lir4Lil4Lix4LiH4LiI4Liy4LiB4LmB4LiV4LmI4Lil4LiwIHRlc3RcclxuYWZ0ZXJFYWNoKCgpID0+IHtcclxuICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcclxufSk7XHJcblxyXG4vLyBHbG9iYWwgZXJyb3IgaGFuZGxlciDguKrguLPguKvguKPguLHguJogdW5oYW5kbGVkIHByb21pc2VzXHJcbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24pID0+IHtcclxuICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246JywgcmVhc29uKTtcclxufSk7XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9.map new file mode 100644 index 0000000..67a8884 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/jestsetup_4fda08179fe6a32d1bea0ac310dcc7f9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\test\\jest.setup.ts","mappings":";AAAA;;;;;GAKG;;AAEH,4BAA0B;AAE1B,kCAAkC;AAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,2CAA2C;AAC3C,+CAA+C;AAC/C,MAAM,eAAe,GAAG;IACtB,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,IAAI,EAAE,OAAO,CAAC,IAAI;CACnB,CAAC;AAEF,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;IACpB,8CAA8C;IAC9C,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACxB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;IACnB,mCAAmC;IACnC,OAAO,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC;IAClC,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;IACpC,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,CAAC,aAAa,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,iDAAiD;AACjD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\test\\jest.setup.ts"],"sourcesContent":["/**\r\n * Jest Global Setup\r\n *\r\n * ตั้งค่า global สำหรับทุก test file\r\n * @see specs/05-Engineering-Guidelines/05-04-testing-strategy.md\r\n */\r\n\r\nimport 'reflect-metadata';\r\n\r\n// Global test timeout (30 วินาที)\r\njest.setTimeout(30000);\r\n\r\n// Mock console methods ใน test environment\r\n// ลด noise ใน test output แต่ยังเก็บ error ไว้\r\nconst originalConsole = {\r\n log: console.log,\r\n info: console.info,\r\n warn: console.warn,\r\n};\r\n\r\nglobal.beforeAll(() => {\r\n // Suppress console.log ใน test (ยกเว้น error)\r\n console.log = jest.fn();\r\n console.info = jest.fn();\r\n console.warn = jest.fn();\r\n});\r\n\r\nglobal.afterAll(() => {\r\n // Restore original console methods\r\n console.log = originalConsole.log;\r\n console.info = originalConsole.info;\r\n console.warn = originalConsole.warn;\r\n});\r\n\r\n// Clean up mocks หลังจากแต่ละ test\r\nafterEach(() => {\r\n jest.clearAllMocks();\r\n});\r\n\r\n// Global error handler สำหรับ unhandled promises\r\nprocess.on('unhandledRejection', (reason) => {\r\n console.error('Unhandled Promise Rejection:', reason);\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0 new file mode 100644 index 0000000..65c0a38 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0 @@ -0,0 +1,12 @@ +3c2e75d9a9e2db245e432d0bf8d0c111 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const validate_js_1 = require("./validate.js"); +function version(uuid) { + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + return parseInt(uuid.slice(14, 15), 16); +} +exports.default = version; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFDYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDL0MsU0FBUyxPQUFPLENBQUMsSUFBSTtJQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2ZXJzaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdmFsaWRhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpO1xuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gICAgaWYgKCEoMCwgdmFsaWRhdGVfanNfMS5kZWZhdWx0KSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTUpLCAxNik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB2ZXJzaW9uO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0.map new file mode 100644 index 0000000..503d843 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4f/version_4fb71003f9f588a1e02156158fac91f0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\version.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,SAAS,OAAO,CAAC,IAAI;IACjB,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\version.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction version(uuid) {\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n return parseInt(uuid.slice(14, 15), 16);\n}\nexports.default = version;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa new file mode 100644 index 0000000..848f4b5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa @@ -0,0 +1,60 @@ +ea64f2030d4f43110ef5aff050dfe2ca +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Rfa = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../user/entities/user.entity"); +const correspondence_entity_1 = require("../../correspondence/entities/correspondence.entity"); // Import +const rfa_type_entity_1 = require("./rfa-type.entity"); +let Rfa = class Rfa { +}; +exports.Rfa = Rfa; +__decorate([ + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", Number) +], Rfa.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], Rfa.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_type_id' }), + __metadata("design:type", Number) +], Rfa.prototype, "rfaTypeId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Rfa.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], Rfa.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Rfa.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_type_entity_1.RfaType), + (0, typeorm_1.JoinColumn)({ name: 'rfa_type_id' }), + __metadata("design:type", typeof (_d = typeof rfa_type_entity_1.RfaType !== "undefined" && rfa_type_entity_1.RfaType) === "function" ? _d : Object) +], Rfa.prototype, "rfaType", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], Rfa.prototype, "creator", void 0); +exports.Rfa = Rfa = __decorate([ + (0, typeorm_1.Entity)('rfas') +], Rfa); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBU2lCO0FBRWpCLGlFQUF1RDtBQUN2RCwrRkFBcUYsQ0FBQyxTQUFTO0FBQy9GLHVEQUE0QztBQUdyQyxJQUFNLEdBQUcsR0FBVCxNQUFNLEdBQUc7Q0E4QmYsQ0FBQTtBQTlCWSxrQkFBRztBQUVkO0lBREMsSUFBQSx1QkFBYSxHQUFFOzsrQkFDSjtBQUlaO0lBRkMsSUFBQSxrQkFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLHNDQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDdkQsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNWLHNDQUFjLG9CQUFkLHNDQUFjOzJDQUFDO0FBR2hDO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOztzQ0FDYjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtzQ0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztzQ0FDNUI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0NBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMseUJBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7a0RBQzFCLHlCQUFPLG9CQUFQLHlCQUFPO29DQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLENBQUM7SUFDckIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTtvQ0FBQztjQTNCSixHQUFHO0lBRGYsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQztHQUNGLEdBQUcsQ0E4QmYiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBQcmltYXJ5Q29sdW1uLFxuICBPbmVUb09uZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi4vLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UuZW50aXR5JzsgLy8gSW1wb3J0XG5pbXBvcnQgeyBSZmFUeXBlIH0gZnJvbSAnLi9yZmEtdHlwZS5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFzJylcbmV4cG9ydCBjbGFzcyBSZmEge1xuICBAUHJpbWFyeUNvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBPbmVUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZSwgeyBvbkRlbGV0ZTogJ0NBU0NBREUnIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZSE6IENvcnJlc3BvbmRlbmNlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3R5cGVfaWQnIH0pXG4gIHJmYVR5cGVJZCE6IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNyZWF0ZWRCeT86IG51bWJlcjtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVR5cGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JmYV90eXBlX2lkJyB9KVxuICByZmFUeXBlITogUmZhVHlwZTtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknIH0pXG4gIGNyZWF0b3I/OiBVc2VyO1xuXG4gIC8vIFJldmlzaW9ucyBhcmUgYWNjZXNzZWQgdmlhIGNvcnJlc3BvbmRlbmNlLnJldmlzaW9ucyAtPiByZmFSZXZpc2lvblxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa.map new file mode 100644 index 0000000..5b29b92 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/50/rfaentity_50ac355b481dd35785689be2a4a7eefa.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCASiB;AAEjB,iEAAuD;AACvD,+FAAqF,CAAC,SAAS;AAC/F,uDAA4C;AAGrC,IAAM,GAAG,GAAT,MAAM,GAAG;CA8Bf,CAAA;AA9BY,kBAAG;AAEd;IADC,IAAA,uBAAa,GAAE;;+BACJ;AAIZ;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACvD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kDACV,sCAAc,oBAAd,sCAAc;2CAAC;AAGhC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;sCACb;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAC5B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDAC1B,yBAAO,oBAAP,yBAAO;oCAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;oCAAC;cA3BJ,GAAG;IADf,IAAA,gBAAM,EAAC,MAAM,CAAC;GACF,GAAG,CA8Bf","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa.entity.ts"],"sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryColumn,\n OneToOne,\n} from 'typeorm';\n\nimport { User } from '../../user/entities/user.entity';\nimport { Correspondence } from '../../correspondence/entities/correspondence.entity'; // Import\nimport { RfaType } from './rfa-type.entity';\n\n@Entity('rfas')\nexport class Rfa {\n @PrimaryColumn()\n id!: number;\n\n @OneToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'id' })\n correspondence!: Correspondence;\n\n @Column({ name: 'rfa_type_id' })\n rfaTypeId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date;\n\n // Relations\n @ManyToOne(() => RfaType)\n @JoinColumn({ name: 'rfa_type_id' })\n rfaType!: RfaType;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Revisions are accessed via correspondence.revisions -> rfaRevision\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479 new file mode 100644 index 0000000..c122f3b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479 @@ -0,0 +1,103 @@ +807639fd30adcc6c120b368656e59367 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawing = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const contract_drawing_subcat_cat_map_entity_1 = require("./contract-drawing-subcat-cat-map.entity"); +const contract_drawing_volume_entity_1 = require("./contract-drawing-volume.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ContractDrawing = class ContractDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ContractDrawing = ContractDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ContractDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'condwg_no', length: 255 }), + __metadata("design:type", String) +], ContractDrawing.prototype, "contractDrawingNo", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 255 }), + __metadata("design:type", String) +], ContractDrawing.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'map_cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "mapCatId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "volumeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_page', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "volumePage", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], ContractDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], ContractDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], ContractDrawing.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap), + (0, typeorm_1.JoinColumn)({ name: 'map_cat_id' }), + __metadata("design:type", typeof (_f = typeof contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap !== "undefined" && contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap) === "function" ? _f : Object) +], ContractDrawing.prototype, "mapCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_volume_entity_1.ContractDrawingVolume), + (0, typeorm_1.JoinColumn)({ name: 'volume_id' }), + __metadata("design:type", typeof (_g = typeof contract_drawing_volume_entity_1.ContractDrawingVolume !== "undefined" && contract_drawing_volume_entity_1.ContractDrawingVolume) === "function" ? _g : Object) +], ContractDrawing.prototype, "volume", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'contract_drawing_attachments', + joinColumn: { name: 'contract_drawing_id', referencedColumnName: 'id' }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], ContractDrawing.prototype, "attachments", void 0); +exports.ContractDrawing = ContractDrawing = __decorate([ + (0, typeorm_1.Entity)('contract_drawings') +], ContractDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmcuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FXaUI7QUFDakIsMEVBQWdFO0FBQ2hFLGlFQUF1RDtBQUN2RCwrRkFBcUY7QUFDckYscUdBQXVGO0FBQ3ZGLHFGQUF5RTtBQUN6RSxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWdCLFNBQVEsaUNBQWM7Q0E0RGxELENBQUE7QUE1RFksMENBQWU7QUFHMUI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7MkNBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7a0RBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7MERBQ2hCO0FBRzNCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDVDtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lEQUM3QjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDNUI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzVCO0FBR3BCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUM1QjtBQU1uQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87Z0RBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO2dEQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsb0VBQTJCLENBQUM7SUFDNUMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNyQixvRUFBMkIsb0JBQTNCLG9FQUEyQjtvREFBQztBQUkxQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzREFBcUIsQ0FBQztJQUN0QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7a0RBQ3pCLHNEQUFxQixvQkFBckIsc0RBQXFCOytDQUFDO0FBUS9CO0lBTkMsSUFBQSxvQkFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUFVLENBQUM7SUFDNUIsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLDhCQUE4QjtRQUNwQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFO1FBQ3ZFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7S0FDekUsQ0FBQzs7b0RBQ3lCOzBCQTNEaEIsZUFBZTtJQUQzQixJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUM7R0FDZixlQUFlLENBNEQzQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcY29udHJhY3QtZHJhd2luZy5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvTWFueSxcbiAgSm9pblRhYmxlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2VudGl0aWVzL2F0dGFjaG1lbnQuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcCB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy1zdWJjYXQtY2F0LW1hcC5lbnRpdHknO1xuaW1wb3J0IHsgQ29udHJhY3REcmF3aW5nVm9sdW1lIH0gZnJvbSAnLi9jb250cmFjdC1kcmF3aW5nLXZvbHVtZS5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdjb250cmFjdF9kcmF3aW5ncycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb25kd2dfbm8nLCBsZW5ndGg6IDI1NSB9KVxuICBjb250cmFjdERyYXdpbmdObyE6IHN0cmluZzsgLy8gISDguKvguYnguLLguKHguKfguYjguLLguIdcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiAyNTUgfSlcbiAgdGl0bGUhOiBzdHJpbmc7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdtYXBfY2F0X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgbWFwQ2F0SWQ/OiBudW1iZXI7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICBAQ29sdW1uKHsgbmFtZTogJ3ZvbHVtZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHZvbHVtZUlkPzogbnVtYmVyOyAvLyA/IOC4p+C5iOC4suC4h+C5hOC4lOC5iSAoTnVsbGFibGUpXG5cbiAgQENvbHVtbih7IG5hbWU6ICd2b2x1bWVfcGFnZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHZvbHVtZVBhZ2U/OiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8gISDguKvguYnguLLguKHguKfguYjguLLguIdcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyAhIOC4q+C5ieC4suC4oeC4p+C5iOC4suC4h1xuXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXG4gIGRlbGV0ZWRBdD86IERhdGU7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB1cGRhdGVkQnk/OiBudW1iZXI7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICAvLyAtLS0gUmVsYXRpb25zIC0tLVxuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JyB9KVxuICB1cGRhdGVyPzogVXNlcjsgLy8gPyDguKfguYjguLLguIfguYTguJTguYlcblxuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnbWFwX2NhdF9pZCcgfSlcbiAgbWFwQ2F0ZWdvcnk/OiBDb250cmFjdERyYXdpbmdTdWJjYXRDYXRNYXA7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb250cmFjdERyYXdpbmdWb2x1bWUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3ZvbHVtZV9pZCcgfSlcbiAgdm9sdW1lPzogQ29udHJhY3REcmF3aW5nVm9sdW1lOyAvLyA/IOC5geC4geC5ieC5hOC4guC4leC4o+C4h+C4meC4teC5iTog4LmD4Liq4LmIID8g4LmA4Lie4Lij4Liy4LiwIHZvbHVtZUlkIOC5gOC4m+C5h+C4mSBOdWxsYWJsZVxuXG4gIEBNYW55VG9NYW55KCgpID0+IEF0dGFjaG1lbnQpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdjb250cmFjdF9kcmF3aW5nX2F0dGFjaG1lbnRzJyxcbiAgICBqb2luQ29sdW1uOiB7IG5hbWU6ICdjb250cmFjdF9kcmF3aW5nX2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcgfSxcbiAgICBpbnZlcnNlSm9pbkNvbHVtbjogeyBuYW1lOiAnYXR0YWNobWVudF9pZCcsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnIH0sXG4gIH0pXG4gIGF0dGFjaG1lbnRzITogQXR0YWNobWVudFtdOyAvLyAhIOC4q+C5ieC4suC4oeC4p+C5iOC4suC4hyAoVHlwZU9STSDguIjguLAgcmV0dXJuIFtdIOC4luC5ieC4suC5hOC4oeC5iOC4oeC4tSlcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479.map new file mode 100644 index 0000000..3fedb20 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/contractdrawingentity_5131b8707236fdf86a0c310a794f2479.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAWiB;AACjB,0EAAgE;AAChE,iEAAuD;AACvD,+FAAqF;AACrF,qGAAuF;AACvF,qFAAyE;AACzE,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,iCAAc;CA4DlD,CAAA;AA5DY,0CAAe;AAG1B;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;2CACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;kDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;0DAChB;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACT;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC7B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDAC5B;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC5B;AAMnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;gDAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;gDAAC;AAIf;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,oEAA2B,CAAC;IAC5C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACrB,oEAA2B,oBAA3B,oEAA2B;oDAAC;AAI1C;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sDAAqB,CAAC;IACtC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;kDACzB,sDAAqB,oBAArB,sDAAqB;+CAAC;AAQ/B;IANC,IAAA,oBAAU,EAAC,GAAG,EAAE,CAAC,8BAAU,CAAC;IAC5B,IAAA,mBAAS,EAAC;QACT,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,EAAE;QACvE,iBAAiB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,EAAE,IAAI,EAAE;KACzE,CAAC;;oDACyB;0BA3DhB,eAAe;IAD3B,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,eAAe,CA4D3B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { ContractDrawingSubcatCatMap } from './contract-drawing-subcat-cat-map.entity';\nimport { ContractDrawingVolume } from './contract-drawing-volume.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('contract_drawings')\nexport class ContractDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // ! ห้ามว่าง\n\n @Column({ name: 'project_id' })\n projectId!: number; // ! ห้ามว่าง\n\n @Column({ name: 'condwg_no', length: 255 })\n contractDrawingNo!: string; // ! ห้ามว่าง\n\n @Column({ length: 255 })\n title!: string; // ! ห้ามว่าง\n\n @Column({ name: 'map_cat_id', nullable: true })\n mapCatId?: number; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'volume_id', nullable: true })\n volumeId?: number; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'volume_page', nullable: true })\n volumePage?: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // ! ห้ามว่าง\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // ! ห้ามว่าง\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number; // ? ว่างได้ (Nullable)\n\n // --- Relations ---\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // ! ห้ามว่าง\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User; // ? ว่างได้\n\n @ManyToOne(() => ContractDrawingSubcatCatMap)\n @JoinColumn({ name: 'map_cat_id' })\n mapCategory?: ContractDrawingSubcatCatMap;\n\n @ManyToOne(() => ContractDrawingVolume)\n @JoinColumn({ name: 'volume_id' })\n volume?: ContractDrawingVolume; // ? แก้ไขตรงนี้: ใส่ ? เพราะ volumeId เป็น Nullable\n\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'contract_drawing_attachments',\n joinColumn: { name: 'contract_drawing_id', referencedColumnName: 'id' },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[]; // ! ห้ามว่าง (TypeORM จะ return [] ถ้าไม่มี)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260 new file mode 100644 index 0000000..c3099fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260 @@ -0,0 +1,28 @@ +1392f4037731be5b7557fad753ade41e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CancelCorrespondenceDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const class_validator_1 = require("class-validator"); +class CancelCorrespondenceDto { +} +exports.CancelCorrespondenceDto = CancelCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Reason for cancelling the correspondence', + example: 'Document was created in error', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CancelCorrespondenceDto.prototype, "reason", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcY2FuY2VsLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBOEM7QUFDOUMscURBQXVEO0FBRXZELE1BQWEsdUJBQXVCO0NBUW5DO0FBUkQsMERBUUM7QUFEQztJQU5DLElBQUEscUJBQVcsRUFBQztRQUNYLFdBQVcsRUFBRSwwQ0FBMEM7UUFDdkQsT0FBTyxFQUFFLCtCQUErQjtLQUN6QyxDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt1REFDRyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxjYW5jZWwtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcclxuaW1wb3J0IHsgSXNTdHJpbmcsIElzTm90RW1wdHkgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xyXG5cclxuZXhwb3J0IGNsYXNzIENhbmNlbENvcnJlc3BvbmRlbmNlRHRvIHtcclxuICBAQXBpUHJvcGVydHkoe1xyXG4gICAgZGVzY3JpcHRpb246ICdSZWFzb24gZm9yIGNhbmNlbGxpbmcgdGhlIGNvcnJlc3BvbmRlbmNlJyxcclxuICAgIGV4YW1wbGU6ICdEb2N1bWVudCB3YXMgY3JlYXRlZCBpbiBlcnJvcicsXHJcbiAgfSlcclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICByZWFzb24hOiBzdHJpbmc7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260.map new file mode 100644 index 0000000..aa8cbf7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/cancelcorrespondencedto_5342b863e6472c198fe125f9c2670260.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\cancel-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAAuD;AAEvD,MAAa,uBAAuB;CAQnC;AARD,0DAQC;AADC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,0CAA0C;QACvD,OAAO,EAAE,+BAA+B;KACzC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACG","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\cancel-correspondence.dto.ts"],"sourcesContent":["import { ApiProperty } from '@nestjs/swagger';\r\nimport { IsString, IsNotEmpty } from 'class-validator';\r\n\r\nexport class CancelCorrespondenceDto {\r\n @ApiProperty({\r\n description: 'Reason for cancelling the correspondence',\r\n example: 'Document was created in error',\r\n })\r\n @IsString()\r\n @IsNotEmpty()\r\n reason!: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451 new file mode 100644 index 0000000..c1721ed --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451 @@ -0,0 +1,22 @@ +8f382bf25c0e1695c1c19d67b54839f2 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowAction = exports.StepStatus = void 0; +// สถานะของการดำเนินการในแต่ละขั้นตอน +var StepStatus; +(function (StepStatus) { + StepStatus["PENDING"] = "PENDING"; + StepStatus["IN_PROGRESS"] = "IN_PROGRESS"; + StepStatus["COMPLETED"] = "COMPLETED"; + StepStatus["REJECTED"] = "REJECTED"; + StepStatus["SKIPPED"] = "SKIPPED"; +})(StepStatus || (exports.StepStatus = StepStatus = {})); +// การกระทำที่ผู้ใช้ทำได้ +var WorkflowAction; +(function (WorkflowAction) { + WorkflowAction["APPROVE"] = "APPROVE"; + WorkflowAction["REJECT"] = "REJECT"; + WorkflowAction["RETURN"] = "RETURN"; + WorkflowAction["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxpbnRlcmZhY2VzXFx3b3JrZmxvdy5pbnRlcmZhY2UudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQXFDO0FBQ3JDLElBQVksVUFNWDtBQU5ELFdBQVksVUFBVTtJQUNwQixpQ0FBbUIsQ0FBQTtJQUNuQix5Q0FBMkIsQ0FBQTtJQUMzQixxQ0FBdUIsQ0FBQTtJQUN2QixtQ0FBcUIsQ0FBQTtJQUNyQixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTlcsVUFBVSwwQkFBVixVQUFVLFFBTXJCO0FBRUQseUJBQXlCO0FBQ3pCLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtJQUNqQiw2Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBTFcsY0FBYyw4QkFBZCxjQUFjLFFBS3pCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcaW50ZXJmYWNlc1xcd29ya2Zsb3cuaW50ZXJmYWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIOC4quC4luC4suC4meC4sOC4guC4reC4h+C4geC4suC4o+C4lOC4s+C5gOC4meC4tOC4meC4geC4suC4o+C5g+C4meC5geC4leC5iOC4peC4sOC4guC4seC5ieC4meC4leC4reC4mVxuZXhwb3J0IGVudW0gU3RlcFN0YXR1cyB7XG4gIFBFTkRJTkcgPSAnUEVORElORycsIC8vIOC4o+C4reC4luC4tuC4h+C4hOC4tOC4p1xuICBJTl9QUk9HUkVTUyA9ICdJTl9QUk9HUkVTUycsIC8vIOC4luC4tuC4h+C4hOC4tOC4p+C5geC4peC5ieC4pyDguKPguK0gYWN0aW9uXG4gIENPTVBMRVRFRCA9ICdDT01QTEVURUQnLCAvLyDguK3guJnguLjguKHguLHguJXguLQv4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4Lij4LmA4Lij4Li14Lii4Lia4Lij4LmJ4Lit4LiiXG4gIFJFSkVDVEVEID0gJ1JFSkVDVEVEJywgLy8g4LiW4Li54LiB4Lib4Lix4LiU4LiV4LiBXG4gIFNLSVBQRUQgPSAnU0tJUFBFRCcsIC8vIOC4luC4ueC4geC4guC5ieC4suC4oVxufVxuXG4vLyDguIHguLLguKPguIHguKPguLDguJfguLPguJfguLXguYjguJzguLnguYnguYPguIrguYnguJfguLPguYTguJTguYlcbmV4cG9ydCBlbnVtIFdvcmtmbG93QWN0aW9uIHtcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJywgLy8g4Lit4LiZ4Li44Lih4Lix4LiV4Li0IC8g4Lii4Li34LiZ4Lii4Lix4LiZIC8g4Liq4LmI4LiH4LiV4LmI4LitXG4gIFJFSkVDVCA9ICdSRUpFQ1QnLCAvLyDguJvguI/guLTguYDguKrguJggKOC4iOC4miB3b3JrZmxvdyDguJfguLHguJnguJfguLUpXG4gIFJFVFVSTiA9ICdSRVRVUk4nLCAvLyDguKrguYjguIfguIHguKXguLHguJogKOC5hOC4m+C5geC4geC5ieC4oeC4suC5g+C4q+C4oeC5iClcbiAgQUNLTk9XTEVER0UgPSAnQUNLTk9XTEVER0UnLCAvLyDguKPguLHguJrguJfguKPguLLguJogKOC4quC4s+C4q+C4o+C4seC4miBGb3IgSW5mbylcbn1cblxuLy8g4LiC4LmJ4Lit4Lih4Li54Lil4Lie4Li34LmJ4LiZ4LiQ4Liy4LiZ4LiC4Lit4LiH4LiC4Lix4LmJ4LiZ4LiV4Lit4LiZIChTdGVwKSDguJfguLXguYggRW5naW5lIOC4leC5ieC4reC4h+C4o+C4ueC5iVxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1N0ZXAge1xuICBzZXF1ZW5jZTogbnVtYmVyOyAvLyDguKXguLPguJTguLHguJrguJfguLXguYggKDEsIDIsIDMuLi4pXG4gIGFzc2lnbmVlSWQ/OiBudW1iZXI7IC8vIFVzZXIgSUQg4LiX4Li14LmI4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4LiaICjguJbguYnguLLguYDguIjguLLguLDguIjguIfguITguJkpXG4gIG9yZ2FuaXphdGlvbklkPzogbnVtYmVyOyAvLyBPcmcgSUQg4LiX4Li14LmI4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4LiaICjguJbguYnguLLguYDguIjguLLguLDguIjguIfguKvguJnguYjguKfguKLguIfguLLguJkpXG4gIHJvbGVJZD86IG51bWJlcjsgLy8gUm9sZSBJRCDguJfguLXguYjguKPguLHguJrguJzguLTguJTguIrguK3guJogKOC4luC5ieC4suC5gOC4iOC4suC4sOC4iOC4h+C4leC4s+C5geC4q+C4meC5iOC4hylcbiAgc3RhdHVzOiBTdGVwU3RhdHVzOyAvLyDguKrguJbguLLguJnguLDguJvguLHguIjguIjguLjguJrguLHguJlcbn1cblxuLy8g4Lic4Lil4Lil4Lix4Lie4LiY4LmM4LiX4Li14LmIIEVuZ2luZSDguIjguLDguJrguK3guIHguYDguKPguLLguKvguKXguLHguIfguIjguLLguIHguJvguKPguLDguKHguKfguKXguJzguKXguYDguKrguKPguYfguIhcbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpdGlvblJlc3VsdCB7XG4gIG5leHRTdGVwU2VxdWVuY2U6IG51bWJlciB8IG51bGw7IC8vIOC4guC4seC5ieC4meC4leC4reC4meC4leC5iOC4reC5hOC4m+C4hOC4t+C4reC5gOC4peC4guC4l+C4teC5iOC5gOC4l+C5iOC4suC5hOC4q+C4o+C5iCAobnVsbCA9IOC4iOC4miB3b3JrZmxvdylcbiAgc2hvdWxkVXBkYXRlU3RhdHVzOiBib29sZWFuOyAvLyDguJXguYnguK3guIfguK3guLHguJvguYDguJTguJXguKrguJbguLLguJnguLDguYDguK3guIHguKrguLLguKPguKvguKXguLHguIHguYTguKvguKE/ICjguYDguIrguYjguJkg4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LiI4Liy4LiBIElOX1JFVklFVyDguYDguJvguYfguJkgQVBQUk9WRUQpXG4gIGRvY3VtZW50U3RhdHVzPzogc3RyaW5nOyAvLyDguKrguJbguLLguJnguLDguYDguK3guIHguKrguLLguKPguKvguKXguLHguIHguJfguLXguYjguITguKfguKPguIjguLDguYDguJvguYfguJlcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451.map new file mode 100644 index 0000000..f3a748e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/workflowinterface_559076d73142ac75ae994e2eddc67451.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\interfaces\\workflow.interface.ts","mappings":";;;AAAA,qCAAqC;AACrC,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,yCAA2B,CAAA;IAC3B,qCAAuB,CAAA;IACvB,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB;AAED,yBAAyB;AACzB,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,6CAA2B,CAAA;AAC7B,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\interfaces\\workflow.interface.ts"],"sourcesContent":["// สถานะของการดำเนินการในแต่ละขั้นตอน\nexport enum StepStatus {\n PENDING = 'PENDING', // รอถึงคิว\n IN_PROGRESS = 'IN_PROGRESS', // ถึงคิวแล้ว รอ action\n COMPLETED = 'COMPLETED', // อนุมัติ/ดำเนินการเรียบร้อย\n REJECTED = 'REJECTED', // ถูกปัดตก\n SKIPPED = 'SKIPPED', // ถูกข้าม\n}\n\n// การกระทำที่ผู้ใช้ทำได้\nexport enum WorkflowAction {\n APPROVE = 'APPROVE', // อนุมัติ / ยืนยัน / ส่งต่อ\n REJECT = 'REJECT', // ปฏิเสธ (จบ workflow ทันที)\n RETURN = 'RETURN', // ส่งกลับ (ไปแก้มาใหม่)\n ACKNOWLEDGE = 'ACKNOWLEDGE', // รับทราบ (สำหรับ For Info)\n}\n\n// ข้อมูลพื้นฐานของขั้นตอน (Step) ที่ Engine ต้องรู้\nexport interface WorkflowStep {\n sequence: number; // ลำดับที่ (1, 2, 3...)\n assigneeId?: number; // User ID ที่รับผิดชอบ (ถ้าเจาะจงคน)\n organizationId?: number; // Org ID ที่รับผิดชอบ (ถ้าเจาะจงหน่วยงาน)\n roleId?: number; // Role ID ที่รับผิดชอบ (ถ้าเจาะจงตำแหน่ง)\n status: StepStatus; // สถานะปัจจุบัน\n}\n\n// ผลลัพธ์ที่ Engine จะบอกเราหลังจากประมวลผลเสร็จ\nexport interface TransitionResult {\n nextStepSequence: number | null; // ขั้นตอนต่อไปคือเลขที่เท่าไหร่ (null = จบ workflow)\n shouldUpdateStatus: boolean; // ต้องอัปเดตสถานะเอกสารหลักไหม? (เช่น เปลี่ยนจาก IN_REVIEW เป็น APPROVED)\n documentStatus?: string; // สถานะเอกสารหลักที่ควรจะเป็น\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28 new file mode 100644 index 0000000..a5ae0ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28 @@ -0,0 +1,51 @@ +c3a0b818c9d362e4835a71c11bcd99b3 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationQueueQueryDto = exports.PaginationDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const migration_review_queue_entity_1 = require("../entities/migration-review-queue.entity"); +const swagger_1 = require("@nestjs/swagger"); +class PaginationDto { + constructor() { + this.page = 1; + this.limit = 10; + } +} +exports.PaginationDto = PaginationDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ default: 1 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(1), + __metadata("design:type", Number) +], PaginationDto.prototype, "page", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ default: 10 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(1), + __metadata("design:type", Number) +], PaginationDto.prototype, "limit", void 0); +class MigrationQueueQueryDto extends PaginationDto { +} +exports.MigrationQueueQueryDto = MigrationQueueQueryDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ enum: migration_review_queue_entity_1.MigrationReviewStatus }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsEnum)(migration_review_queue_entity_1.MigrationReviewStatus), + __metadata("design:type", typeof (_a = typeof migration_review_queue_entity_1.MigrationReviewStatus !== "undefined" && migration_review_queue_entity_1.MigrationReviewStatus) === "function" ? _a : Object) +], MigrationQueueQueryDto.prototype, "status", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXG1pZ3JhdGlvbi1xdWV1ZS1xdWVyeS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFpRTtBQUNqRSx5REFBeUM7QUFDekMsNkZBQWtGO0FBQ2xGLDZDQUFzRDtBQUV0RCxNQUFhLGFBQWE7SUFBMUI7UUFNRSxTQUFJLEdBQVksQ0FBQyxDQUFDO1FBT2xCLFVBQUssR0FBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUFBO0FBZEQsc0NBY0M7QUFSQztJQUxDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbkMsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLHFCQUFHLEVBQUMsQ0FBQyxDQUFDOzsyQ0FDVztBQU9sQjtJQUxDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEMsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLHFCQUFHLEVBQUMsQ0FBQyxDQUFDOzs0Q0FDYTtBQUd0QixNQUFhLHNCQUF1QixTQUFRLGFBQWE7Q0FLeEQ7QUFMRCx3REFLQztBQURDO0lBSEMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLElBQUksRUFBRSxxREFBcUIsRUFBRSxDQUFDO0lBQ3BELElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQU0sRUFBQyxxREFBcUIsQ0FBQztrREFDckIscURBQXFCLG9CQUFyQixxREFBcUI7c0RBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXG1pZ3JhdGlvbi1xdWV1ZS1xdWVyeS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNPcHRpb25hbCwgSXNFbnVtLCBJc0ludCwgTWluIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBNaWdyYXRpb25SZXZpZXdTdGF0dXMgfSBmcm9tICcuLi9lbnRpdGllcy9taWdyYXRpb24tcmV2aWV3LXF1ZXVlLmVudGl0eSc7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eU9wdGlvbmFsIH0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25EdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlZmF1bHQ6IDEgfSlcbiAgQElzT3B0aW9uYWwoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIEBJc0ludCgpXG4gIEBNaW4oMSlcbiAgcGFnZT86IG51bWJlciA9IDE7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZWZhdWx0OiAxMCB9KVxuICBASXNPcHRpb25hbCgpXG4gIEBUeXBlKCgpID0+IE51bWJlcilcbiAgQElzSW50KClcbiAgQE1pbigxKVxuICBsaW1pdD86IG51bWJlciA9IDEwO1xufVxuXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uUXVldWVRdWVyeUR0byBleHRlbmRzIFBhZ2luYXRpb25EdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGVudW06IE1pZ3JhdGlvblJldmlld1N0YXR1cyB9KVxuICBASXNPcHRpb25hbCgpXG4gIEBJc0VudW0oTWlncmF0aW9uUmV2aWV3U3RhdHVzKVxuICBzdGF0dXM/OiBNaWdyYXRpb25SZXZpZXdTdGF0dXM7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28.map new file mode 100644 index 0000000..1d54842 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/migrationqueuequerydto_5944a89cab040beab6d8d094ea709d28.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\migration-queue-query.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAAiE;AACjE,yDAAyC;AACzC,6FAAkF;AAClF,6CAAsD;AAEtD,MAAa,aAAa;IAA1B;QAME,SAAI,GAAY,CAAC,CAAC;QAOlB,UAAK,GAAY,EAAE,CAAC;IACtB,CAAC;CAAA;AAdD,sCAcC;AARC;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;2CACW;AAOlB;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACpC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;4CACa;AAGtB,MAAa,sBAAuB,SAAQ,aAAa;CAKxD;AALD,wDAKC;AADC;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,qDAAqB,EAAE,CAAC;IACpD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,qDAAqB,CAAC;kDACrB,qDAAqB,oBAArB,qDAAqB;sDAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\migration-queue-query.dto.ts"],"sourcesContent":["import { IsOptional, IsEnum, IsInt, Min } from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { MigrationReviewStatus } from '../entities/migration-review-queue.entity';\nimport { ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class PaginationDto {\n @ApiPropertyOptional({ default: 1 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(1)\n page?: number = 1;\n\n @ApiPropertyOptional({ default: 10 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(1)\n limit?: number = 10;\n}\n\nexport class MigrationQueueQueryDto extends PaginationDto {\n @ApiPropertyOptional({ enum: MigrationReviewStatus })\n @IsOptional()\n @IsEnum(MigrationReviewStatus)\n status?: MigrationReviewStatus;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042 new file mode 100644 index 0000000..b8f5e0d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042 @@ -0,0 +1,50 @@ +dc5f6c85e35616e30dbbeb1175464884 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UuidBaseEntity = void 0; +const typeorm_1 = require("typeorm"); +const uuid_1 = require("uuid"); +/** + * Abstract base entity providing a UUID public identifier. + * + * Naming Convention (ADR-019 v1.8.1): + * - TypeScript Property: `publicId` — semantic name indicating this is the public-facing identifier + * - Database Column: `uuid` — MariaDB native UUID type (stored as BINARY(16)) + * + * This avoids confusion between the property name and the DB data type, + * while clearly indicating this is the ID exposed via API (not internal INT PK). + */ +class UuidBaseEntity { + generatePublicId() { + if (!this.publicId) { + this.publicId = (0, uuid_1.v7)(); + } + } +} +exports.UuidBaseEntity = UuidBaseEntity; +__decorate([ + (0, typeorm_1.Column)({ + type: 'uuid', + name: 'uuid', // DB column name (MariaDB native UUID type) + unique: true, + nullable: false, + comment: 'UUID Public Identifier (ADR-019)', + }), + __metadata("design:type", String) +], UuidBaseEntity.prototype, "publicId", void 0); +__decorate([ + (0, typeorm_1.BeforeInsert)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], UuidBaseEntity.prototype, "generatePublicId", null); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxlbnRpdGllc1xcdXVpZC1iYXNlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBK0M7QUFDL0MsK0JBQW9DO0FBRXBDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXNCLGNBQWM7SUFXbEMsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsU0FBTSxHQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhCRCx3Q0FnQkM7QUFSQztJQVBDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU0sRUFBRSw0Q0FBNEM7UUFDMUQsTUFBTSxFQUFFLElBQUk7UUFDWixRQUFRLEVBQUUsS0FBSztRQUNmLE9BQU8sRUFBRSxrQ0FBa0M7S0FDNUMsQ0FBQzs7Z0RBQ2dCO0FBR2xCO0lBREMsSUFBQSxzQkFBWSxHQUFFOzs7O3NEQUtkIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZW50aXRpZXNcXHV1aWQtYmFzZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sdW1uLCBCZWZvcmVJbnNlcnQgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgdjcgYXMgdXVpZHY3IH0gZnJvbSAndXVpZCc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBlbnRpdHkgcHJvdmlkaW5nIGEgVVVJRCBwdWJsaWMgaWRlbnRpZmllci5cclxuICpcclxuICogTmFtaW5nIENvbnZlbnRpb24gKEFEUi0wMTkgdjEuOC4xKTpcclxuICogLSBUeXBlU2NyaXB0IFByb3BlcnR5OiBgcHVibGljSWRgIOKAlCBzZW1hbnRpYyBuYW1lIGluZGljYXRpbmcgdGhpcyBpcyB0aGUgcHVibGljLWZhY2luZyBpZGVudGlmaWVyXHJcbiAqIC0gRGF0YWJhc2UgQ29sdW1uOiBgdXVpZGAg4oCUIE1hcmlhREIgbmF0aXZlIFVVSUQgdHlwZSAoc3RvcmVkIGFzIEJJTkFSWSgxNikpXHJcbiAqXHJcbiAqIFRoaXMgYXZvaWRzIGNvbmZ1c2lvbiBiZXR3ZWVuIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB0aGUgREIgZGF0YSB0eXBlLFxyXG4gKiB3aGlsZSBjbGVhcmx5IGluZGljYXRpbmcgdGhpcyBpcyB0aGUgSUQgZXhwb3NlZCB2aWEgQVBJIChub3QgaW50ZXJuYWwgSU5UIFBLKS5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQENvbHVtbih7XHJcbiAgICB0eXBlOiAndXVpZCcsXHJcbiAgICBuYW1lOiAndXVpZCcsIC8vIERCIGNvbHVtbiBuYW1lIChNYXJpYURCIG5hdGl2ZSBVVUlEIHR5cGUpXHJcbiAgICB1bmlxdWU6IHRydWUsXHJcbiAgICBudWxsYWJsZTogZmFsc2UsXHJcbiAgICBjb21tZW50OiAnVVVJRCBQdWJsaWMgSWRlbnRpZmllciAoQURSLTAxOSknLFxyXG4gIH0pXHJcbiAgcHVibGljSWQhOiBzdHJpbmc7IC8vIFR5cGVTY3JpcHQgcHJvcGVydHkgbmFtZSDigJQgc2VtYW50aWMsIGF2b2lkcyB0eXBlIGNvbmZ1c2lvblxyXG5cclxuICBAQmVmb3JlSW5zZXJ0KClcclxuICBnZW5lcmF0ZVB1YmxpY0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnB1YmxpY0lkKSB7XHJcbiAgICAgIHRoaXMucHVibGljSWQgPSB1dWlkdjcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042.map new file mode 100644 index 0000000..9909f08 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/59/uuidbaseentity_59f2b57324454ece33500e1d53c5a042.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAA+C;AAC/C,+BAAoC;AAEpC;;;;;;;;;GASG;AACH,MAAsB,cAAc;IAWlC,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,SAAM,GAAE,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAhBD,wCAgBC;AARC;IAPC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM,EAAE,4CAA4C;QAC1D,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,kCAAkC;KAC5C,CAAC;;gDACgB;AAGlB;IADC,IAAA,sBAAY,GAAE;;;;sDAKd","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.ts"],"sourcesContent":["import { Column, BeforeInsert } from 'typeorm';\r\nimport { v7 as uuidv7 } from 'uuid';\r\n\r\n/**\r\n * Abstract base entity providing a UUID public identifier.\r\n *\r\n * Naming Convention (ADR-019 v1.8.1):\r\n * - TypeScript Property: `publicId` — semantic name indicating this is the public-facing identifier\r\n * - Database Column: `uuid` — MariaDB native UUID type (stored as BINARY(16))\r\n *\r\n * This avoids confusion between the property name and the DB data type,\r\n * while clearly indicating this is the ID exposed via API (not internal INT PK).\r\n */\r\nexport abstract class UuidBaseEntity {\r\n @Column({\r\n type: 'uuid',\r\n name: 'uuid', // DB column name (MariaDB native UUID type)\r\n unique: true,\r\n nullable: false,\r\n comment: 'UUID Public Identifier (ADR-019)',\r\n })\r\n publicId!: string; // TypeScript property name — semantic, avoids type confusion\r\n\r\n @BeforeInsert()\r\n generatePublicId(): void {\r\n if (!this.publicId) {\r\n this.publicId = uuidv7();\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02 new file mode 100644 index 0000000..d715d5f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02 @@ -0,0 +1,5 @@ +5e0212b1ae7e2046c1727fbc3b758e08 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccmVnZXguanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLE9BQU8sR0FBRywwSkFBMEosQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxyZWdleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02.map new file mode 100644 index 0000000..c9ec2dd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/regex_5be6fba76349e8c2e24fdebc978fcd02.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\regex.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,0JAA0J,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\regex.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3 new file mode 100644 index 0000000..a78918a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3 @@ -0,0 +1,106 @@ +c13c6c2ed242ca7a5c0bd753e2bbfcaa +"use strict"; +// File: src/common/services/crypto.service.ts +// บันทึกการแก้ไข: Encryption/Decryption Utility (T1.1) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var CryptoService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CryptoService = void 0; +const common_1 = require("@nestjs/common"); +const config_1 = require("@nestjs/config"); +const crypto = __importStar(require("crypto")); +let CryptoService = CryptoService_1 = class CryptoService { + constructor(configService) { + this.configService = configService; + this.logger = new common_1.Logger(CryptoService_1.name); + this.algorithm = 'aes-256-cbc'; + this.ivLength = 16; + // Key ต้องมีขนาด 32 bytes (256 bits) + const secret = this.configService.get('APP_SECRET_KEY') || + 'default-secret-key-32-chars-long!'; + this.key = crypto.scryptSync(secret, 'salt', 32); + } + encrypt(text) { + if (text === null || text === undefined) + return text; + try { + const stringValue = String(text); + const iv = crypto.randomBytes(this.ivLength); + const cipher = crypto.createCipheriv(this.algorithm, this.key, iv); + let encrypted = cipher.update(stringValue, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return `${iv.toString('hex')}:${encrypted}`; + } + catch (error) { + this.logger.error(`Encryption failed: ${error instanceof Error ? error.message : String(error)}`); + throw error; + } + } + decrypt(text) { + if (!text || typeof text !== 'string' || !text.includes(':')) + return text; + try { + const [ivHex, encryptedHex] = text.split(':'); + if (!ivHex || !encryptedHex) + return text; + const iv = Buffer.from(ivHex, 'hex'); + const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv); + let decrypted = decipher.update(encryptedHex, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; + } + catch (error) { + this.logger.warn(`Decryption failed for value. Returning original text. Error: ${error instanceof Error ? error.message : String(error)}`); + // กรณี Decrypt ไม่ได้ ให้คืนค่าเดิมเพื่อป้องกัน App Crash + return text; + } + } +}; +exports.CryptoService = CryptoService; +exports.CryptoService = CryptoService = CryptoService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _a : Object]) +], CryptoService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcY3J5cHRvLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDhDQUE4QztBQUM5Qyx1REFBdUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDJDQUFvRDtBQUNwRCwyQ0FBK0M7QUFDL0MsK0NBQWlDO0FBRzFCLElBQU0sYUFBYSxxQkFBbkIsTUFBTSxhQUFhO0lBTXhCLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTC9CLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxlQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLGFBQWEsQ0FBQztRQUUxQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRzdCLHFDQUFxQztRQUNyQyxNQUFNLE1BQU0sR0FDVixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBUyxnQkFBZ0IsQ0FBQztZQUNoRCxtQ0FBbUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsT0FBTyxDQUNMLElBQWtEO1FBRWxELElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXJELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUQsU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysc0JBQXNCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUMvRSxDQUFDO1lBQ0YsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUxRSxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFekMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsZ0VBQWdFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUN6SCxDQUFDO1lBQ0YsMERBQTBEO1lBQzFELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRixDQUFBO0FBdERZLHNDQUFhO3dCQUFiLGFBQWE7SUFEekIsSUFBQSxtQkFBVSxHQUFFO3lEQU93QixzQkFBYSxvQkFBYixzQkFBYTtHQU5yQyxhQUFhLENBc0R6QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXHNlcnZpY2VzXFxjcnlwdG8uc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL3NlcnZpY2VzL2NyeXB0by5zZXJ2aWNlLnRzXG4vLyDguJrguLHguJnguJfguLbguIHguIHguLLguKPguYHguIHguYnguYTguII6IEVuY3J5cHRpb24vRGVjcnlwdGlvbiBVdGlsaXR5IChUMS4xKVxuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcnlwdG9TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENyeXB0b1NlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtID0gJ2Flcy0yNTYtY2JjJztcbiAgcHJpdmF0ZSByZWFkb25seSBrZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpdkxlbmd0aCA9IDE2O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSkge1xuICAgIC8vIEtleSDguJXguYnguK3guIfguKHguLXguILguJnguLLguJQgMzIgYnl0ZXMgKDI1NiBiaXRzKVxuICAgIGNvbnN0IHNlY3JldCA9XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0PHN0cmluZz4oJ0FQUF9TRUNSRVRfS0VZJykgfHxcbiAgICAgICdkZWZhdWx0LXNlY3JldC1rZXktMzItY2hhcnMtbG9uZyEnO1xuICAgIHRoaXMua2V5ID0gY3J5cHRvLnNjcnlwdFN5bmMoc2VjcmV0LCAnc2FsdCcsIDMyKTtcbiAgfVxuXG4gIGVuY3J5cHQoXG4gICAgdGV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGV4dDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh0ZXh0KTtcbiAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKHRoaXMuaXZMZW5ndGgpO1xuICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KHRoaXMuYWxnb3JpdGhtLCB0aGlzLmtleSwgaXYpO1xuICAgICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoc3RyaW5nVmFsdWUsICd1dGY4JywgJ2hleCcpO1xuICAgICAgZW5jcnlwdGVkICs9IGNpcGhlci5maW5hbCgnaGV4Jyk7XG4gICAgICByZXR1cm4gYCR7aXYudG9TdHJpbmcoJ2hleCcpfToke2VuY3J5cHRlZH1gO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEVuY3J5cHRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgZGVjcnlwdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycgfHwgIXRleHQuaW5jbHVkZXMoJzonKSkgcmV0dXJuIHRleHQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgW2l2SGV4LCBlbmNyeXB0ZWRIZXhdID0gdGV4dC5zcGxpdCgnOicpO1xuICAgICAgaWYgKCFpdkhleCB8fCAhZW5jcnlwdGVkSGV4KSByZXR1cm4gdGV4dDtcblxuICAgICAgY29uc3QgaXYgPSBCdWZmZXIuZnJvbShpdkhleCwgJ2hleCcpO1xuICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdih0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXksIGl2KTtcbiAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkSGV4LCAnaGV4JywgJ3V0ZjgnKTtcbiAgICAgIGRlY3J5cHRlZCArPSBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYERlY3J5cHRpb24gZmFpbGVkIGZvciB2YWx1ZS4gUmV0dXJuaW5nIG9yaWdpbmFsIHRleHQuIEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgLy8g4LiB4Lij4LiT4Li1IERlY3J5cHQg4LmE4Lih4LmI4LmE4LiU4LmJIOC5g+C4q+C5ieC4hOC4t+C4meC4hOC5iOC4suC5gOC4lOC4tOC4oeC5gOC4nuC4t+C5iOC4reC4m+C5ieC4reC4h+C4geC4seC4mSBBcHAgQ3Jhc2hcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3.map new file mode 100644 index 0000000..9b2fddf --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5e/cryptoservice_5e927b72fdea5c673aec5d0f79d114e3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\crypto.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\crypto.service.ts"],"sourcesContent":["// File: src/common/services/crypto.service.ts\n// บันทึกการแก้ไข: Encryption/Decryption Utility (T1.1)\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport * as crypto from 'crypto';\n\n@Injectable()\nexport class CryptoService {\n private readonly logger = new Logger(CryptoService.name);\n private readonly algorithm = 'aes-256-cbc';\n private readonly key: Buffer;\n private readonly ivLength = 16;\n\n constructor(private configService: ConfigService) {\n // Key ต้องมีขนาด 32 bytes (256 bits)\n const secret =\n this.configService.get('APP_SECRET_KEY') ||\n 'default-secret-key-32-chars-long!';\n this.key = crypto.scryptSync(secret, 'salt', 32);\n }\n\n encrypt(\n text: string | number | boolean | null | undefined\n ): string | null | undefined {\n if (text === null || text === undefined) return text;\n\n try {\n const stringValue = String(text);\n const iv = crypto.randomBytes(this.ivLength);\n const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);\n let encrypted = cipher.update(stringValue, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n return `${iv.toString('hex')}:${encrypted}`;\n } catch (error: unknown) {\n this.logger.error(\n `Encryption failed: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n decrypt(text: string): string {\n if (!text || typeof text !== 'string' || !text.includes(':')) return text;\n\n try {\n const [ivHex, encryptedHex] = text.split(':');\n if (!ivHex || !encryptedHex) return text;\n\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);\n let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n } catch (error: unknown) {\n this.logger.warn(\n `Decryption failed for value. Returning original text. Error: ${error instanceof Error ? error.message : String(error)}`\n );\n // กรณี Decrypt ไม่ได้ ให้คืนค่าเดิมเพื่อป้องกัน App Crash\n return text;\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b new file mode 100644 index 0000000..08c686c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b @@ -0,0 +1,38 @@ +1e43b13634c8db19e29ee03167c1f1a1 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MetricsService = void 0; +const common_1 = require("@nestjs/common"); +const prom_client_1 = require("prom-client"); +const nestjs_prometheus_1 = require("@willsoto/nestjs-prometheus"); +let MetricsService = class MetricsService { + constructor(numbersGenerated, sequenceUtilization, lockWaitTime, lockFailures) { + this.numbersGenerated = numbersGenerated; + this.sequenceUtilization = sequenceUtilization; + this.lockWaitTime = lockWaitTime; + this.lockFailures = lockFailures; + } +}; +exports.MetricsService = MetricsService; +exports.MetricsService = MetricsService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, nestjs_prometheus_1.InjectMetric)('numbering_sequences_total')), + __param(1, (0, nestjs_prometheus_1.InjectMetric)('numbering_sequence_utilization')), + __param(2, (0, nestjs_prometheus_1.InjectMetric)('numbering_lock_wait_seconds')), + __param(3, (0, nestjs_prometheus_1.InjectMetric)('numbering_lock_failures_total')), + __metadata("design:paramtypes", [typeof (_a = typeof prom_client_1.Counter !== "undefined" && prom_client_1.Counter) === "function" ? _a : Object, typeof (_b = typeof prom_client_1.Gauge !== "undefined" && prom_client_1.Gauge) === "function" ? _b : Object, typeof (_c = typeof prom_client_1.Histogram !== "undefined" && prom_client_1.Histogram) === "function" ? _c : Object, typeof (_d = typeof prom_client_1.Counter !== "undefined" && prom_client_1.Counter) === "function" ? _d : Object]) +], MetricsService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcbWV0cmljcy5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEM7QUFDNUMsNkNBQXdEO0FBQ3hELG1FQUEyRDtBQUdwRCxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0lBQ3pCLFlBRVMsZ0JBQWlDLEVBRWpDLG1CQUFrQyxFQUVsQyxZQUErQixFQUUvQixZQUE2QjtRQU43QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBRWpDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBZTtRQUVsQyxpQkFBWSxHQUFaLFlBQVksQ0FBbUI7UUFFL0IsaUJBQVksR0FBWixZQUFZLENBQWlCO0lBQ25DLENBQUM7Q0FDTCxDQUFBO0FBWFksd0NBQWM7eUJBQWQsY0FBYztJQUQxQixJQUFBLG1CQUFVLEdBQUU7SUFHUixXQUFBLElBQUEsZ0NBQVksRUFBQywyQkFBMkIsQ0FBQyxDQUFBO0lBRXpDLFdBQUEsSUFBQSxnQ0FBWSxFQUFDLGdDQUFnQyxDQUFDLENBQUE7SUFFOUMsV0FBQSxJQUFBLGdDQUFZLEVBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUUzQyxXQUFBLElBQUEsZ0NBQVksRUFBQywrQkFBK0IsQ0FBQyxDQUFBO3lEQUxyQixxQkFBTyxvQkFBUCxxQkFBTyxvREFFSixtQkFBSyxvQkFBTCxtQkFBSyxvREFFWix1QkFBUyxvQkFBVCx1QkFBUyxvREFFVCxxQkFBTyxvQkFBUCxxQkFBTztHQVRuQixjQUFjLENBVzFCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXG1ldHJpY3Muc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb3VudGVyLCBHYXVnZSwgSGlzdG9ncmFtIH0gZnJvbSAncHJvbS1jbGllbnQnO1xyXG5pbXBvcnQgeyBJbmplY3RNZXRyaWMgfSBmcm9tICdAd2lsbHNvdG8vbmVzdGpzLXByb21ldGhldXMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTWV0cmljc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX3NlcXVlbmNlc190b3RhbCcpXHJcbiAgICBwdWJsaWMgbnVtYmVyc0dlbmVyYXRlZDogQ291bnRlcjxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX3NlcXVlbmNlX3V0aWxpemF0aW9uJylcclxuICAgIHB1YmxpYyBzZXF1ZW5jZVV0aWxpemF0aW9uOiBHYXVnZTxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX2xvY2tfd2FpdF9zZWNvbmRzJylcclxuICAgIHB1YmxpYyBsb2NrV2FpdFRpbWU6IEhpc3RvZ3JhbTxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX2xvY2tfZmFpbHVyZXNfdG90YWwnKVxyXG4gICAgcHVibGljIGxvY2tGYWlsdXJlczogQ291bnRlcjxzdHJpbmc+XHJcbiAgKSB7fVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b.map new file mode 100644 index 0000000..5a004e5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/metricsservice_6274282700f640060c02badf0682615b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\metrics.service.ts","mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAwD;AACxD,mEAA2D;AAGpD,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAES,gBAAiC,EAEjC,mBAAkC,EAElC,YAA+B,EAE/B,YAA6B;QAN7B,qBAAgB,GAAhB,gBAAgB,CAAiB;QAEjC,wBAAmB,GAAnB,mBAAmB,CAAe;QAElC,iBAAY,GAAZ,YAAY,CAAmB;QAE/B,iBAAY,GAAZ,YAAY,CAAiB;IACnC,CAAC;CACL,CAAA;AAXY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,gCAAY,EAAC,2BAA2B,CAAC,CAAA;IAEzC,WAAA,IAAA,gCAAY,EAAC,gCAAgC,CAAC,CAAA;IAE9C,WAAA,IAAA,gCAAY,EAAC,6BAA6B,CAAC,CAAA;IAE3C,WAAA,IAAA,gCAAY,EAAC,+BAA+B,CAAC,CAAA;yDALrB,qBAAO,oBAAP,qBAAO,oDAEJ,mBAAK,oBAAL,mBAAK,oDAEZ,uBAAS,oBAAT,uBAAS,oDAET,qBAAO,oBAAP,qBAAO;GATnB,cAAc,CAW1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\metrics.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\r\nimport { Counter, Gauge, Histogram } from 'prom-client';\r\nimport { InjectMetric } from '@willsoto/nestjs-prometheus';\r\n\r\n@Injectable()\r\nexport class MetricsService {\r\n constructor(\r\n @InjectMetric('numbering_sequences_total')\r\n public numbersGenerated: Counter,\r\n @InjectMetric('numbering_sequence_utilization')\r\n public sequenceUtilization: Gauge,\r\n @InjectMetric('numbering_lock_wait_seconds')\r\n public lockWaitTime: Histogram,\r\n @InjectMetric('numbering_lock_failures_total')\r\n public lockFailures: Counter\r\n ) {}\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27 new file mode 100644 index 0000000..a084cb0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27 @@ -0,0 +1,15 @@ +e92e16bf9beb6ceb0f0b149e96e3c81f +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function v1ToV6(uuid) { + const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid; + const v6Bytes = _v1ToV6(v1Bytes); + return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes; +} +exports.default = v1ToV6; +function _v1ToV6(v1Bytes) { + return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjFUb1Y2LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLE1BQU0sQ0FBQyxJQUFJO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3RixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDekIsU0FBUyxPQUFPLENBQUMsT0FBTztJQUNwQixPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN2YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2MVRvVjYuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHYxVG9WNih1dWlkKSB7XG4gICAgY29uc3QgdjFCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBwYXJzZV9qc18xLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgICBjb25zdCB2NkJ5dGVzID0gX3YxVG9WNih2MUJ5dGVzKTtcbiAgICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkodjZCeXRlcykgOiB2NkJ5dGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjFUb1Y2O1xuZnVuY3Rpb24gX3YxVG9WNih2MUJ5dGVzKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKCh2MUJ5dGVzWzZdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbN10gPj4gNCkgJiAweDBmKSwgKCh2MUJ5dGVzWzddICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbNF0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzRdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbNV0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzVdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMF0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzBdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMV0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzFdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMl0gJiAweGYwKSA+PiA0KSwgMHg2MCB8ICh2MUJ5dGVzWzJdICYgMHgwZiksIHYxQnl0ZXNbM10sIHYxQnl0ZXNbOF0sIHYxQnl0ZXNbOV0sIHYxQnl0ZXNbMTBdLCB2MUJ5dGVzWzExXSwgdjFCeXRlc1sxMl0sIHYxQnl0ZXNbMTNdLCB2MUJ5dGVzWzE0XSwgdjFCeXRlc1sxNV0pO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27.map new file mode 100644 index 0000000..7e97d0c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/v1ToV6_65e5cb9f7a2fd674054d754d3b8d2f27.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1ToV6.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,MAAM,CAAC,IAAI;IAChB,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7F,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;AACzB,SAAS,OAAO,CAAC,OAAO;IACpB,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7f,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1ToV6.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v1ToV6(uuid) {\n const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n const v6Bytes = _v1ToV6(v1Bytes);\n return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes;\n}\nexports.default = v1ToV6;\nfunction _v1ToV6(v1Bytes) {\n return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]);\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183 new file mode 100644 index 0000000..5c71800 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183 @@ -0,0 +1,44 @@ +b94c9f56f6c087f382d7a351eebbbf92 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CommitBatchDto = exports.CommitBatchItemDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const import_correspondence_dto_1 = require("./import-correspondence.dto"); +class CommitBatchItemDto { +} +exports.CommitBatchItemDto = CommitBatchItemDto; +__decorate([ + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], CommitBatchItemDto.prototype, "queueId", void 0); +__decorate([ + (0, class_validator_1.ValidateNested)(), + (0, class_transformer_1.Type)(() => import_correspondence_dto_1.ImportCorrespondenceDto), + __metadata("design:type", typeof (_a = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _a : Object) +], CommitBatchItemDto.prototype, "dto", void 0); +class CommitBatchDto { +} +exports.CommitBatchDto = CommitBatchDto; +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.ValidateNested)({ each: true }), + (0, class_transformer_1.Type)(() => CommitBatchItemDto), + __metadata("design:type", Array) +], CommitBatchDto.prototype, "items", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CommitBatchDto.prototype, "batchId", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGNvbW1pdC1iYXRjaC5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFnRjtBQUNoRix5REFBeUM7QUFDekMsMkVBQXNFO0FBRXRFLE1BQWEsa0JBQWtCO0NBTzlCO0FBUEQsZ0RBT0M7QUFMQztJQURDLElBQUEsNEJBQVUsR0FBRTs7bURBQ0k7QUFJakI7SUFGQyxJQUFBLGdDQUFjLEdBQUU7SUFDaEIsSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLG1EQUF1QixDQUFDO2tEQUM5QixtREFBdUIsb0JBQXZCLG1EQUF1QjsrQ0FBQztBQUdoQyxNQUFhLGNBQWM7Q0FTMUI7QUFURCx3Q0FTQztBQUxDO0lBSEMsSUFBQSx5QkFBTyxHQUFFO0lBQ1QsSUFBQSxnQ0FBYyxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlCLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQzs7NkNBQ0Y7QUFJN0I7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OytDQUNJIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZHRvXFxjb21taXQtYmF0Y2guZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzQXJyYXksIFZhbGlkYXRlTmVzdGVkLCBJc1N0cmluZywgSXNOb3RFbXB0eSB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgSW1wb3J0Q29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5leHBvcnQgY2xhc3MgQ29tbWl0QmF0Y2hJdGVtRHRvIHtcbiAgQElzTm90RW1wdHkoKVxuICBxdWV1ZUlkITogbnVtYmVyO1xuXG4gIEBWYWxpZGF0ZU5lc3RlZCgpXG4gIEBUeXBlKCgpID0+IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvKVxuICBkdG8hOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0bztcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdEJhdGNoRHRvIHtcbiAgQElzQXJyYXkoKVxuICBAVmFsaWRhdGVOZXN0ZWQoeyBlYWNoOiB0cnVlIH0pXG4gIEBUeXBlKCgpID0+IENvbW1pdEJhdGNoSXRlbUR0bylcbiAgaXRlbXMhOiBDb21taXRCYXRjaEl0ZW1EdG9bXTtcblxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIGJhdGNoSWQhOiBzdHJpbmc7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183.map new file mode 100644 index 0000000..be088a6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/commitbatchdto_6730d20e7a0883adb915d65256d6d183.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\commit-batch.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAAgF;AAChF,yDAAyC;AACzC,2EAAsE;AAEtE,MAAa,kBAAkB;CAO9B;AAPD,gDAOC;AALC;IADC,IAAA,4BAAU,GAAE;;mDACI;AAIjB;IAFC,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mDAAuB,CAAC;kDAC9B,mDAAuB,oBAAvB,mDAAuB;+CAAC;AAGhC,MAAa,cAAc;CAS1B;AATD,wCASC;AALC;IAHC,IAAA,yBAAO,GAAE;IACT,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC;;6CACF;AAI7B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACI","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\commit-batch.dto.ts"],"sourcesContent":["import { IsArray, ValidateNested, IsString, IsNotEmpty } from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { ImportCorrespondenceDto } from './import-correspondence.dto';\n\nexport class CommitBatchItemDto {\n @IsNotEmpty()\n queueId!: number;\n\n @ValidateNested()\n @Type(() => ImportCorrespondenceDto)\n dto!: ImportCorrespondenceDto;\n}\n\nexport class CommitBatchDto {\n @IsArray()\n @ValidateNested({ each: true })\n @Type(() => CommitBatchItemDto)\n items!: CommitBatchItemDto[];\n\n @IsString()\n @IsNotEmpty()\n batchId!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2 new file mode 100644 index 0000000..a56aabd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2 @@ -0,0 +1,317 @@ +338c6ef4bdd053340bfcc183e7e81fde +"use strict"; +// File: src/modules/json-schema/json-schema.service.ts +// บันทึกการแก้ไข: Fix TS2345 (undefined check) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var JsonSchemaService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSchemaService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const ajv_1 = __importDefault(require("ajv")); +const ajv_formats_1 = __importDefault(require("ajv-formats")); +const typeorm_2 = require("typeorm"); +const json_schema_entity_1 = require("./entities/json-schema.entity"); +// Services ย่อยที่แยกตามหน้าที่ (Single Responsibility) +const json_security_service_1 = require("./services/json-security.service"); +const ui_schema_service_1 = require("./services/ui-schema.service"); +const virtual_column_service_1 = require("./services/virtual-column.service"); +let JsonSchemaService = JsonSchemaService_1 = class JsonSchemaService { + constructor(jsonSchemaRepository, virtualColumnService, uiSchemaService, jsonSecurityService) { + this.jsonSchemaRepository = jsonSchemaRepository; + this.virtualColumnService = virtualColumnService; + this.uiSchemaService = uiSchemaService; + this.jsonSecurityService = jsonSecurityService; + this.validators = new Map(); // Cache สำหรับเก็บ Validator ที่ Compile แล้ว + this.logger = new common_1.Logger(JsonSchemaService_1.name); + // ค่า Default สำหรับการตรวจสอบข้อมูล + this.defaultOptions = { + removeAdditional: true, // ลบฟิลด์เกิน + coerceTypes: true, // แปลงชนิดข้อมูลอัตโนมัติ (เช่น "123" -> 123) + useDefaults: true, // ใส่ค่า Default ถ้าไม่มีข้อมูล + }; + // กำหนดค่าเริ่มต้นให้กับ AJV Validation Engine + this.ajv = new ajv_1.default({ + allErrors: true, // แสดง Error ทั้งหมด ไม่หยุดแค่จุดแรก + strict: false, // ไม่เคร่งครัดเกินไป (ยอมรับ Keyword แปลกๆ เช่น ui:widget) + coerceTypes: true, + useDefaults: true, + removeAdditional: true, + }); + (0, ajv_formats_1.default)(this.ajv); // เพิ่ม Format มาตรฐาน (email, date, uri ฯลฯ) + this.registerCustomValidators(); // ลงทะเบียน Validator เฉพาะของโปรเจกต์ + } + async onModuleInit() { + // สามารถโหลด Schema ที่ Active ทั้งหมดมา Cache ไว้ล่วงหน้าได้ที่นี่ เพื่อความเร็วในการตอบสนองครั้งแรก + } + /** + * ลงทะเบียน Custom Validators เฉพาะสำหรับ LCBP3 + */ + registerCustomValidators() { + // 1. ตรวจสอบรูปแบบเลขที่เอกสาร (เช่น TEAM-RFA-STR-0001) + this.ajv.addFormat('document-number', { + type: 'string', + validate: (value) => { + // Regex อย่างง่าย: กลุ่มตัวอักษรขีดคั่นด้วย - + return /^[A-Z0-9]{2,10}-[A-Z]{2,5}(-[A-Z0-9]{2,5})?-\d{4}-\d{3,5}$/.test(value); + }, + }); + // 2. Keyword สำหรับระบุ Role ที่จำเป็น (ใช้ร่วมกับ Security Service) + this.ajv.addKeyword({ + keyword: 'requiredRole', + type: 'string', + metaSchema: { type: 'string' }, + validate: (_schema, _data) => true, // ผ่านเสมอในขั้น AJV (Security Service จะจัดการเอง) + }); + } + /** + * สร้าง Schema ใหม่ พร้อมจัดการ Version, UI Schema และ Virtual Columns + */ + async create(createDto) { + // 1. ตรวจสอบความถูกต้องของ JSON Schema Definition (AJV Syntax) + try { + this.ajv.compile(createDto.schemaDefinition); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`); + } + // 2. จัดการ UI Schema + if (createDto.uiSchema) { + // ถ้าส่งมา ให้ตรวจสอบความถูกต้องเทียบกับ Data Schema + this.uiSchemaService.validateUiSchema(createDto.uiSchema, createDto.schemaDefinition); + } + else { + // ถ้าไม่ส่งมา ให้สร้าง UI Schema พื้นฐานให้อัตโนมัติ + createDto.uiSchema = this.uiSchemaService.generateDefaultUiSchema(createDto.schemaDefinition); + } + // 3. จัดการ Versioning อัตโนมัติ (Auto-increment) + const latestSchema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: createDto.schemaCode }, + order: { version: 'DESC' }, + }); + let newVersion = 1; + if (latestSchema) { + // ถ้าผู้ใช้ไม่ระบุ Version หรือระบุมาน้อยกว่าล่าสุด ให้ +1 + if (!createDto.version || createDto.version <= latestSchema.version) { + newVersion = latestSchema.version + 1; + } + else { + newVersion = createDto.version; + } + } + else if (createDto.version) { + newVersion = createDto.version; + } + // 4. บันทึกลงฐานข้อมูล + const newSchema = this.jsonSchemaRepository.create({ + ...createDto, + version: newVersion, + }); + const savedSchema = await this.jsonSchemaRepository.save(newSchema); + // ล้าง Cache เพื่อให้โหลดตัวใหม่ในครั้งถัดไป + this.validators.delete(savedSchema.schemaCode); + this.logger.log(`Schema '${savedSchema.schemaCode}' created (v${savedSchema.version})`); + // 5. สร้าง/อัปเดต Virtual Columns บน Database จริง (Performance Optimization) + // Fix TS2345: Add empty array fallback + if (savedSchema.virtualColumns && savedSchema.virtualColumns.length > 0) { + await this.virtualColumnService.setupVirtualColumns(savedSchema.tableName, savedSchema.virtualColumns || []); + } + return savedSchema; + } + /** + * ค้นหา Schema ทั้งหมด (Pagination & Filter) + */ + async findAll(searchDto) { + const { search, isActive, page = 1, limit = 20 } = searchDto; + const skip = (page - 1) * limit; + const query = this.jsonSchemaRepository.createQueryBuilder('schema'); + if (search) { + query.andWhere('schema.schemaCode LIKE :search', { + search: `%${search}%`, + }); + } + if (isActive !== undefined) { + query.andWhere('schema.isActive = :isActive', { isActive }); + } + // เรียงตาม Code ก่อน แล้วตามด้วย Version ล่าสุด + query.orderBy('schema.schemaCode', 'ASC'); + query.addOrderBy('schema.version', 'DESC'); + const [items, total] = await query.skip(skip).take(limit).getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + /** + * ดึงข้อมูล Schema ตาม ID + */ + async findOne(id) { + const schema = await this.jsonSchemaRepository.findOne({ where: { id } }); + if (!schema) { + throw new common_1.NotFoundException(`JsonSchema with ID ${id} not found`); + } + return schema; + } + /** + * ดึงข้อมูล Schema ตาม Code และ Version (สำหรับ Migration) + */ + async findOneByCodeAndVersion(code, version) { + const schema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: code, version }, + }); + if (!schema) { + throw new common_1.NotFoundException(`JsonSchema '${code}' version ${version} not found`); + } + return schema; + } + /** + * ดึง Schema เวอร์ชันล่าสุดที่ Active (สำหรับใช้งานทั่วไป) + */ + async findLatestByCode(code) { + const schema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: code, isActive: true }, + order: { version: 'DESC' }, + }); + if (!schema) { + throw new common_1.NotFoundException(`Active JsonSchema with code '${code}' not found`); + } + return schema; + } + /** + * [CORE FUNCTION] ตรวจสอบข้อมูล (Validate), ทำความสะอาด (Sanitize) และเข้ารหัส (Encrypt) + * ใช้สำหรับ "ขาเข้า" (Write) ก่อนบันทึกลง Database + */ + async validateData(schemaCode, data, _options = {}) { + // 1. ดึงและ Compile Validator + const validate = await this.getValidator(schemaCode); + const schema = await this.findLatestByCode(schemaCode); // ดึง Full Schema เพื่อใช้ Config อื่นๆ + // 2. สำเนาข้อมูลเพื่อป้องกัน Side Effect และเตรียมสำหรับ AJV Mutation (Sanitization) + const dataToValidate = JSON.parse(JSON.stringify(data)); + // 3. เริ่มการตรวจสอบ (AJV จะทำการ Coerce Type และ Remove Additional Properties ให้ด้วย) + const valid = validate(dataToValidate); + // 4. จัดการกรณีข้อมูลไม่ถูกต้อง + if (!valid) { + const errors = (validate.errors || []).map((err) => ({ + field: err.instancePath || 'root', + message: err.message || 'Validation error', + value: err.params, + })); + return { + isValid: false, + errors, + sanitizedData: null, + }; + } + // 5. เข้ารหัสข้อมูล (Encryption) สำหรับ Field ที่มีความลับ (x-encrypt: true) + const secureData = this.jsonSecurityService.encryptFields(dataToValidate, schema.schemaDefinition); + return { + isValid: true, + errors: [], + sanitizedData: secureData, // ข้อมูลนี้สะอาดและปลอดภัย พร้อมบันทึก + }; + } + /** + * [CORE FUNCTION] อ่านข้อมูล, ถอดรหัส (Decrypt) และกรองตามสิทธิ์ (Filter) + * ใช้สำหรับ "ขาออก" (Read) ก่อนส่งให้ Frontend + */ + async processReadData(schemaCode, data, userContext) { + if (!data) + return data; + // ดึง Schema เพื่อดู Config การถอดรหัสและการมองเห็น + const schema = await this.findLatestByCode(schemaCode); + return this.jsonSecurityService.decryptAndFilterFields(data, schema.schemaDefinition, userContext); + } + /** + * Helper: ดึงและ Cache AJV Validator Function เพื่อประสิทธิภาพ + */ + async getValidator(schemaCode) { + let validate = this.validators.get(schemaCode); + if (!validate) { + const schema = await this.findLatestByCode(schemaCode); + try { + validate = this.ajv.compile(schema.schemaDefinition); + this.validators.set(schemaCode, validate); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid Schema Definition for '${schemaCode}': ${error instanceof Error ? error.message : String(error)}`); + } + } + return validate; + } + /** + * Wrapper เก่าสำหรับ Backward Compatibility (ถ้ามีโค้ดเก่าเรียกใช้) + */ + async validate(schemaCode, data) { + const result = await this.validateData(schemaCode, data); + if (!result.isValid) { + const errorMsg = result.errors + .map((e) => `${e.field}: ${e.message}`) + .join(', '); + throw new common_1.BadRequestException(`JSON Validation Failed: ${errorMsg}`); + } + return true; + } + /** + * อัปเดตข้อมูล Schema และจัดการผลกระทบ (Virtual Columns / UI Schema) + */ + async update(id, updateDto) { + const schema = await this.findOne(id); + // ตรวจสอบ JSON Schema + if (updateDto.schemaDefinition) { + try { + this.ajv.compile(updateDto.schemaDefinition); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`); + } + this.validators.delete(schema.schemaCode); // เคลียร์ Cache เก่า + } + // ตรวจสอบ UI Schema + if (updateDto.uiSchema) { + this.uiSchemaService.validateUiSchema(updateDto.uiSchema, updateDto.schemaDefinition || schema.schemaDefinition); + } + const updatedSchema = this.jsonSchemaRepository.merge(schema, updateDto); + const savedSchema = await this.jsonSchemaRepository.save(updatedSchema); + // อัปเดต Virtual Columns ใน Database ถ้ามีการเปลี่ยนแปลง Config + // Fix TS2345: Add empty array fallback + if (updateDto.virtualColumns && updatedSchema.virtualColumns) { + await this.virtualColumnService.setupVirtualColumns(savedSchema.tableName, savedSchema.virtualColumns || []); + } + return savedSchema; + } + /** + * ลบ Schema (Hard Delete) + */ + async remove(id) { + const schema = await this.findOne(id); + this.validators.delete(schema.schemaCode); + await this.jsonSchemaRepository.remove(schema); + } +}; +exports.JsonSchemaService = JsonSchemaService; +exports.JsonSchemaService = JsonSchemaService = JsonSchemaService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(json_schema_entity_1.JsonSchema)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof virtual_column_service_1.VirtualColumnService !== "undefined" && virtual_column_service_1.VirtualColumnService) === "function" ? _b : Object, typeof (_c = typeof ui_schema_service_1.UiSchemaService !== "undefined" && ui_schema_service_1.UiSchemaService) === "function" ? _c : Object, typeof (_d = typeof json_security_service_1.JsonSecurityService !== "undefined" && json_security_service_1.JsonSecurityService) === "function" ? _d : Object]) +], JsonSchemaService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGpzb24tc2NoZW1hLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDtBQUN2RCwrQ0FBK0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9DLDJDQU13QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQsOENBQTRDO0FBQzVDLDhEQUFxQztBQUNyQyxxQ0FBcUM7QUFLckMsc0VBQTJEO0FBRTNELHdEQUF3RDtBQUN4RCw0RUFHMEM7QUFDMUMsb0VBQStEO0FBRS9ELDhFQUF5RTtBQVNsRSxJQUFNLGlCQUFpQix5QkFBdkIsTUFBTSxpQkFBaUI7SUFZNUIsWUFFRSxvQkFBNkQsRUFDNUMsb0JBQTBDLEVBQzFDLGVBQWdDLEVBQ2hDLG1CQUF3QztRQUh4Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdCO1FBQzVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFmbkQsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDLENBQUMsOENBQThDO1FBQ3ZGLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxtQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3RCxxQ0FBcUM7UUFDcEIsbUJBQWMsR0FBc0I7WUFDbkQsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGNBQWM7WUFDdEMsV0FBVyxFQUFFLElBQUksRUFBRSw4Q0FBOEM7WUFDakUsV0FBVyxFQUFFLElBQUksRUFBRSxnQ0FBZ0M7U0FDcEQsQ0FBQztRQVNBLCtDQUErQztRQUMvQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksYUFBRyxDQUFDO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLEVBQUUsc0NBQXNDO1lBQ3ZELE1BQU0sRUFBRSxLQUFLLEVBQUUsMkRBQTJEO1lBQzFFLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxJQUFJ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TUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhFLGdFQUFnRTtRQUNoRSx1Q0FBdUM7UUFDdkMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FDakQsV0FBVyxDQUFDLFNBQVMsRUFDckIsV0FBVyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQ2pDLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFVO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFBO0FBeFhZLDhDQUFpQjs0QkFBakIsaUJBQWlCO0lBRDdCLElBQUEsbUJBQVUsR0FBRTtJQWNSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQywrQkFBVSxDQUFDLENBQUE7eURBQ1Usb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ1YsNkNBQW9CLG9CQUFwQiw2Q0FBb0Isb0RBQ3pCLG1DQUFlLG9CQUFmLG1DQUFlLG9EQUNYLDJDQUFtQixvQkFBbkIsMkNBQW1CO0dBakJoRCxpQkFBaUIsQ0F3WDdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxqc29uLXNjaGVtYS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UudHNcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjogRml4IFRTMjM0NSAodW5kZWZpbmVkIGNoZWNrKVxuXG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBMb2dnZXIsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBPbk1vZHVsZUluaXQsXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IEFqdiwgeyBWYWxpZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnYWp2JztcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcblxuaW1wb3J0IHsgQ3JlYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgU2VhcmNoSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL3NlYXJjaC1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgVXBkYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgSnNvblNjaGVtYSB9IGZyb20gJy4vZW50aXRpZXMvanNvbi1zY2hlbWEuZW50aXR5JztcblxuLy8gU2VydmljZXMg4Lii4LmI4Lit4Lii4LiX4Li14LmI4LmB4Lii4LiB4LiV4Liy4Lih4Lir4LiZ4LmJ4Liy4LiX4Li14LmIIChTaW5nbGUgUmVzcG9uc2liaWxpdHkpXG5pbXBvcnQge1xuICBKc29uU2VjdXJpdHlTZXJ2aWNlLFxuICBTZWN1cml0eUNvbnRleHQsXG59IGZyb20gJy4vc2VydmljZXMvanNvbi1zZWN1cml0eS5zZXJ2aWNlJztcbmltcG9ydCB7IFVpU2NoZW1hU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdWktc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgVWlTY2hlbWEgfSBmcm9tICcuL2ludGVyZmFjZXMvdWktc2NoZW1hLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaXJ0dWFsQ29sdW1uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlydHVhbC1jb2x1bW4uc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFZhbGlkYXRpb25FcnJvckRldGFpbCxcbiAgVmFsaWRhdGlvbk9wdGlvbnMsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlcy92YWxpZGF0aW9uLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnNvblNjaGVtYVNlcnZpY2UgaW1wbGVtZW50cyBPbk1vZHVsZUluaXQge1xuICBwcml2YXRlIGFqdjogQWp2O1xuICBwcml2YXRlIHZhbGlkYXRvcnMgPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdGVGdW5jdGlvbj4oKTsgLy8gQ2FjaGUg4Liq4Liz4Lir4Lij4Lix4Lia4LmA4LiB4LmH4LiaIFZhbGlkYXRvciDguJfguLXguYggQ29tcGlsZSDguYHguKXguYnguKdcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEpzb25TY2hlbWFTZXJ2aWNlLm5hbWUpO1xuXG4gIC8vIOC4hOC5iOC4siBEZWZhdWx0IOC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4leC4o+C4p+C4iOC4quC4reC4muC4guC5ieC4reC4oeC4ueC4pVxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRPcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucyA9IHtcbiAgICByZW1vdmVBZGRpdGlvbmFsOiB0cnVlLCAvLyDguKXguJrguJ/guLTguKXguJTguYzguYDguIHguLTguJlcbiAgICBjb2VyY2VUeXBlczogdHJ1ZSwgLy8g4LmB4Lib4Lil4LiH4LiK4LiZ4Li04LiU4LiC4LmJ4Lit4Lih4Li54Lil4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0ICjguYDguIrguYjguJkgXCIxMjNcIiAtPiAxMjMpXG4gICAgdXNlRGVmYXVsdHM6IHRydWUsIC8vIOC5g+C4quC5iOC4hOC5iOC4siBEZWZhdWx0IOC4luC5ieC4suC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KEpzb25TY2hlbWEpXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc29uU2NoZW1hUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxKc29uU2NoZW1hPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpcnR1YWxDb2x1bW5TZXJ2aWNlOiBWaXJ0dWFsQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVpU2NoZW1hU2VydmljZTogVWlTY2hlbWFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkganNvblNlY3VyaXR5U2VydmljZTogSnNvblNlY3VyaXR5U2VydmljZVxuICApIHtcbiAgICAvLyDguIHguLPguKvguJnguJTguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJnguYPguKvguYnguIHguLHguJogQUpWIFZhbGlkYXRpb24gRW5naW5lXG4gICAgdGhpcy5hanYgPSBuZXcgQWp2KHtcbiAgICAgIGFsbEVycm9yczogdHJ1ZSwgLy8g4LmB4Liq4LiU4LiHIEVycm9yIOC4l+C4seC5ieC4h+C4q+C4oeC4lCDguYTguKHguYjguKvguKLguLjguJTguYHguITguYjguIjguLjguJTguYHguKPguIFcbiAgICAgIHN0cmljdDogZmFsc2UsIC8vIOC5hOC4oeC5iOC5gOC4hOC4o+C5iOC4h+C4hOC4o+C4seC4lOC5gOC4geC4tOC4meC5hOC4myAo4Lii4Lit4Lih4Lij4Lix4LiaIEtleXdvcmQg4LmB4Lib4Lil4LiB4LmGIOC5gOC4iuC5iOC4mSB1aTp3aWRnZXQpXG4gICAgICBjb2VyY2VUeXBlczogdHJ1ZSxcbiAgICAgIHVzZURlZmF1bHRzOiB0cnVlLFxuICAgICAgcmVtb3ZlQWRkaXRpb25hbDogdHJ1ZSxcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRzKHRoaXMuYWp2KTsgLy8g4LmA4Lie4Li04LmI4LihIEZvcm1hdCDguKHguLLguJXguKPguJDguLLguJkgKGVtYWlsLCBkYXRlLCB1cmkg4Liv4Lil4LivKVxuICAgIHRoaXMucmVnaXN0ZXJDdXN0b21WYWxpZGF0b3JzKCk7IC8vIOC4peC4h+C4l+C4sOC5gOC4muC4teC4ouC4mSBWYWxpZGF0b3Ig4LmA4LiJ4Lie4Liy4Liw4LiC4Lit4LiH4LmC4Lib4Lij4LmA4LiI4LiB4LiV4LmMXG4gIH1cblxuICBhc3luYyBvbk1vZHVsZUluaXQoKSB7XG4gICAgLy8g4Liq4Liy4Lih4Liy4Lij4LiW4LmC4Lir4Lil4LiUIFNjaGVtYSDguJfguLXguYggQWN0aXZlIOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4oeC4siBDYWNoZSDguYTguKfguYnguKXguYjguKfguIfguKvguJnguYnguLLguYTguJTguYnguJfguLXguYjguJnguLXguYgg4LmA4Lie4Li34LmI4Lit4LiE4Lin4Liy4Lih4LmA4Lij4LmH4Lin4LmD4LiZ4LiB4Liy4Lij4LiV4Lit4Lia4Liq4LiZ4Lit4LiH4LiE4Lij4Lix4LmJ4LiH4LmB4Lij4LiBXG4gIH1cblxuICAvKipcbiAgICog4Lil4LiH4LiX4Liw4LmA4Lia4Li14Lii4LiZIEN1c3RvbSBWYWxpZGF0b3JzIOC5gOC4ieC4nuC4suC4sOC4quC4s+C4q+C4o+C4seC4miBMQ0JQM1xuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckN1c3RvbVZhbGlkYXRvcnMoKSB7XG4gICAgLy8gMS4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lij4Li54Lib4LmB4Lia4Lia4LmA4Lil4LiC4LiX4Li14LmI4LmA4Lit4LiB4Liq4Liy4LijICjguYDguIrguYjguJkgVEVBTS1SRkEtU1RSLTAwMDEpXG4gICAgdGhpcy5hanYuYWRkRm9ybWF0KCdkb2N1bWVudC1udW1iZXInLCB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHZhbGlkYXRlOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBSZWdleCDguK3guKLguYjguLLguIfguIfguYjguLLguKI6IOC4geC4peC4uOC5iOC4oeC4leC4seC4p+C4reC4seC4geC4qeC4o+C4guC4teC4lOC4hOC4seC5iOC4meC4lOC5ieC4p+C4oiAtXG4gICAgICAgIHJldHVybiAvXltBLVowLTldezIsMTB9LVtBLVpdezIsNX0oLVtBLVowLTldezIsNX0pPy1cXGR7NH0tXFxkezMsNX0kLy50ZXN0KFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gMi4gS2V5d29yZCDguKrguLPguKvguKPguLHguJrguKPguLDguJrguLggUm9sZSDguJfguLXguYjguIjguLPguYDguJvguYfguJkgKOC5g+C4iuC5ieC4o+C5iOC4p+C4oeC4geC4seC4miBTZWN1cml0eSBTZXJ2aWNlKVxuICAgIHRoaXMuYWp2LmFkZEtleXdvcmQoe1xuICAgICAga2V5d29yZDogJ3JlcXVpcmVkUm9sZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIG1ldGFTY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHZhbGlkYXRlOiAoX3NjaGVtYTogc3RyaW5nLCBfZGF0YTogdW5rbm93bikgPT4gdHJ1ZSwgLy8g4Lic4LmI4Liy4LiZ4LmA4Liq4Lih4Lit4LmD4LiZ4LiC4Lix4LmJ4LiZIEFKViAoU2VjdXJpdHkgU2VydmljZSDguIjguLDguIjguLHguJTguIHguLLguKPguYDguK3guIcpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog4Liq4Lij4LmJ4Liy4LiHIFNjaGVtYSDguYPguKvguKHguYgg4Lie4Lij4LmJ4Lit4Lih4LiI4Lix4LiU4LiB4Liy4LijIFZlcnNpb24sIFVJIFNjaGVtYSDguYHguKXguLAgVmlydHVhbCBDb2x1bW5zXG4gICAqL1xuICBhc3luYyBjcmVhdGUoY3JlYXRlRHRvOiBDcmVhdGVKc29uU2NoZW1hRHRvKTogUHJvbWlzZTxKc29uU2NoZW1hPiB7XG4gICAgLy8gMS4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiE4Lin4Liy4Lih4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LiC4Lit4LiHIEpTT04gU2NoZW1hIERlZmluaXRpb24gKEFKViBTeW50YXgpXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYWp2LmNvbXBpbGUoY3JlYXRlRHRvLnNjaGVtYURlZmluaXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYEludmFsaWQgSlNPTiBTY2hlbWEgZm9ybWF0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4iOC4seC4lOC4geC4suC4oyBVSSBTY2hlbWFcbiAgICBpZiAoY3JlYXRlRHRvLnVpU2NoZW1hKSB7XG4gICAgICAvLyDguJbguYnguLLguKrguYjguIfguKHguLIg4LmD4Lir4LmJ4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiE4Lin4Liy4Lih4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LmA4LiX4Li14Lii4Lia4LiB4Lix4LiaIERhdGEgU2NoZW1hXG4gICAgICB0aGlzLnVpU2NoZW1hU2VydmljZS52YWxpZGF0ZVVpU2NoZW1hKFxuICAgICAgICBjcmVhdGVEdG8udWlTY2hlbWEgYXMgdW5rbm93biBhcyBVaVNjaGVtYSxcbiAgICAgICAgY3JlYXRlRHRvLnNjaGVtYURlZmluaXRpb25cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOC4luC5ieC4suC5hOC4oeC5iOC4quC5iOC4h+C4oeC4siDguYPguKvguYnguKrguKPguYnguLLguIcgVUkgU2NoZW1hIOC4nuC4t+C5ieC4meC4kOC4suC4meC5g+C4q+C5ieC4reC4seC4leC5guC4meC4oeC4seC4leC4tFxuICAgICAgY3JlYXRlRHRvLnVpU2NoZW1hID0gdGhpcy51aVNjaGVtYVNlcnZpY2UuZ2VuZXJhdGVEZWZhdWx0VWlTY2hlbWEoXG4gICAgICAgIGNyZWF0ZUR0by5zY2hlbWFEZWZpbml0aW9uXG4gICAgICApIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuXG4gICAgLy8gMy4g4LiI4Lix4LiU4LiB4Liy4LijIFZlcnNpb25pbmcg4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0IChBdXRvLWluY3JlbWVudClcbiAgICBjb25zdCBsYXRlc3RTY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY3JlYXRlRHRvLnNjaGVtYUNvZGUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgbGV0IG5ld1ZlcnNpb24gPSAxO1xuICAgIGlmIChsYXRlc3RTY2hlbWEpIHtcbiAgICAgIC8vIOC4luC5ieC4suC4nOC4ueC5ieC5g+C4iuC5ieC5hOC4oeC5iOC4o+C4sOC4muC4uCBWZXJzaW9uIOC4q+C4o+C4t+C4reC4o+C4sOC4muC4uOC4oeC4suC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4peC5iOC4suC4quC4uOC4lCDguYPguKvguYkgKzFcbiAgICAgIGlmICghY3JlYXRlRHRvLnZlcnNpb24gfHwgY3JlYXRlRHRvLnZlcnNpb24gPD0gbGF0ZXN0U2NoZW1hLnZlcnNpb24pIHtcbiAgICAgICAgbmV3VmVyc2lvbiA9IGxhdGVzdFNjaGVtYS52ZXJzaW9uICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZlcnNpb24gPSBjcmVhdGVEdG8udmVyc2lvbjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNyZWF0ZUR0by52ZXJzaW9uKSB7XG4gICAgICBuZXdWZXJzaW9uID0gY3JlYXRlRHRvLnZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gNC4g4Lia4Lix4LiZ4LiX4Li24LiB4Lil4LiH4LiQ4Liy4LiZ4LiC4LmJ4Lit4Lih4Li54LilXG4gICAgY29uc3QgbmV3U2NoZW1hID0gdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5jcmVhdGUoe1xuICAgICAgLi4uY3JlYXRlRHRvLFxuICAgICAgdmVyc2lvbjogbmV3VmVyc2lvbixcbiAgICB9KTtcblxuICAgIGNvbnN0IHNhdmVkU2NoZW1hID0gYXdhaXQgdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5zYXZlKG5ld1NjaGVtYSk7XG5cbiAgICAvLyDguKXguYnguLLguIcgQ2FjaGUg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJ4LmC4Lir4Lil4LiU4LiV4Lix4Lin4LmD4Lir4Lih4LmI4LmD4LiZ4LiE4Lij4Lix4LmJ4LiH4LiW4Lix4LiU4LmE4LibXG4gICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzYXZlZFNjaGVtYS5zY2hlbWFDb2RlKTtcblxuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBTY2hlbWEgJyR7c2F2ZWRTY2hlbWEuc2NoZW1hQ29kZX0nIGNyZWF0ZWQgKHYke3NhdmVkU2NoZW1hLnZlcnNpb259KWBcbiAgICApO1xuXG4gICAgLy8gNS4g4Liq4Lij4LmJ4Liy4LiHL+C4reC4seC4m+C5gOC4lOC4lSBWaXJ0dWFsIENvbHVtbnMg4Lia4LiZIERhdGFiYXNlIOC4iOC4o+C4tOC4hyAoUGVyZm9ybWFuY2UgT3B0aW1pemF0aW9uKVxuICAgIC8vIEZpeCBUUzIzNDU6IEFkZCBlbXB0eSBhcnJheSBmYWxsYmFja1xuICAgIGlmIChzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucyAmJiBzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnZpcnR1YWxDb2x1bW5TZXJ2aWNlLnNldHVwVmlydHVhbENvbHVtbnMoXG4gICAgICAgIHNhdmVkU2NoZW1hLnRhYmxlTmFtZSxcbiAgICAgICAgc2F2ZWRTY2hlbWEudmlydHVhbENvbHVtbnMgfHwgW11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhdmVkU2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4hOC5ieC4meC4q+C4siBTY2hlbWEg4LiX4Lix4LmJ4LiH4Lir4Lih4LiUIChQYWdpbmF0aW9uICYgRmlsdGVyKVxuICAgKi9cbiAgYXN5bmMgZmluZEFsbChzZWFyY2hEdG86IFNlYXJjaEpzb25TY2hlbWFEdG8pIHtcbiAgICBjb25zdCB7IHNlYXJjaCwgaXNBY3RpdmUsIHBhZ2UgPSAxLCBsaW1pdCA9IDIwIH0gPSBzZWFyY2hEdG87XG4gICAgY29uc3Qgc2tpcCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3NjaGVtYScpO1xuXG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3NjaGVtYS5zY2hlbWFDb2RlIExJS0UgOnNlYXJjaCcsIHtcbiAgICAgICAgc2VhcmNoOiBgJSR7c2VhcmNofSVgLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHF1ZXJ5LmFuZFdoZXJlKCdzY2hlbWEuaXNBY3RpdmUgPSA6aXNBY3RpdmUnLCB7IGlzQWN0aXZlIH0pO1xuICAgIH1cblxuICAgIC8vIOC5gOC4o+C4teC4ouC4h+C4leC4suC4oSBDb2RlIOC4geC5iOC4reC4mSDguYHguKXguYnguKfguJXguLLguKHguJTguYnguKfguKIgVmVyc2lvbiDguKXguYjguLLguKrguLjguJRcbiAgICBxdWVyeS5vcmRlckJ5KCdzY2hlbWEuc2NoZW1hQ29kZScsICdBU0MnKTtcbiAgICBxdWVyeS5hZGRPcmRlckJ5KCdzY2hlbWEudmVyc2lvbicsICdERVNDJyk7XG5cbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5LnNraXAoc2tpcCkudGFrZShsaW1pdCkuZ2V0TWFueUFuZENvdW50KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogaXRlbXMsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIHRvdGFsLFxuICAgICAgICBwYWdlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgdG90YWxQYWdlczogTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4h+C4guC5ieC4reC4oeC4ueC4pSBTY2hlbWEg4LiV4Liy4LihIElEXG4gICAqL1xuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYEpzb25TY2hlbWEgd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguJTguLbguIfguILguYnguK3guKHguLnguKUgU2NoZW1hIOC4leC4suC4oSBDb2RlIOC5geC4peC4sCBWZXJzaW9uICjguKrguLPguKvguKPguLHguJogTWlncmF0aW9uKVxuICAgKi9cbiAgYXN5bmMgZmluZE9uZUJ5Q29kZUFuZFZlcnNpb24oXG4gICAgY29kZTogc3RyaW5nLFxuICAgIHZlcnNpb246IG51bWJlclxuICApOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY29kZSwgdmVyc2lvbiB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYEpzb25TY2hlbWEgJyR7Y29kZX0nIHZlcnNpb24gJHt2ZXJzaW9ufSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4hyBTY2hlbWEg4LmA4Lin4Lit4Lij4LmM4LiK4Lix4LiZ4Lil4LmI4Liy4Liq4Li44LiU4LiX4Li14LmIIEFjdGl2ZSAo4Liq4Liz4Lir4Lij4Lix4Lia4LmD4LiK4LmJ4LiH4Liy4LiZ4LiX4Lix4LmI4Lin4LmE4LibKVxuICAgKi9cbiAgYXN5bmMgZmluZExhdGVzdEJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY29kZSwgaXNBY3RpdmU6IHRydWUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYEFjdGl2ZSBKc29uU2NoZW1hIHdpdGggY29kZSAnJHtjb2RlfScgbm90IGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQ09SRSBGVU5DVElPTl0g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiC4LmJ4Lit4Lih4Li54LilIChWYWxpZGF0ZSksIOC4l+C4s+C4hOC4p+C4suC4oeC4quC4sOC4reC4suC4lCAoU2FuaXRpemUpIOC5geC4peC4sOC5gOC4guC5ieC4suC4o+C4q+C4seC4qiAoRW5jcnlwdClcbiAgICog4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4LiaIFwi4LiC4Liy4LmA4LiC4LmJ4LiyXCIgKFdyaXRlKSDguIHguYjguK3guJnguJrguLHguJnguJfguLbguIHguKXguIcgRGF0YWJhc2VcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlRGF0YShcbiAgICBzY2hlbWFDb2RlOiBzdHJpbmcsXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgX29wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gMS4g4LiU4Li24LiH4LmB4Lil4LiwIENvbXBpbGUgVmFsaWRhdG9yXG4gICAgY29uc3QgdmFsaWRhdGUgPSBhd2FpdCB0aGlzLmdldFZhbGlkYXRvcihzY2hlbWFDb2RlKTtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmZpbmRMYXRlc3RCeUNvZGUoc2NoZW1hQ29kZSk7IC8vIOC4lOC4tuC4hyBGdWxsIFNjaGVtYSDguYDguJ7guLfguYjguK3guYPguIrguYkgQ29uZmlnIOC4reC4t+C5iOC4meC5hlxuXG4gICAgLy8gMi4g4Liq4Liz4LmA4LiZ4Liy4LiC4LmJ4Lit4Lih4Li54Lil4LmA4Lie4Li34LmI4Lit4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFNpZGUgRWZmZWN0IOC5geC4peC4sOC5gOC4leC4o+C4teC4ouC4oeC4quC4s+C4q+C4o+C4seC4miBBSlYgTXV0YXRpb24gKFNhbml0aXphdGlvbilcbiAgICBjb25zdCBkYXRhVG9WYWxpZGF0ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpIGFzIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHVua25vd25cbiAgICA+O1xuXG4gICAgLy8gMy4g4LmA4Lij4Li04LmI4Lih4LiB4Liy4Lij4LiV4Lij4Lin4LiI4Liq4Lit4LiaIChBSlYg4LiI4Liw4LiX4Liz4LiB4Liy4LijIENvZXJjZSBUeXBlIOC5geC4peC4sCBSZW1vdmUgQWRkaXRpb25hbCBQcm9wZXJ0aWVzIOC5g+C4q+C5ieC4lOC5ieC4p+C4oilcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlKGRhdGFUb1ZhbGlkYXRlKTtcblxuICAgIC8vIDQuIOC4iOC4seC4lOC4geC4suC4o+C4geC4o+C4k+C4teC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4h1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yczogVmFsaWRhdGlvbkVycm9yRGV0YWlsW10gPSAodmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoXG4gICAgICAgIChlcnIpID0+ICh7XG4gICAgICAgICAgZmllbGQ6IGVyci5pbnN0YW5jZVBhdGggfHwgJ3Jvb3QnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlIHx8ICdWYWxpZGF0aW9uIGVycm9yJyxcbiAgICAgICAgICB2YWx1ZTogZXJyLnBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIHNhbml0aXplZERhdGE6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIDUuIOC5gOC4guC5ieC4suC4o+C4q+C4seC4quC4guC5ieC4reC4oeC4ueC4pSAoRW5jcnlwdGlvbikg4Liq4Liz4Lir4Lij4Lix4LiaIEZpZWxkIOC4l+C4teC5iOC4oeC4teC4hOC4p+C4suC4oeC4peC4seC4miAoeC1lbmNyeXB0OiB0cnVlKVxuICAgIGNvbnN0IHNlY3VyZURhdGEgPSB0aGlzLmpzb25TZWN1cml0eVNlcnZpY2UuZW5jcnlwdEZpZWxkcyhcbiAgICAgIGRhdGFUb1ZhbGlkYXRlLFxuICAgICAgc2NoZW1hLnNjaGVtYURlZmluaXRpb25cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICBlcnJvcnM6IFtdLFxuICAgICAgc2FuaXRpemVkRGF0YTogc2VjdXJlRGF0YSwgLy8g4LiC4LmJ4Lit4Lih4Li54Lil4LiZ4Li14LmJ4Liq4Liw4Lit4Liy4LiU4LmB4Lil4Liw4Lib4Lil4Lit4LiU4Lig4Lix4LiiIOC4nuC4o+C5ieC4reC4oeC4muC4seC4meC4l+C4tuC4gVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogW0NPUkUgRlVOQ1RJT05dIOC4reC5iOC4suC4meC4guC5ieC4reC4oeC4ueC4pSwg4LiW4Lit4LiU4Lij4Lir4Lix4LiqIChEZWNyeXB0KSDguYHguKXguLDguIHguKPguK3guIfguJXguLLguKHguKrguLTguJfguJjguLTguYwgKEZpbHRlcilcbiAgICog4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4LiaIFwi4LiC4Liy4Lit4Lit4LiBXCIgKFJlYWQpIOC4geC5iOC4reC4meC4quC5iOC4h+C5g+C4q+C5iSBGcm9udGVuZFxuICAgKi9cbiAgYXN5bmMgcHJvY2Vzc1JlYWREYXRhKFxuICAgIHNjaGVtYUNvZGU6IHN0cmluZyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB1c2VyQ29udGV4dDogU2VjdXJpdHlDb250ZXh0XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBkYXRhO1xuXG4gICAgLy8g4LiU4Li24LiHIFNjaGVtYSDguYDguJ7guLfguYjguK3guJTguLkgQ29uZmlnIOC4geC4suC4o+C4luC4reC4lOC4o+C4q+C4seC4quC5geC4peC4sOC4geC4suC4o+C4oeC4reC4h+C5gOC4q+C5h+C4mVxuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZExhdGVzdEJ5Q29kZShzY2hlbWFDb2RlKTtcblxuICAgIHJldHVybiB0aGlzLmpzb25TZWN1cml0eVNlcnZpY2UuZGVjcnlwdEFuZEZpbHRlckZpZWxkcyhcbiAgICAgIGRhdGEsXG4gICAgICBzY2hlbWEuc2NoZW1hRGVmaW5pdGlvbixcbiAgICAgIHVzZXJDb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IOC4lOC4tuC4h+C5geC4peC4sCBDYWNoZSBBSlYgVmFsaWRhdG9yIEZ1bmN0aW9uIOC5gOC4nuC4t+C5iOC4reC4m+C4o+C4sOC4quC4tOC4l+C4mOC4tOC4oOC4suC4nlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWYWxpZGF0b3Ioc2NoZW1hQ29kZTogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0ZUZ1bmN0aW9uPiB7XG4gICAgbGV0IHZhbGlkYXRlID0gdGhpcy52YWxpZGF0b3JzLmdldChzY2hlbWFDb2RlKTtcblxuICAgIGlmICghdmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZExhdGVzdEJ5Q29kZShzY2hlbWFDb2RlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlID0gdGhpcy5hanYuY29tcGlsZShzY2hlbWEuc2NoZW1hRGVmaW5pdGlvbik7XG4gICAgICAgIHRoaXMudmFsaWRhdG9ycy5zZXQoc2NoZW1hQ29kZSwgdmFsaWRhdGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEludmFsaWQgU2NoZW1hIERlZmluaXRpb24gZm9yICcke3NjaGVtYUNvZGV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciDguYDguIHguYjguLLguKrguLPguKvguKPguLHguJogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAo4LiW4LmJ4Liy4Lih4Li14LmC4LiE4LmJ4LiU4LmA4LiB4LmI4Liy4LmA4Lij4Li14Lii4LiB4LmD4LiK4LmJKVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUoXG4gICAgc2NoZW1hQ29kZTogc3RyaW5nLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVEYXRhKHNjaGVtYUNvZGUsIGRhdGEpO1xuICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gcmVzdWx0LmVycm9yc1xuICAgICAgICAubWFwKChlKSA9PiBgJHtlLmZpZWxkfTogJHtlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihgSlNPTiBWYWxpZGF0aW9uIEZhaWxlZDogJHtlcnJvck1zZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog4Lit4Lix4Lib4LmA4LiU4LiV4LiC4LmJ4Lit4Lih4Li54LilIFNjaGVtYSDguYHguKXguLDguIjguLHguJTguIHguLLguKPguJzguKXguIHguKPguLDguJfguJogKFZpcnR1YWwgQ29sdW1ucyAvIFVJIFNjaGVtYSlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogbnVtYmVyLFxuICAgIHVwZGF0ZUR0bzogVXBkYXRlSnNvblNjaGVtYUR0b1xuICApOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmZpbmRPbmUoaWQpO1xuXG4gICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4LiaIEpTT04gU2NoZW1hXG4gICAgaWYgKHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmFqdi5jb21waWxlKHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBJbnZhbGlkIEpTT04gU2NoZW1hIGZvcm1hdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzY2hlbWEuc2NoZW1hQ29kZSk7IC8vIOC5gOC4hOC4peC4teC4ouC4o+C5jCBDYWNoZSDguYDguIHguYjguLJcbiAgICB9XG5cbiAgICAvLyDguJXguKPguKfguIjguKrguK3guJogVUkgU2NoZW1hXG4gICAgaWYgKHVwZGF0ZUR0by51aVNjaGVtYSkge1xuICAgICAgdGhpcy51aVNjaGVtYVNlcnZpY2UudmFsaWRhdGVVaVNjaGVtYShcbiAgICAgICAgdXBkYXRlRHRvLnVpU2NoZW1hIGFzIHVua25vd24gYXMgVWlTY2hlbWEsXG4gICAgICAgIHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uIHx8IHNjaGVtYS5zY2hlbWFEZWZpbml0aW9uXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRTY2hlbWEgPSB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5Lm1lcmdlKHNjaGVtYSwgdXBkYXRlRHRvKTtcbiAgICBjb25zdCBzYXZlZFNjaGVtYSA9IGF3YWl0IHRoaXMuanNvblNjaGVtYVJlcG9zaXRvcnkuc2F2ZSh1cGRhdGVkU2NoZW1hKTtcblxuICAgIC8vIOC4reC4seC4m+C5gOC4lOC4lSBWaXJ0dWFsIENvbHVtbnMg4LmD4LiZIERhdGFiYXNlIOC4luC5ieC4suC4oeC4teC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC5geC4m+C4peC4hyBDb25maWdcbiAgICAvLyBGaXggVFMyMzQ1OiBBZGQgZW1wdHkgYXJyYXkgZmFsbGJhY2tcbiAgICBpZiAodXBkYXRlRHRvLnZpcnR1YWxDb2x1bW5zICYmIHVwZGF0ZWRTY2hlbWEudmlydHVhbENvbHVtbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMudmlydHVhbENvbHVtblNlcnZpY2Uuc2V0dXBWaXJ0dWFsQ29sdW1ucyhcbiAgICAgICAgc2F2ZWRTY2hlbWEudGFibGVOYW1lLFxuICAgICAgICBzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucyB8fCBbXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRTY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICog4Lil4LiaIFNjaGVtYSAoSGFyZCBEZWxldGUpXG4gICAqL1xuICBhc3luYyByZW1vdmUoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZE9uZShpZCk7XG4gICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzY2hlbWEuc2NoZW1hQ29kZSk7XG4gICAgYXdhaXQgdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5yZW1vdmUoc2NoZW1hKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2.map new file mode 100644 index 0000000..b68ed15 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/jsonschemaservice_6765703b4a05bdb892b359106504d3c2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.service.ts"],"sourcesContent":["// File: src/modules/json-schema/json-schema.service.ts\n// บันทึกการแก้ไข: Fix TS2345 (undefined check)\n\nimport {\n BadRequestException,\n Injectable,\n Logger,\n NotFoundException,\n OnModuleInit,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { Repository } from 'typeorm';\n\nimport { CreateJsonSchemaDto } from './dto/create-json-schema.dto';\nimport { SearchJsonSchemaDto } from './dto/search-json-schema.dto';\nimport { UpdateJsonSchemaDto } from './dto/update-json-schema.dto';\nimport { JsonSchema } from './entities/json-schema.entity';\n\n// Services ย่อยที่แยกตามหน้าที่ (Single Responsibility)\nimport {\n JsonSecurityService,\n SecurityContext,\n} from './services/json-security.service';\nimport { UiSchemaService } from './services/ui-schema.service';\nimport { UiSchema } from './interfaces/ui-schema.interface';\nimport { VirtualColumnService } from './services/virtual-column.service';\n\nimport {\n ValidationErrorDetail,\n ValidationOptions,\n ValidationResult,\n} from './interfaces/validation-result.interface';\n\n@Injectable()\nexport class JsonSchemaService implements OnModuleInit {\n private ajv: Ajv;\n private validators = new Map(); // Cache สำหรับเก็บ Validator ที่ Compile แล้ว\n private readonly logger = new Logger(JsonSchemaService.name);\n\n // ค่า Default สำหรับการตรวจสอบข้อมูล\n private readonly defaultOptions: ValidationOptions = {\n removeAdditional: true, // ลบฟิลด์เกิน\n coerceTypes: true, // แปลงชนิดข้อมูลอัตโนมัติ (เช่น \"123\" -> 123)\n useDefaults: true, // ใส่ค่า Default ถ้าไม่มีข้อมูล\n };\n\n constructor(\n @InjectRepository(JsonSchema)\n private readonly jsonSchemaRepository: Repository,\n private readonly virtualColumnService: VirtualColumnService,\n private readonly uiSchemaService: UiSchemaService,\n private readonly jsonSecurityService: JsonSecurityService\n ) {\n // กำหนดค่าเริ่มต้นให้กับ AJV Validation Engine\n this.ajv = new Ajv({\n allErrors: true, // แสดง Error ทั้งหมด ไม่หยุดแค่จุดแรก\n strict: false, // ไม่เคร่งครัดเกินไป (ยอมรับ Keyword แปลกๆ เช่น ui:widget)\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: true,\n });\n addFormats(this.ajv); // เพิ่ม Format มาตรฐาน (email, date, uri ฯลฯ)\n this.registerCustomValidators(); // ลงทะเบียน Validator เฉพาะของโปรเจกต์\n }\n\n async onModuleInit() {\n // สามารถโหลด Schema ที่ Active ทั้งหมดมา Cache ไว้ล่วงหน้าได้ที่นี่ เพื่อความเร็วในการตอบสนองครั้งแรก\n }\n\n /**\n * ลงทะเบียน Custom Validators เฉพาะสำหรับ LCBP3\n */\n private registerCustomValidators() {\n // 1. ตรวจสอบรูปแบบเลขที่เอกสาร (เช่น TEAM-RFA-STR-0001)\n this.ajv.addFormat('document-number', {\n type: 'string',\n validate: (value: string) => {\n // Regex อย่างง่าย: กลุ่มตัวอักษรขีดคั่นด้วย -\n return /^[A-Z0-9]{2,10}-[A-Z]{2,5}(-[A-Z0-9]{2,5})?-\\d{4}-\\d{3,5}$/.test(\n value\n );\n },\n });\n\n // 2. Keyword สำหรับระบุ Role ที่จำเป็น (ใช้ร่วมกับ Security Service)\n this.ajv.addKeyword({\n keyword: 'requiredRole',\n type: 'string',\n metaSchema: { type: 'string' },\n validate: (_schema: string, _data: unknown) => true, // ผ่านเสมอในขั้น AJV (Security Service จะจัดการเอง)\n });\n }\n\n /**\n * สร้าง Schema ใหม่ พร้อมจัดการ Version, UI Schema และ Virtual Columns\n */\n async create(createDto: CreateJsonSchemaDto): Promise {\n // 1. ตรวจสอบความถูกต้องของ JSON Schema Definition (AJV Syntax)\n try {\n this.ajv.compile(createDto.schemaDefinition);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // 2. จัดการ UI Schema\n if (createDto.uiSchema) {\n // ถ้าส่งมา ให้ตรวจสอบความถูกต้องเทียบกับ Data Schema\n this.uiSchemaService.validateUiSchema(\n createDto.uiSchema as unknown as UiSchema,\n createDto.schemaDefinition\n );\n } else {\n // ถ้าไม่ส่งมา ให้สร้าง UI Schema พื้นฐานให้อัตโนมัติ\n createDto.uiSchema = this.uiSchemaService.generateDefaultUiSchema(\n createDto.schemaDefinition\n ) as unknown as Record;\n }\n\n // 3. จัดการ Versioning อัตโนมัติ (Auto-increment)\n const latestSchema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: createDto.schemaCode },\n order: { version: 'DESC' },\n });\n\n let newVersion = 1;\n if (latestSchema) {\n // ถ้าผู้ใช้ไม่ระบุ Version หรือระบุมาน้อยกว่าล่าสุด ให้ +1\n if (!createDto.version || createDto.version <= latestSchema.version) {\n newVersion = latestSchema.version + 1;\n } else {\n newVersion = createDto.version;\n }\n } else if (createDto.version) {\n newVersion = createDto.version;\n }\n\n // 4. บันทึกลงฐานข้อมูล\n const newSchema = this.jsonSchemaRepository.create({\n ...createDto,\n version: newVersion,\n });\n\n const savedSchema = await this.jsonSchemaRepository.save(newSchema);\n\n // ล้าง Cache เพื่อให้โหลดตัวใหม่ในครั้งถัดไป\n this.validators.delete(savedSchema.schemaCode);\n\n this.logger.log(\n `Schema '${savedSchema.schemaCode}' created (v${savedSchema.version})`\n );\n\n // 5. สร้าง/อัปเดต Virtual Columns บน Database จริง (Performance Optimization)\n // Fix TS2345: Add empty array fallback\n if (savedSchema.virtualColumns && savedSchema.virtualColumns.length > 0) {\n await this.virtualColumnService.setupVirtualColumns(\n savedSchema.tableName,\n savedSchema.virtualColumns || []\n );\n }\n\n return savedSchema;\n }\n\n /**\n * ค้นหา Schema ทั้งหมด (Pagination & Filter)\n */\n async findAll(searchDto: SearchJsonSchemaDto) {\n const { search, isActive, page = 1, limit = 20 } = searchDto;\n const skip = (page - 1) * limit;\n\n const query = this.jsonSchemaRepository.createQueryBuilder('schema');\n\n if (search) {\n query.andWhere('schema.schemaCode LIKE :search', {\n search: `%${search}%`,\n });\n }\n\n if (isActive !== undefined) {\n query.andWhere('schema.isActive = :isActive', { isActive });\n }\n\n // เรียงตาม Code ก่อน แล้วตามด้วย Version ล่าสุด\n query.orderBy('schema.schemaCode', 'ASC');\n query.addOrderBy('schema.version', 'DESC');\n\n const [items, total] = await query.skip(skip).take(limit).getManyAndCount();\n\n return {\n data: items,\n meta: {\n total,\n page,\n limit,\n totalPages: Math.ceil(total / limit),\n },\n };\n }\n\n /**\n * ดึงข้อมูล Schema ตาม ID\n */\n async findOne(id: number): Promise {\n const schema = await this.jsonSchemaRepository.findOne({ where: { id } });\n if (!schema) {\n throw new NotFoundException(`JsonSchema with ID ${id} not found`);\n }\n return schema;\n }\n\n /**\n * ดึงข้อมูล Schema ตาม Code และ Version (สำหรับ Migration)\n */\n async findOneByCodeAndVersion(\n code: string,\n version: number\n ): Promise {\n const schema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: code, version },\n });\n\n if (!schema) {\n throw new NotFoundException(\n `JsonSchema '${code}' version ${version} not found`\n );\n }\n return schema;\n }\n\n /**\n * ดึง Schema เวอร์ชันล่าสุดที่ Active (สำหรับใช้งานทั่วไป)\n */\n async findLatestByCode(code: string): Promise {\n const schema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: code, isActive: true },\n order: { version: 'DESC' },\n });\n\n if (!schema) {\n throw new NotFoundException(\n `Active JsonSchema with code '${code}' not found`\n );\n }\n return schema;\n }\n\n /**\n * [CORE FUNCTION] ตรวจสอบข้อมูล (Validate), ทำความสะอาด (Sanitize) และเข้ารหัส (Encrypt)\n * ใช้สำหรับ \"ขาเข้า\" (Write) ก่อนบันทึกลง Database\n */\n async validateData(\n schemaCode: string,\n data: Record,\n _options: ValidationOptions = {}\n ): Promise {\n // 1. ดึงและ Compile Validator\n const validate = await this.getValidator(schemaCode);\n const schema = await this.findLatestByCode(schemaCode); // ดึง Full Schema เพื่อใช้ Config อื่นๆ\n\n // 2. สำเนาข้อมูลเพื่อป้องกัน Side Effect และเตรียมสำหรับ AJV Mutation (Sanitization)\n const dataToValidate = JSON.parse(JSON.stringify(data)) as Record<\n string,\n unknown\n >;\n\n // 3. เริ่มการตรวจสอบ (AJV จะทำการ Coerce Type และ Remove Additional Properties ให้ด้วย)\n const valid = validate(dataToValidate);\n\n // 4. จัดการกรณีข้อมูลไม่ถูกต้อง\n if (!valid) {\n const errors: ValidationErrorDetail[] = (validate.errors || []).map(\n (err) => ({\n field: err.instancePath || 'root',\n message: err.message || 'Validation error',\n value: err.params,\n })\n );\n\n return {\n isValid: false,\n errors,\n sanitizedData: null,\n };\n }\n\n // 5. เข้ารหัสข้อมูล (Encryption) สำหรับ Field ที่มีความลับ (x-encrypt: true)\n const secureData = this.jsonSecurityService.encryptFields(\n dataToValidate,\n schema.schemaDefinition\n );\n\n return {\n isValid: true,\n errors: [],\n sanitizedData: secureData, // ข้อมูลนี้สะอาดและปลอดภัย พร้อมบันทึก\n };\n }\n\n /**\n * [CORE FUNCTION] อ่านข้อมูล, ถอดรหัส (Decrypt) และกรองตามสิทธิ์ (Filter)\n * ใช้สำหรับ \"ขาออก\" (Read) ก่อนส่งให้ Frontend\n */\n async processReadData(\n schemaCode: string,\n data: Record,\n userContext: SecurityContext\n ): Promise> {\n if (!data) return data;\n\n // ดึง Schema เพื่อดู Config การถอดรหัสและการมองเห็น\n const schema = await this.findLatestByCode(schemaCode);\n\n return this.jsonSecurityService.decryptAndFilterFields(\n data,\n schema.schemaDefinition,\n userContext\n );\n }\n\n /**\n * Helper: ดึงและ Cache AJV Validator Function เพื่อประสิทธิภาพ\n */\n private async getValidator(schemaCode: string): Promise {\n let validate = this.validators.get(schemaCode);\n\n if (!validate) {\n const schema = await this.findLatestByCode(schemaCode);\n try {\n validate = this.ajv.compile(schema.schemaDefinition);\n this.validators.set(schemaCode, validate);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid Schema Definition for '${schemaCode}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return validate;\n }\n\n /**\n * Wrapper เก่าสำหรับ Backward Compatibility (ถ้ามีโค้ดเก่าเรียกใช้)\n */\n async validate(\n schemaCode: string,\n data: Record\n ): Promise {\n const result = await this.validateData(schemaCode, data);\n if (!result.isValid) {\n const errorMsg = result.errors\n .map((e) => `${e.field}: ${e.message}`)\n .join(', ');\n throw new BadRequestException(`JSON Validation Failed: ${errorMsg}`);\n }\n return true;\n }\n\n /**\n * อัปเดตข้อมูล Schema และจัดการผลกระทบ (Virtual Columns / UI Schema)\n */\n async update(\n id: number,\n updateDto: UpdateJsonSchemaDto\n ): Promise {\n const schema = await this.findOne(id);\n\n // ตรวจสอบ JSON Schema\n if (updateDto.schemaDefinition) {\n try {\n this.ajv.compile(updateDto.schemaDefinition);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n this.validators.delete(schema.schemaCode); // เคลียร์ Cache เก่า\n }\n\n // ตรวจสอบ UI Schema\n if (updateDto.uiSchema) {\n this.uiSchemaService.validateUiSchema(\n updateDto.uiSchema as unknown as UiSchema,\n updateDto.schemaDefinition || schema.schemaDefinition\n );\n }\n\n const updatedSchema = this.jsonSchemaRepository.merge(schema, updateDto);\n const savedSchema = await this.jsonSchemaRepository.save(updatedSchema);\n\n // อัปเดต Virtual Columns ใน Database ถ้ามีการเปลี่ยนแปลง Config\n // Fix TS2345: Add empty array fallback\n if (updateDto.virtualColumns && updatedSchema.virtualColumns) {\n await this.virtualColumnService.setupVirtualColumns(\n savedSchema.tableName,\n savedSchema.virtualColumns || []\n );\n }\n\n return savedSchema;\n }\n\n /**\n * ลบ Schema (Hard Delete)\n */\n async remove(id: number): Promise {\n const schema = await this.findOne(id);\n this.validators.delete(schema.schemaCode);\n await this.jsonSchemaRepository.remove(schema);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c new file mode 100644 index 0000000..beafec3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c @@ -0,0 +1,41 @@ +afa5059cd7fe10c0f288acc5605d84a7 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unsafeStringify = void 0; +const validate_js_1 = require("./validate.js"); +const byteToHex = []; +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +function unsafeStringify(arr, offset = 0) { + return (byteToHex[arr[offset + 0]] + + byteToHex[arr[offset + 1]] + + byteToHex[arr[offset + 2]] + + byteToHex[arr[offset + 3]] + + '-' + + byteToHex[arr[offset + 4]] + + byteToHex[arr[offset + 5]] + + '-' + + byteToHex[arr[offset + 6]] + + byteToHex[arr[offset + 7]] + + '-' + + byteToHex[arr[offset + 8]] + + byteToHex[arr[offset + 9]] + + '-' + + byteToHex[arr[offset + 10]] + + byteToHex[arr[offset + 11]] + + byteToHex[arr[offset + 12]] + + byteToHex[arr[offset + 13]] + + byteToHex[arr[offset + 14]] + + byteToHex[arr[offset + 15]]).toLowerCase(); +} +exports.unsafeStringify = unsafeStringify; +function stringify(arr, offset = 0) { + const uuid = unsafeStringify(arr, offset); + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + return uuid; +} +exports.default = stringify; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcc3RyaW5naWZ5LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNELFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsQ0FBQztJQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHO1FBQ0gsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxzdHJpbmdpZnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVuc2FmZVN0cmluZ2lmeSA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlX2pzXzEgPSByZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKTtcbmNvbnN0IGJ5dGVUb0hleCA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5mdW5jdGlvbiB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydHMudW5zYWZlU3RyaW5naWZ5ID0gdW5zYWZlU3RyaW5naWZ5O1xuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAgIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAgIGlmICghKDAsIHZhbGlkYXRlX2pzXzEuZGVmYXVsdCkodXVpZCkpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdpZnk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c.map new file mode 100644 index 0000000..13ff460 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/67/stringify_6718cb580e6407ba23f44e15fa5f549c.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\stringify.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC;AACjC,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AACD,SAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AACD,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;AAC1C,SAAS,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\stringify.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unsafeStringify = void 0;\nconst validate_js_1 = require(\"./validate.js\");\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nexports.unsafeStringify = unsafeStringify;\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexports.default = stringify;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb new file mode 100644 index 0000000..c07fd06 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb @@ -0,0 +1,167 @@ +71618f8e5523bff20164d182c296b221 +"use strict"; +// File: src/modules/notification/notification.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var NotificationService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NotificationService = void 0; +const common_1 = require("@nestjs/common"); +const bullmq_1 = require("@nestjs/bullmq"); +const bullmq_2 = require("bullmq"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const notification_entity_1 = require("./entities/notification.entity"); +const user_entity_1 = require("../user/entities/user.entity"); +// Gateway +const notification_gateway_1 = require("./notification.gateway"); +let NotificationService = NotificationService_1 = class NotificationService { + constructor(notificationQueue, notificationRepo, userRepo, + // ไม่ต้อง Inject UserPrefRepo แล้ว เพราะ Processor จะจัดการเอง + notificationGateway) { + this.notificationQueue = notificationQueue; + this.notificationRepo = notificationRepo; + this.userRepo = userRepo; + this.notificationGateway = notificationGateway; + this.logger = new common_1.Logger(NotificationService_1.name); + } + /** + * ส่งการแจ้งเตือน (Centralized Notification Sender) + */ + async send(data) { + try { + // --------------------------------------------------------- + // 1. สร้าง Entity และบันทึกลง DB (System Log) + // --------------------------------------------------------- + const notification = this.notificationRepo.create({ + userId: data.userId, + title: data.title, + message: data.message, + notificationType: notification_entity_1.NotificationType.SYSTEM, + entityType: data.entityType, + entityId: data.entityId, + isRead: false, + }); + const savedNotification = await this.notificationRepo.save(notification); + // --------------------------------------------------------- + // 2. Real-time Push (WebSocket) + // --------------------------------------------------------- + this.notificationGateway.sendToUser(data.userId, savedNotification); + // --------------------------------------------------------- + // 3. Push Job ลง Redis BullMQ (Dispatch Logic) + // เปลี่ยนชื่อ Job เป็น 'dispatch-notification' ตาม Processor + // --------------------------------------------------------- + await this.notificationQueue.add('dispatch-notification', { + ...data, + notificationId: savedNotification.id, // ส่ง ID ไปด้วยเผื่อใช้ Tracking + }, { + attempts: 3, + backoff: { + type: 'exponential', + delay: 5000, + }, + removeOnComplete: true, + }); + this.logger.debug(`Dispatched notification job for user ${data.userId}`); + } + catch (error) { + this.logger.error(`Failed to process notification for user ${data.userId}`, error.stack); + } + } + // ... (ส่วน findAll, markAsRead, cleanupOldNotifications เหมือนเดิม ไม่ต้องแก้) ... + async findAll(userId, searchDto) { + const { page = 1, limit = 20, isRead } = searchDto; + const skip = (page - 1) * limit; + const queryBuilder = this.notificationRepo + .createQueryBuilder('notification') + .where('notification.userId = :userId', { userId }) + .orderBy('notification.createdAt', 'DESC') + .take(limit) + .skip(skip); + if (isRead !== undefined) { + queryBuilder.andWhere('notification.isRead = :isRead', { isRead }); + } + const [items, total] = await queryBuilder.getManyAndCount(); + const unreadCount = await this.notificationRepo.count({ + where: { userId, isRead: false }, + }); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + unreadCount, + }, + }; + } + /** + * ดึงจำนวน Notification ที่ยังไม่ได้อ่าน + */ + async getUnreadCount(userId) { + return this.notificationRepo.count({ + where: { userId, isRead: false }, + }); + } + async markAsRead(id, userId) { + const notification = await this.notificationRepo.findOne({ + where: { id, userId }, + }); + if (!notification) { + throw new common_1.NotFoundException(`Notification #${id} not found`); + } + if (!notification.isRead) { + notification.isRead = true; + await this.notificationRepo.save(notification); + } + } + async markAsReadByUuid(uuid, userId) { + const notification = await this.notificationRepo.findOne({ + where: { publicId: uuid, userId }, + }); + if (!notification) { + throw new common_1.NotFoundException(`Notification UUID ${uuid} not found`); + } + if (!notification.isRead) { + notification.isRead = true; + await this.notificationRepo.save(notification); + } + } + async markAllAsRead(userId) { + await this.notificationRepo.update({ userId, isRead: false }, { isRead: true }); + } + async cleanupOldNotifications(days = 90) { + const dateLimit = new Date(); + dateLimit.setDate(dateLimit.getDate() - days); + const result = await this.notificationRepo + .createQueryBuilder() + .delete() + .from(notification_entity_1.Notification) + .where('createdAt < :dateLimit', { dateLimit }) + .execute(); + this.logger.log(`Cleaned up ${result.affected} old notifications`); + return result.affected ?? 0; + } +}; +exports.NotificationService = NotificationService; +exports.NotificationService = NotificationService = NotificationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, bullmq_1.InjectQueue)('notifications')), + __param(1, (0, typeorm_1.InjectRepository)(notification_entity_1.Notification)), + __param(2, (0, typeorm_1.InjectRepository)(user_entity_1.User)), + __metadata("design:paramtypes", [typeof (_a = typeof bullmq_2.Queue !== "undefined" && bullmq_2.Queue) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof notification_gateway_1.NotificationGateway !== "undefined" && notification_gateway_1.NotificationGateway) === "function" ? _d : Object]) +], NotificationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxub3RpZmljYXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEseURBQXlEOzs7Ozs7Ozs7Ozs7Ozs7OztBQUV6RCwyQ0FBdUU7QUFDdkUsMkNBQTZDO0FBQzdDLG1DQUErQjtBQUMvQiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBRXJDLFdBQVc7QUFDWCx3RUFBZ0Y7QUFDaEYsOERBQW9EO0FBRXBELFVBQVU7QUFDVixpRUFBNkQ7QUFpQnRELElBQU0sbUJBQW1CLDJCQUF6QixNQUFNLG1CQUFtQjtJQUc5QixZQUNnQyxpQkFBZ0MsRUFFOUQsZ0JBQWtELEVBRWxELFFBQWtDO0lBQ2xDLCtEQUErRDtJQUN2RCxtQkFBd0M7UUFOVixzQkFBaUIsR0FBakIsaUJBQWlCLENBQU87UUFFdEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtRQUUxQyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUUxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBVGpDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxxQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQVU1RCxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQXlCO1FBQ2xDLElBQUksQ0FBQztZQUNILDREQUE0RDtZQUM1RCw4Q0FBOEM7WUFDOUMsNERBQTREO1lBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLGdCQUFnQixFQUFFLHNDQUFnQixDQUFDLE1BQU07Z0JBQ3pDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dC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QUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFDekIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE9BQWUsRUFBRTtRQUM3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQjthQUN2QyxrQkFBa0IsRUFBRTthQUNwQixNQUFNLEVBQUU7YUFDUixJQUFJLENBQUMsa0NBQVksQ0FBQzthQUNsQixLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzthQUM5QyxPQUFPLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsTUFBTSxDQUFDLFFBQVEsb0JBQW9CLENBQUMsQ0FBQztRQUNuRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRixDQUFBO0FBaktZLGtEQUFtQjs4QkFBbkIsbUJBQW1CO0lBRC9CLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSxvQkFBVyxFQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzVCLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrQ0FBWSxDQUFDLENBQUE7SUFFOUIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLGtCQUFJLENBQUMsQ0FBQTt5REFIa0MsY0FBSyxvQkFBTCxjQUFLLG9EQUVwQyxvQkFBVSxvQkFBVixvQkFBVSxvREFFbEIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBRUMsMENBQW1CLG9CQUFuQiwwQ0FBbUI7R0FWdkMsbUJBQW1CLENBaUsvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxub3RpZmljYXRpb25cXG5vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UXVldWUgfSBmcm9tICdAbmVzdGpzL2J1bGxtcSc7XHJcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnYnVsbG1xJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbi8vIEVudGl0aWVzXHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW50aXRpZXMvbm90aWZpY2F0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuXHJcbi8vIEdhdGV3YXlcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uR2F0ZXdheSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLmdhdGV3YXknO1xyXG5cclxuLy8gRFRPc1xyXG5pbXBvcnQgeyBTZWFyY2hOb3RpZmljYXRpb25EdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtbm90aWZpY2F0aW9uLmR0byc7XHJcblxyXG4vLyBJbnRlcmZhY2VzXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uSm9iRGF0YSB7XHJcbiAgdXNlcklkOiBudW1iZXI7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdHlwZTogJ0VNQUlMJyB8ICdMSU5FJyB8ICdTWVNURU0nOyAvLyDguIrguYjguK3guIfguJfguLLguIfguKvguKXguLHguIHguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguKrguYjguIcgKFRyaWdnZXIgVHlwZSlcclxuICBlbnRpdHlUeXBlPzogc3RyaW5nO1xyXG4gIGVudGl0eUlkPzogbnVtYmVyO1xyXG4gIGxpbms/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOb3RpZmljYXRpb25TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RRdWV1ZSgnbm90aWZpY2F0aW9ucycpIHByaXZhdGUgbm90aWZpY2F0aW9uUXVldWU6IFF1ZXVlLFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoTm90aWZpY2F0aW9uKVxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25SZXBvOiBSZXBvc2l0b3J5PE5vdGlmaWNhdGlvbj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShVc2VyKVxyXG4gICAgcHJpdmF0ZSB1c2VyUmVwbzogUmVwb3NpdG9yeTxVc2VyPixcclxuICAgIC8vIOC5hOC4oeC5iOC4leC5ieC4reC4hyBJbmplY3QgVXNlclByZWZSZXBvIOC5geC4peC5ieC4pyDguYDguJ7guKPguLLguLAgUHJvY2Vzc29yIOC4iOC4sOC4iOC4seC4lOC4geC4suC4o+C5gOC4reC4h1xyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25HYXRld2F5OiBOb3RpZmljYXRpb25HYXRld2F5XHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiDguKrguYjguIfguIHguLLguKPguYHguIjguYnguIfguYDguJXguLfguK3guJkgKENlbnRyYWxpemVkIE5vdGlmaWNhdGlvbiBTZW5kZXIpXHJcbiAgICovXHJcbiAgYXN5bmMgc2VuZChkYXRhOiBOb3RpZmljYXRpb25Kb2JEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMS4g4Liq4Lij4LmJ4Liy4LiHIEVudGl0eSDguYHguKXguLDguJrguLHguJnguJfguLbguIHguKXguIcgREIgKFN5c3RlbSBMb2cpXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblJlcG8uY3JlYXRlKHtcclxuICAgICAgICB1c2VySWQ6IGRhdGEudXNlcklkLFxyXG4gICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxyXG4gICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcclxuICAgICAgICBub3RpZmljYXRpb25UeXBlOiBOb3RpZmljYXRpb25UeXBlLlNZU1RFTSxcclxuICAgICAgICBlbnRpdHlUeXBlOiBkYXRhLmVudGl0eVR5cGUsXHJcbiAgICAgICAgZW50aXR5SWQ6IGRhdGEuZW50aXR5SWQsXHJcbiAgICAgICAgaXNSZWFkOiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzYXZlZE5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUmVwby5zYXZlKG5vdGlmaWNhdGlvbik7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMi4gUmVhbC10aW1lIFB1c2ggKFdlYlNvY2tldClcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uR2F0ZXdheS5zZW5kVG9Vc2VyKGRhdGEudXNlcklkLCBzYXZlZE5vdGlmaWNhdGlvbik7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMy4gUHVzaCBKb2Ig4Lil4LiHIFJlZGlzIEJ1bGxNUSAoRGlzcGF0Y2ggTG9naWMpXHJcbiAgICAgIC8vIOC5gOC4m+C4peC4teC5iOC4ouC4meC4iuC4t+C5iOC4rSBKb2Ig4LmA4Lib4LmH4LiZICdkaXNwYXRjaC1ub3RpZmljYXRpb24nIOC4leC4suC4oSBQcm9jZXNzb3JcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUXVldWUuYWRkKFxyXG4gICAgICAgICdkaXNwYXRjaC1ub3RpZmljYXRpb24nLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLmRhdGEsXHJcbiAgICAgICAgICBub3RpZmljYXRpb25JZDogc2F2ZWROb3RpZmljYXRpb24uaWQsIC8vIOC4quC5iOC4hyBJRCDguYTguJvguJTguYnguKfguKLguYDguJzguLfguYjguK3guYPguIrguYkgVHJhY2tpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGF0dGVtcHRzOiAzLFxyXG4gICAgICAgICAgYmFja29mZjoge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxyXG4gICAgICAgICAgICBkZWxheTogNTAwMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmVPbkNvbXBsZXRlOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBEaXNwYXRjaGVkIG5vdGlmaWNhdGlvbiBqb2IgZm9yIHVzZXIgJHtkYXRhLnVzZXJJZH1gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gZm9yIHVzZXIgJHtkYXRhLnVzZXJJZH1gLFxyXG4gICAgICAgIChlcnJvciBhcyBFcnJvcikuc3RhY2tcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC4uLiAo4Liq4LmI4Lin4LiZIGZpbmRBbGwsIG1hcmtBc1JlYWQsIGNsZWFudXBPbGROb3RpZmljYXRpb25zIOC5gOC4q+C4oeC4t+C4reC4meC5gOC4lOC4tOC4oSDguYTguKHguYjguJXguYnguK3guIfguYHguIHguYkpIC4uLlxyXG5cclxuICBhc3luYyBmaW5kQWxsKHVzZXJJZDogbnVtYmVyLCBzZWFyY2hEdG86IFNlYXJjaE5vdGlmaWNhdGlvbkR0bykge1xyXG4gICAgY29uc3QgeyBwYWdlID0gMSwgbGltaXQgPSAyMCwgaXNSZWFkIH0gPSBzZWFyY2hEdG87XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXMubm90aWZpY2F0aW9uUmVwb1xyXG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCdub3RpZmljYXRpb24nKVxyXG4gICAgICAud2hlcmUoJ25vdGlmaWNhdGlvbi51c2VySWQgPSA6dXNlcklkJywgeyB1c2VySWQgfSlcclxuICAgICAgLm9yZGVyQnkoJ25vdGlmaWNhdGlvbi5jcmVhdGVkQXQnLCAnREVTQycpXHJcbiAgICAgIC50YWtlKGxpbWl0KVxyXG4gICAgICAuc2tpcChza2lwKTtcclxuXHJcbiAgICBpZiAoaXNSZWFkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcXVlcnlCdWlsZGVyLmFuZFdoZXJlKCdub3RpZmljYXRpb24uaXNSZWFkID0gOmlzUmVhZCcsIHsgaXNSZWFkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgcXVlcnlCdWlsZGVyLmdldE1hbnlBbmRDb3VudCgpO1xyXG4gICAgY29uc3QgdW5yZWFkQ291bnQgPSBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblJlcG8uY291bnQoe1xyXG4gICAgICB3aGVyZTogeyB1c2VySWQsIGlzUmVhZDogZmFsc2UgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGE6IGl0ZW1zLFxyXG4gICAgICBtZXRhOiB7XHJcbiAgICAgICAgdG90YWwsXHJcbiAgICAgICAgcGFnZSxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICAgICAgdW5yZWFkQ291bnQsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog4LiU4Li24LiH4LiI4Liz4LiZ4Lin4LiZIE5vdGlmaWNhdGlvbiDguJfguLXguYjguKLguLHguIfguYTguKHguYjguYTguJTguYnguK3guYjguLLguJlcclxuICAgKi9cclxuICBhc3luYyBnZXRVbnJlYWRDb3VudCh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25SZXBvLmNvdW50KHtcclxuICAgICAgd2hlcmU6IHsgdXNlcklkLCBpc1JlYWQ6IGZhbHNlIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG1hcmtBc1JlYWQoaWQ6IG51bWJlciwgdXNlcklkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQsIHVzZXJJZCB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFub3RpZmljYXRpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBOb3RpZmljYXRpb24gIyR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghbm90aWZpY2F0aW9uLmlzUmVhZCkge1xyXG4gICAgICBub3RpZmljYXRpb24uaXNSZWFkID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLnNhdmUobm90aWZpY2F0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG1hcmtBc1JlYWRCeVV1aWQodXVpZDogc3RyaW5nLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0gYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogdXVpZCwgdXNlcklkIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIW5vdGlmaWNhdGlvbikge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYE5vdGlmaWNhdGlvbiBVVUlEICR7dXVpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFub3RpZmljYXRpb24uaXNSZWFkKSB7XHJcbiAgICAgIG5vdGlmaWNhdGlvbi5pc1JlYWQgPSB0cnVlO1xyXG4gICAgICBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblJlcG8uc2F2ZShub3RpZmljYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWFya0FsbEFzUmVhZCh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLnVwZGF0ZShcclxuICAgICAgeyB1c2VySWQsIGlzUmVhZDogZmFsc2UgfSxcclxuICAgICAgeyBpc1JlYWQ6IHRydWUgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNsZWFudXBPbGROb3RpZmljYXRpb25zKGRheXM6IG51bWJlciA9IDkwKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGNvbnN0IGRhdGVMaW1pdCA9IG5ldyBEYXRlKCk7XHJcbiAgICBkYXRlTGltaXQuc2V0RGF0ZShkYXRlTGltaXQuZ2V0RGF0ZSgpIC0gZGF5cyk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvXHJcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxyXG4gICAgICAuZGVsZXRlKClcclxuICAgICAgLmZyb20oTm90aWZpY2F0aW9uKVxyXG4gICAgICAud2hlcmUoJ2NyZWF0ZWRBdCA8IDpkYXRlTGltaXQnLCB7IGRhdGVMaW1pdCB9KVxyXG4gICAgICAuZXhlY3V0ZSgpO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xlYW5lZCB1cCAke3Jlc3VsdC5hZmZlY3RlZH0gb2xkIG5vdGlmaWNhdGlvbnNgKTtcclxuICAgIHJldHVybiByZXN1bHQuYWZmZWN0ZWQgPz8gMDtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb.map new file mode 100644 index 0000000..82349a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/69/notificationservice_690a5698471511d3b44c648da34fdeeb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.service.ts"],"sourcesContent":["// File: src/modules/notification/notification.service.ts\r\n\r\nimport { Injectable, Logger, NotFoundException } from '@nestjs/common';\r\nimport { InjectQueue } from '@nestjs/bullmq';\r\nimport { Queue } from 'bullmq';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\n\r\n// Entities\r\nimport { Notification, NotificationType } from './entities/notification.entity';\r\nimport { User } from '../user/entities/user.entity';\r\n\r\n// Gateway\r\nimport { NotificationGateway } from './notification.gateway';\r\n\r\n// DTOs\r\nimport { SearchNotificationDto } from './dto/search-notification.dto';\r\n\r\n// Interfaces\r\nexport interface NotificationJobData {\r\n userId: number;\r\n title: string;\r\n message: string;\r\n type: 'EMAIL' | 'LINE' | 'SYSTEM'; // ช่องทางหลักที่ต้องการส่ง (Trigger Type)\r\n entityType?: string;\r\n entityId?: number;\r\n link?: string;\r\n}\r\n\r\n@Injectable()\r\nexport class NotificationService {\r\n private readonly logger = new Logger(NotificationService.name);\r\n\r\n constructor(\r\n @InjectQueue('notifications') private notificationQueue: Queue,\r\n @InjectRepository(Notification)\r\n private notificationRepo: Repository,\r\n @InjectRepository(User)\r\n private userRepo: Repository,\r\n // ไม่ต้อง Inject UserPrefRepo แล้ว เพราะ Processor จะจัดการเอง\r\n private notificationGateway: NotificationGateway\r\n ) {}\r\n\r\n /**\r\n * ส่งการแจ้งเตือน (Centralized Notification Sender)\r\n */\r\n async send(data: NotificationJobData): Promise {\r\n try {\r\n // ---------------------------------------------------------\r\n // 1. สร้าง Entity และบันทึกลง DB (System Log)\r\n // ---------------------------------------------------------\r\n const notification = this.notificationRepo.create({\r\n userId: data.userId,\r\n title: data.title,\r\n message: data.message,\r\n notificationType: NotificationType.SYSTEM,\r\n entityType: data.entityType,\r\n entityId: data.entityId,\r\n isRead: false,\r\n });\r\n\r\n const savedNotification = await this.notificationRepo.save(notification);\r\n\r\n // ---------------------------------------------------------\r\n // 2. Real-time Push (WebSocket)\r\n // ---------------------------------------------------------\r\n this.notificationGateway.sendToUser(data.userId, savedNotification);\r\n\r\n // ---------------------------------------------------------\r\n // 3. Push Job ลง Redis BullMQ (Dispatch Logic)\r\n // เปลี่ยนชื่อ Job เป็น 'dispatch-notification' ตาม Processor\r\n // ---------------------------------------------------------\r\n await this.notificationQueue.add(\r\n 'dispatch-notification',\r\n {\r\n ...data,\r\n notificationId: savedNotification.id, // ส่ง ID ไปด้วยเผื่อใช้ Tracking\r\n },\r\n {\r\n attempts: 3,\r\n backoff: {\r\n type: 'exponential',\r\n delay: 5000,\r\n },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n this.logger.debug(`Dispatched notification job for user ${data.userId}`);\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to process notification for user ${data.userId}`,\r\n (error as Error).stack\r\n );\r\n }\r\n }\r\n\r\n // ... (ส่วน findAll, markAsRead, cleanupOldNotifications เหมือนเดิม ไม่ต้องแก้) ...\r\n\r\n async findAll(userId: number, searchDto: SearchNotificationDto) {\r\n const { page = 1, limit = 20, isRead } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n const queryBuilder = this.notificationRepo\r\n .createQueryBuilder('notification')\r\n .where('notification.userId = :userId', { userId })\r\n .orderBy('notification.createdAt', 'DESC')\r\n .take(limit)\r\n .skip(skip);\r\n\r\n if (isRead !== undefined) {\r\n queryBuilder.andWhere('notification.isRead = :isRead', { isRead });\r\n }\r\n\r\n const [items, total] = await queryBuilder.getManyAndCount();\r\n const unreadCount = await this.notificationRepo.count({\r\n where: { userId, isRead: false },\r\n });\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n unreadCount,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * ดึงจำนวน Notification ที่ยังไม่ได้อ่าน\r\n */\r\n async getUnreadCount(userId: number): Promise {\r\n return this.notificationRepo.count({\r\n where: { userId, isRead: false },\r\n });\r\n }\r\n\r\n async markAsRead(id: number, userId: number): Promise {\r\n const notification = await this.notificationRepo.findOne({\r\n where: { id, userId },\r\n });\r\n\r\n if (!notification) {\r\n throw new NotFoundException(`Notification #${id} not found`);\r\n }\r\n\r\n if (!notification.isRead) {\r\n notification.isRead = true;\r\n await this.notificationRepo.save(notification);\r\n }\r\n }\r\n\r\n async markAsReadByUuid(uuid: string, userId: number): Promise {\r\n const notification = await this.notificationRepo.findOne({\r\n where: { publicId: uuid, userId },\r\n });\r\n\r\n if (!notification) {\r\n throw new NotFoundException(`Notification UUID ${uuid} not found`);\r\n }\r\n\r\n if (!notification.isRead) {\r\n notification.isRead = true;\r\n await this.notificationRepo.save(notification);\r\n }\r\n }\r\n\r\n async markAllAsRead(userId: number): Promise {\r\n await this.notificationRepo.update(\r\n { userId, isRead: false },\r\n { isRead: true }\r\n );\r\n }\r\n\r\n async cleanupOldNotifications(days: number = 90): Promise {\r\n const dateLimit = new Date();\r\n dateLimit.setDate(dateLimit.getDate() - days);\r\n\r\n const result = await this.notificationRepo\r\n .createQueryBuilder()\r\n .delete()\r\n .from(Notification)\r\n .where('createdAt < :dateLimit', { dateLimit })\r\n .execute();\r\n\r\n this.logger.log(`Cleaned up ${result.affected} old notifications`);\r\n return result.affected ?? 0;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352 new file mode 100644 index 0000000..922dd4f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352 @@ -0,0 +1,91 @@ +5ca2d04a14488641599da5575598d386 +"use strict"; +// File: src/modules/user/entities/user-assignment.entity.ts +// บันทึกการแก้ไข: Entity สำหรับการมอบหมาย Role ให้กับ User ตาม Scope (T1.3, RBAC 4-Level) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserAssignment = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("./user.entity"); +const role_entity_1 = require("./role.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +const project_entity_1 = require("../../project/entities/project.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +const contract_entity_1 = require("../../contract/entities/contract.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +let UserAssignment = class UserAssignment { +}; +exports.UserAssignment = UserAssignment; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], UserAssignment.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id' }), + __metadata("design:type", Number) +], UserAssignment.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id' }), + __metadata("design:type", Number) +], UserAssignment.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'assigned_by_user_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "assignedByUserId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'assigned_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], UserAssignment.prototype, "assignedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User, (user) => user.assignments, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], UserAssignment.prototype, "user", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => role_entity_1.Role, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_c = typeof role_entity_1.Role !== "undefined" && role_entity_1.Role) === "function" ? _c : Object) +], UserAssignment.prototype, "role", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_d = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _d : Object) +], UserAssignment.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_e = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _e : Object) +], UserAssignment.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_f = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _f : Object) +], UserAssignment.prototype, "contract", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User, { nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'assigned_by_user_id' }), + __metadata("design:type", typeof (_g = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _g : Object) +], UserAssignment.prototype, "assignedBy", void 0); +exports.UserAssignment = UserAssignment = __decorate([ + (0, typeorm_1.Entity)('user_assignments') +], UserAssignment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItYXNzaWdubWVudC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDREQUE0RDtBQUM1RCwwRkFBMEY7Ozs7Ozs7Ozs7Ozs7QUFFMUYscUNBT2lCO0FBQ2pCLCtDQUFxQztBQUNyQywrQ0FBcUM7QUFDckMseUZBQStFLENBQUMsb0NBQW9DO0FBQ3BILDBFQUFnRSxDQUFDLG9DQUFvQztBQUNyRyw2RUFBbUUsQ0FBQyxvQ0FBb0M7QUFHakcsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBYztDQW1EMUIsQ0FBQTtBQW5EWSx3Q0FBYztBQUV6QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7OzBDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzhDQUNaO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs4Q0FDWjtBQUloQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NEQUM1QjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDNUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0RBQzVCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0RBQzlCO0FBRzFCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBTWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDMUUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTs0Q0FBQztBQUlaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDOUMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTs0Q0FBQztBQUlaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtDQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN0RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7b0RBQUM7QUFJNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pFLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87K0NBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMEJBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xFLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7Z0RBQUM7QUFJcEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztrREFDL0Isa0JBQUksb0JBQUosa0JBQUk7a0RBQUM7eUJBbERQLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQW1EMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItYXNzaWdubWVudC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLWFzc2lnbm1lbnQuZW50aXR5LnRzXG4vLyDguJrguLHguJnguJfguLbguIHguIHguLLguKPguYHguIHguYnguYTguII6IEVudGl0eSDguKrguLPguKvguKPguLHguJrguIHguLLguKPguKHguK3guJrguKvguKHguLLguKIgUm9sZSDguYPguKvguYnguIHguLHguJogVXNlciDguJXguLLguKEgU2NvcGUgKFQxLjMsIFJCQUMgNC1MZXZlbClcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSAnLi9yb2xlLmVudGl0eSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5pbXBvcnQgeyBDb250cmFjdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0L2VudGl0aWVzL2NvbnRyYWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5cbkBFbnRpdHkoJ3VzZXJfYXNzaWdubWVudHMnKVxuZXhwb3J0IGNsYXNzIFVzZXJBc3NpZ25tZW50IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXG4gIHVzZXJJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JvbGVfaWQnIH0pXG4gIHJvbGVJZCE6IG51bWJlcjtcblxuICAvLyAtLS0gU2NvcGVzICjguYDguKXguLfguK3guIHguYTguJTguYnguYDguJ7guLXguKLguIcgMSDguKvguKPguLfguK3guYDguJvguYfguJkgTlVMTCDguJfguLHguYnguIfguKvguKHguJTguKrguLPguKvguKPguLHguJogR2xvYmFsKSAtLS1cbiAgQENvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBvcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBwcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb250cmFjdF9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNvbnRyYWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF9ieV91c2VyX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYXNzaWduZWRCeVVzZXJJZD86IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF9hdCcgfSlcbiAgYXNzaWduZWRBdCE6IERhdGU7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFVzZXIsICh1c2VyKSA9PiB1c2VyLmFzc2lnbm1lbnRzLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXNlcl9pZCcgfSlcbiAgdXNlciE6IFVzZXI7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBSb2xlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgcm9sZSE6IFJvbGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBPcmdhbml6YXRpb24sIHsgb25EZWxldGU6ICdDQVNDQURFJywgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX2lkJyB9KVxuICBvcmdhbml6YXRpb24/OiBPcmdhbml6YXRpb247XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0LCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3Q/OiBQcm9qZWN0O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29udHJhY3QsIHsgb25EZWxldGU6ICdDQVNDQURFJywgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY29udHJhY3RfaWQnIH0pXG4gIGNvbnRyYWN0PzogQ29udHJhY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyLCB7IG51bGxhYmxlOiB0cnVlIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2Fzc2lnbmVkX2J5X3VzZXJfaWQnIH0pXG4gIGFzc2lnbmVkQnk/OiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352.map new file mode 100644 index 0000000..3011c0f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/userassignmententity_6c08bec9f4284f2e501944a3c1043352.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-assignment.entity.ts","mappings":";AAAA,4DAA4D;AAC5D,0FAA0F;;;;;;;;;;;;;AAE1F,qCAOiB;AACjB,+CAAqC;AACrC,+CAAqC;AACrC,yFAA+E,CAAC,oCAAoC;AACpH,0EAAgE,CAAC,oCAAoC;AACrG,6EAAmE,CAAC,oCAAoC;AAGjG,IAAM,cAAc,GAApB,MAAM,cAAc;CAmD1B,CAAA;AAnDY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACZ;AAIhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC5B;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC5B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDAC9B;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAMlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC9C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;oDAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;+CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;gDAAC;AAIpB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC/B,kBAAI,oBAAJ,kBAAI;kDAAC;yBAlDP,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAmD1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-assignment.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user-assignment.entity.ts\n// บันทึกการแก้ไข: Entity สำหรับการมอบหมาย Role ให้กับ User ตาม Scope (T1.3, RBAC 4-Level)\n\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\nimport { Role } from './role.entity';\nimport { Organization } from '../../organization/entities/organization.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\nimport { Project } from '../../project/entities/project.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\nimport { Contract } from '../../contract/entities/contract.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\n\n@Entity('user_assignments')\nexport class UserAssignment {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'user_id' })\n userId!: number;\n\n @Column({ name: 'role_id' })\n roleId!: number;\n\n // --- Scopes (เลือกได้เพียง 1 หรือเป็น NULL ทั้งหมดสำหรับ Global) ---\n @Column({ name: 'organization_id', nullable: true })\n organizationId?: number;\n\n @Column({ name: 'project_id', nullable: true })\n projectId?: number;\n\n @Column({ name: 'contract_id', nullable: true })\n contractId?: number;\n\n @Column({ name: 'assigned_by_user_id', nullable: true })\n assignedByUserId?: number;\n\n @CreateDateColumn({ name: 'assigned_at' })\n assignedAt!: Date;\n\n // --- Relations ---\n\n @ManyToOne(() => User, (user) => user.assignments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user!: User;\n\n @ManyToOne(() => Role, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role!: Role;\n\n @ManyToOne(() => Organization, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'organization_id' })\n organization?: Organization;\n\n @ManyToOne(() => Project, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => Contract, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n\n @ManyToOne(() => User, { nullable: true })\n @JoinColumn({ name: 'assigned_by_user_id' })\n assignedBy?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02 new file mode 100644 index 0000000..b5ca26f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02 @@ -0,0 +1,918 @@ +bd22d2b9d1eee44ebf398938b2a71c4d +"use strict"; +// File: src/modules/correspondence/correspondence.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const tag_entity_1 = require("../master/entities/tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_revision_attachment_entity_1 = require("./entities/correspondence-revision-attachment.entity"); +// Services +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +let CorrespondenceService = CorrespondenceService_1 = class CorrespondenceService { + async hasSystemManageAllPermission(userId) { + const permissions = await this.userService.getUserPermissions(userId); + return permissions.includes('system.manage_all'); + } + /** + * Business Rule: Revision Label Strategy + * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...) + * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...) + */ + getInitialRevisionLabel(typeCode) { + const alphabetTypes = ['RFA', 'RFI']; + if (alphabetTypes.includes(typeCode.toUpperCase())) { + return 'A'; // Alphabet for RFA, RFI + } + return undefined; // Numeric (no label for revision 0) + } + constructor(correspondenceRepo, revisionRepo, typeRepo, statusRepo, referenceRepo, tagRepo, numberingService, jsonSchemaService, workflowEngine, userService, dataSource, searchService, fileStorageService, uuidResolver, notificationService, revAttachRepo) { + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.typeRepo = typeRepo; + this.statusRepo = statusRepo; + this.referenceRepo = referenceRepo; + this.tagRepo = tagRepo; + this.numberingService = numberingService; + this.jsonSchemaService = jsonSchemaService; + this.workflowEngine = workflowEngine; + this.userService = userService; + this.dataSource = dataSource; + this.searchService = searchService; + this.fileStorageService = fileStorageService; + this.uuidResolver = uuidResolver; + this.notificationService = notificationService; + this.revAttachRepo = revAttachRepo; + this.logger = new common_1.Logger(CorrespondenceService_1.name); + } + /** + * Business Rule Validation: EC-CORR-003 - Correspondence to Self + * Prevent external correspondence to same organization + */ + async validateCorrespondenceRecipients(createDto, user) { + // Get user's organization + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + if (!userOrgId) { + if (createDto.originatorId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (canManageAll) { + userOrgId = await this.uuidResolver.resolveOrganizationId(createDto.originatorId); + } + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + } + // For impersonation, use the specified originator + const originatorOrgId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : userOrgId; + // Check if it's internal communication + if (createDto.isInternal) { + // Internal communications should use Circulation instead + throw new common_1.BadRequestException('Internal communications should use Circulation Sheet instead of Correspondence'); + } + // Validate recipients + if (!createDto.recipients || createDto.recipients.length === 0) { + throw new common_1.BadRequestException('At least one recipient (TO or CC) is required'); + } + const toRecipients = createDto.recipients.filter((r) => r.type === 'TO'); + const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC'); + if (toRecipients.length === 0 && ccRecipients.length === 0) { + throw new common_1.BadRequestException('At least one TO or CC recipient is required'); + } + // Check for same organization correspondence + for (const recipient of createDto.recipients) { + const recipientOrgId = await this.uuidResolver.resolveOrganizationId(recipient.organizationId); + if (recipientOrgId === originatorOrgId) { + throw new common_1.BadRequestException('Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'); + } + } + } + async create(createDto, user) { + // Business Rule Validation: EC-CORR-003 - Correspondence to Self + await this.validateCorrespondenceRecipients(createDto, user); + // ADR-019: Resolve UUID references to internal INT IDs + const resolvedProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const resolvedOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const resolvedRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + const statusDraft = await this.statusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + if (!statusDraft) { + throw new common_1.InternalServerErrorException('Status DRAFT not found in Master Data'); + } + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + // Impersonation Logic + if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (!canManageAll) { + throw new common_1.ForbiddenException('You do not have permission to create documents on behalf of other organizations.'); + } + userOrgId = resolvedOriginatorId; + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + if (createDto.details) { + try { + await this.jsonSchemaService.validate(type.typeCode, createDto.details); + } + catch (error) { + this.logger.warn(`Schema validation warning for ${type.typeCode}: ${error.message}`); + } + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // [Fix #6] Fetch real ORG Code from Organization entity + const originatorOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: userOrgId }, + }); + const orgCode = originatorOrg?.organizationCode ?? 'UNK'; + // [v1.5.1] Extract recipient organization from recipients array (Primary TO) + const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + const docNumber = await this.numberingService.generateNextNumber({ + projectId: resolvedProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, // [v1.5.1] Pass recipient for document number format + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + const correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: docNumber.number, + correspondenceTypeId: createDto.typeId, + disciplineId: createDto.disciplineId, + projectId: resolvedProjectId, + originatorId: userOrgId, + isInternal: createDto.isInternal || false, + createdBy: user.user_id, + }); + const savedCorr = await queryRunner.manager.save(correspondence); + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: savedCorr.id, + revisionNumber: 0, + revisionLabel: this.getInitialRevisionLabel(type.typeCode), + isCurrent: true, + statusId: statusDraft.id, + subject: createDto.subject, + body: createDto.body, + remarks: createDto.remarks, + dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined, + documentDate: createDto.documentDate + ? new Date(createDto.documentDate) + : undefined, + issuedDate: createDto.issuedDate + ? new Date(createDto.issuedDate) + : undefined, + receivedDate: createDto.receivedDate + ? new Date(createDto.receivedDate) + : undefined, + description: createDto.description, + details: createDto.details, + createdBy: user.user_id, + schemaVersion: 1, + }); + await queryRunner.manager.save(revision); + // Save Recipients (using resolved INT IDs) + if (resolvedRecipients && resolvedRecipients.length > 0) { + const recipients = resolvedRecipients.map((r) => queryRunner.manager.create(correspondence_recipient_entity_1.CorrespondenceRecipient, { + correspondenceId: savedCorr.id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await queryRunner.manager.save(recipients); + } + // Commit attachments from Temp → Permanent (Two-Phase Storage) + if (createDto.attachmentTempIds?.length) { + const issueDate = createDto.issuedDate + ? new Date(createDto.issuedDate) + : createDto.documentDate + ? new Date(createDto.documentDate) + : undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(createDto.attachmentTempIds, { issueDate, documentType: 'Correspondence' }); + if (committed.length > 0) { + const links = committed.map((att, idx) => queryRunner.manager.create(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, { + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: idx === 0, // ไฟล์แรกเป็น main document + })); + await queryRunner.manager.save(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, links); + } + } + await queryRunner.commitTransaction(); + // Start Workflow Instance (non-blocking) + try { + const workflowCode = `CORRESPONDENCE_${type.typeCode}`; + await this.workflowEngine.createInstance(workflowCode, 'correspondence', savedCorr.id.toString(), { + projectId: resolvedProjectId, + originatorId: userOrgId, + disciplineId: createDto.disciplineId, + initiatorId: user.user_id, + }); + } + catch (error) { + this.logger.warn(`Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${error.message}`); + } + // Fire-and-forget search indexing (non-blocking, void intentional) + void this.searchService.indexDocument({ + id: savedCorr.id, + publicId: savedCorr.publicId, + type: 'correspondence', + docNumber: docNumber.number, + title: createDto.subject, + description: createDto.description, + status: 'DRAFT', + projectId: resolvedProjectId, + createdAt: new Date(), + }); + return { + ...savedCorr, + currentRevision: revision, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to create correspondence: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + async findAll(searchDto = {}) { + const { search, typeId, projectId, statusId, status, page = 1, limit = 10, } = searchDto; + const skip = (page - 1) * limit; + // Change: Query from Revision Repo + const query = this.revisionRepo + .createQueryBuilder('rev') + .leftJoinAndSelect('rev.correspondence', 'corr') + .leftJoinAndSelect('corr.type', 'type') + .leftJoinAndSelect('corr.project', 'project') + .leftJoinAndSelect('corr.originator', 'org') + .leftJoinAndSelect('rev.status', 'status'); + // Filter by Revision Status + const revStatus = searchDto.revisionStatus || 'CURRENT'; + if (revStatus === 'CURRENT') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: true }); + } + else if (revStatus === 'OLD') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: false }); + } + // If 'ALL', no filter needed on isCurrent + if (projectId) { + query.andWhere('corr.projectId = :projectId', { projectId }); + } + if (typeId) { + query.andWhere('corr.correspondenceTypeId = :typeId', { typeId }); + } + if (statusId) { + query.andWhere('rev.statusId = :statusId', { statusId }); + } + if (status) { + query.andWhere('status.statusCode = :status', { status }); + } + if (search) { + query.andWhere('(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)', { search: `%${search}%` }); + } + // Default Sort: Latest Created + query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit); + const [items, total] = await query.getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + relations: [ + 'revisions', + 'revisions.status', + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with ID ${id} not found`); + } + return correspondence; + } + async findOneByUuid(publicId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { publicId }, + relations: [ + 'revisions', + 'revisions.status', + 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction + 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with UUID ${publicId} not found`); + } + return correspondence; + } + async addReference(id, dto) { + const source = await this.correspondenceRepo.findOne({ where: { id } }); + // ADR-019: Resolve target publicId → internal INT id + const target = await this.correspondenceRepo.findOne({ + where: { publicId: dto.targetUuid }, + }); + if (!source || !target) { + throw new common_1.NotFoundException('Source or Target correspondence not found'); + } + if (source.id === target.id) { + throw new common_1.BadRequestException('Cannot reference self'); + } + const exists = await this.referenceRepo.findOne({ + where: { + sourceId: id, + targetId: target.id, + }, + }); + if (exists) { + return exists; + } + const ref = this.referenceRepo.create({ + sourceId: id, + targetId: target.id, + }); + return this.referenceRepo.save(ref); + } + async removeReference(id, targetId) { + const result = await this.referenceRepo.delete({ + sourceId: id, + targetId: targetId, + }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Reference not found'); + } + } + async getTags(id) { + const rows = await this.tagRepo.find({ + where: { correspondenceId: id }, + relations: ['tag'], + }); + return rows.map((r) => r.tag).filter(Boolean); + } + async addTag(id, tagId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence ${id} not found`); + } + const tag = await this.dataSource.manager.findOne(tag_entity_1.Tag, { + where: { id: tagId }, + }); + if (!tag) { + throw new common_1.NotFoundException(`Tag ${tagId} not found`); + } + const exists = await this.tagRepo.findOne({ + where: { correspondenceId: id, tagId }, + }); + if (exists) + return exists; + const row = this.tagRepo.create({ correspondenceId: id, tagId }); + return this.tagRepo.save(row); + } + async removeTag(id, tagId) { + const result = await this.tagRepo.delete({ correspondenceId: id, tagId }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Tag assignment not found'); + } + } + async getReferences(id) { + const outgoing = await this.referenceRepo.find({ + where: { sourceId: id }, + relations: ['target', 'target.type'], + }); + const incoming = await this.referenceRepo.find({ + where: { targetId: id }, + relations: ['source', 'source.type'], + }); + return { outgoing, incoming }; + } + async update(id, updateDto, user) { + // 1. Find Current Revision + const revision = await this.revisionRepo.findOne({ + where: { + correspondenceId: id, + isCurrent: true, + }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Current revision for correspondence ${id} not found`); + } + // 2. Check Permission + if (revision.statusId) { + const status = await this.statusRepo.findOne({ + where: { id: revision.statusId }, + }); + if (status && status.statusCode !== 'DRAFT') { + const permissions = await this.userService.getUserPermissions(user.user_id); + const canEditSubmittedOrLater = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canEditSubmittedOrLater) { + throw new common_1.ForbiddenException('Only Org Admin or Superadmin can edit non-draft correspondences'); + } + } + } + // ADR-019: Resolve UUID references in update DTO + const updResolvedProjectId = updateDto.projectId + ? await this.uuidResolver.resolveProjectId(updateDto.projectId) + : undefined; + const updResolvedOriginatorId = updateDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId) + : undefined; + const updResolvedRecipients = updateDto.recipients + ? await Promise.all(updateDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + // 3. Update Correspondence Entity if needed + const correspondenceUpdate = {}; + if (updateDto.disciplineId) + correspondenceUpdate.disciplineId = updateDto.disciplineId; + if (updResolvedProjectId) + correspondenceUpdate.projectId = updResolvedProjectId; + if (updResolvedOriginatorId) + correspondenceUpdate.originatorId = updResolvedOriginatorId; + if (Object.keys(correspondenceUpdate).length > 0) { + await this.correspondenceRepo.update(id, correspondenceUpdate); + } + // 4. Update Revision Entity + const revisionUpdate = {}; + if (updateDto.subject) + revisionUpdate.subject = updateDto.subject; + if (updateDto.body) + revisionUpdate.body = updateDto.body; + if (updateDto.remarks) + revisionUpdate.remarks = updateDto.remarks; + // Format Date correctly if string + if (updateDto.dueDate) + revisionUpdate.dueDate = new Date(updateDto.dueDate); + if (updateDto.documentDate) + revisionUpdate.documentDate = new Date(updateDto.documentDate); + if (updateDto.issuedDate) + revisionUpdate.issuedDate = new Date(updateDto.issuedDate); + if (updateDto.receivedDate) + revisionUpdate.receivedDate = new Date(updateDto.receivedDate); + if (updateDto.description) + revisionUpdate.description = updateDto.description; + if (updateDto.details) + revisionUpdate.details = updateDto.details; + if (Object.keys(revisionUpdate).length > 0) { + await this.revisionRepo.update(revision.id, revisionUpdate); + } + // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage) + if (updateDto.attachmentTempIds?.length) { + const issueDate = updateDto.issuedDate + ? new Date(updateDto.issuedDate) + : updateDto.documentDate + ? new Date(updateDto.documentDate) + : revision.issuedDate || revision.documentDate || undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(updateDto.attachmentTempIds, { + issueDate: issueDate ? new Date(issueDate) : undefined, + documentType: 'Correspondence', + }); + if (committed.length > 0) { + const links = committed.map((att) => this.revAttachRepo.create({ + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main + })); + await this.revAttachRepo.save(links); + } + } + // 5. Update Recipients if provided + if (updResolvedRecipients) { + const recipientRepo = this.dataSource.getRepository(correspondence_recipient_entity_1.CorrespondenceRecipient); + await recipientRepo.delete({ correspondenceId: id }); + const newRecipients = updResolvedRecipients.map((r) => recipientRepo.create({ + correspondenceId: id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await recipientRepo.save(newRecipients); + } + // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project) + // AND it is a DRAFT. + // Fetch fresh data for context and comparison + const currentCorr = await this.correspondenceRepo.findOne({ + where: { id }, + relations: ['type', 'recipients', 'recipients.recipientOrganization'], + }); + if (currentCorr) { + const currentToRecipient = currentCorr.recipients?.find((r) => r.recipientType === 'TO'); + const currentRecipientId = currentToRecipient?.recipientOrganizationId; + // Check for ACTUAL value changes + const isProjectChanged = updResolvedProjectId !== undefined && + updResolvedProjectId !== currentCorr.projectId; + const isOriginatorChanged = updResolvedOriginatorId !== undefined && + updResolvedOriginatorId !== currentCorr.originatorId; + const isDisciplineChanged = updateDto.disciplineId !== undefined && + updateDto.disciplineId !== currentCorr.disciplineId; + const isTypeChanged = updateDto.typeId !== undefined && + updateDto.typeId !== currentCorr.correspondenceTypeId; + let isRecipientChanged = false; + let newRecipientId; + if (updResolvedRecipients) { + const newToRecipient = updResolvedRecipients.find((r) => r.type === 'TO'); + newRecipientId = newToRecipient?.organizationId; + if (newRecipientId !== currentRecipientId) { + isRecipientChanged = true; + } + } + if (isProjectChanged || + isDisciplineChanged || + isTypeChanged || + isRecipientChanged || + isOriginatorChanged) { + const targetRecipientId = isRecipientChanged + ? newRecipientId + : currentRecipientId; + // Resolve Recipient Code for the NEW context + let recipientCode = ''; + if (targetRecipientId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: targetRecipientId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + // [Fix #6] Fetch real ORG Code from originator organization + const originatorOrgForUpdate = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { + id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + }, + }); + const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK'; + // Prepare Contexts + const oldCtx = { + projectId: currentCorr.projectId, + originatorOrganizationId: currentCorr.originatorId ?? 0, + typeId: currentCorr.correspondenceTypeId, + disciplineId: currentCorr.disciplineId, + recipientOrganizationId: currentRecipientId, + year: new Date().getFullYear(), + }; + const newCtx = { + projectId: updResolvedProjectId ?? currentCorr.projectId, + originatorOrganizationId: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId, + disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId, + recipientOrganizationId: targetRecipientId, + year: new Date().getFullYear(), + userId: user.user_id, // Pass User ID for Audit + customTokens: { + TYPE_CODE: currentCorr.type?.typeCode || '', + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }; + // If Type Changed, need NEW Type Code + if (isTypeChanged) { + const newType = await this.typeRepo.findOne({ + where: { id: newCtx.typeId }, + }); + if (newType) + newCtx.customTokens.TYPE_CODE = newType.typeCode; + } + const newDocNumber = await this.numberingService.updateNumberForDraft(currentCorr.correspondenceNumber, oldCtx, newCtx); + await this.correspondenceRepo.update(id, { + correspondenceNumber: newDocNumber, + }); + } + } + const updated = await this.findOne(id); + // Re-index updated document in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: updated.id, + publicId: updated.publicId, + type: 'correspondence', + docNumber: updated.correspondenceNumber, + title: updateDto.subject ?? updated.revisions?.[0]?.subject, + description: updateDto.description ?? updated.revisions?.[0]?.description, + status: 'DRAFT', + projectId: updated.projectId, + createdAt: updated.createdAt, + }); + return updated; + } + async previewDocumentNumber(createDto, user) { + // ADR-019: Resolve UUID references + const previewProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const previewOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const previewRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) + userOrgId = fullUser.primaryOrganizationId; + } + if (previewOriginatorId && previewOriginatorId !== userOrgId) { + // Allow impersonation for preview + userOrgId = previewOriginatorId; + } + // Extract recipient from recipients array + const toRecipient = previewRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + return this.numberingService.previewNumber({ + projectId: previewProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + } + /** + * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation + * Cancel correspondence and handle related circulations + */ + async cancel(publicId, reason, user) { + const correspondence = await this.findOneByUuid(publicId); + // Check if user has permission to cancel (Org Admin or Superadmin only) + const permissions = await this.userService.getUserPermissions(user.user_id); + const canCancel = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canCancel) { + throw new common_1.ForbiddenException('Only administrators can cancel correspondences'); + } + // Check if there are any active circulations + const circulationRepo = this.dataSource.getRepository('Circulation'); + const activeCirculations = await circulationRepo.find({ + where: { + correspondenceId: correspondence.id, + status: 'OPEN', + }, + }); + const warningMessage = activeCirculations.length > 0 + ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.` + : ''; + // Get the current revision to update status + const currentRevision = await this.revisionRepo.findOne({ + where: { + correspondenceId: correspondence.id, + isCurrent: true, + }, + }); + if (!currentRevision) { + throw new common_1.NotFoundException('Current revision not found'); + } + // Get cancelled status + const cancelledStatus = await this.statusRepo.findOne({ + where: { statusCode: 'CANCELLED' }, + }); + if (!cancelledStatus) { + throw new common_1.InternalServerErrorException('CANCELLED status not found'); + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // Update correspondence revision status to CANCELLED + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, currentRevision.id, { + statusId: cancelledStatus.id, + remarks: `Cancelled: ${reason}`, + }); + // Force close all active circulations + if (activeCirculations.length > 0) { + await queryRunner.manager.update('Circulation', { + correspondenceId: correspondence.id, + status: 'OPEN', + }, { + status: 'FORCE_CLOSED', + closedAt: new Date(), + closedBy: user.user_id, + closeReason: `Correspondence cancelled: ${reason}`, + }); + } + await queryRunner.commitTransaction(); + // Re-index cancelled status in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: correspondence.id, + publicId: correspondence.publicId, + type: 'correspondence', + docNumber: correspondence.correspondenceNumber, + title: currentRevision.subject, + status: 'CANCELLED', + projectId: correspondence.projectId, + createdAt: correspondence.createdAt, + }); + // Notify originator's doc-control user about cancellation (fire-and-forget) + if (correspondence.originatorId) { + void this.userService + .findDocControlIdByOrg(correspondence.originatorId) + .then((targetUserId) => { + if (targetUserId) { + void this.notificationService.send({ + userId: targetUserId, + title: 'Correspondence Cancelled', + message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: correspondence.id, + link: `/correspondences/${correspondence.publicId}`, + }); + } + }) + .catch((err) => this.logger.warn(`Cancel notification failed: ${err.message}`)); + } + return { + success: true, + message: warningMessage || 'Correspondence cancelled successfully', + activeCirculationsCount: activeCirculations.length, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to cancel correspondence: ${error.message}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async bulkCancel(publicIds, reason, user) { + const succeeded = []; + const failed = []; + for (const publicId of publicIds) { + try { + await this.cancel(publicId, reason, user); + succeeded.push(publicId); + } + catch { + failed.push(publicId); + } + } + return { succeeded, failed }; + } + async exportCsv(searchDto) { + const { data } = await this.findAll(searchDto); + const header = [ + 'Document No.', + 'Rev', + 'Subject', + 'Type', + 'Status', + 'Project', + 'From', + 'Due Date', + 'Created At', + ]; + const rows = data.map((rev) => { + const corr = rev.correspondence ?? rev; + return [ + this.escapeCsv(corr.correspondenceNumber ?? ''), + this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)), + this.escapeCsv(rev.subject ?? ''), + this.escapeCsv(corr.type?.typeCode ?? ''), + this.escapeCsv(rev.status?.statusCode ?? ''), + this.escapeCsv(corr.project?.projectCode ?? ''), + this.escapeCsv(corr.originator?.organizationCode ?? ''), + rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '', + new Date(rev.createdAt).toISOString().split('T')[0], + ].join(','); + }); + return [header.join(','), ...rows].join('\n'); + } + escapeCsv(value) { + if (value.includes(',') || value.includes('"') || value.includes('\n')) { + return `"${value.replace(/"/g, '""')}"`; + } + return value; + } +}; +exports.CorrespondenceService = CorrespondenceService; +exports.CorrespondenceService = CorrespondenceService = CorrespondenceService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_reference_entity_1.CorrespondenceReference)), + __param(5, (0, typeorm_1.InjectRepository)(correspondence_tag_entity_1.CorrespondenceTag)), + __param(15, (0, typeorm_1.InjectRepository)(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof document_numbering_service_1.DocumentNumberingService !== "undefined" && document_numbering_service_1.DocumentNumberingService) === "function" ? _g : Object, typeof (_h = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _h : Object, typeof (_j = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _j : Object, typeof (_k = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _l : Object, typeof (_m = typeof search_service_1.SearchService !== "undefined" && search_service_1.SearchService) === "function" ? _m : Object, typeof (_o = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _o : Object, typeof (_p = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _p : Object, typeof (_q = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _q : Object, typeof (_r = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _r : Object]) +], CorrespondenceService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDZEQUE2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0QsMkNBT3dCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFFakQsV0FBVztBQUNYLDRFQUFrRTtBQUNsRSw4RkFBbUY7QUFDbkYsc0ZBQTJFO0FBQzNFLDBGQUErRTtBQUMvRSxnR0FBcUY7QUFDckYsZ0dBQXFGO0FBQ3JGLG9GQUF5RTtBQUN6RSw4REFBb0Q7QUFFcEQsc0ZBQTRFO0FBQzVFLG9IQUF3RztBQVF4RyxXQUFXO0FBQ1gsMEdBQXFHO0FBQ3JHLDRFQUF1RTtBQUN2RSx3RkFBbUY7QUFDbkYsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCx5RkFBb0Y7QUFDcEYsdUZBQWtGO0FBQ2xGLCtFQUEyRTtBQVVwRSxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHeEIsS0FBSyxDQUFDLDRCQUE0QixDQUFDLE1BQWM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssdUJBQXVCLENBQUMsUUFBZ0I7UUFDOUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7UUFDdEMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDLENBQUMsb0NBQW9DO0lBQ3hELENBQUM7SUFFRCxZQUVFLGtCQUFzRCxFQUV0RCxZQUF3RCxF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cUJBQXFCLENBZ21DakMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvY29ycmVzcG9uZGVuY2Uuc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxyXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXHJcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbixcclxuICBGb3JiaWRkZW5FeGNlcHRpb24sXHJcbiAgTG9nZ2VyLFxyXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnksIERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbi8vIEVudGl0aWVzXHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVR5cGUgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VTdGF0dXMgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXN0YXR1cy5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVmZXJlbmNlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmVjaXBpZW50IH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZWNpcGllbnQuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUYWcgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXRhZy5lbnRpdHknO1xyXG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi9tYXN0ZXIvZW50aXRpZXMvdGFnLmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xyXG5cclxuLy8gRFRPc1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBBZGRSZWZlcmVuY2VEdG8gfSBmcm9tICcuL2R0by9hZGQtcmVmZXJlbmNlLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9kb2N1bWVudC1udW1iZXJpbmcvc2VydmljZXMvZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKc29uU2NoZW1hU2VydmljZSB9IGZyb20gJy4uL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENvcnJlc3BvbmRlbmNlU2VydmljZSAtIERvY3VtZW50IG1hbmFnZW1lbnQgKENSVUQpXHJcbiAqL1xyXG5pbnRlcmZhY2UgUmVzb2x2ZWRSZWNpcGllbnQge1xyXG4gIG9yZ2FuaXphdGlvbklkOiBudW1iZXI7XHJcbiAgdHlwZTogJ1RPJyB8ICdDQyc7XHJcbn1cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc1N5c3RlbU1hbmFnZUFsbFBlcm1pc3Npb24odXNlcklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnModXNlcklkKTtcclxuICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGU6IFJldmlzaW9uIExhYmVsIFN0cmF0ZWd5XHJcbiAgICogLSBSRkEsIFJGSTogVXNlIGFscGhhYmV0IHN0YXJ0aW5nIHdpdGggJ0EnIChBLCBCLCBDLi4uKVxyXG4gICAqIC0gT3RoZXIgdHlwZXMgKExFVFRFUiwgTUVNTywgZXRjLik6IFVzZSBudW1lcmljIChudWxsIGZvciBmaXJzdCwgdGhlbiAxLCAyLCAzLi4uKVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFJldmlzaW9uTGFiZWwodHlwZUNvZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBhbHBoYWJldFR5cGVzID0gWydSRkEnLCAnUkZJJ107XHJcbiAgICBpZiAoYWxwaGFiZXRUeXBlcy5pbmNsdWRlcyh0eXBlQ29kZS50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICByZXR1cm4gJ0EnOyAvLyBBbHBoYWJldCBmb3IgUkZBLCBSRklcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE51bWVyaWMgKG5vIGxhYmVsIGZvciByZXZpc2lvbiAwKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZSlcclxuICAgIHByaXZhdGUgY29ycmVzcG9uZGVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmV2aXNpb24pXHJcbiAgICBwcml2YXRlIHJldmlzaW9uUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVJldmlzaW9uPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgIHByaXZhdGUgdHlwZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgcHJpdmF0ZSBzdGF0dXNSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlKVxyXG4gICAgcHJpdmF0ZSByZWZlcmVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlVGFnKVxyXG4gICAgcHJpdmF0ZSB0YWdSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVGFnPixcclxuICAgIHByaXZhdGUgbnVtYmVyaW5nU2VydmljZTogRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBqc29uU2NoZW1hU2VydmljZTogSnNvblNjaGVtYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdvcmtmbG93RW5naW5lOiBXb3JrZmxvd0VuZ2luZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcclxuICAgIHByaXZhdGUgZmlsZVN0b3JhZ2VTZXJ2aWNlOiBGaWxlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHV1aWRSZXNvbHZlcjogVXVpZFJlc29sdmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50KVxyXG4gICAgcHJpdmF0ZSByZXZBdHRhY2hSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50PlxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzaW5lc3MgUnVsZSBWYWxpZGF0aW9uOiBFQy1DT1JSLTAwMyAtIENvcnJlc3BvbmRlbmNlIHRvIFNlbGZcclxuICAgKiBQcmV2ZW50IGV4dGVybmFsIGNvcnJlc3BvbmRlbmNlIHRvIHNhbWUgb3JnYW5pemF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNvcnJlc3BvbmRlbmNlUmVjaXBpZW50cyhcclxuICAgIGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8sXHJcbiAgICB1c2VyOiBVc2VyXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBHZXQgdXNlcidzIG9yZ2FuaXphdGlvblxyXG4gICAgbGV0IHVzZXJPcmdJZCA9IHVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgY29uc3QgZnVsbFVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRPbmUodXNlci51c2VyX2lkKTtcclxuICAgICAgaWYgKGZ1bGxVc2VyKSB7XHJcbiAgICAgICAgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgaWYgKGNyZWF0ZUR0by5vcmlnaW5hdG9ySWQpIHtcclxuICAgICAgICBjb25zdCBjYW5NYW5hZ2VBbGwgPSBhd2FpdCB0aGlzLmhhc1N5c3RlbU1hbmFnZUFsbFBlcm1pc3Npb24oXHJcbiAgICAgICAgICB1c2VyLnVzZXJfaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjYW5NYW5hZ2VBbGwpIHtcclxuICAgICAgICAgIHVzZXJPcmdJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChcclxuICAgICAgICAgICAgY3JlYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgICAnVXNlciBtdXN0IGJlbG9uZyB0byBhbiBvcmdhbml6YXRpb24gdG8gY3JlYXRlIGRvY3VtZW50cydcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIGltcGVyc29uYXRpb24sIHVzZSB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3JcclxuICAgIGNvbnN0IG9yaWdpbmF0b3JPcmdJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1c2VyT3JnSWQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBpbnRlcm5hbCBjb21tdW5pY2F0aW9uXHJcbiAgICBpZiAoY3JlYXRlRHRvLmlzSW50ZXJuYWwpIHtcclxuICAgICAgLy8gSW50ZXJuYWwgY29tbXVuaWNhdGlvbnMgc2hvdWxkIHVzZSBDaXJjdWxhdGlvbiBpbnN0ZWFkXHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICdJbnRlcm5hbCBjb21tdW5pY2F0aW9ucyBzaG91bGQgdXNlIENpcmN1bGF0aW9uIFNoZWV0IGluc3RlYWQgb2YgQ29ycmVzcG9uZGVuY2UnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgcmVjaXBpZW50c1xyXG4gICAgaWYgKCFjcmVhdGVEdG8ucmVjaXBpZW50cyB8fCBjcmVhdGVEdG8ucmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ0F0IGxlYXN0IG9uZSByZWNpcGllbnQgKFRPIG9yIENDKSBpcyByZXF1aXJlZCdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b1JlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50cy5maWx0ZXIoKHIpID0+IHIudHlwZSA9PT0gJ1RPJyk7XHJcbiAgICBjb25zdCBjY1JlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50cy5maWx0ZXIoKHIpID0+IHIudHlwZSA9PT0gJ0NDJyk7XHJcblxyXG4gICAgaWYgKHRvUmVjaXBpZW50cy5sZW5ndGggPT09IDAgJiYgY2NSZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAnQXQgbGVhc3Qgb25lIFRPIG9yIENDIHJlY2lwaWVudCBpcyByZXF1aXJlZCdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBmb3Igc2FtZSBvcmdhbml6YXRpb24gY29ycmVzcG9uZGVuY2VcclxuICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIGNyZWF0ZUR0by5yZWNpcGllbnRzKSB7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudE9yZ0lkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgIHJlY2lwaWVudC5vcmdhbml6YXRpb25JZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlY2lwaWVudE9yZ0lkID09PSBvcmlnaW5hdG9yT3JnSWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAgICdDYW5ub3Qgc2VuZCBjb3JyZXNwb25kZW5jZSB0byB5b3VyIG93biBvcmdhbml6YXRpb24uIFVzZSBDaXJjdWxhdGlvbiBTaGVldCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbi4nXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlKGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8sIHVzZXI6IFVzZXIpIHtcclxuICAgIC8vIEJ1c2luZXNzIFJ1bGUgVmFsaWRhdGlvbjogRUMtQ09SUi0wMDMgLSBDb3JyZXNwb25kZW5jZSB0byBTZWxmXHJcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ29ycmVzcG9uZGVuY2VSZWNpcGllbnRzKGNyZWF0ZUR0bywgdXNlcik7XHJcbiAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUQgcmVmZXJlbmNlcyB0byBpbnRlcm5hbCBJTlQgSURzXHJcbiAgICBjb25zdCByZXNvbHZlZFByb2plY3RJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQoXHJcbiAgICAgIGNyZWF0ZUR0by5wcm9qZWN0SWRcclxuICAgICk7XHJcbiAgICBjb25zdCByZXNvbHZlZE9yaWdpbmF0b3JJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCByZXNvbHZlZFJlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50c1xyXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgY3JlYXRlRHRvLnJlY2lwaWVudHMubWFwKFxyXG4gICAgICAgICAgICBhc3luYyAocik6IFByb21pc2U8UmVzb2x2ZWRSZWNpcGllbnQ+ID0+ICh7XHJcbiAgICAgICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChcclxuICAgICAgICAgICAgICAgIHIub3JnYW5pemF0aW9uSWRcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHR5cGU6IHIudHlwZSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkOiBjcmVhdGVEdG8udHlwZUlkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdEb2N1bWVudCBUeXBlIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0RyYWZ0ID0gYXdhaXQgdGhpcy5zdGF0dXNSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghc3RhdHVzRHJhZnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXHJcbiAgICAgICAgJ1N0YXR1cyBEUkFGVCBub3QgZm91bmQgaW4gTWFzdGVyIERhdGEnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVzZXJPcmdJZCA9IHVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikge1xyXG4gICAgICAgIHVzZXJPcmdJZCA9IGZ1bGxVc2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEltcGVyc29uYXRpb24gTG9naWNcclxuICAgIGlmIChyZXNvbHZlZE9yaWdpbmF0b3JJZCAmJiByZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGNhbk1hbmFnZUFsbCA9IGF3YWl0IHRoaXMuaGFzU3lzdGVtTWFuYWdlQWxsUGVybWlzc2lvbihcclxuICAgICAgICB1c2VyLnVzZXJfaWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFjYW5NYW5hZ2VBbGwpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKFxyXG4gICAgICAgICAgJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBkb2N1bWVudHMgb24gYmVoYWxmIG9mIG90aGVyIG9yZ2FuaXphdGlvbnMuJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdXNlck9yZ0lkID0gcmVzb2x2ZWRPcmlnaW5hdG9ySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ1VzZXIgbXVzdCBiZWxvbmcgdG8gYW4gb3JnYW5pemF0aW9uIHRvIGNyZWF0ZSBkb2N1bWVudHMnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNyZWF0ZUR0by5kZXRhaWxzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5qc29uU2NoZW1hU2VydmljZS52YWxpZGF0ZSh0eXBlLnR5cGVDb2RlLCBjcmVhdGVEdG8uZGV0YWlscyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgICAgIGBTY2hlbWEgdmFsaWRhdGlvbiB3YXJuaW5nIGZvciAke3R5cGUudHlwZUNvZGV9OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gW0ZpeCAjNl0gRmV0Y2ggcmVhbCBPUkcgQ29kZSBmcm9tIE9yZ2FuaXphdGlvbiBlbnRpdHlcclxuICAgICAgY29uc3Qgb3JpZ2luYXRvck9yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoXHJcbiAgICAgICAgT3JnYW5pemF0aW9uLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGlkOiB1c2VyT3JnSWQgfSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG9yZ0NvZGUgPSBvcmlnaW5hdG9yT3JnPy5vcmdhbml6YXRpb25Db2RlID8/ICdVTksnO1xyXG5cclxuICAgICAgLy8gW3YxLjUuMV0gRXh0cmFjdCByZWNpcGllbnQgb3JnYW5pemF0aW9uIGZyb20gcmVjaXBpZW50cyBhcnJheSAoUHJpbWFyeSBUTylcclxuICAgICAgY29uc3QgdG9SZWNpcGllbnQgPSByZXNvbHZlZFJlY2lwaWVudHM/LmZpbmQoKHIpID0+IHIudHlwZSA9PT0gJ1RPJyk7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudE9yZ2FuaXphdGlvbklkID0gdG9SZWNpcGllbnQ/Lm9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgICAgaWYgKHJlY2lwaWVudE9yZ2FuaXphdGlvbklkKSB7XHJcbiAgICAgICAgY29uc3QgcmVjT3JnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShPcmdhbml6YXRpb24sIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGlkOiByZWNpcGllbnRPcmdhbml6YXRpb25JZCB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyZWNPcmcpIHJlY2lwaWVudENvZGUgPSByZWNPcmcub3JnYW5pemF0aW9uQ29kZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZG9jTnVtYmVyID0gYXdhaXQgdGhpcy5udW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcih7XHJcbiAgICAgICAgcHJvamVjdElkOiByZXNvbHZlZFByb2plY3RJZCxcclxuICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IHVzZXJPcmdJZCxcclxuICAgICAgICB0eXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiBjcmVhdGVEdG8uZGlzY2lwbGluZUlkLFxyXG4gICAgICAgIHN1YlR5cGVJZDogY3JlYXRlRHRvLnN1YlR5cGVJZCxcclxuICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZCwgLy8gW3YxLjUuMV0gUGFzcyByZWNpcGllbnQgZm9yIGRvY3VtZW50IG51bWJlciBmb3JtYXRcclxuICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgY3VzdG9tVG9rZW5zOiB7XHJcbiAgICAgICAgICBUWVBFX0NPREU6IHR5cGUudHlwZUNvZGUsXHJcbiAgICAgICAgICBPUkdfQ09ERTogb3JnQ29kZSxcclxuICAgICAgICAgIFJFQ0lQSUVOVF9DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgUkVDX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IGRvY051bWJlci5udW1iZXIsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiBjcmVhdGVEdG8uZGlzY2lwbGluZUlkLFxyXG4gICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiB1c2VyT3JnSWQsXHJcbiAgICAgICAgaXNJbnRlcm5hbDogY3JlYXRlRHRvLmlzSW50ZXJuYWwgfHwgZmFsc2UsXHJcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBzYXZlZENvcnIgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoY29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgY29uc3QgcmV2aXNpb24gPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogc2F2ZWRDb3JyLmlkLFxyXG4gICAgICAgIHJldmlzaW9uTnVtYmVyOiAwLFxyXG4gICAgICAgIHJldmlzaW9uTGFiZWw6IHRoaXMuZ2V0SW5pdGlhbFJldmlzaW9uTGFiZWwodHlwZS50eXBlQ29kZSksXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiBzdGF0dXNEcmFmdC5pZCxcclxuICAgICAgICBzdWJqZWN0OiBjcmVhdGVEdG8uc3ViamVjdCxcclxuICAgICAgICBib2R5OiBjcmVhdGVEdG8uYm9keSxcclxuICAgICAgICByZW1hcmtzOiBjcmVhdGVEdG8ucmVtYXJrcyxcclxuICAgICAgICBkdWVEYXRlOiBjcmVhdGVEdG8uZHVlRGF0ZSA/IG5ldyBEYXRlKGNyZWF0ZUR0by5kdWVEYXRlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBkb2N1bWVudERhdGU6IGNyZWF0ZUR0by5kb2N1bWVudERhdGVcclxuICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzc3VlZERhdGU6IGNyZWF0ZUR0by5pc3N1ZWREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgcmVjZWl2ZWREYXRlOiBjcmVhdGVEdG8ucmVjZWl2ZWREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5yZWNlaXZlZERhdGUpXHJcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogY3JlYXRlRHRvLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIGRldGFpbHM6IGNyZWF0ZUR0by5kZXRhaWxzLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlci51c2VyX2lkLFxyXG4gICAgICAgIHNjaGVtYVZlcnNpb246IDEsXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUocmV2aXNpb24pO1xyXG5cclxuICAgICAgLy8gU2F2ZSBSZWNpcGllbnRzICh1c2luZyByZXNvbHZlZCBJTlQgSURzKVxyXG4gICAgICBpZiAocmVzb2x2ZWRSZWNpcGllbnRzICYmIHJlc29sdmVkUmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHJlc29sdmVkUmVjaXBpZW50cy5tYXAoKHIpID0+XHJcbiAgICAgICAgICBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJlY2lwaWVudCwge1xyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBzYXZlZENvcnIuaWQsXHJcbiAgICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiByLm9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgICByZWNpcGllbnRUeXBlOiByLnR5cGUsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKHJlY2lwaWVudHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDb21taXQgYXR0YWNobWVudHMgZnJvbSBUZW1wIOKGkiBQZXJtYW5lbnQgKFR3by1QaGFzZSBTdG9yYWdlKVxyXG4gICAgICBpZiAoY3JlYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBpc3N1ZURhdGUgPSBjcmVhdGVEdG8uaXNzdWVkRGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8uaXNzdWVkRGF0ZSlcclxuICAgICAgICAgIDogY3JlYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5kb2N1bWVudERhdGUpXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyBbRklYIHYxLjguMV0gY29tbWl0IOC5hOC4lOC5iSBBdHRhY2htZW50IHJlY29yZHMg4LiB4Lil4Lix4Lia4Lih4LiyIOKGkiDguJrguLHguJnguJfguLbguIEganVuY3Rpb25cclxuICAgICAgICBjb25zdCBjb21taXR0ZWQgPSBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5jb21taXQoXHJcbiAgICAgICAgICBjcmVhdGVEdG8uYXR0YWNobWVudFRlbXBJZHMsXHJcbiAgICAgICAgICB7IGlzc3VlRGF0ZSwgZG9jdW1lbnRUeXBlOiAnQ29ycmVzcG9uZGVuY2UnIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoY29tbWl0dGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGxpbmtzID0gY29tbWl0dGVkLm1hcCgoYXR0LCBpZHgpID0+XHJcbiAgICAgICAgICAgIHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50LCB7XHJcbiAgICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkOiByZXZpc2lvbi5pZCxcclxuICAgICAgICAgICAgICBhdHRhY2htZW50SWQ6IGF0dC5pZCxcclxuICAgICAgICAgICAgICBpc01haW5Eb2N1bWVudDogaWR4ID09PSAwLCAvLyDguYTguJ/guKXguYzguYHguKPguIHguYDguJvguYfguJkgbWFpbiBkb2N1bWVudFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShcclxuICAgICAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgIGxpbmtzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIFN0YXJ0IFdvcmtmbG93IEluc3RhbmNlIChub24tYmxvY2tpbmcpXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dDb2RlID0gYENPUlJFU1BPTkRFTkNFXyR7dHlwZS50eXBlQ29kZX1gO1xyXG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dFbmdpbmUuY3JlYXRlSW5zdGFuY2UoXHJcbiAgICAgICAgICB3b3JrZmxvd0NvZGUsXHJcbiAgICAgICAgICAnY29ycmVzcG9uZGVuY2UnLFxyXG4gICAgICAgICAgc2F2ZWRDb3JyLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogdXNlck9yZ0lkLFxyXG4gICAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGNyZWF0ZUR0by5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgICAgIGluaXRpYXRvcklkOiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYFdvcmtmbG93IG5vdCBzdGFydGVkIGZvciAke2RvY051bWJlci5udW1iZXJ9IChDb2RlOiBDT1JSRVNQT05ERU5DRV8ke3R5cGUudHlwZUNvZGV9KTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpcmUtYW5kLWZvcmdldCBzZWFyY2ggaW5kZXhpbmcgKG5vbi1ibG9ja2luZywgdm9pZCBpbnRlbnRpb25hbClcclxuICAgICAgdm9pZCB0aGlzLnNlYXJjaFNlcnZpY2UuaW5kZXhEb2N1bWVudCh7XHJcbiAgICAgICAgaWQ6IHNhdmVkQ29yci5pZCxcclxuICAgICAgICBwdWJsaWNJZDogc2F2ZWRDb3JyLnB1YmxpY0lkLFxyXG4gICAgICAgIHR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgZG9jTnVtYmVyOiBkb2NOdW1iZXIubnVtYmVyLFxyXG4gICAgICAgIHRpdGxlOiBjcmVhdGVEdG8uc3ViamVjdCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogY3JlYXRlRHRvLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHN0YXR1czogJ0RSQUZUJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IHJlc29sdmVkUHJvamVjdElkLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNhdmVkQ29ycixcclxuICAgICAgICBjdXJyZW50UmV2aXNpb246IHJldmlzaW9uLFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgY29ycmVzcG9uZGVuY2U6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmRBbGwoc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byA9IHt9KSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHNlYXJjaCxcclxuICAgICAgdHlwZUlkLFxyXG4gICAgICBwcm9qZWN0SWQsXHJcbiAgICAgIHN0YXR1c0lkLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHBhZ2UgPSAxLFxyXG4gICAgICBsaW1pdCA9IDEwLFxyXG4gICAgfSA9IHNlYXJjaER0bztcclxuICAgIGNvbnN0IHNraXAgPSAocGFnZSAtIDEpICogbGltaXQ7XHJcblxyXG4gICAgLy8gQ2hhbmdlOiBRdWVyeSBmcm9tIFJldmlzaW9uIFJlcG9cclxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5yZXZpc2lvblJlcG9cclxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncmV2JylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdyZXYuY29ycmVzcG9uZGVuY2UnLCAnY29ycicpXHJcbiAgICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdCgnY29yci50eXBlJywgJ3R5cGUnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ2NvcnIucHJvamVjdCcsICdwcm9qZWN0JylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdjb3JyLm9yaWdpbmF0b3InLCAnb3JnJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdyZXYuc3RhdHVzJywgJ3N0YXR1cycpO1xyXG5cclxuICAgIC8vIEZpbHRlciBieSBSZXZpc2lvbiBTdGF0dXNcclxuICAgIGNvbnN0IHJldlN0YXR1cyA9IHNlYXJjaER0by5yZXZpc2lvblN0YXR1cyB8fCAnQ1VSUkVOVCc7XHJcblxyXG4gICAgaWYgKHJldlN0YXR1cyA9PT0gJ0NVUlJFTlQnKSB7XHJcbiAgICAgIHF1ZXJ5LndoZXJlKCdyZXYuaXNDdXJyZW50ID0gOmlzQ3VycmVudCcsIHsgaXNDdXJyZW50OiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIGlmIChyZXZTdGF0dXMgPT09ICdPTEQnKSB7XHJcbiAgICAgIHF1ZXJ5LndoZXJlKCdyZXYuaXNDdXJyZW50ID0gOmlzQ3VycmVudCcsIHsgaXNDdXJyZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICAgIC8vIElmICdBTEwnLCBubyBmaWx0ZXIgbmVlZGVkIG9uIGlzQ3VycmVudFxyXG5cclxuICAgIGlmIChwcm9qZWN0SWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ2NvcnIucHJvamVjdElkID0gOnByb2plY3RJZCcsIHsgcHJvamVjdElkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ2NvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQgPSA6dHlwZUlkJywgeyB0eXBlSWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXR1c0lkKSB7XHJcbiAgICAgIHF1ZXJ5LmFuZFdoZXJlKCdyZXYuc3RhdHVzSWQgPSA6c3RhdHVzSWQnLCB7IHN0YXR1c0lkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3N0YXR1cy5zdGF0dXNDb2RlID0gOnN0YXR1cycsIHsgc3RhdHVzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoXHJcbiAgICAgICAgJyhjb3JyLmNvcnJlc3BvbmRlbmNlTnVtYmVyIExJS0UgOnNlYXJjaCBPUiByZXYuc3ViamVjdCBMSUtFIDpzZWFyY2gpJyxcclxuICAgICAgICB7IHNlYXJjaDogYCUke3NlYXJjaH0lYCB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmYXVsdCBTb3J0OiBMYXRlc3QgQ3JlYXRlZFxyXG4gICAgcXVlcnkub3JkZXJCeSgncmV2LmNyZWF0ZWRBdCcsICdERVNDJykuc2tpcChza2lwKS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5LmdldE1hbnlBbmRDb3VudCgpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGE6IGl0ZW1zLFxyXG4gICAgICBtZXRhOiB7XHJcbiAgICAgICAgdG90YWwsXHJcbiAgICAgICAgcGFnZSxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZShpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFtcclxuICAgICAgICAncmV2aXNpb25zJyxcclxuICAgICAgICAncmV2aXNpb25zLnN0YXR1cycsXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdwcm9qZWN0JyxcclxuICAgICAgICAnb3JpZ2luYXRvcicsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMnLFxyXG4gICAgICAgICdyZWNpcGllbnRzLnJlY2lwaWVudE9yZ2FuaXphdGlvbicsIC8vIFt2MS41LjFdIEZpeGVkIHJlbGF0aW9uIG5hbWVcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBDb3JyZXNwb25kZW5jZSB3aXRoIElEICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXVpZChwdWJsaWNJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFtcclxuICAgICAgICAncmV2aXNpb25zJyxcclxuICAgICAgICAncmV2aXNpb25zLnN0YXR1cycsXHJcbiAgICAgICAgJ3JldmlzaW9ucy5hdHRhY2htZW50TGlua3MnLCAvLyBbRklYIHYxLjguMV0g4LmC4Lir4Lil4LiUIGp1bmN0aW9uXHJcbiAgICAgICAgJ3JldmlzaW9ucy5hdHRhY2htZW50TGlua3MuYXR0YWNobWVudCcsIC8vIFtGSVggdjEuOC4xXSDguYLguKvguKXguJQgYXR0YWNobWVudCDguIjguKPguLTguIdcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJyxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDb3JyZXNwb25kZW5jZSB3aXRoIFVVSUQgJHtwdWJsaWNJZH0gbm90IGZvdW5kYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKGlkOiBudW1iZXIsIGR0bzogQWRkUmVmZXJlbmNlRHRvKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgdGFyZ2V0IHB1YmxpY0lkIOKGkiBpbnRlcm5hbCBJTlQgaWRcclxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogZHRvLnRhcmdldFV1aWQgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdTb3VyY2Ugb3IgVGFyZ2V0IGNvcnJlc3BvbmRlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzb3VyY2UuaWQgPT09IHRhcmdldC5pZCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQ2Fubm90IHJlZmVyZW5jZSBzZWxmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHNvdXJjZUlkOiBpZCxcclxuICAgICAgICB0YXJnZXRJZDogdGFyZ2V0LmlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICByZXR1cm4gZXhpc3RzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZiA9IHRoaXMucmVmZXJlbmNlUmVwby5jcmVhdGUoe1xyXG4gICAgICBzb3VyY2VJZDogaWQsXHJcbiAgICAgIHRhcmdldElkOiB0YXJnZXQuaWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VSZXBvLnNhdmUocmVmKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShpZDogbnVtYmVyLCB0YXJnZXRJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZGVsZXRlKHtcclxuICAgICAgc291cmNlSWQ6IGlkLFxyXG4gICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignUmVmZXJlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGFncyhpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy50YWdSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBjb3JyZXNwb25kZW5jZUlkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsndGFnJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci50YWcpLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFRhZyhpZDogbnVtYmVyLCB0YWdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWNvcnJlc3BvbmRlbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQ29ycmVzcG9uZGVuY2UgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShUYWcsIHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdGFnKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVGFnICR7dGFnSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMudGFnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgY29ycmVzcG9uZGVuY2VJZDogaWQsIHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChleGlzdHMpIHJldHVybiBleGlzdHM7XHJcblxyXG4gICAgY29uc3Qgcm93ID0gdGhpcy50YWdSZXBvLmNyZWF0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkLCB0YWdJZCB9KTtcclxuICAgIHJldHVybiB0aGlzLnRhZ1JlcG8uc2F2ZShyb3cpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlVGFnKGlkOiBudW1iZXIsIHRhZ0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFnUmVwby5kZWxldGUoeyBjb3JyZXNwb25kZW5jZUlkOiBpZCwgdGFnSWQgfSk7XHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignVGFnIGFzc2lnbm1lbnQgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSZWZlcmVuY2VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG91dGdvaW5nID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBzb3VyY2VJZDogaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3RhcmdldCcsICd0YXJnZXQudHlwZSddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5jb21pbmcgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7IHRhcmdldElkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnc291cmNlJywgJ3NvdXJjZS50eXBlJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBvdXRnb2luZywgaW5jb21pbmcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZShpZDogbnVtYmVyLCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyAxLiBGaW5kIEN1cnJlbnQgUmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uID0gYXdhaXQgdGhpcy5yZXZpc2lvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDdXJyZW50IHJldmlzaW9uIGZvciBjb3JyZXNwb25kZW5jZSAke2lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQ2hlY2sgUGVybWlzc2lvblxyXG4gICAgaWYgKHJldmlzaW9uLnN0YXR1c0lkKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgICB3aGVyZTogeyBpZDogcmV2aXNpb24uc3RhdHVzSWQgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5zdGF0dXNDb2RlICE9PSAnRFJBRlQnKSB7XHJcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyhcclxuICAgICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2FuRWRpdFN1Ym1pdHRlZE9yTGF0ZXIgPVxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpIHx8XHJcbiAgICAgICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5FZGl0U3VibWl0dGVkT3JMYXRlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgJ09ubHkgT3JnIEFkbWluIG9yIFN1cGVyYWRtaW4gY2FuIGVkaXQgbm9uLWRyYWZ0IGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXMgaW4gdXBkYXRlIERUT1xyXG4gICAgY29uc3QgdXBkUmVzb2x2ZWRQcm9qZWN0SWQgPSB1cGRhdGVEdG8ucHJvamVjdElkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCh1cGRhdGVEdG8ucHJvamVjdElkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID0gdXBkYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCh1cGRhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkUmVjaXBpZW50cyA9IHVwZGF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICB1cGRhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gMy4gVXBkYXRlIENvcnJlc3BvbmRlbmNlIEVudGl0eSBpZiBuZWVkZWRcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlVXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLmRpc2NpcGxpbmVJZCA9IHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQ7XHJcbiAgICBpZiAodXBkUmVzb2x2ZWRQcm9qZWN0SWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLnByb2plY3RJZCA9IHVwZFJlc29sdmVkUHJvamVjdElkO1xyXG4gICAgaWYgKHVwZFJlc29sdmVkT3JpZ2luYXRvcklkKVxyXG4gICAgICBjb3JyZXNwb25kZW5jZVVwZGF0ZS5vcmlnaW5hdG9ySWQgPSB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29ycmVzcG9uZGVuY2VVcGRhdGUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8udXBkYXRlKGlkLCBjb3JyZXNwb25kZW5jZVVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gVXBkYXRlIFJldmlzaW9uIEVudGl0eVxyXG4gICAgY29uc3QgcmV2aXNpb25VcGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBpZiAodXBkYXRlRHRvLnN1YmplY3QpIHJldmlzaW9uVXBkYXRlLnN1YmplY3QgPSB1cGRhdGVEdG8uc3ViamVjdDtcclxuICAgIGlmICh1cGRhdGVEdG8uYm9keSkgcmV2aXNpb25VcGRhdGUuYm9keSA9IHVwZGF0ZUR0by5ib2R5O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5yZW1hcmtzKSByZXZpc2lvblVwZGF0ZS5yZW1hcmtzID0gdXBkYXRlRHRvLnJlbWFya3M7XHJcbiAgICAvLyBGb3JtYXQgRGF0ZSBjb3JyZWN0bHkgaWYgc3RyaW5nXHJcbiAgICBpZiAodXBkYXRlRHRvLmR1ZURhdGUpIHJldmlzaW9uVXBkYXRlLmR1ZURhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uZHVlRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUuZG9jdW1lbnREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgIHJldmlzaW9uVXBkYXRlLmlzc3VlZERhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uaXNzdWVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUucmVjZWl2ZWREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRlc2NyaXB0aW9uKVxyXG4gICAgICByZXZpc2lvblVwZGF0ZS5kZXNjcmlwdGlvbiA9IHVwZGF0ZUR0by5kZXNjcmlwdGlvbjtcclxuICAgIGlmICh1cGRhdGVEdG8uZGV0YWlscykgcmV2aXNpb25VcGRhdGUuZGV0YWlscyA9IHVwZGF0ZUR0by5kZXRhaWxzO1xyXG5cclxuICAgIGlmIChPYmplY3Qua2V5cyhyZXZpc2lvblVwZGF0ZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby51cGRhdGUocmV2aXNpb24uaWQsIHJldmlzaW9uVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LjUgQ29tbWl0IG5ldyBhdHRhY2htZW50cyBmcm9tIFRlbXAg4oaSIFBlcm1hbmVudCAoVHdvLVBoYXNlIFN0b3JhZ2UpXHJcbiAgICBpZiAodXBkYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgaXNzdWVEYXRlID0gdXBkYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKHVwZGF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgIDogdXBkYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZSh1cGRhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgOiByZXZpc2lvbi5pc3N1ZWREYXRlIHx8IHJldmlzaW9uLmRvY3VtZW50RGF0ZSB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAvLyBbRklYIHYxLjguMV0gY29tbWl0IOC5hOC4lOC5iSBBdHRhY2htZW50IHJlY29yZHMg4LiB4Lil4Lix4Lia4Lih4LiyIOKGkiDguJrguLHguJnguJfguLbguIEganVuY3Rpb25cclxuICAgICAgY29uc3QgY29tbWl0dGVkID0gYXdhaXQgdGhpcy5maWxlU3RvcmFnZVNlcnZpY2UuY29tbWl0KFxyXG4gICAgICAgIHVwZGF0ZUR0by5hdHRhY2htZW50VGVtcElkcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpc3N1ZURhdGU6IGlzc3VlRGF0ZSA/IG5ldyBEYXRlKGlzc3VlRGF0ZSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBkb2N1bWVudFR5cGU6ICdDb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGNvbW1pdHRlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBjb21taXR0ZWQubWFwKChhdHQpID0+XHJcbiAgICAgICAgICB0aGlzLnJldkF0dGFjaFJlcG8uY3JlYXRlKHtcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkOiByZXZpc2lvbi5pZCxcclxuICAgICAgICAgICAgYXR0YWNobWVudElkOiBhdHQuaWQsXHJcbiAgICAgICAgICAgIGlzTWFpbkRvY3VtZW50OiBmYWxzZSwgLy8g4LmE4Lif4Lil4LmM4LiX4Li14LmIIHVwbG9hZCDguYDguJ7guLTguYjguKHguYDguJXguLTguKHguYTguKHguYjguYPguIrguYggbWFpblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmV2QXR0YWNoUmVwby5zYXZlKGxpbmtzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIFVwZGF0ZSBSZWNpcGllbnRzIGlmIHByb3ZpZGVkXHJcbiAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudFJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJlY2lwaWVudFxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLmRlbGV0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3UmVjaXBpZW50cyA9IHVwZFJlc29sdmVkUmVjaXBpZW50cy5tYXAoKHIpID0+XHJcbiAgICAgICAgcmVjaXBpZW50UmVwby5jcmVhdGUoe1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogci5vcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgIHJlY2lwaWVudFR5cGU6IHIudHlwZSxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLnNhdmUobmV3UmVjaXBpZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNi4gUmVnZW5lcmF0ZSBEb2N1bWVudCBOdW1iZXIgaWYgc3RydWN0dXJhbCBmaWVsZHMgY2hhbmdlZCAoUmVjaXBpZW50LCBEaXNjaXBsaW5lLCBUeXBlLCBQcm9qZWN0KVxyXG4gICAgLy8gQU5EIGl0IGlzIGEgRFJBRlQuXHJcblxyXG4gICAgLy8gRmV0Y2ggZnJlc2ggZGF0YSBmb3IgY29udGV4dCBhbmQgY29tcGFyaXNvblxyXG4gICAgY29uc3QgY3VycmVudENvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3R5cGUnLCAncmVjaXBpZW50cycsICdyZWNpcGllbnRzLnJlY2lwaWVudE9yZ2FuaXphdGlvbiddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRDb3JyKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUb1JlY2lwaWVudCA9IGN1cnJlbnRDb3JyLnJlY2lwaWVudHM/LmZpbmQoXHJcbiAgICAgICAgKHIpID0+IHIucmVjaXBpZW50VHlwZSA9PT0gJ1RPJ1xyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjdXJyZW50UmVjaXBpZW50SWQgPSBjdXJyZW50VG9SZWNpcGllbnQ/LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgZm9yIEFDVFVBTCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgIGNvbnN0IGlzUHJvamVjdENoYW5nZWQgPVxyXG4gICAgICAgIHVwZFJlc29sdmVkUHJvamVjdElkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRSZXNvbHZlZFByb2plY3RJZCAhPT0gY3VycmVudENvcnIucHJvamVjdElkO1xyXG4gICAgICBjb25zdCBpc09yaWdpbmF0b3JDaGFuZ2VkID1cclxuICAgICAgICB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgIT09IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZDtcclxuICAgICAgY29uc3QgaXNEaXNjaXBsaW5lQ2hhbmdlZCA9XHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gY3VycmVudENvcnIuZGlzY2lwbGluZUlkO1xyXG4gICAgICBjb25zdCBpc1R5cGVDaGFuZ2VkID1cclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZVR5cGVJZDtcclxuXHJcbiAgICAgIGxldCBpc1JlY2lwaWVudENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgbGV0IG5ld1JlY2lwaWVudElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VG9SZWNpcGllbnQgPSB1cGRSZXNvbHZlZFJlY2lwaWVudHMuZmluZChcclxuICAgICAgICAgIChyKSA9PiByLnR5cGUgPT09ICdUTydcclxuICAgICAgICApO1xyXG4gICAgICAgIG5ld1JlY2lwaWVudElkID0gbmV3VG9SZWNpcGllbnQ/Lm9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgICBpZiAobmV3UmVjaXBpZW50SWQgIT09IGN1cnJlbnRSZWNpcGllbnRJZCkge1xyXG4gICAgICAgICAgaXNSZWNpcGllbnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc1Byb2plY3RDaGFuZ2VkIHx8XHJcbiAgICAgICAgaXNEaXNjaXBsaW5lQ2hhbmdlZCB8fFxyXG4gICAgICAgIGlzVHlwZUNoYW5nZWQgfHxcclxuICAgICAgICBpc1JlY2lwaWVudENoYW5nZWQgfHxcclxuICAgICAgICBpc09yaWdpbmF0b3JDaGFuZ2VkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFJlY2lwaWVudElkID0gaXNSZWNpcGllbnRDaGFuZ2VkXHJcbiAgICAgICAgICA/IG5ld1JlY2lwaWVudElkXHJcbiAgICAgICAgICA6IGN1cnJlbnRSZWNpcGllbnRJZDtcclxuXHJcbiAgICAgICAgLy8gUmVzb2x2ZSBSZWNpcGllbnQgQ29kZSBmb3IgdGhlIE5FVyBjb250ZXh0XHJcbiAgICAgICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgICAgICBpZiAodGFyZ2V0UmVjaXBpZW50SWQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlY09yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoT3JnYW5pemF0aW9uLCB7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiB0YXJnZXRSZWNpcGllbnRJZCB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAocmVjT3JnKSByZWNpcGllbnRDb2RlID0gcmVjT3JnLm9yZ2FuaXphdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBbRml4ICM2XSBGZXRjaCByZWFsIE9SRyBDb2RlIGZyb20gb3JpZ2luYXRvciBvcmdhbml6YXRpb25cclxuICAgICAgICBjb25zdCBvcmlnaW5hdG9yT3JnRm9yVXBkYXRlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShcclxuICAgICAgICAgIE9yZ2FuaXphdGlvbixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgICAgICBpZDogdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgPz8gY3VycmVudENvcnIub3JpZ2luYXRvcklkID8/IDAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBvcmdDb2RlID0gb3JpZ2luYXRvck9yZ0ZvclVwZGF0ZT8ub3JnYW5pemF0aW9uQ29kZSA/PyAnVU5LJztcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSBDb250ZXh0c1xyXG4gICAgICAgIGNvbnN0IG9sZEN0eCA9IHtcclxuICAgICAgICAgIHByb2plY3RJZDogY3VycmVudENvcnIucHJvamVjdElkLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdXJyZW50Q29yci5vcmlnaW5hdG9ySWQgPz8gMCxcclxuICAgICAgICAgIHR5cGVJZDogY3VycmVudENvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjdXJyZW50UmVjaXBpZW50SWQsXHJcbiAgICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xyXG4gICAgICAgICAgcHJvamVjdElkOiB1cGRSZXNvbHZlZFByb2plY3RJZCA/PyBjdXJyZW50Q29yci5wcm9qZWN0SWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6XHJcbiAgICAgICAgICAgIHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID8/IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZCA/PyAwLFxyXG4gICAgICAgICAgdHlwZUlkOiB1cGRhdGVEdG8udHlwZUlkID8/IGN1cnJlbnRDb3JyLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiB1cGRhdGVEdG8uZGlzY2lwbGluZUlkID8/IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiB0YXJnZXRSZWNpcGllbnRJZCxcclxuICAgICAgICAgIHllYXI6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyX2lkLCAvLyBQYXNzIFVzZXIgSUQgZm9yIEF1ZGl0XHJcbiAgICAgICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICAgICAgVFlQRV9DT0RFOiBjdXJyZW50Q29yci50eXBlPy50eXBlQ29kZSB8fCAnJyxcclxuICAgICAgICAgICAgT1JHX0NPREU6IG9yZ0NvZGUsXHJcbiAgICAgICAgICAgIFJFQ0lQSUVOVF9DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgICBSRUNfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gSWYgVHlwZSBDaGFuZ2VkLCBuZWVkIE5FVyBUeXBlIENvZGVcclxuICAgICAgICBpZiAoaXNUeXBlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiBuZXdDdHgudHlwZUlkIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChuZXdUeXBlKSBuZXdDdHguY3VzdG9tVG9rZW5zLlRZUEVfQ09ERSA9IG5ld1R5cGUudHlwZUNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdEb2NOdW1iZXIgPSBhd2FpdCB0aGlzLm51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQoXHJcbiAgICAgICAgICBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICAgIG9sZEN0eCxcclxuICAgICAgICAgIG5ld0N0eFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLnVwZGF0ZShpZCwge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IG5ld0RvY051bWJlcixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmZpbmRPbmUoaWQpO1xyXG5cclxuICAgIC8vIFJlLWluZGV4IHVwZGF0ZWQgZG9jdW1lbnQgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgdm9pZCB0aGlzLnNlYXJjaFNlcnZpY2UuaW5kZXhEb2N1bWVudCh7XHJcbiAgICAgIGlkOiB1cGRhdGVkLmlkLFxyXG4gICAgICBwdWJsaWNJZDogdXBkYXRlZC5wdWJsaWNJZCxcclxuICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgZG9jTnVtYmVyOiB1cGRhdGVkLmNvcnJlc3BvbmRlbmNlTnVtYmVyLFxyXG4gICAgICB0aXRsZTogdXBkYXRlRHRvLnN1YmplY3QgPz8gdXBkYXRlZC5yZXZpc2lvbnM/LlswXT8uc3ViamVjdCxcclxuICAgICAgZGVzY3JpcHRpb246IHVwZGF0ZUR0by5kZXNjcmlwdGlvbiA/PyB1cGRhdGVkLnJldmlzaW9ucz8uWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgc3RhdHVzOiAnRFJBRlQnLFxyXG4gICAgICBwcm9qZWN0SWQ6IHVwZGF0ZWQucHJvamVjdElkLFxyXG4gICAgICBjcmVhdGVkQXQ6IHVwZGF0ZWQuY3JlYXRlZEF0LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcmV2aWV3RG9jdW1lbnROdW1iZXIoY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0bywgdXNlcjogVXNlcikge1xyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXNcclxuICAgIGNvbnN0IHByZXZpZXdQcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKFxyXG4gICAgICBjcmVhdGVEdG8ucHJvamVjdElkXHJcbiAgICApO1xyXG4gICAgY29uc3QgcHJldmlld09yaWdpbmF0b3JJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwcmV2aWV3UmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICBjcmVhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkOiBjcmVhdGVEdG8udHlwZUlkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdEb2N1bWVudCBUeXBlIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGxldCB1c2VyT3JnSWQgPSB1c2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmV2aWV3T3JpZ2luYXRvcklkICYmIHByZXZpZXdPcmlnaW5hdG9ySWQgIT09IHVzZXJPcmdJZCkge1xyXG4gICAgICAvLyBBbGxvdyBpbXBlcnNvbmF0aW9uIGZvciBwcmV2aWV3XHJcbiAgICAgIHVzZXJPcmdJZCA9IHByZXZpZXdPcmlnaW5hdG9ySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCByZWNpcGllbnQgZnJvbSByZWNpcGllbnRzIGFycmF5XHJcbiAgICBjb25zdCB0b1JlY2lwaWVudCA9IHByZXZpZXdSZWNpcGllbnRzPy5maW5kKChyKSA9PiByLnR5cGUgPT09ICdUTycpO1xyXG4gICAgY29uc3QgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQgPSB0b1JlY2lwaWVudD8ub3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgIGlmIChyZWNpcGllbnRPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICBjb25zdCByZWNPcmcgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKE9yZ2FuaXphdGlvbiwge1xyXG4gICAgICAgIHdoZXJlOiB7IGlkOiByZWNpcGllbnRPcmdhbml6YXRpb25JZCB9LFxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHJlY09yZykgcmVjaXBpZW50Q29kZSA9IHJlY09yZy5vcmdhbml6YXRpb25Db2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1NlcnZpY2UucHJldmlld051bWJlcih7XHJcbiAgICAgIHByb2plY3RJZDogcHJldmlld1Byb2plY3RJZCxcclxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiB1c2VyT3JnSWQhLFxyXG4gICAgICB0eXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjcmVhdGVEdG8uc3ViVHlwZUlkLFxyXG4gICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICBUWVBFX0NPREU6IHR5cGUudHlwZUNvZGUsXHJcbiAgICAgICAgUkVDSVBJRU5UX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgUkVDX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGUgSW1wbGVtZW50YXRpb246IEVDLUNPUlItMDAxIC0gQ2FuY2VsIENvcnJlc3BvbmRlbmNlIHdpdGggRG93bnN0cmVhbSBDaXJjdWxhdGlvblxyXG4gICAqIENhbmNlbCBjb3JyZXNwb25kZW5jZSBhbmQgaGFuZGxlIHJlbGF0ZWQgY2lyY3VsYXRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY2FuY2VsKHB1YmxpY0lkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCB1c2VyOiBVc2VyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuZmluZE9uZUJ5VXVpZChwdWJsaWNJZCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjYW5jZWwgKE9yZyBBZG1pbiBvciBTdXBlcmFkbWluIG9ubHkpXHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKHVzZXIudXNlcl9pZCk7XHJcbiAgICBjb25zdCBjYW5DYW5jZWwgPVxyXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnY29ycmVzcG9uZGVuY2UuY2FuY2VsJykgfHxcclxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3N5c3RlbS5tYW5hZ2VfYWxsJyk7XHJcblxyXG4gICAgaWYgKCFjYW5DYW5jZWwpIHtcclxuICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAnT25seSBhZG1pbmlzdHJhdG9ycyBjYW4gY2FuY2VsIGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgIGNvbnN0IGNpcmN1bGF0aW9uUmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KCdDaXJjdWxhdGlvbicpO1xyXG4gICAgY29uc3QgYWN0aXZlQ2lyY3VsYXRpb25zID0gYXdhaXQgY2lyY3VsYXRpb25SZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgIHN0YXR1czogJ09QRU4nLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPVxyXG4gICAgICBhY3RpdmVDaXJjdWxhdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgICAgID8gYFRoZXJlIGFyZSAke2FjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGh9IGFjdGl2ZSBjaXJjdWxhdGlvbihzKSBmb3IgdGhpcyBjb3JyZXNwb25kZW5jZS4gQ2FuY2VsaW5nIHdpbGwgZm9yY2UgY2xvc2UgYWxsIHJlbGF0ZWQgY2lyY3VsYXRpb25zLmBcclxuICAgICAgICA6ICcnO1xyXG5cclxuICAgIC8vIEdldCB0aGUgY3VycmVudCByZXZpc2lvbiB0byB1cGRhdGUgc3RhdHVzXHJcbiAgICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWN1cnJlbnRSZXZpc2lvbikge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0N1cnJlbnQgcmV2aXNpb24gbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGNhbmNlbGxlZCBzdGF0dXNcclxuICAgIGNvbnN0IGNhbmNlbGxlZFN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgc3RhdHVzQ29kZTogJ0NBTkNFTExFRCcgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY2FuY2VsbGVkU3RhdHVzKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCdDQU5DRUxMRUQgc3RhdHVzIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVXBkYXRlIGNvcnJlc3BvbmRlbmNlIHJldmlzaW9uIHN0YXR1cyB0byBDQU5DRUxMRURcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBjdXJyZW50UmV2aXNpb24uaWQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc3RhdHVzSWQ6IGNhbmNlbGxlZFN0YXR1cy5pZCxcclxuICAgICAgICAgIHJlbWFya3M6IGBDYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gRm9yY2UgY2xvc2UgYWxsIGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgICAgaWYgKGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgICAnQ2lyY3VsYXRpb24nLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiAnT1BFTicsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzdGF0dXM6ICdGT1JDRV9DTE9TRUQnLFxyXG4gICAgICAgICAgICBjbG9zZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgY2xvc2VkQnk6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICAgICAgY2xvc2VSZWFzb246IGBDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIFJlLWluZGV4IGNhbmNlbGxlZCBzdGF0dXMgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgICBpZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcHVibGljSWQ6IGNvcnJlc3BvbmRlbmNlLnB1YmxpY0lkLFxyXG4gICAgICAgIHR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgZG9jTnVtYmVyOiBjb3JyZXNwb25kZW5jZS5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICB0aXRsZTogY3VycmVudFJldmlzaW9uLnN1YmplY3QsXHJcbiAgICAgICAgc3RhdHVzOiAnQ0FOQ0VMTEVEJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IGNvcnJlc3BvbmRlbmNlLnByb2plY3RJZCxcclxuICAgICAgICBjcmVhdGVkQXQ6IGNvcnJlc3BvbmRlbmNlLmNyZWF0ZWRBdCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBOb3RpZnkgb3JpZ2luYXRvcidzIGRvYy1jb250cm9sIHVzZXIgYWJvdXQgY2FuY2VsbGF0aW9uIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIGlmIChjb3JyZXNwb25kZW5jZS5vcmlnaW5hdG9ySWQpIHtcclxuICAgICAgICB2b2lkIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgIC5maW5kRG9jQ29udHJvbElkQnlPcmcoY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcklkKVxyXG4gICAgICAgICAgLnRoZW4oKHRhcmdldFVzZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0VXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29ycmVzcG9uZGVuY2UgQ2FuY2VsbGVkJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke2NvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlTnVtYmVyfSDigJQgJHtjdXJyZW50UmV2aXNpb24uc3ViamVjdH0gaGFzIGJlZW4gY2FuY2VsbGVkLiBSZWFzb246ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnRU1BSUwnLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgICAgIGxpbms6IGAvY29ycmVzcG9uZGVuY2VzLyR7Y29ycmVzcG9uZGVuY2UucHVibGljSWR9YCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT5cclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgQ2FuY2VsIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBtZXNzYWdlOiB3YXJuaW5nTWVzc2FnZSB8fCAnQ29ycmVzcG9uZGVuY2UgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgICAgICAgYWN0aXZlQ2lyY3VsYXRpb25zQ291bnQ6IGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gY2FuY2VsIGNvcnJlc3BvbmRlbmNlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYnVsa0NhbmNlbChcclxuICAgIHB1YmxpY0lkczogc3RyaW5nW10sXHJcbiAgICByZWFzb246IHN0cmluZyxcclxuICAgIHVzZXI6IFVzZXJcclxuICApOiBQcm9taXNlPHsgc3VjY2VlZGVkOiBzdHJpbmdbXTsgZmFpbGVkOiBzdHJpbmdbXSB9PiB7XHJcbiAgICBjb25zdCBzdWNjZWVkZWQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBmYWlsZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBwdWJsaWNJZCBvZiBwdWJsaWNJZHMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbChwdWJsaWNJZCwgcmVhc29uLCB1c2VyKTtcclxuICAgICAgICBzdWNjZWVkZWQucHVzaChwdWJsaWNJZCk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGZhaWxlZC5wdXNoKHB1YmxpY0lkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHN1Y2NlZWRlZCwgZmFpbGVkIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBleHBvcnRDc3Yoc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZmluZEFsbChzZWFyY2hEdG8pO1xyXG5cclxuICAgIGNvbnN0IGhlYWRlciA9IFtcclxuICAgICAgJ0RvY3VtZW50IE5vLicsXHJcbiAgICAgICdSZXYnLFxyXG4gICAgICAnU3ViamVjdCcsXHJcbiAgICAgICdUeXBlJyxcclxuICAgICAgJ1N0YXR1cycsXHJcbiAgICAgICdQcm9qZWN0JyxcclxuICAgICAgJ0Zyb20nLFxyXG4gICAgICAnRHVlIERhdGUnLFxyXG4gICAgICAnQ3JlYXRlZCBBdCcsXHJcbiAgICBdO1xyXG4gICAgY29uc3Qgcm93cyA9IGRhdGEubWFwKChyZXYpID0+IHtcclxuICAgICAgY29uc3QgY29yciA9IHJldi5jb3JyZXNwb25kZW5jZSA/PyAocmV2IGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXIgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5yZXZpc2lvbkxhYmVsID8/IFN0cmluZyhyZXYucmV2aXNpb25OdW1iZXIgPz8gMCkpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5zdWJqZWN0ID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnR5cGU/LnR5cGVDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihyZXYuc3RhdHVzPy5zdGF0dXNDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnByb2plY3Q/LnByb2plY3RDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLm9yaWdpbmF0b3I/Lm9yZ2FuaXphdGlvbkNvZGUgPz8gJycpLFxyXG4gICAgICAgIHJldi5kdWVEYXRlID8gbmV3IERhdGUocmV2LmR1ZURhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSA6ICcnLFxyXG4gICAgICAgIG5ldyBEYXRlKHJldi5jcmVhdGVkQXQpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSxcclxuICAgICAgXS5qb2luKCcsJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gW2hlYWRlci5qb2luKCcsJyksIC4uLnJvd3NdLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVDc3YodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSB8fCB2YWx1ZS5pbmNsdWRlcygnXCInKSB8fCB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcclxuICAgICAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02.map new file mode 100644 index 0000000..329b545 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6e/correspondenceservice_6e8dfea54e797651604b391b91f0bf02.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence.service.ts\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n ForbiddenException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\n\r\n// Entities\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Tag } from '../master/entities/tag.entity';\r\nimport { User } from '../user/entities/user.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity';\r\n\r\n// DTOs\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\n\r\n// Services\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\n\r\n/**\r\n * CorrespondenceService - Document management (CRUD)\r\n */\r\ninterface ResolvedRecipient {\r\n organizationId: number;\r\n type: 'TO' | 'CC';\r\n}\r\n@Injectable()\r\nexport class CorrespondenceService {\r\n private readonly logger = new Logger(CorrespondenceService.name);\r\n\r\n private async hasSystemManageAllPermission(userId: number): Promise {\r\n const permissions = await this.userService.getUserPermissions(userId);\r\n return permissions.includes('system.manage_all');\r\n }\r\n\r\n /**\r\n * Business Rule: Revision Label Strategy\r\n * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...)\r\n * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...)\r\n */\r\n private getInitialRevisionLabel(typeCode: string): string | undefined {\r\n const alphabetTypes = ['RFA', 'RFI'];\r\n if (alphabetTypes.includes(typeCode.toUpperCase())) {\r\n return 'A'; // Alphabet for RFA, RFI\r\n }\r\n return undefined; // Numeric (no label for revision 0)\r\n }\r\n\r\n constructor(\r\n @InjectRepository(Correspondence)\r\n private correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private statusRepo: Repository,\r\n @InjectRepository(CorrespondenceReference)\r\n private referenceRepo: Repository,\r\n @InjectRepository(CorrespondenceTag)\r\n private tagRepo: Repository,\r\n private numberingService: DocumentNumberingService,\r\n private jsonSchemaService: JsonSchemaService,\r\n private workflowEngine: WorkflowEngineService,\r\n private userService: UserService,\r\n private dataSource: DataSource,\r\n private searchService: SearchService,\r\n private fileStorageService: FileStorageService,\r\n private uuidResolver: UuidResolverService,\r\n private notificationService: NotificationService,\r\n @InjectRepository(CorrespondenceRevisionAttachment)\r\n private revAttachRepo: Repository\r\n ) {}\r\n\r\n /**\r\n * Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n * Prevent external correspondence to same organization\r\n */\r\n private async validateCorrespondenceRecipients(\r\n createDto: CreateCorrespondenceDto,\r\n user: User\r\n ): Promise {\r\n // Get user's organization\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n if (createDto.originatorId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (canManageAll) {\r\n userOrgId = await this.uuidResolver.resolveOrganizationId(\r\n createDto.originatorId\r\n );\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n }\r\n\r\n // For impersonation, use the specified originator\r\n const originatorOrgId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : userOrgId;\r\n\r\n // Check if it's internal communication\r\n if (createDto.isInternal) {\r\n // Internal communications should use Circulation instead\r\n throw new BadRequestException(\r\n 'Internal communications should use Circulation Sheet instead of Correspondence'\r\n );\r\n }\r\n\r\n // Validate recipients\r\n if (!createDto.recipients || createDto.recipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one recipient (TO or CC) is required'\r\n );\r\n }\r\n\r\n const toRecipients = createDto.recipients.filter((r) => r.type === 'TO');\r\n const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC');\r\n\r\n if (toRecipients.length === 0 && ccRecipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one TO or CC recipient is required'\r\n );\r\n }\r\n\r\n // Check for same organization correspondence\r\n for (const recipient of createDto.recipients) {\r\n const recipientOrgId = await this.uuidResolver.resolveOrganizationId(\r\n recipient.organizationId\r\n );\r\n\r\n if (recipientOrgId === originatorOrgId) {\r\n throw new BadRequestException(\r\n 'Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'\r\n );\r\n }\r\n }\r\n }\r\n\r\n async create(createDto: CreateCorrespondenceDto, user: User) {\r\n // Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n await this.validateCorrespondenceRecipients(createDto, user);\r\n // ADR-019: Resolve UUID references to internal INT IDs\r\n const resolvedProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const resolvedOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const resolvedRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n const statusDraft = await this.statusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n if (!statusDraft) {\r\n throw new InternalServerErrorException(\r\n 'Status DRAFT not found in Master Data'\r\n );\r\n }\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n // Impersonation Logic\r\n if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (!canManageAll) {\r\n throw new ForbiddenException(\r\n 'You do not have permission to create documents on behalf of other organizations.'\r\n );\r\n }\r\n userOrgId = resolvedOriginatorId;\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n\r\n if (createDto.details) {\r\n try {\r\n await this.jsonSchemaService.validate(type.typeCode, createDto.details);\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Schema validation warning for ${type.typeCode}: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // [Fix #6] Fetch real ORG Code from Organization entity\r\n const originatorOrg = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: { id: userOrgId },\r\n }\r\n );\r\n const orgCode = originatorOrg?.organizationCode ?? 'UNK';\r\n\r\n // [v1.5.1] Extract recipient organization from recipients array (Primary TO)\r\n const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n const docNumber = await this.numberingService.generateNextNumber({\r\n projectId: resolvedProjectId,\r\n originatorOrganizationId: userOrgId,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId, // [v1.5.1] Pass recipient for document number format\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n\r\n const correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: docNumber.number,\r\n correspondenceTypeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n isInternal: createDto.isInternal || false,\r\n createdBy: user.user_id,\r\n });\r\n const savedCorr = await queryRunner.manager.save(correspondence);\r\n\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: savedCorr.id,\r\n revisionNumber: 0,\r\n revisionLabel: this.getInitialRevisionLabel(type.typeCode),\r\n isCurrent: true,\r\n statusId: statusDraft.id,\r\n subject: createDto.subject,\r\n body: createDto.body,\r\n remarks: createDto.remarks,\r\n dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined,\r\n documentDate: createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined,\r\n issuedDate: createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : undefined,\r\n receivedDate: createDto.receivedDate\r\n ? new Date(createDto.receivedDate)\r\n : undefined,\r\n description: createDto.description,\r\n details: createDto.details,\r\n createdBy: user.user_id,\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(revision);\r\n\r\n // Save Recipients (using resolved INT IDs)\r\n if (resolvedRecipients && resolvedRecipients.length > 0) {\r\n const recipients = resolvedRecipients.map((r) =>\r\n queryRunner.manager.create(CorrespondenceRecipient, {\r\n correspondenceId: savedCorr.id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await queryRunner.manager.save(recipients);\r\n }\r\n\r\n // Commit attachments from Temp → Permanent (Two-Phase Storage)\r\n if (createDto.attachmentTempIds?.length) {\r\n const issueDate = createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n createDto.attachmentTempIds,\r\n { issueDate, documentType: 'Correspondence' }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att, idx) =>\r\n queryRunner.manager.create(CorrespondenceRevisionAttachment, {\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: idx === 0, // ไฟล์แรกเป็น main document\r\n })\r\n );\r\n await queryRunner.manager.save(\r\n CorrespondenceRevisionAttachment,\r\n links\r\n );\r\n }\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Start Workflow Instance (non-blocking)\r\n try {\r\n const workflowCode = `CORRESPONDENCE_${type.typeCode}`;\r\n await this.workflowEngine.createInstance(\r\n workflowCode,\r\n 'correspondence',\r\n savedCorr.id.toString(),\r\n {\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n disciplineId: createDto.disciplineId,\r\n initiatorId: user.user_id,\r\n } as Record\r\n );\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${(error as Error).message}`\r\n );\r\n }\r\n\r\n // Fire-and-forget search indexing (non-blocking, void intentional)\r\n void this.searchService.indexDocument({\r\n id: savedCorr.id,\r\n publicId: savedCorr.publicId,\r\n type: 'correspondence',\r\n docNumber: docNumber.number,\r\n title: createDto.subject,\r\n description: createDto.description,\r\n status: 'DRAFT',\r\n projectId: resolvedProjectId,\r\n createdAt: new Date(),\r\n });\r\n\r\n return {\r\n ...savedCorr,\r\n currentRevision: revision,\r\n };\r\n } catch (err) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to create correspondence: ${(err as Error).message}`\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async findAll(searchDto: SearchCorrespondenceDto = {}) {\r\n const {\r\n search,\r\n typeId,\r\n projectId,\r\n statusId,\r\n status,\r\n page = 1,\r\n limit = 10,\r\n } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n // Change: Query from Revision Repo\r\n const query = this.revisionRepo\r\n .createQueryBuilder('rev')\r\n .leftJoinAndSelect('rev.correspondence', 'corr')\r\n .leftJoinAndSelect('corr.type', 'type')\r\n .leftJoinAndSelect('corr.project', 'project')\r\n .leftJoinAndSelect('corr.originator', 'org')\r\n .leftJoinAndSelect('rev.status', 'status');\r\n\r\n // Filter by Revision Status\r\n const revStatus = searchDto.revisionStatus || 'CURRENT';\r\n\r\n if (revStatus === 'CURRENT') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: true });\r\n } else if (revStatus === 'OLD') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: false });\r\n }\r\n // If 'ALL', no filter needed on isCurrent\r\n\r\n if (projectId) {\r\n query.andWhere('corr.projectId = :projectId', { projectId });\r\n }\r\n\r\n if (typeId) {\r\n query.andWhere('corr.correspondenceTypeId = :typeId', { typeId });\r\n }\r\n\r\n if (statusId) {\r\n query.andWhere('rev.statusId = :statusId', { statusId });\r\n }\r\n\r\n if (status) {\r\n query.andWhere('status.statusCode = :status', { status });\r\n }\r\n\r\n if (search) {\r\n query.andWhere(\r\n '(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n // Default Sort: Latest Created\r\n query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit);\r\n\r\n const [items, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence with ID ${id} not found`);\r\n }\r\n return correspondence;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction\r\n 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization',\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(\r\n `Correspondence with UUID ${publicId} not found`\r\n );\r\n }\r\n return correspondence;\r\n }\r\n\r\n async addReference(id: number, dto: AddReferenceDto) {\r\n const source = await this.correspondenceRepo.findOne({ where: { id } });\r\n // ADR-019: Resolve target publicId → internal INT id\r\n const target = await this.correspondenceRepo.findOne({\r\n where: { publicId: dto.targetUuid },\r\n });\r\n\r\n if (!source || !target) {\r\n throw new NotFoundException('Source or Target correspondence not found');\r\n }\r\n\r\n if (source.id === target.id) {\r\n throw new BadRequestException('Cannot reference self');\r\n }\r\n\r\n const exists = await this.referenceRepo.findOne({\r\n where: {\r\n sourceId: id,\r\n targetId: target.id,\r\n },\r\n });\r\n\r\n if (exists) {\r\n return exists;\r\n }\r\n\r\n const ref = this.referenceRepo.create({\r\n sourceId: id,\r\n targetId: target.id,\r\n });\r\n\r\n return this.referenceRepo.save(ref);\r\n }\r\n\r\n async removeReference(id: number, targetId: number) {\r\n const result = await this.referenceRepo.delete({\r\n sourceId: id,\r\n targetId: targetId,\r\n });\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Reference not found');\r\n }\r\n }\r\n\r\n async getTags(id: number) {\r\n const rows = await this.tagRepo.find({\r\n where: { correspondenceId: id },\r\n relations: ['tag'],\r\n });\r\n return rows.map((r) => r.tag).filter(Boolean);\r\n }\r\n\r\n async addTag(id: number, tagId: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n });\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence ${id} not found`);\r\n }\r\n\r\n const tag = await this.dataSource.manager.findOne(Tag, {\r\n where: { id: tagId },\r\n });\r\n if (!tag) {\r\n throw new NotFoundException(`Tag ${tagId} not found`);\r\n }\r\n\r\n const exists = await this.tagRepo.findOne({\r\n where: { correspondenceId: id, tagId },\r\n });\r\n if (exists) return exists;\r\n\r\n const row = this.tagRepo.create({ correspondenceId: id, tagId });\r\n return this.tagRepo.save(row);\r\n }\r\n\r\n async removeTag(id: number, tagId: number) {\r\n const result = await this.tagRepo.delete({ correspondenceId: id, tagId });\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Tag assignment not found');\r\n }\r\n }\r\n\r\n async getReferences(id: number) {\r\n const outgoing = await this.referenceRepo.find({\r\n where: { sourceId: id },\r\n relations: ['target', 'target.type'],\r\n });\r\n\r\n const incoming = await this.referenceRepo.find({\r\n where: { targetId: id },\r\n relations: ['source', 'source.type'],\r\n });\r\n\r\n return { outgoing, incoming };\r\n }\r\n\r\n async update(id: number, updateDto: UpdateCorrespondenceDto, user: User) {\r\n // 1. Find Current Revision\r\n const revision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: id,\r\n isCurrent: true,\r\n },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Current revision for correspondence ${id} not found`\r\n );\r\n }\r\n\r\n // 2. Check Permission\r\n if (revision.statusId) {\r\n const status = await this.statusRepo.findOne({\r\n where: { id: revision.statusId },\r\n });\r\n\r\n if (status && status.statusCode !== 'DRAFT') {\r\n const permissions = await this.userService.getUserPermissions(\r\n user.user_id\r\n );\r\n const canEditSubmittedOrLater =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canEditSubmittedOrLater) {\r\n throw new ForbiddenException(\r\n 'Only Org Admin or Superadmin can edit non-draft correspondences'\r\n );\r\n }\r\n }\r\n }\r\n\r\n // ADR-019: Resolve UUID references in update DTO\r\n const updResolvedProjectId = updateDto.projectId\r\n ? await this.uuidResolver.resolveProjectId(updateDto.projectId)\r\n : undefined;\r\n const updResolvedOriginatorId = updateDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId)\r\n : undefined;\r\n const updResolvedRecipients = updateDto.recipients\r\n ? await Promise.all(\r\n updateDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n // 3. Update Correspondence Entity if needed\r\n const correspondenceUpdate: Record = {};\r\n if (updateDto.disciplineId)\r\n correspondenceUpdate.disciplineId = updateDto.disciplineId;\r\n if (updResolvedProjectId)\r\n correspondenceUpdate.projectId = updResolvedProjectId;\r\n if (updResolvedOriginatorId)\r\n correspondenceUpdate.originatorId = updResolvedOriginatorId;\r\n\r\n if (Object.keys(correspondenceUpdate).length > 0) {\r\n await this.correspondenceRepo.update(id, correspondenceUpdate);\r\n }\r\n\r\n // 4. Update Revision Entity\r\n const revisionUpdate: Record = {};\r\n if (updateDto.subject) revisionUpdate.subject = updateDto.subject;\r\n if (updateDto.body) revisionUpdate.body = updateDto.body;\r\n if (updateDto.remarks) revisionUpdate.remarks = updateDto.remarks;\r\n // Format Date correctly if string\r\n if (updateDto.dueDate) revisionUpdate.dueDate = new Date(updateDto.dueDate);\r\n if (updateDto.documentDate)\r\n revisionUpdate.documentDate = new Date(updateDto.documentDate);\r\n if (updateDto.issuedDate)\r\n revisionUpdate.issuedDate = new Date(updateDto.issuedDate);\r\n if (updateDto.receivedDate)\r\n revisionUpdate.receivedDate = new Date(updateDto.receivedDate);\r\n if (updateDto.description)\r\n revisionUpdate.description = updateDto.description;\r\n if (updateDto.details) revisionUpdate.details = updateDto.details;\r\n\r\n if (Object.keys(revisionUpdate).length > 0) {\r\n await this.revisionRepo.update(revision.id, revisionUpdate);\r\n }\r\n\r\n // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage)\r\n if (updateDto.attachmentTempIds?.length) {\r\n const issueDate = updateDto.issuedDate\r\n ? new Date(updateDto.issuedDate)\r\n : updateDto.documentDate\r\n ? new Date(updateDto.documentDate)\r\n : revision.issuedDate || revision.documentDate || undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n updateDto.attachmentTempIds,\r\n {\r\n issueDate: issueDate ? new Date(issueDate) : undefined,\r\n documentType: 'Correspondence',\r\n }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att) =>\r\n this.revAttachRepo.create({\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main\r\n })\r\n );\r\n await this.revAttachRepo.save(links);\r\n }\r\n }\r\n\r\n // 5. Update Recipients if provided\r\n if (updResolvedRecipients) {\r\n const recipientRepo = this.dataSource.getRepository(\r\n CorrespondenceRecipient\r\n );\r\n await recipientRepo.delete({ correspondenceId: id });\r\n\r\n const newRecipients = updResolvedRecipients.map((r) =>\r\n recipientRepo.create({\r\n correspondenceId: id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await recipientRepo.save(newRecipients);\r\n }\r\n\r\n // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project)\r\n // AND it is a DRAFT.\r\n\r\n // Fetch fresh data for context and comparison\r\n const currentCorr = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: ['type', 'recipients', 'recipients.recipientOrganization'],\r\n });\r\n\r\n if (currentCorr) {\r\n const currentToRecipient = currentCorr.recipients?.find(\r\n (r) => r.recipientType === 'TO'\r\n );\r\n const currentRecipientId = currentToRecipient?.recipientOrganizationId;\r\n\r\n // Check for ACTUAL value changes\r\n const isProjectChanged =\r\n updResolvedProjectId !== undefined &&\r\n updResolvedProjectId !== currentCorr.projectId;\r\n const isOriginatorChanged =\r\n updResolvedOriginatorId !== undefined &&\r\n updResolvedOriginatorId !== currentCorr.originatorId;\r\n const isDisciplineChanged =\r\n updateDto.disciplineId !== undefined &&\r\n updateDto.disciplineId !== currentCorr.disciplineId;\r\n const isTypeChanged =\r\n updateDto.typeId !== undefined &&\r\n updateDto.typeId !== currentCorr.correspondenceTypeId;\r\n\r\n let isRecipientChanged = false;\r\n let newRecipientId: number | undefined;\r\n\r\n if (updResolvedRecipients) {\r\n const newToRecipient = updResolvedRecipients.find(\r\n (r) => r.type === 'TO'\r\n );\r\n newRecipientId = newToRecipient?.organizationId;\r\n\r\n if (newRecipientId !== currentRecipientId) {\r\n isRecipientChanged = true;\r\n }\r\n }\r\n\r\n if (\r\n isProjectChanged ||\r\n isDisciplineChanged ||\r\n isTypeChanged ||\r\n isRecipientChanged ||\r\n isOriginatorChanged\r\n ) {\r\n const targetRecipientId = isRecipientChanged\r\n ? newRecipientId\r\n : currentRecipientId;\r\n\r\n // Resolve Recipient Code for the NEW context\r\n let recipientCode = '';\r\n if (targetRecipientId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: targetRecipientId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n // [Fix #6] Fetch real ORG Code from originator organization\r\n const originatorOrgForUpdate = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: {\r\n id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n },\r\n }\r\n );\r\n const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK';\r\n\r\n // Prepare Contexts\r\n const oldCtx = {\r\n projectId: currentCorr.projectId,\r\n originatorOrganizationId: currentCorr.originatorId ?? 0,\r\n typeId: currentCorr.correspondenceTypeId,\r\n disciplineId: currentCorr.disciplineId,\r\n recipientOrganizationId: currentRecipientId,\r\n year: new Date().getFullYear(),\r\n };\r\n\r\n const newCtx = {\r\n projectId: updResolvedProjectId ?? currentCorr.projectId,\r\n originatorOrganizationId:\r\n updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId,\r\n disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId,\r\n recipientOrganizationId: targetRecipientId,\r\n year: new Date().getFullYear(),\r\n userId: user.user_id, // Pass User ID for Audit\r\n customTokens: {\r\n TYPE_CODE: currentCorr.type?.typeCode || '',\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n };\r\n\r\n // If Type Changed, need NEW Type Code\r\n if (isTypeChanged) {\r\n const newType = await this.typeRepo.findOne({\r\n where: { id: newCtx.typeId },\r\n });\r\n if (newType) newCtx.customTokens.TYPE_CODE = newType.typeCode;\r\n }\r\n\r\n const newDocNumber = await this.numberingService.updateNumberForDraft(\r\n currentCorr.correspondenceNumber,\r\n oldCtx,\r\n newCtx\r\n );\r\n\r\n await this.correspondenceRepo.update(id, {\r\n correspondenceNumber: newDocNumber,\r\n });\r\n }\r\n }\r\n\r\n const updated = await this.findOne(id);\r\n\r\n // Re-index updated document in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: updated.id,\r\n publicId: updated.publicId,\r\n type: 'correspondence',\r\n docNumber: updated.correspondenceNumber,\r\n title: updateDto.subject ?? updated.revisions?.[0]?.subject,\r\n description: updateDto.description ?? updated.revisions?.[0]?.description,\r\n status: 'DRAFT',\r\n projectId: updated.projectId,\r\n createdAt: updated.createdAt,\r\n });\r\n\r\n return updated;\r\n }\r\n\r\n async previewDocumentNumber(createDto: CreateCorrespondenceDto, user: User) {\r\n // ADR-019: Resolve UUID references\r\n const previewProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const previewOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const previewRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n\r\n if (previewOriginatorId && previewOriginatorId !== userOrgId) {\r\n // Allow impersonation for preview\r\n userOrgId = previewOriginatorId;\r\n }\r\n\r\n // Extract recipient from recipients array\r\n const toRecipient = previewRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n return this.numberingService.previewNumber({\r\n projectId: previewProjectId,\r\n originatorOrganizationId: userOrgId!,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId,\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation\r\n * Cancel correspondence and handle related circulations\r\n */\r\n async cancel(publicId: string, reason: string, user: User) {\r\n const correspondence = await this.findOneByUuid(publicId);\r\n\r\n // Check if user has permission to cancel (Org Admin or Superadmin only)\r\n const permissions = await this.userService.getUserPermissions(user.user_id);\r\n const canCancel =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canCancel) {\r\n throw new ForbiddenException(\r\n 'Only administrators can cancel correspondences'\r\n );\r\n }\r\n\r\n // Check if there are any active circulations\r\n const circulationRepo = this.dataSource.getRepository('Circulation');\r\n const activeCirculations = await circulationRepo.find({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n });\r\n\r\n const warningMessage =\r\n activeCirculations.length > 0\r\n ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.`\r\n : '';\r\n\r\n // Get the current revision to update status\r\n const currentRevision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n isCurrent: true,\r\n },\r\n });\r\n\r\n if (!currentRevision) {\r\n throw new NotFoundException('Current revision not found');\r\n }\r\n\r\n // Get cancelled status\r\n const cancelledStatus = await this.statusRepo.findOne({\r\n where: { statusCode: 'CANCELLED' },\r\n });\r\n\r\n if (!cancelledStatus) {\r\n throw new InternalServerErrorException('CANCELLED status not found');\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // Update correspondence revision status to CANCELLED\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n currentRevision.id,\r\n {\r\n statusId: cancelledStatus.id,\r\n remarks: `Cancelled: ${reason}`,\r\n }\r\n );\r\n\r\n // Force close all active circulations\r\n if (activeCirculations.length > 0) {\r\n await queryRunner.manager.update(\r\n 'Circulation',\r\n {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n {\r\n status: 'FORCE_CLOSED',\r\n closedAt: new Date(),\r\n closedBy: user.user_id,\r\n closeReason: `Correspondence cancelled: ${reason}`,\r\n }\r\n );\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Re-index cancelled status in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: correspondence.id,\r\n publicId: correspondence.publicId,\r\n type: 'correspondence',\r\n docNumber: correspondence.correspondenceNumber,\r\n title: currentRevision.subject,\r\n status: 'CANCELLED',\r\n projectId: correspondence.projectId,\r\n createdAt: correspondence.createdAt,\r\n });\r\n\r\n // Notify originator's doc-control user about cancellation (fire-and-forget)\r\n if (correspondence.originatorId) {\r\n void this.userService\r\n .findDocControlIdByOrg(correspondence.originatorId)\r\n .then((targetUserId) => {\r\n if (targetUserId) {\r\n void this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Correspondence Cancelled',\r\n message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: correspondence.id,\r\n link: `/correspondences/${correspondence.publicId}`,\r\n });\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Cancel notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: warningMessage || 'Correspondence cancelled successfully',\r\n activeCirculationsCount: activeCirculations.length,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to cancel correspondence: ${(error as Error).message}`\r\n );\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async bulkCancel(\r\n publicIds: string[],\r\n reason: string,\r\n user: User\r\n ): Promise<{ succeeded: string[]; failed: string[] }> {\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const publicId of publicIds) {\r\n try {\r\n await this.cancel(publicId, reason, user);\r\n succeeded.push(publicId);\r\n } catch {\r\n failed.push(publicId);\r\n }\r\n }\r\n\r\n return { succeeded, failed };\r\n }\r\n\r\n async exportCsv(searchDto: SearchCorrespondenceDto): Promise {\r\n const { data } = await this.findAll(searchDto);\r\n\r\n const header = [\r\n 'Document No.',\r\n 'Rev',\r\n 'Subject',\r\n 'Type',\r\n 'Status',\r\n 'Project',\r\n 'From',\r\n 'Due Date',\r\n 'Created At',\r\n ];\r\n const rows = data.map((rev) => {\r\n const corr = rev.correspondence ?? (rev as unknown as Correspondence);\r\n return [\r\n this.escapeCsv(corr.correspondenceNumber ?? ''),\r\n this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)),\r\n this.escapeCsv(rev.subject ?? ''),\r\n this.escapeCsv(corr.type?.typeCode ?? ''),\r\n this.escapeCsv(rev.status?.statusCode ?? ''),\r\n this.escapeCsv(corr.project?.projectCode ?? ''),\r\n this.escapeCsv(corr.originator?.organizationCode ?? ''),\r\n rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '',\r\n new Date(rev.createdAt).toISOString().split('T')[0],\r\n ].join(',');\r\n });\r\n\r\n return [header.join(','), ...rows].join('\\n');\r\n }\r\n\r\n private escapeCsv(value: string): string {\r\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496 new file mode 100644 index 0000000..954025e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496 @@ -0,0 +1,41 @@ +0d8856588afe476fde634f80c05f61ee +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceReference = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +let CorrespondenceReference = class CorrespondenceReference { +}; +exports.CorrespondenceReference = CorrespondenceReference; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'src_correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceReference.prototype, "sourceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'tgt_correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceReference.prototype, "targetId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'src_correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceReference.prototype, "source", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'tgt_correspondence_id' }), + __metadata("design:type", typeof (_b = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _b : Object) +], CorrespondenceReference.prototype, "target", void 0); +exports.CorrespondenceReference = CorrespondenceReference = __decorate([ + (0, typeorm_1.Entity)('correspondence_references') +], CorrespondenceReference); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZWZlcmVuY2UuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBR2xELElBQU0sdUJBQXVCLEdBQTdCLE1BQU0sdUJBQXVCO0NBY25DLENBQUE7QUFkWSwwREFBdUI7QUFFbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQzs7eURBQy9CO0FBR2xCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLENBQUM7O3lEQUMvQjtBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzQ0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDO2tEQUNyQyxzQ0FBYyxvQkFBZCxzQ0FBYzt1REFBQztBQUl4QjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzQ0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDO2tEQUNyQyxzQ0FBYyxvQkFBZCxzQ0FBYzt1REFBQztrQ0FiYix1QkFBdUI7SUFEbkMsSUFBQSxnQkFBTSxFQUFDLDJCQUEyQixDQUFDO0dBQ3ZCLHVCQUF1QixDQWNuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLXJlZmVyZW5jZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5Q29sdW1uLCBNYW55VG9PbmUsIEpvaW5Db2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9yZWZlcmVuY2VzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSB7XG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3NyY19jb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgc291cmNlSWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAndGd0X2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICB0YXJnZXRJZCE6IG51bWJlcjtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnc3JjX2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBzb3VyY2U/OiBDb3JyZXNwb25kZW5jZTtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndGd0X2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICB0YXJnZXQ/OiBDb3JyZXNwb25kZW5jZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496.map new file mode 100644 index 0000000..2444cbd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/correspondencereferenceentity_6f56be445ca1f5393cdf21aec2e09496.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-reference.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AAGlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAcnC,CAAA;AAdY,0DAAuB;AAElC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;;yDAC/B;AAGlB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;;yDAC/B;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;kDACrC,sCAAc,oBAAd,sCAAc;uDAAC;AAIxB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;kDACrC,sCAAc,oBAAd,sCAAc;uDAAC;kCAbb,uBAAuB;IADnC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,uBAAuB,CAcnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-reference.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\nimport { Correspondence } from './correspondence.entity';\n\n@Entity('correspondence_references')\nexport class CorrespondenceReference {\n @PrimaryColumn({ name: 'src_correspondence_id' })\n sourceId!: number;\n\n @PrimaryColumn({ name: 'tgt_correspondence_id' })\n targetId!: number;\n\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'src_correspondence_id' })\n source?: Correspondence;\n\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'tgt_correspondence_id' })\n target?: Correspondence;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d new file mode 100644 index 0000000..f668e60 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d @@ -0,0 +1,58 @@ +d1f644f9fc5b52e63c0cb88535d3596a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingSubCategory = void 0; +const typeorm_1 = require("typeorm"); +let ShopDrawingSubCategory = class ShopDrawingSubCategory { +}; +exports.ShopDrawingSubCategory = ShopDrawingSubCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_code', length: 50, unique: true }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "subCategoryCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_name', length: 255 }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "subCategoryName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], ShopDrawingSubCategory.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingSubCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingSubCategory.prototype, "updatedAt", void 0); +exports.ShopDrawingSubCategory = ShopDrawingSubCategory = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_sub_categories') +], ShopDrawingSubCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFHVixJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUFzQjtDQTJCbEMsQ0FBQTtBQTNCWSx3REFBc0I7QUFFakM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztrREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt5REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0RBQ3ZDO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7K0RBQzFCO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzJEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt5REFDeEI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0RBQzFCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3lEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3lEQUFDO2lDQTFCTixzQkFBc0I7SUFEbEMsSUFBQSxnQkFBTSxFQUFDLDZCQUE2QixDQUFDO0dBQ3pCLHNCQUFzQixDQTJCbEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnc2hvcF9kcmF3aW5nX3N1Yl9jYXRlZ29yaWVzJylcbmV4cG9ydCBjbGFzcyBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICEgKOC4leC4seC4p+C4l+C4teC5iCBlcnJvcilcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3RJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9jb2RlJywgbGVuZ3RoOiA1MCwgdW5pcXVlOiB0cnVlIH0pXG4gIHN1YkNhdGVnb3J5Q29kZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgc3ViQ2F0ZWdvcnlOYW1lITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc29ydF9vcmRlcicsIGRlZmF1bHQ6IDAgfSlcbiAgc29ydE9yZGVyITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d.map new file mode 100644 index 0000000..0efb29f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6f/shopdrawingsubcategoryentity_6fdc9993ff00a40e652c39369a986c8d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-sub-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CA2BlC,CAAA;AA3BY,wDAAsB;AAEjC;IADC,IAAA,gCAAsB,GAAE;;kDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;yDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;+DACvC;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;+DAC1B;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;yDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wDAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;yDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;yDAAC;iCA1BN,sBAAsB;IADlC,IAAA,gBAAM,EAAC,6BAA6B,CAAC;GACzB,sBAAsB,CA2BlC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-sub-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\n\n@Entity('shop_drawing_sub_categories')\nexport class ShopDrawingSubCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม ! (ตัวที่ error)\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'sub_category_code', length: 50, unique: true })\n subCategoryCode!: string; // เติม !\n\n @Column({ name: 'sub_category_name', length: 255 })\n subCategoryName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea new file mode 100644 index 0000000..497a104 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea @@ -0,0 +1,60 @@ +d07a108f4201dfee75306d69b994fde2 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingCategory = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingCategory = class ContractDrawingCategory { +}; +exports.ContractDrawingCategory = ContractDrawingCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "catCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "catName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingCategory.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingCategory.prototype, "project", void 0); +exports.ContractDrawingCategory = ContractDrawingCategory = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_cats') +], ContractDrawingCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctY2F0ZWdvcnkuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FRaUI7QUFDakIsMEVBQWdFO0FBR3pELElBQU0sdUJBQXVCLEdBQTdCLE1BQU0sdUJBQXVCO0NBNEJuQyxDQUFBO0FBNUJZLDBEQUF1QjtBQUVsQztJQURDLElBQUEsZ0NBQXNCLEdBQUU7O21EQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7OzBEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3dEQUN4QjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt3REFDekI7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NERBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7OzBEQUN4QjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUlqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87d0RBQUM7a0NBM0JQLHVCQUF1QjtJQURuQyxJQUFBLGdCQUFNLEVBQUMsdUJBQXVCLENBQUM7R0FDbkIsdUJBQXVCLENBNEJuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcY29udHJhY3QtZHJhd2luZy1jYXRlZ29yeS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5cbkBFbnRpdHkoJ2NvbnRyYWN0X2RyYXdpbmdfY2F0cycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nQ2F0ZWdvcnkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY2F0X2NvZGUnLCBsZW5ndGg6IDUwIH0pXG4gIGNhdENvZGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjYXRfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIGNhdE5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea.map new file mode 100644 index 0000000..6d2b3a1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/contractdrawingcategoryentity_7571b26d19f2bd90122b25c9504bdbea.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA4BnC,CAAA;AA5BY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;0DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;wDACxB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wDACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;wDAAC;kCA3BP,uBAAuB;IADnC,IAAA,gBAAM,EAAC,uBAAuB,CAAC;GACnB,uBAAuB,CA4BnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_cats')\nexport class ContractDrawingCategory {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'cat_code', length: 50 })\n catCode!: string;\n\n @Column({ name: 'cat_name', length: 255 })\n catName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833 new file mode 100644 index 0000000..b062429 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833 @@ -0,0 +1,95 @@ +20ec77fc0f60950bbd1662e0b41ad4db +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-instance.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowInstance = exports.WorkflowStatus = void 0; +const typeorm_1 = require("typeorm"); +const workflow_definition_entity_1 = require("./workflow-definition.entity"); +var WorkflowStatus; +(function (WorkflowStatus) { + WorkflowStatus["ACTIVE"] = "ACTIVE"; + WorkflowStatus["COMPLETED"] = "COMPLETED"; + WorkflowStatus["CANCELLED"] = "CANCELLED"; + WorkflowStatus["TERMINATED"] = "TERMINATED"; +})(WorkflowStatus || (exports.WorkflowStatus = WorkflowStatus = {})); +/** + * เก็บสถานะการเดินเรื่องของเอกสารแต่ละใบ (Runtime State) + */ +let WorkflowInstance = class WorkflowInstance { +}; +exports.WorkflowInstance = WorkflowInstance; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowInstance.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => workflow_definition_entity_1.WorkflowDefinition), + (0, typeorm_1.JoinColumn)({ name: 'definition_id' }), + __metadata("design:type", typeof (_a = typeof workflow_definition_entity_1.WorkflowDefinition !== "undefined" && workflow_definition_entity_1.WorkflowDefinition) === "function" ? _a : Object) +], WorkflowInstance.prototype, "definition", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'definition_id' }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "definitionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'entity_type', + length: 50, + comment: 'ประเภทเอกสาร เช่น rfa, correspondence', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "entityType", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'entity_id', + length: 50, + comment: 'ID ของเอกสาร (String/UUID)', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "entityId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'current_state', + length: 50, + comment: 'ชื่อ State ปัจจุบัน เช่น DRAFT, IN_REVIEW', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "currentState", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: WorkflowStatus, + default: WorkflowStatus.ACTIVE, + comment: 'สถานะภาพรวมของ Instance', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: 'Runtime Context Data' }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowInstance.prototype, "context", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowInstance.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], WorkflowInstance.prototype, "updatedAt", void 0); +exports.WorkflowInstance = WorkflowInstance = __decorate([ + (0, typeorm_1.Entity)('workflow_instances'), + (0, typeorm_1.Index)(['entityType', 'entityId']) // เพื่อค้นหาว่าเอกสารนี้ (เช่น RFA-001) อยู่ขั้นตอนไหน + , + (0, typeorm_1.Index)(['currentState']) // เพื่อ Dashboard: "มีงานค้างที่ขั้นตอนไหนบ้าง" +], WorkflowInstance); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctaW5zdGFuY2UuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7QUFBQSx5RUFBeUU7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBU2lCO0FBQ2pCLDZFQUFrRTtBQUVsRSxJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIseUNBQXVCLENBQUE7SUFDdkIseUNBQXVCLENBQUE7SUFDdkIsMkNBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLGNBQWMsOEJBQWQsY0FBYyxRQUt6QjtBQUVEOztHQUVHO0FBSUksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBZ0I7Q0FvRDVCLENBQUE7QUFwRFksNENBQWdCO0FBRTNCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxNQUFNLENBQUM7OzRDQUNuQjtBQUtaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLCtDQUFrQixDQUFDO0lBQ25DLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztrREFDekIsK0NBQWtCLG9CQUFsQiwrQ0FBa0I7b0RBQUM7QUFHaEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O3NEQUNaO0FBUXRCO0lBTEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLGFBQWE7UUFDbkIsTUFBTSxFQUFFLEVBQUU7UUFDVixPQUFPLEVBQUUsdUNBQXVDO0tBQ2pELENBQUM7O29EQUNrQjtBQU9wQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsT0FBTyxFQUFFLDRCQUE0QjtLQUN0QyxDQUFDOztrREFDZ0I7QUFPbEI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsZUFBZTtRQUNyQixNQUFNLEVBQUUsRUFBRTtRQUNWLE9BQU8sRUFBRSwyQ0FBMkM7S0FDckQsQ0FBQzs7c0RBQ29CO0FBUXRCO0lBTkMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsY0FBYztRQUNwQixPQUFPLEVBQUUsY0FBYyxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQyxDQUFDOztnREFDc0I7QUFLeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLENBQUM7a0RBQ2hFLE1BQU0sb0JBQU4sTUFBTTtpREFBa0I7QUFHbEM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7bURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7bURBQUM7MkJBbkROLGdCQUFnQjtJQUg1QixJQUFBLGdCQUFNLEVBQUMsb0JBQW9CLENBQUM7SUFDNUIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyx1REFBdUQ7O0lBQ3pGLElBQUEsZUFBSyxFQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnREFBZ0Q7R0FDNUQsZ0JBQWdCLENBb0Q1QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXGVudGl0aWVzXFx3b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvd29ya2Zsb3ctZW5naW5lL2VudGl0aWVzL3dvcmtmbG93LWluc3RhbmNlLmVudGl0eS50c1xuXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBXb3JrZmxvd0RlZmluaXRpb24gfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24uZW50aXR5JztcblxuZXhwb3J0IGVudW0gV29ya2Zsb3dTdGF0dXMge1xuICBBQ1RJVkUgPSAnQUNUSVZFJywgLy8g4LiB4Liz4Lil4Lix4LiH4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4LijXG4gIENPTVBMRVRFRCA9ICdDT01QTEVURUQnLCAvLyDguIjguJrguIHguKPguLDguJrguKfguJnguIHguLLguKMgKOC4luC4tuC4hyBUZXJtaW5hbCBTdGF0ZSlcbiAgQ0FOQ0VMTEVEID0gJ0NBTkNFTExFRCcsIC8vIOC4luC4ueC4geC4ouC4geC5gOC4peC4tOC4geC4geC4peC4suC4h+C4hOC4seC4mVxuICBURVJNSU5BVEVEID0gJ1RFUk1JTkFURUQnLCAvLyDguJbguLnguIHguJrguLHguIfguITguLHguJrguIjguJrguYLguJTguKLguKPguLDguJrguJog4Lir4Lij4Li34LitIEVycm9yXG59XG5cbi8qKlxuICog4LmA4LiB4LmH4Lia4Liq4LiW4Liy4LiZ4Liw4LiB4Liy4Lij4LmA4LiU4Li04LiZ4LmA4Lij4Li34LmI4Lit4LiH4LiC4Lit4LiH4LmA4Lit4LiB4Liq4Liy4Lij4LmB4LiV4LmI4Lil4Liw4LmD4LiaIChSdW50aW1lIFN0YXRlKVxuICovXG5ARW50aXR5KCd3b3JrZmxvd19pbnN0YW5jZXMnKVxuQEluZGV4KFsnZW50aXR5VHlwZScsICdlbnRpdHlJZCddKSAvLyDguYDguJ7guLfguYjguK3guITguYnguJnguKvguLLguKfguYjguLLguYDguK3guIHguKrguLLguKPguJnguLXguYkgKOC5gOC4iuC5iOC4mSBSRkEtMDAxKSDguK3guKLguLnguYjguILguLHguYnguJnguJXguK3guJnguYTguKvguJlcbkBJbmRleChbJ2N1cnJlbnRTdGF0ZSddKSAvLyDguYDguJ7guLfguYjguK0gRGFzaGJvYXJkOiBcIuC4oeC4teC4h+C4suC4meC4hOC5ieC4suC4h+C4l+C4teC5iOC4guC4seC5ieC4meC4leC4reC4meC5hOC4q+C4meC4muC5ieC4suC4h1wiXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dJbnN0YW5jZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCd1dWlkJylcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLy8g4Lic4Li54LiB4LiB4Lix4LiaIERlZmluaXRpb24g4LmA4Lie4Li34LmI4Lit4Lij4Li54LmJ4Lin4LmI4Liy4LmD4LiK4LmJ4LiB4LiO4LiK4Li44LiU4LmE4Lir4LiZIChWZXJzaW9uIOC5hOC4q+C4mSlcbiAgQE1hbnlUb09uZSgoKSA9PiBXb3JrZmxvd0RlZmluaXRpb24pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2RlZmluaXRpb25faWQnIH0pXG4gIGRlZmluaXRpb24hOiBXb3JrZmxvd0RlZmluaXRpb247XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZWZpbml0aW9uX2lkJyB9KVxuICBkZWZpbml0aW9uSWQhOiBzdHJpbmc7XG5cbiAgLy8gUG9seW1vcnBoaWMgUmVsYXRpb246IOC5gOC4iuC4t+C5iOC4reC4oeC4geC4seC4muC5gOC4reC4geC4quC4suC4o+C5hOC4lOC5ieC4q+C4peC4suC4ouC4m+C4o+C4sOC5gOC4oOC4lyAoUkZBLCBDT1JSLCBldGMuKSDguYLguJTguKLguYTguKHguYjguJXguYnguK3guIcgRm9yZWlnbiBLZXkg4LiI4Lij4Li04LiHXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdlbnRpdHlfdHlwZScsXG4gICAgbGVuZ3RoOiA1MCxcbiAgICBjb21tZW50OiAn4Lib4Lij4Liw4LmA4Lig4LiX4LmA4Lit4LiB4Liq4Liy4LijIOC5gOC4iuC5iOC4mSByZmEsIGNvcnJlc3BvbmRlbmNlJyxcbiAgfSlcbiAgZW50aXR5VHlwZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZW50aXR5X2lkJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGNvbW1lbnQ6ICdJRCDguILguK3guIfguYDguK3guIHguKrguLLguKMgKFN0cmluZy9VVUlEKScsXG4gIH0pXG4gIGVudGl0eUlkITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdjdXJyZW50X3N0YXRlJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGNvbW1lbnQ6ICfguIrguLfguYjguK0gU3RhdGUg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZIOC5gOC4iuC5iOC4mSBEUkFGVCwgSU5fUkVWSUVXJyxcbiAgfSlcbiAgY3VycmVudFN0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBXb3JrZmxvd1N0YXR1cyxcbiAgICBkZWZhdWx0OiBXb3JrZmxvd1N0YXR1cy5BQ1RJVkUsXG4gICAgY29tbWVudDogJ+C4quC4luC4suC4meC4sOC4oOC4suC4nuC4o+C4p+C4oeC4guC4reC4hyBJbnN0YW5jZScsXG4gIH0pXG4gIHN0YXR1cyE6IFdvcmtmbG93U3RhdHVzO1xuXG4gIC8vIENvbnRleHQ6IOC5gOC4geC5h+C4muC4leC4seC4p+C5geC4m+C4o+C4l+C4teC5iOC4iOC4s+C5gOC4m+C5h+C4meC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4mSBXb3JrZmxvd1xuICAvLyDguYDguIrguYjguJkgeyBcImFtb3VudFwiOiA1MDAwMDAsIFwicmVxdWVzdGVyX3JvbGVcIjogXCJFTkdJTkVFUlwiLCBcImFwcHJvdmVyX2lkc1wiOiBbMSwgMl0gfVxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSwgY29tbWVudDogJ1J1bnRpbWUgQ29udGV4dCBEYXRhJyB9KVxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833.map new file mode 100644 index 0000000..5edfda8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/79/workflowinstanceentity_7974b5283b44c525ac220408bcae9833.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-instance.entity.ts","mappings":";AAAA,yEAAyE;;;;;;;;;;;;;AAEzE,qCASiB;AACjB,6EAAkE;AAElE,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mCAAiB,CAAA;IACjB,yCAAuB,CAAA;IACvB,yCAAuB,CAAA;IACvB,2CAAyB,CAAA;AAC3B,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED;;GAEG;AAII,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAoD5B,CAAA;AApDY,4CAAgB;AAE3B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;4CACnB;AAKZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+CAAkB,CAAC;IACnC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;kDACzB,+CAAkB,oBAAlB,+CAAkB;oDAAC;AAGhC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;sDACZ;AAQtB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,uCAAuC;KACjD,CAAC;;oDACkB;AAOpB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,4BAA4B;KACtC,CAAC;;kDACgB;AAOlB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,2CAA2C;KACrD,CAAC;;sDACoB;AAQtB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,cAAc,CAAC,MAAM;QAC9B,OAAO,EAAE,yBAAyB;KACnC,CAAC;;gDACsB;AAKxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;kDAChE,MAAM,oBAAN,MAAM;iDAAkB;AAGlC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;mDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;mDAAC;2BAnDN,gBAAgB;IAH5B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;IAC5B,IAAA,eAAK,EAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,uDAAuD;;IACzF,IAAA,eAAK,EAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gDAAgD;GAC5D,gBAAgB,CAoD5B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-instance.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-instance.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { WorkflowDefinition } from './workflow-definition.entity';\n\nexport enum WorkflowStatus {\n ACTIVE = 'ACTIVE', // กำลังดำเนินการ\n COMPLETED = 'COMPLETED', // จบกระบวนการ (ถึง Terminal State)\n CANCELLED = 'CANCELLED', // ถูกยกเลิกกลางคัน\n TERMINATED = 'TERMINATED', // ถูกบังคับจบโดยระบบ หรือ Error\n}\n\n/**\n * เก็บสถานะการเดินเรื่องของเอกสารแต่ละใบ (Runtime State)\n */\n@Entity('workflow_instances')\n@Index(['entityType', 'entityId']) // เพื่อค้นหาว่าเอกสารนี้ (เช่น RFA-001) อยู่ขั้นตอนไหน\n@Index(['currentState']) // เพื่อ Dashboard: \"มีงานค้างที่ขั้นตอนไหนบ้าง\"\nexport class WorkflowInstance {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n // ผูกกับ Definition เพื่อรู้ว่าใช้กฎชุดไหน (Version ไหน)\n @ManyToOne(() => WorkflowDefinition)\n @JoinColumn({ name: 'definition_id' })\n definition!: WorkflowDefinition;\n\n @Column({ name: 'definition_id' })\n definitionId!: string;\n\n // Polymorphic Relation: เชื่อมกับเอกสารได้หลายประเภท (RFA, CORR, etc.) โดยไม่ต้อง Foreign Key จริง\n @Column({\n name: 'entity_type',\n length: 50,\n comment: 'ประเภทเอกสาร เช่น rfa, correspondence',\n })\n entityType!: string;\n\n @Column({\n name: 'entity_id',\n length: 50,\n comment: 'ID ของเอกสาร (String/UUID)',\n })\n entityId!: string;\n\n @Column({\n name: 'current_state',\n length: 50,\n comment: 'ชื่อ State ปัจจุบัน เช่น DRAFT, IN_REVIEW',\n })\n currentState!: string;\n\n @Column({\n type: 'enum',\n enum: WorkflowStatus,\n default: WorkflowStatus.ACTIVE,\n comment: 'สถานะภาพรวมของ Instance',\n })\n status!: WorkflowStatus;\n\n // Context: เก็บตัวแปรที่จำเป็นสำหรับการตัดสินใจใน Workflow\n // เช่น { \"amount\": 500000, \"requester_role\": \"ENGINEER\", \"approver_ids\": [1, 2] }\n @Column({ type: 'json', nullable: true, comment: 'Runtime Context Data' })\n context?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7 new file mode 100644 index 0000000..f79ea23 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7 @@ -0,0 +1,127 @@ +955257e69863dc481082ae698de0a889 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsBuiltDrawingRevision = void 0; +const typeorm_1 = require("typeorm"); +const asbuilt_drawing_entity_1 = require("./asbuilt-drawing.entity"); +const shop_drawing_revision_entity_1 = require("./shop-drawing-revision.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let AsBuiltDrawingRevision = class AsBuiltDrawingRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.AsBuiltDrawingRevision = AsBuiltDrawingRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'asbuilt_drawing_id' }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "asBuiltDrawingId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'title', length: 255 }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', length: 10, nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], AsBuiltDrawingRevision.prototype, "revisionDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'legacy_drawing_number', length: 100, nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "legacyDrawingNumber", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], AsBuiltDrawingRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_current', + type: 'boolean', + nullable: true, + default: null, + }), + __metadata("design:type", Object) +], AsBuiltDrawingRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => asbuilt_drawing_entity_1.AsBuiltDrawing, (drawing) => drawing.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'asbuilt_drawing_id' }), + __metadata("design:type", typeof (_c = typeof asbuilt_drawing_entity_1.AsBuiltDrawing !== "undefined" && asbuilt_drawing_entity_1.AsBuiltDrawing) === "function" ? _c : Object) +], AsBuiltDrawingRevision.prototype, "asBuiltDrawing", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], AsBuiltDrawingRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], AsBuiltDrawingRevision.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => shop_drawing_revision_entity_1.ShopDrawingRevision), + (0, typeorm_1.JoinTable)({ + name: 'asbuilt_revision_shop_revisions_refs', + joinColumn: { + name: 'asbuilt_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + }), + __metadata("design:type", Array) +], AsBuiltDrawingRevision.prototype, "shopDrawingRevisions", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'asbuilt_drawing_revision_attachments', + joinColumn: { + name: 'asbuilt_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], AsBuiltDrawingRevision.prototype, "attachments", void 0); +exports.AsBuiltDrawingRevision = AsBuiltDrawingRevision = __decorate([ + (0, typeorm_1.Entity)('asbuilt_drawing_revisions'), + (0, typeorm_1.Unique)(['asBuiltDrawingId', 'isCurrent']) +], AsBuiltDrawingRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixxRUFBMEQ7QUFDMUQsaUZBQXFFO0FBQ3JFLCtGQUFxRjtBQUNyRixpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUlyQyxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUF1QixTQUFRLGlDQUFjO0NBb0Z6RCxDQUFBO0FBcEZZLHdEQUFzQjtBQUdqQztJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztrREFDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7O2dFQUNiO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzhEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3FEQUN4QjtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs2REFDeEM7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNqRCxJQUFJLG9CQUFKLElBQUk7NERBQUM7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MkRBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzttRUFDMUM7QUFHN0I7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7eURBQUM7QUFRakI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOzt5REFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7eURBQzVCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUM1QjtBQU9uQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx1Q0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1FBQy9ELFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUM7SUFDRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztrREFDMUIsdUNBQWMsb0JBQWQsdUNBQWM7OERBQUM7QUFJaEM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBZWY7SUFaQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMsa0RBQW1CLENBQUM7SUFDckMsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsNkJBQTZCO1lBQ25DLG9CQUFvQixFQUFFLElBQUk7U0FDM0I7UUFDRCxpQkFBaUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLG9CQUFvQixFQUFFLElBQUk7U0FDM0I7S0FDRixDQUFDOztvRUFDMkM7QUFZN0M7SUFUQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMsOEJBQVUsQ0FBQztJQUM1QixJQUFBLG1CQUFTLEVBQUM7UUFDVCxJQUFJLEVBQUUsc0NBQXNDO1FBQzVDLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSw2QkFBNkI7WUFDbkMsb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtRQUNELGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7S0FDekUsQ0FBQzs7MkRBQ3lCO2lDQW5GaEIsc0JBQXNCO0lBRmxDLElBQUEsZ0JBQU0sRUFBQywyQkFBMkIsQ0FBQztJQUNuQyxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUMsQ0FBQztHQUM3QixzQkFBc0IsQ0FvRmxDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxhc2J1aWx0LWRyYXdpbmctcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbiAgVW5pcXVlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEFzQnVpbHREcmF3aW5nIH0gZnJvbSAnLi9hc2J1aWx0LWRyYXdpbmcuZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuL3Nob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25zJylcbkBVbmlxdWUoWydhc0J1aWx0RHJhd2luZ0lkJywgJ2lzQ3VycmVudCddKVxuZXhwb3J0IGNsYXNzIEFzQnVpbHREcmF3aW5nUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FzYnVpbHRfZHJhd2luZ19pZCcgfSlcbiAgYXNCdWlsdERyYXdpbmdJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0aXRsZScsIGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbGFiZWwnLCBsZW5ndGg6IDEwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpc2lvbkxhYmVsPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fZGF0ZScsIHR5cGU6ICdkYXRlJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmV2aXNpb25EYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2xlZ2FjeV9kcmF3aW5nX251bWJlcicsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBsZWdhY3lEcmF3aW5nTnVtYmVyPzogc3RyaW5nO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2lzX2N1cnJlbnQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICBkZWZhdWx0OiBudWxsLFxuICB9KVxuICBpc0N1cnJlbnQ/OiBib29sZWFuIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IEFzQnVpbHREcmF3aW5nLCAoZHJhd2luZykgPT4gZHJhd2luZy5yZXZpc2lvbnMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfaWQnIH0pXG4gIGFzQnVpbHREcmF3aW5nITogQXNCdWlsdERyYXdpbmc7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JyB9KVxuICBjcmVhdG9yPzogVXNlcjtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYnknIH0pXG4gIHVwZGF0ZXI/OiBVc2VyO1xuXG4gIC8vIFJlbGF0aW9uIHRvIFNob3AgRHJhd2luZyBSZXZpc2lvbnMgKE06TilcbiAgQE1hbnlUb01hbnkoKCkgPT4gU2hvcERyYXdpbmdSZXZpc2lvbilcbiAgQEpvaW5UYWJsZSh7XG4gICAgbmFtZTogJ2FzYnVpbHRfcmV2aXNpb25fc2hvcF9yZXZpc2lvbnNfcmVmcycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ2FzYnVpbHRfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7XG4gICAgICBuYW1lOiAnc2hvcF9kcmF3aW5nX3JldmlzaW9uX2lkJyxcbiAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnLFxuICAgIH0sXG4gIH0pXG4gIHNob3BEcmF3aW5nUmV2aXNpb25zITogU2hvcERyYXdpbmdSZXZpc2lvbltdO1xuXG4gIC8vIEF0dGFjaG1lbnRzIChNOk4pXG4gIEBNYW55VG9NYW55KCgpID0+IEF0dGFjaG1lbnQpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25fYXR0YWNobWVudHMnLFxuICAgIGpvaW5Db2x1bW46IHtcbiAgICAgIG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25faWQnLFxuICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcsXG4gICAgfSxcbiAgICBpbnZlcnNlSm9pbkNvbHVtbjogeyBuYW1lOiAnYXR0YWNobWVudF9pZCcsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnIH0sXG4gIH0pXG4gIGF0dGFjaG1lbnRzITogQXR0YWNobWVudFtdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7.map new file mode 100644 index 0000000..b17fe75 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/asbuiltdrawingrevisionentity_7b0f0e99a66843abc7a1e9936808bbe7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n Unique,\n} from 'typeorm';\nimport { AsBuiltDrawing } from './asbuilt-drawing.entity';\nimport { ShopDrawingRevision } from './shop-drawing-revision.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('asbuilt_drawing_revisions')\n@Unique(['asBuiltDrawingId', 'isCurrent'])\nexport class AsBuiltDrawingRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'asbuilt_drawing_id' })\n asBuiltDrawingId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number;\n\n @Column({ name: 'title', length: 255 })\n title!: string;\n\n @Column({ name: 'revision_label', length: 10, nullable: true })\n revisionLabel?: string;\n\n @Column({ name: 'revision_date', type: 'date', nullable: true })\n revisionDate?: Date;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'legacy_drawing_number', length: 100, nullable: true })\n legacyDrawingNumber?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({\n name: 'is_current',\n type: 'boolean',\n nullable: true,\n default: null,\n })\n isCurrent?: boolean | null;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => AsBuiltDrawing, (drawing) => drawing.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'asbuilt_drawing_id' })\n asBuiltDrawing!: AsBuiltDrawing;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n // Relation to Shop Drawing Revisions (M:N)\n @ManyToMany(() => ShopDrawingRevision)\n @JoinTable({\n name: 'asbuilt_revision_shop_revisions_refs',\n joinColumn: {\n name: 'asbuilt_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n })\n shopDrawingRevisions!: ShopDrawingRevision[];\n\n // Attachments (M:N)\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'asbuilt_drawing_revision_attachments',\n joinColumn: {\n name: 'asbuilt_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672 new file mode 100644 index 0000000..4c2ffc5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672 @@ -0,0 +1,49 @@ +ea5854e4f402d5a4cd11e53728564e14 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var ManualOverrideService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ManualOverrideService = void 0; +const common_1 = require("@nestjs/common"); +const counter_service_1 = require("./counter.service"); +const audit_service_1 = require("./audit.service"); +let ManualOverrideService = ManualOverrideService_1 = class ManualOverrideService { + constructor(counterService, auditService) { + this.counterService = counterService; + this.auditService = auditService; + this.logger = new common_1.Logger(ManualOverrideService_1.name); + } + async applyOverride(dto, userId) { + this.logger.log(`Applying manual override by user ${userId}: ${JSON.stringify(dto)}`); + // 1. Force update the counter + await this.counterService.forceUpdateCounter(dto, dto.newLastNumber); + // 2. Log Audit + await this.auditService.log({ + documentId: undefined, // No specific document + documentNumber: `OVERRIDE-TO-${dto.newLastNumber}`, + operation: 'MANUAL_OVERRIDE', + status: 'MANUAL', + counterKey: dto, // CounterKeyDto part of ManualOverrideDto + templateUsed: 'MANUAL_OVERRIDE', + userId: userId, + isSuccess: true, + metadata: { reason: dto.reason, reference: dto.reference }, + totalDurationMs: 0, + }); + } +}; +exports.ManualOverrideService = ManualOverrideService; +exports.ManualOverrideService = ManualOverrideService = ManualOverrideService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _a : Object, typeof (_b = typeof audit_service_1.AuditService !== "undefined" && audit_service_1.AuditService) === "function" ? _b : Object]) +], ManualOverrideService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcbWFudWFsLW92ZXJyaWRlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBb0Q7QUFDcEQsdURBQW1EO0FBQ25ELG1EQUErQztBQUl4QyxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHaEMsWUFDbUIsY0FBOEIsRUFDOUIsWUFBMEI7UUFEMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBSjVCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx1QkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUs5RCxDQUFDO0lBRUosS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFzQixFQUFFLE1BQWM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2Isb0NBQW9DLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3JFLENBQUM7UUFFRiw4QkFBOEI7UUFDOUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckUsZUFBZTtRQUNmLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDMUIsVUFBVSxFQUFFLFNBQVMsRUFBRSx1QkFBdUI7WUFDOUMsY0FBYyxFQUFFLGVBQWUsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUNsRCxTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFVBQVUsRUFBRSxHQUF5QyxFQUFFLDBDQUEwQztZQUNqRyxZQUFZLEVBQUUsaUJBQWlCO1lBQy9CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUMxRCxlQUFlLEVBQUUsQ0FBQztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YsQ0FBQTtBQTlCWSxzREFBcUI7Z0NBQXJCLHFCQUFxQjtJQURqQyxJQUFBLG1CQUFVLEdBQUU7eURBS3dCLGdDQUFjLG9CQUFkLGdDQUFjLG9EQUNoQiw0QkFBWSxvQkFBWiw0QkFBWTtHQUxsQyxxQkFBcUIsQ0E4QmpDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXG1hbnVhbC1vdmVycmlkZS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ291bnRlclNlcnZpY2UgfSBmcm9tICcuL2NvdW50ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJy4vYXVkaXQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hbnVhbE92ZXJyaWRlRHRvIH0gZnJvbSAnLi4vZHRvL21hbnVhbC1vdmVycmlkZS5kdG8nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTWFudWFsT3ZlcnJpZGVTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoTWFudWFsT3ZlcnJpZGVTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY291bnRlclNlcnZpY2U6IENvdW50ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNlcnZpY2U6IEF1ZGl0U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgYXBwbHlPdmVycmlkZShkdG86IE1hbnVhbE92ZXJyaWRlRHRvLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICBgQXBwbHlpbmcgbWFudWFsIG92ZXJyaWRlIGJ5IHVzZXIgJHt1c2VySWR9OiAke0pTT04uc3RyaW5naWZ5KGR0byl9YFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyAxLiBGb3JjZSB1cGRhdGUgdGhlIGNvdW50ZXJcclxuICAgIGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuZm9yY2VVcGRhdGVDb3VudGVyKGR0bywgZHRvLm5ld0xhc3ROdW1iZXIpO1xyXG5cclxuICAgIC8vIDIuIExvZyBBdWRpdFxyXG4gICAgYXdhaXQgdGhpcy5hdWRpdFNlcnZpY2UubG9nKHtcclxuICAgICAgZG9jdW1lbnRJZDogdW5kZWZpbmVkLCAvLyBObyBzcGVjaWZpYyBkb2N1bWVudFxyXG4gICAgICBkb2N1bWVudE51bWJlcjogYE9WRVJSSURFLVRPLSR7ZHRvLm5ld0xhc3ROdW1iZXJ9YCxcclxuICAgICAgb3BlcmF0aW9uOiAnTUFOVUFMX09WRVJSSURFJyxcclxuICAgICAgc3RhdHVzOiAnTUFOVUFMJyxcclxuICAgICAgY291bnRlcktleTogZHRvIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIC8vIENvdW50ZXJLZXlEdG8gcGFydCBvZiBNYW51YWxPdmVycmlkZUR0b1xyXG4gICAgICB0ZW1wbGF0ZVVzZWQ6ICdNQU5VQUxfT1ZFUlJJREUnLFxyXG4gICAgICB1c2VySWQ6IHVzZXJJZCxcclxuICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24sIHJlZmVyZW5jZTogZHRvLnJlZmVyZW5jZSB9LFxyXG4gICAgICB0b3RhbER1cmF0aW9uTXM6IDAsXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672.map new file mode 100644 index 0000000..b055a1b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/manualoverrideservice_7b9238f128ae7fcbbbf80747fc6f0672.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.ts","mappings":";;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAmD;AACnD,mDAA+C;AAIxC,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAGhC,YACmB,cAA8B,EAC9B,YAA0B;QAD1B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,iBAAY,GAAZ,YAAY,CAAc;QAJ5B,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAK9D,CAAC;IAEJ,KAAK,CAAC,aAAa,CAAC,GAAsB,EAAE,MAAc;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,oCAAoC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QAEF,8BAA8B;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAErE,eAAe;QACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,SAAS,EAAE,uBAAuB;YAC9C,cAAc,EAAE,eAAe,GAAG,CAAC,aAAa,EAAE;YAClD,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,GAAyC,EAAE,0CAA0C;YACjG,YAAY,EAAE,iBAAiB;YAC/B,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;YAC1D,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA9BY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;yDAKwB,gCAAc,oBAAd,gCAAc,oDAChB,4BAAY,oBAAZ,4BAAY;GALlC,qBAAqB,CA8BjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\r\nimport { CounterService } from './counter.service';\r\nimport { AuditService } from './audit.service';\r\nimport { ManualOverrideDto } from '../dto/manual-override.dto';\r\n\r\n@Injectable()\r\nexport class ManualOverrideService {\r\n private readonly logger = new Logger(ManualOverrideService.name);\r\n\r\n constructor(\r\n private readonly counterService: CounterService,\r\n private readonly auditService: AuditService\r\n ) {}\r\n\r\n async applyOverride(dto: ManualOverrideDto, userId: number): Promise {\r\n this.logger.log(\r\n `Applying manual override by user ${userId}: ${JSON.stringify(dto)}`\r\n );\r\n\r\n // 1. Force update the counter\r\n await this.counterService.forceUpdateCounter(dto, dto.newLastNumber);\r\n\r\n // 2. Log Audit\r\n await this.auditService.log({\r\n documentId: undefined, // No specific document\r\n documentNumber: `OVERRIDE-TO-${dto.newLastNumber}`,\r\n operation: 'MANUAL_OVERRIDE',\r\n status: 'MANUAL',\r\n counterKey: dto as unknown as Record, // CounterKeyDto part of ManualOverrideDto\r\n templateUsed: 'MANUAL_OVERRIDE',\r\n userId: userId,\r\n isSuccess: true,\r\n metadata: { reason: dto.reason, reference: dto.reference },\r\n totalDurationMs: 0,\r\n });\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f new file mode 100644 index 0000000..ecd48ea --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f @@ -0,0 +1,92 @@ +81d3937f1ee1628acef873c64c726bd8 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const migration_service_1 = require("./migration.service"); +const typeorm_1 = require("@nestjs/typeorm"); +const import_transaction_entity_1 = require("./entities/import-transaction.entity"); +const correspondence_type_entity_1 = require("../correspondence/entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("../correspondence/entities/correspondence-status.entity"); +const project_entity_1 = require("../project/entities/project.entity"); +const typeorm_2 = require("typeorm"); +const migration_review_queue_entity_1 = require("./entities/migration-review-queue.entity"); +const migration_error_entity_1 = require("./entities/migration-error.entity"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +describe('MigrationService', () => { + let service; + const mockTransactionRepo = { + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + }; + const mockTypeRepo = { + findOne: jest.fn(), + }; + const mockStatusRepo = { + findOne: jest.fn(), + }; + const mockProjectRepo = { + findOne: jest.fn(), + }; + const mockQueryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + count: jest.fn(), + update: jest.fn(), + }, + }; + const mockDataSource = { + createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner), + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + migration_service_1.MigrationService, + { + provide: (0, typeorm_1.getRepositoryToken)(import_transaction_entity_1.ImportTransaction), + useValue: mockTransactionRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType), + useValue: mockTypeRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus), + useValue: mockStatusRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(project_entity_1.Project), + useValue: mockProjectRepo, + }, + { + provide: typeorm_2.DataSource, + useValue: mockDataSource, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(migration_review_queue_entity_1.MigrationReviewQueue), + useValue: { findOne: jest.fn(), create: jest.fn(), save: jest.fn() }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(migration_error_entity_1.MigrationError), + useValue: { create: jest.fn(), save: jest.fn() }, + }, + { + provide: file_storage_service_1.FileStorageService, + useValue: { importStagingFile: jest.fn() }, + }, + ], + }).compile(); + service = module.get(migration_service_1.MigrationService); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELDJEQUF1RDtBQUN2RCw2Q0FBcUQ7QUFDckQsb0ZBQXlFO0FBQ3pFLHNHQUEyRjtBQUMzRiwwR0FBK0Y7QUFDL0YsdUVBQTZEO0FBQzdELHFDQUFxQztBQUNyQyw0RkFBZ0Y7QUFDaEYsOEVBQW1FO0FBQ25FLHlGQUFvRjtBQUVwRixRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksT0FBeUIsQ0FBQztJQUU5QixNQUFNLG1CQUFtQixHQUFHO1FBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ2hCLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRztRQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNuQixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUc7UUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7S0FDbkIsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHO1FBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ25CLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRztRQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQzNCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDNUIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1NBQ2xCO0tBQ0YsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDO0tBQzlELENBQUM7SUFFRixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxvQ0FBZ0I7Z0JBQ2hCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLDZDQUFpQixDQUFDO29CQUM5QyxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5QjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsSUFBQSw0QkFBa0IsRUFBQywrQ0FBa0IsQ0FBQztvQkFDL0MsUUFBUSxFQUFFLFlBQVk7aUJBQ3ZCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLG1EQUFvQixDQUFDO29CQUNqRCxRQUFRLEVBQUUsY0FBYztpQkFDekI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsd0JBQU8sQ0FBQztvQkFDcEMsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxvQkFBVTtvQkFDbkIsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLG9EQUFvQixDQUFDO29CQUNqRCxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRTtpQkFDckU7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsdUNBQWMsQ0FBQztvQkFDM0MsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFO2lCQUNqRDtnQkFDRDtvQkFDRSxPQUFPLEVBQUUseUNBQWtCO29CQUMzQixRQUFRLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUU7aUJBQzNDO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsb0NBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWlncmF0aW9uU2VydmljZSB9IGZyb20gJy4vbWlncmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0UmVwb3NpdG9yeVRva2VuIH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IEltcG9ydFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnRpdGllcy9pbXBvcnQtdHJhbnNhY3Rpb24uZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVHlwZSB9IGZyb20gJy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBNaWdyYXRpb25SZXZpZXdRdWV1ZSB9IGZyb20gJy4vZW50aXRpZXMvbWlncmF0aW9uLXJldmlldy1xdWV1ZS5lbnRpdHknO1xuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1lcnJvci5lbnRpdHknO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XG5cbmRlc2NyaWJlKCdNaWdyYXRpb25TZXJ2aWNlJywgKCkgPT4ge1xuICBsZXQgc2VydmljZTogTWlncmF0aW9uU2VydmljZTtcblxuICBjb25zdCBtb2NrVHJhbnNhY3Rpb25SZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICBjcmVhdGU6IGplc3QuZm4oKSxcbiAgICBzYXZlOiBqZXN0LmZuKCksXG4gIH07XG5cbiAgY29uc3QgbW9ja1R5cGVSZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrU3RhdHVzUmVwbyA9IHtcbiAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gIH07XG5cbiAgY29uc3QgbW9ja1Byb2plY3RSZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrUXVlcnlSdW5uZXIgPSB7XG4gICAgY29ubmVjdDogamVzdC5mbigpLFxuICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcbiAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxuICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcbiAgICByZWxlYXNlOiBqZXN0LmZuKCksXG4gICAgbWFuYWdlcjoge1xuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgICBzYXZlOiBqZXN0LmZuKCksXG4gICAgICBjb3VudDogamVzdC5mbigpLFxuICAgICAgdXBkYXRlOiBqZXN0LmZuKCksXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBtb2NrRGF0YVNvdXJjZSA9IHtcbiAgICBjcmVhdGVRdWVyeVJ1bm5lcjogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrUXVlcnlSdW5uZXIpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTWlncmF0aW9uU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihJbXBvcnRUcmFuc2FjdGlvbiksXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tUcmFuc2FjdGlvblJlcG8sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1R5cGVSZXBvLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1N0YXR1c1JlcG8sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oUHJvamVjdCksXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tQcm9qZWN0UmVwbyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERhdGFTb3VyY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tEYXRhU291cmNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKE1pZ3JhdGlvblJldmlld1F1ZXVlKSxcbiAgICAgICAgICB1c2VWYWx1ZTogeyBmaW5kT25lOiBqZXN0LmZuKCksIGNyZWF0ZTogamVzdC5mbigpLCBzYXZlOiBqZXN0LmZuKCkgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihNaWdyYXRpb25FcnJvciksXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY3JlYXRlOiBqZXN0LmZuKCksIHNhdmU6IGplc3QuZm4oKSB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogRmlsZVN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7IGltcG9ydFN0YWdpbmdGaWxlOiBqZXN0LmZuKCkgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uU2VydmljZT4oTWlncmF0aW9uU2VydmljZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3Qoc2VydmljZSkudG9CZURlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f.map new file mode 100644 index 0000000..6d02c43 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/migrationservicespec_7bc28279d64f4b6df8862834313cd60f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { MigrationService } from './migration.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { ImportTransaction } from './entities/import-transaction.entity';\nimport { CorrespondenceType } from '../correspondence/entities/correspondence-type.entity';\nimport { CorrespondenceStatus } from '../correspondence/entities/correspondence-status.entity';\nimport { Project } from '../project/entities/project.entity';\nimport { DataSource } from 'typeorm';\nimport { MigrationReviewQueue } from './entities/migration-review-queue.entity';\nimport { MigrationError } from './entities/migration-error.entity';\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\n\ndescribe('MigrationService', () => {\n let service: MigrationService;\n\n const mockTransactionRepo = {\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n };\n\n const mockTypeRepo = {\n findOne: jest.fn(),\n };\n\n const mockStatusRepo = {\n findOne: jest.fn(),\n };\n\n const mockProjectRepo = {\n findOne: jest.fn(),\n };\n\n const mockQueryRunner = {\n connect: jest.fn(),\n startTransaction: jest.fn(),\n commitTransaction: jest.fn(),\n rollbackTransaction: jest.fn(),\n release: jest.fn(),\n manager: {\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n count: jest.fn(),\n update: jest.fn(),\n },\n };\n\n const mockDataSource = {\n createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner),\n };\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n MigrationService,\n {\n provide: getRepositoryToken(ImportTransaction),\n useValue: mockTransactionRepo,\n },\n {\n provide: getRepositoryToken(CorrespondenceType),\n useValue: mockTypeRepo,\n },\n {\n provide: getRepositoryToken(CorrespondenceStatus),\n useValue: mockStatusRepo,\n },\n {\n provide: getRepositoryToken(Project),\n useValue: mockProjectRepo,\n },\n {\n provide: DataSource,\n useValue: mockDataSource,\n },\n {\n provide: getRepositoryToken(MigrationReviewQueue),\n useValue: { findOne: jest.fn(), create: jest.fn(), save: jest.fn() },\n },\n {\n provide: getRepositoryToken(MigrationError),\n useValue: { create: jest.fn(), save: jest.fn() },\n },\n {\n provide: FileStorageService,\n useValue: { importStagingFile: jest.fn() },\n },\n ],\n }).compile();\n\n service = module.get(MigrationService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7 new file mode 100644 index 0000000..33525d4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7 @@ -0,0 +1,10 @@ +3f303250fff028a002627814751b5293 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateCorrespondenceDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const create_correspondence_dto_1 = require("./create-correspondence.dto"); +class UpdateCorrespondenceDto extends (0, swagger_1.PartialType)(create_correspondence_dto_1.CreateCorrespondenceDto) { +} +exports.UpdateCorrespondenceDto = UpdateCorrespondenceDto; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcdXBkYXRlLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEM7QUFDOUMsMkVBQXNFO0FBRXRFLE1BQWEsdUJBQXdCLFNBQVEsSUFBQSxxQkFBVyxFQUN0RCxtREFBdUIsQ0FDeEI7Q0FBRztBQUZKLDBEQUVJIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdG9cXHVwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFydGlhbFR5cGUgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuaW1wb3J0IHsgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gZXh0ZW5kcyBQYXJ0aWFsVHlwZShcbiAgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG9cbikge31cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7.map new file mode 100644 index 0000000..3351160 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/updatecorrespondencedto_7bc4e52a3a7d9d90fed5ec54a60395f7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\update-correspondence.dto.ts","mappings":";;;AAAA,6CAA8C;AAC9C,2EAAsE;AAEtE,MAAa,uBAAwB,SAAQ,IAAA,qBAAW,EACtD,mDAAuB,CACxB;CAAG;AAFJ,0DAEI","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\update-correspondence.dto.ts"],"sourcesContent":["import { PartialType } from '@nestjs/swagger';\nimport { CreateCorrespondenceDto } from './create-correspondence.dto';\n\nexport class UpdateCorrespondenceDto extends PartialType(\n CreateCorrespondenceDto\n) {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec new file mode 100644 index 0000000..242d724 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec @@ -0,0 +1,16 @@ +3bd675d66c9db29f86a7660a0ecc0925 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = void 0; +const md5_js_1 = require("./md5.js"); +const v35_js_1 = require("./v35.js"); +var v35_js_2 = require("./v35.js"); +Object.defineProperty(exports, "DNS", { enumerable: true, get: function () { return v35_js_2.DNS; } }); +Object.defineProperty(exports, "URL", { enumerable: true, get: function () { return v35_js_2.URL; } }); +function v3(value, namespace, buf, offset) { + return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset); +} +v3.DNS = v35_js_1.DNS; +v3.URL = v35_js_1.URL; +exports.default = v3; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjMuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2RyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkcsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBQ0QsRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUN0QixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2My5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSB2b2lkIDA7XG5jb25zdCBtZDVfanNfMSA9IHJlcXVpcmUoXCIuL21kNS5qc1wiKTtcbmNvbnN0IHYzNV9qc18xID0gcmVxdWlyZShcIi4vdjM1LmpzXCIpO1xudmFyIHYzNV9qc18yID0gcmVxdWlyZShcIi4vdjM1LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRE5TXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2MzVfanNfMi5ETlM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJVUkxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYzNV9qc18yLlVSTDsgfSB9KTtcbmZ1bmN0aW9uIHYzKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuICgwLCB2MzVfanNfMS5kZWZhdWx0KSgweDMwLCBtZDVfanNfMS5kZWZhdWx0LCB2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCk7XG59XG52My5ETlMgPSB2MzVfanNfMS5ETlM7XG52My5VUkwgPSB2MzVfanNfMS5VUkw7XG5leHBvcnRzLmRlZmF1bHQgPSB2MztcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec.map new file mode 100644 index 0000000..90dc485 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/v3_7b2bb99f75e9a0cef4d4441c2908c7ec.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v3.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC;AACD,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v3.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst md5_js_1 = require(\"./md5.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v3(value, namespace, buf, offset) {\n return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset);\n}\nv3.DNS = v35_js_1.DNS;\nv3.URL = v35_js_1.URL;\nexports.default = v3;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690 new file mode 100644 index 0000000..0ae90a4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690 @@ -0,0 +1,67 @@ +a89b193d148fe99e60c19f6a0e18634d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaType = void 0; +const typeorm_1 = require("typeorm"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); +let RfaType = class RfaType { + populateVirtualFields() { + this.typeName = this.typeNameEn; + // Map remark to description if needed, or just let description be undefined + // this['description'] = this.remark; + } +}; +exports.RfaType = RfaType; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaType.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id' }), + __metadata("design:type", Number) +], RfaType.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_code', length: 20 }), + __metadata("design:type", String) +], RfaType.prototype, "typeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name_th', length: 100 }), + __metadata("design:type", String) +], RfaType.prototype, "typeNameTh", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name_en', length: 100 }), + __metadata("design:type", String) +], RfaType.prototype, "typeNameEn", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaType.prototype, "remark", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaType.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_a = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _a : Object) +], RfaType.prototype, "contract", void 0); +__decorate([ + (0, typeorm_1.AfterLoad)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], RfaType.prototype, "populateVirtualFields", null); +exports.RfaType = RfaType = __decorate([ + (0, typeorm_1.Entity)('rfa_types') +], RfaType); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXR5cGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FPaUI7QUFDakIsNkVBQW1FO0FBRzVELElBQU0sT0FBTyxHQUFiLE1BQU0sT0FBTztJQStCbEIscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNoQyw0RUFBNEU7UUFDNUUscUNBQXFDO0lBQ3ZDLENBQUM7Q0FDRixDQUFBO0FBcENZLDBCQUFPO0FBRWxCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bUNBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7MkNBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7eUNBQ3hCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzJDQUMxQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzsyQ0FDMUI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7dUNBQ3pCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lDQUMxQjtBQUtuQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxDQUFDO0lBQ3pCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7eUNBQUM7QUFNcEI7SUFEQyxJQUFBLG1CQUFTLEdBQUU7Ozs7b0RBS1g7a0JBbkNVLE9BQU87SUFEbkIsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQztHQUNQLE9BQU8sQ0FvQ25CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHJmYVxcZW50aXRpZXNcXHJmYS10eXBlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQWZ0ZXJMb2FkLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi8uLi9jb250cmFjdC9lbnRpdGllcy9jb250cmFjdC5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfdHlwZXMnKVxuZXhwb3J0IGNsYXNzIFJmYVR5cGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29udHJhY3RfaWQnIH0pXG4gIGNvbnRyYWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0eXBlX2NvZGUnLCBsZW5ndGg6IDIwIH0pXG4gIHR5cGVDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9uYW1lX3RoJywgbGVuZ3RoOiAxMDAgfSlcbiAgdHlwZU5hbWVUaCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3R5cGVfbmFtZV9lbicsIGxlbmd0aDogMTAwIH0pXG4gIHR5cGVOYW1lRW4hOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmVtYXJrPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29udHJhY3QpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X2lkJyB9KVxuICBjb250cmFjdD86IENvbnRyYWN0O1xuXG4gIC8vIFZpcnR1YWwgcHJvcGVydHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgdHlwZU5hbWUhOiBzdHJpbmc7XG5cbiAgQEFmdGVyTG9hZCgpXG4gIHBvcHVsYXRlVmlydHVhbEZpZWxkcygpIHtcbiAgICB0aGlzLnR5cGVOYW1lID0gdGhpcy50eXBlTmFtZUVuO1xuICAgIC8vIE1hcCByZW1hcmsgdG8gZGVzY3JpcHRpb24gaWYgbmVlZGVkLCBvciBqdXN0IGxldCBkZXNjcmlwdGlvbiBiZSB1bmRlZmluZWRcbiAgICAvLyB0aGlzWydkZXNjcmlwdGlvbiddID0gdGhpcy5yZW1hcms7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690.map new file mode 100644 index 0000000..a123c33 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfatypeentity_7cb927d597fc65cc2920a7c584ef5690.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-type.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,6EAAmE;AAG5D,IAAM,OAAO,GAAb,MAAM,OAAO;IA+BlB,qBAAqB;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,4EAA4E;QAC5E,qCAAqC;IACvC,CAAC;CACF,CAAA;AApCY,0BAAO;AAElB;IADC,IAAA,gCAAsB,GAAE;;mCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yCACxB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uCACzB;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yCAC1B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;IACzB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;yCAAC;AAMpB;IADC,IAAA,mBAAS,GAAE;;;;oDAKX;kBAnCU,OAAO;IADnB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,OAAO,CAoCnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-type.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n AfterLoad,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Contract } from '../../contract/entities/contract.entity';\n\n@Entity('rfa_types')\nexport class RfaType {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'contract_id' })\n contractId!: number;\n\n @Column({ name: 'type_code', length: 20 })\n typeCode!: string;\n\n @Column({ name: 'type_name_th', length: 100 })\n typeNameTh!: string;\n\n @Column({ name: 'type_name_en', length: 100 })\n typeNameEn!: string;\n\n @Column({ type: 'text', nullable: true })\n remark?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n // Relations\n @ManyToOne(() => Contract)\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n\n // Virtual property for backward compatibility\n typeName!: string;\n\n @AfterLoad()\n populateVirtualFields() {\n this.typeName = this.typeNameEn;\n // Map remark to description if needed, or just let description be undefined\n // this['description'] = this.remark;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f new file mode 100644 index 0000000..7a97f3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f @@ -0,0 +1,181 @@ +c44473e7789b8acd2ff00b8b42fb8d40 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("typeorm"); +const document_numbering_service_1 = require("./services/document-numbering.service"); +const counter_service_1 = require("./services/counter.service"); +const reservation_service_1 = require("./services/reservation.service"); +const format_service_1 = require("./services/format.service"); +const typeorm_2 = require("@nestjs/typeorm"); +const config_1 = require("@nestjs/config"); +const document_number_format_entity_1 = require("./entities/document-number-format.entity"); +const document_number_audit_entity_1 = require("./entities/document-number-audit.entity"); +const document_number_error_entity_1 = require("./entities/document-number-error.entity"); +const document_numbering_lock_service_1 = require("./services/document-numbering-lock.service"); +const manual_override_service_1 = require("./services/manual-override.service"); +const metrics_service_1 = require("./services/metrics.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +describe('DocumentNumberingService', () => { + let service; + let module; + let counterService; + let formatService; + const mockContext = { + projectId: 1, + originatorOrganizationId: 1, + recipientOrganizationId: 1, + typeId: 1, + subTypeId: 1, + rfaTypeId: 1, + disciplineId: 1, + year: 2025, + customTokens: { TYPE_CODE: 'COR', ORG_CODE: 'GGL' }, + }; + beforeEach(async () => { + module = await testing_1.Test.createTestingModule({ + providers: [ + document_numbering_service_1.DocumentNumberingService, + { + provide: config_1.ConfigService, + useValue: { get: jest.fn().mockReturnValue('localhost') }, + }, + { + provide: counter_service_1.CounterService, + useValue: { + incrementCounter: jest.fn().mockResolvedValue(1), + getCurrentSequence: jest.fn().mockResolvedValue(0), + }, + }, + { + provide: reservation_service_1.ReservationService, + useValue: { + reserve: jest.fn(), + confirm: jest.fn(), + cancel: jest.fn(), + }, + }, + { + provide: format_service_1.FormatService, + useValue: { + format: jest + .fn() + .mockResolvedValue({ previewNumber: '0001', isDefault: false }), + }, + }, + { + provide: document_numbering_lock_service_1.DocumentNumberingLockService, + useValue: { + acquireLock: jest.fn().mockResolvedValue({ release: jest.fn() }), + releaseLock: jest.fn(), + }, + }, + { + provide: manual_override_service_1.ManualOverrideService, + useValue: { applyOverride: jest.fn() }, + }, + { + provide: metrics_service_1.MetricsService, + useValue: { + numbersGenerated: { inc: jest.fn() }, + lockFailures: { inc: jest.fn() }, + }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_format_entity_1.DocumentNumberFormat), + useValue: { findOne: jest.fn() }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit), + useValue: { + create: jest.fn().mockReturnValue({ id: 1 }), + save: jest.fn().mockResolvedValue({ id: 1 }), + findOne: jest.fn(), + }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_error_entity_1.DocumentNumberError), + useValue: { + create: jest.fn().mockReturnValue({}), + save: jest.fn().mockResolvedValue({}), + }, + }, + { + provide: typeorm_1.EntityManager, + useValue: { transaction: jest.fn() }, + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveProjectId: jest.fn().mockResolvedValue(1), + resolveOrganizationId: jest.fn().mockResolvedValue(1), + }, + }, + ], + }).compile(); + service = module.get(document_numbering_service_1.DocumentNumberingService); + counterService = module.get(counter_service_1.CounterService); + formatService = module.get(format_service_1.FormatService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('generateNextNumber', () => { + it('should generate a new number successfully', async () => { + counterService.incrementCounter.mockResolvedValue(1); + formatService.format.mockResolvedValue({ + previewNumber: 'DOC-0001', + isDefault: false, + }); + const result = await service.generateNextNumber(mockContext); + // Service returns object with number and auditId + expect(result).toHaveProperty('number'); + expect(result).toHaveProperty('auditId'); + expect(result.number).toBe('DOC-0001'); + expect(counterService.incrementCounter).toHaveBeenCalled(); + expect(formatService.format).toHaveBeenCalled(); + }); + it('should throw error when increment fails', async () => { + // Mock CounterService to throw error + counterService.incrementCounter.mockRejectedValue(new Error('Transaction failed')); + await expect(service.generateNextNumber(mockContext)).rejects.toThrow('Transaction failed'); + }); + }); + describe('Admin Operations', () => { + it('voidAndReplace should verify audit log exists', async () => { + const auditRepo = module.get((0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit)); + auditRepo.findOne.mockResolvedValue({ + documentNumber: 'DOC-001', + counterKey: JSON.stringify({ projectId: 1, correspondenceTypeId: 1 }), + templateUsed: 'test', + }); + auditRepo.save.mockResolvedValue({ id: 2 }); + const result = await service.voidAndReplace({ + documentNumber: 'DOC-001', + reason: 'test', + replace: false, + }); + expect(result.status).toBe('VOIDED'); + expect(auditRepo.save).toHaveBeenCalled(); + }); + it('cancelNumber should log cancellation', async () => { + const auditRepo = module.get((0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit)); + auditRepo.findOne.mockResolvedValue({ + documentNumber: 'DOC-002', + counterKey: {}, + }); + auditRepo.save.mockResolvedValue({ id: 3 }); + const result = await service.cancelNumber({ + documentNumber: 'DOC-002', + reason: 'bad', + projectId: 1, + }); + expect(result.status).toBe('CANCELLED'); + expect(auditRepo.save).toHaveBeenCalled(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkb2N1bWVudC1udW1iZXJpbmcuc2VydmljZS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELHFDQUFvRDtBQUNwRCxzRkFBaUY7QUFDakYsZ0VBQTREO0FBQzVELHdFQUFvRTtBQUNwRSw4REFBMEQ7QUFDMUQsNkNBQXFEO0FBQ3JELDJDQUErQztBQUMvQyw0RkFBZ0Y7QUFDaEYsMEZBQThFO0FBQzlFLDBGQUE4RTtBQUU5RSxnR0FBMEY7QUFDMUYsZ0ZBQTJFO0FBQzNFLGdFQUE0RDtBQUM1RCx1RkFBa0Y7QUFFbEYsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxJQUFJLE9BQWlDLENBQUM7SUFDdEMsSUFBSSxNQUFxQixDQUFDO0lBQzFCLElBQUksY0FBOEIsQ0FBQztJQUNuQyxJQUFJLGFBQTRCLENBQUM7SUFFakMsTUFBTSxXQUFXLEdBQUc7UUFDbEIsU0FBUyxFQUFFLENBQUM7UUFDWix3QkFBd0IsRUFBRSxDQUFDO1FBQzNCLHVCQUF1QixFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLENBQUM7UUFDVCxTQUFTLEVBQUUsQ0FBQztRQUNaLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLENBQUM7UUFDZixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtLQUNwRCxDQUFDO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLE1BQU0sR0FBRyxNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUN0QyxTQUFTLEVBQUU7Z0JBQ1QscURBQXdCO2dCQUN4QjtvQkFDRSxPQUFPLEVBQUUsc0JBQWE7b0JBQ3RCLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFdB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ZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkb2N1bWVudC1udW1iZXJpbmcuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRW50aXR5TWFuYWdlciB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBDb3VudGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY291bnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc2VydmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcmVzZXJ2YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZXBvc2l0b3J5VG9rZW4gfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRm9ybWF0IH0gZnJvbSAnLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZm9ybWF0LmVudGl0eSc7XG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItYXVkaXQuZW50aXR5JztcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL2RvY3VtZW50LW51bWJlci1lcnJvci5lbnRpdHknO1xuXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ0xvY2tTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmctbG9jay5zZXJ2aWNlJztcbmltcG9ydCB7IE1hbnVhbE92ZXJyaWRlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbWFudWFsLW92ZXJyaWRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWV0cmljc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21ldHJpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XG5cbmRlc2NyaWJlKCdEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UnLCAoKSA9PiB7XG4gIGxldCBzZXJ2aWNlOiBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2U7XG4gIGxldCBtb2R1bGU6IFRlc3RpbmdNb2R1bGU7XG4gIGxldCBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2U7XG4gIGxldCBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlO1xuXG4gIGNvbnN0IG1vY2tDb250ZXh0ID0ge1xuICAgIHByb2plY3RJZDogMSxcbiAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IDEsXG4gICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDEsXG4gICAgdHlwZUlkOiAxLFxuICAgIHN1YlR5cGVJZDogMSxcbiAgICByZmFUeXBlSWQ6IDEsXG4gICAgZGlzY2lwbGluZUlkOiAxLFxuICAgIHllYXI6IDIwMjUsXG4gICAgY3VzdG9tVG9rZW5zOiB7IFRZUEVfQ09ERTogJ0NPUicsIE9SR19DT0RFOiAnR0dMJyB9LFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIG1vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogeyBnZXQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ2xvY2FsaG9zdCcpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDb3VudGVyU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgaW5jcmVtZW50Q291bnRlcjogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxuICAgICAgICAgICAgZ2V0Q3VycmVudFNlcXVlbmNlOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJlc2VydmF0aW9uU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgcmVzZXJ2ZTogamVzdC5mbigpLFxuICAgICAgICAgICAgY29uZmlybTogamVzdC5mbigpLFxuICAgICAgICAgICAgY2FuY2VsOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEZvcm1hdFNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGZvcm1hdDogamVzdFxuICAgICAgICAgICAgICAuZm4oKVxuICAgICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoeyBwcmV2aWV3TnVtYmVyOiAnMDAwMScsIGlzRGVmYXVsdDogZmFsc2UgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGFjcXVpcmVMb2NrOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyByZWxlYXNlOiBqZXN0LmZuKCkgfSksXG4gICAgICAgICAgICByZWxlYXNlTG9jazogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNYW51YWxPdmVycmlkZVNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHsgYXBwbHlPdmVycmlkZTogamVzdC5mbigpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNZXRyaWNzU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgbnVtYmVyc0dlbmVyYXRlZDogeyBpbmM6IGplc3QuZm4oKSB9LFxuICAgICAgICAgICAgbG9ja0ZhaWx1cmVzOiB7IGluYzogamVzdC5mbigpIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihEb2N1bWVudE51bWJlckZvcm1hdCksXG4gICAgICAgICAgdXNlVmFsdWU6IHsgZmluZE9uZTogamVzdC5mbigpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdCksXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGlkOiAxIH0pLFxuICAgICAgICAgICAgc2F2ZTogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgaWQ6IDEgfSksXG4gICAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihEb2N1bWVudE51bWJlckVycm9yKSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHt9KSxcbiAgICAgICAgICAgIHNhdmU6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEVudGl0eU1hbmFnZXIsXG4gICAgICAgICAgdXNlVmFsdWU6IHsgdHJhbnNhY3Rpb246IGplc3QuZm4oKSB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogVXVpZFJlc29sdmVyU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgcmVzb2x2ZVByb2plY3RJZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxuICAgICAgICAgICAgcmVzb2x2ZU9yZ2FuaXphdGlvbklkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8RG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlPihEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UpO1xuICAgIGNvdW50ZXJTZXJ2aWNlID0gbW9kdWxlLmdldDxDb3VudGVyU2VydmljZT4oQ291bnRlclNlcnZpY2UpO1xuICAgIGZvcm1hdFNlcnZpY2UgPSBtb2R1bGUuZ2V0PEZvcm1hdFNlcnZpY2U+KEZvcm1hdFNlcnZpY2UpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHNlcnZpY2UpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZU5leHROdW1iZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIG5ldyBudW1iZXIgc3VjY2Vzc2Z1bGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgKGNvdW50ZXJTZXJ2aWNlLmluY3JlbWVudENvdW50ZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxKTtcbiAgICAgIChmb3JtYXRTZXJ2aWNlLmZvcm1hdCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgcHJldmlld051bWJlcjogJ0RPQy0wMDAxJyxcbiAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcihtb2NrQ29udGV4dCk7XG5cbiAgICAgIC8vIFNlcnZpY2UgcmV0dXJucyBvYmplY3Qgd2l0aCBudW1iZXIgYW5kIGF1ZGl0SWRcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KCdudW1iZXInKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KCdhdWRpdElkJyk7XG4gICAgICBleHBlY3QocmVzdWx0Lm51bWJlcikudG9CZSgnRE9DLTAwMDEnKTtcbiAgICAgIGV4cGVjdChjb3VudGVyU2VydmljZS5pbmNyZW1lbnRDb3VudGVyIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KGZvcm1hdFNlcnZpY2UuZm9ybWF0IGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGluY3JlbWVudCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1vY2sgQ291bnRlclNlcnZpY2UgdG8gdGhyb3cgZXJyb3JcbiAgICAgIChjb3VudGVyU2VydmljZS5pbmNyZW1lbnRDb3VudGVyIGFzIGplc3QuTW9jaykubW9ja1JlamVjdGVkVmFsdWUoXG4gICAgICAgIG5ldyBFcnJvcignVHJhbnNhY3Rpb24gZmFpbGVkJylcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGV4cGVjdChzZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcihtb2NrQ29udGV4dCkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgJ1RyYW5zYWN0aW9uIGZhaWxlZCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZG1pbiBPcGVyYXRpb25zJywgKCkgPT4ge1xuICAgIGl0KCd2b2lkQW5kUmVwbGFjZSBzaG91bGQgdmVyaWZ5IGF1ZGl0IGxvZyBleGlzdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdWRpdFJlcG8gPSBtb2R1bGUuZ2V0PFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4+KFxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdClcbiAgICAgICk7XG4gICAgICAoYXVkaXRSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMScsXG4gICAgICAgIGNvdW50ZXJLZXk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdElkOiAxLCBjb3JyZXNwb25kZW5jZVR5cGVJZDogMSB9KSxcbiAgICAgICAgdGVtcGxhdGVVc2VkOiAndGVzdCcsXG4gICAgICB9KTtcbiAgICAgIChhdWRpdFJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHsgaWQ6IDIgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2Uudm9pZEFuZFJlcGxhY2Uoe1xuICAgICAgICBkb2N1bWVudE51bWJlcjogJ0RPQy0wMDEnLFxuICAgICAgICByZWFzb246ICd0ZXN0JyxcbiAgICAgICAgcmVwbGFjZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3RhdHVzKS50b0JlKCdWT0lERUQnKTtcbiAgICAgIGV4cGVjdChhdWRpdFJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYW5jZWxOdW1iZXIgc2hvdWxkIGxvZyBjYW5jZWxsYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdWRpdFJlcG8gPSBtb2R1bGUuZ2V0PFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4+KFxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdClcbiAgICAgICk7XG4gICAgICAoYXVkaXRSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMicsXG4gICAgICAgIGNvdW50ZXJLZXk6IHt9LFxuICAgICAgfSk7XG4gICAgICAoYXVkaXRSZXBvLnNhdmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGlkOiAzIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmNhbmNlbE51bWJlcih7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMicsXG4gICAgICAgIHJlYXNvbjogJ2JhZCcsXG4gICAgICAgIHByb2plY3RJZDogMSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdGF0dXMpLnRvQmUoJ0NBTkNFTExFRCcpO1xuICAgICAgZXhwZWN0KGF1ZGl0UmVwby5zYXZlIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f.map new file mode 100644 index 0000000..e96235c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7e/documentnumberingservicespec_7eaf3c0d785f09155dbd9f0da330510f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { Repository, EntityManager } from 'typeorm';\nimport { DocumentNumberingService } from './services/document-numbering.service';\nimport { CounterService } from './services/counter.service';\nimport { ReservationService } from './services/reservation.service';\nimport { FormatService } from './services/format.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { ConfigService } from '@nestjs/config';\nimport { DocumentNumberFormat } from './entities/document-number-format.entity';\nimport { DocumentNumberAudit } from './entities/document-number-audit.entity';\nimport { DocumentNumberError } from './entities/document-number-error.entity';\n\nimport { DocumentNumberingLockService } from './services/document-numbering-lock.service';\nimport { ManualOverrideService } from './services/manual-override.service';\nimport { MetricsService } from './services/metrics.service';\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\n\ndescribe('DocumentNumberingService', () => {\n let service: DocumentNumberingService;\n let module: TestingModule;\n let counterService: CounterService;\n let formatService: FormatService;\n\n const mockContext = {\n projectId: 1,\n originatorOrganizationId: 1,\n recipientOrganizationId: 1,\n typeId: 1,\n subTypeId: 1,\n rfaTypeId: 1,\n disciplineId: 1,\n year: 2025,\n customTokens: { TYPE_CODE: 'COR', ORG_CODE: 'GGL' },\n };\n\n beforeEach(async () => {\n module = await Test.createTestingModule({\n providers: [\n DocumentNumberingService,\n {\n provide: ConfigService,\n useValue: { get: jest.fn().mockReturnValue('localhost') },\n },\n {\n provide: CounterService,\n useValue: {\n incrementCounter: jest.fn().mockResolvedValue(1),\n getCurrentSequence: jest.fn().mockResolvedValue(0),\n },\n },\n {\n provide: ReservationService,\n useValue: {\n reserve: jest.fn(),\n confirm: jest.fn(),\n cancel: jest.fn(),\n },\n },\n {\n provide: FormatService,\n useValue: {\n format: jest\n .fn()\n .mockResolvedValue({ previewNumber: '0001', isDefault: false }),\n },\n },\n {\n provide: DocumentNumberingLockService,\n useValue: {\n acquireLock: jest.fn().mockResolvedValue({ release: jest.fn() }),\n releaseLock: jest.fn(),\n },\n },\n {\n provide: ManualOverrideService,\n useValue: { applyOverride: jest.fn() },\n },\n {\n provide: MetricsService,\n useValue: {\n numbersGenerated: { inc: jest.fn() },\n lockFailures: { inc: jest.fn() },\n },\n },\n {\n provide: getRepositoryToken(DocumentNumberFormat),\n useValue: { findOne: jest.fn() },\n },\n {\n provide: getRepositoryToken(DocumentNumberAudit),\n useValue: {\n create: jest.fn().mockReturnValue({ id: 1 }),\n save: jest.fn().mockResolvedValue({ id: 1 }),\n findOne: jest.fn(),\n },\n },\n {\n provide: getRepositoryToken(DocumentNumberError),\n useValue: {\n create: jest.fn().mockReturnValue({}),\n save: jest.fn().mockResolvedValue({}),\n },\n },\n {\n provide: EntityManager,\n useValue: { transaction: jest.fn() },\n },\n {\n provide: UuidResolverService,\n useValue: {\n resolveProjectId: jest.fn().mockResolvedValue(1),\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\n },\n },\n ],\n }).compile();\n\n service = module.get(DocumentNumberingService);\n counterService = module.get(CounterService);\n formatService = module.get(FormatService);\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('generateNextNumber', () => {\n it('should generate a new number successfully', async () => {\n (counterService.incrementCounter as jest.Mock).mockResolvedValue(1);\n (formatService.format as jest.Mock).mockResolvedValue({\n previewNumber: 'DOC-0001',\n isDefault: false,\n });\n\n const result = await service.generateNextNumber(mockContext);\n\n // Service returns object with number and auditId\n expect(result).toHaveProperty('number');\n expect(result).toHaveProperty('auditId');\n expect(result.number).toBe('DOC-0001');\n expect(counterService.incrementCounter as jest.Mock).toHaveBeenCalled();\n expect(formatService.format as jest.Mock).toHaveBeenCalled();\n });\n\n it('should throw error when increment fails', async () => {\n // Mock CounterService to throw error\n (counterService.incrementCounter as jest.Mock).mockRejectedValue(\n new Error('Transaction failed')\n );\n\n await expect(service.generateNextNumber(mockContext)).rejects.toThrow(\n 'Transaction failed'\n );\n });\n });\n\n describe('Admin Operations', () => {\n it('voidAndReplace should verify audit log exists', async () => {\n const auditRepo = module.get>(\n getRepositoryToken(DocumentNumberAudit)\n );\n (auditRepo.findOne as jest.Mock).mockResolvedValue({\n documentNumber: 'DOC-001',\n counterKey: JSON.stringify({ projectId: 1, correspondenceTypeId: 1 }),\n templateUsed: 'test',\n });\n (auditRepo.save as jest.Mock).mockResolvedValue({ id: 2 });\n\n const result = await service.voidAndReplace({\n documentNumber: 'DOC-001',\n reason: 'test',\n replace: false,\n });\n expect(result.status).toBe('VOIDED');\n expect(auditRepo.save as jest.Mock).toHaveBeenCalled();\n });\n\n it('cancelNumber should log cancellation', async () => {\n const auditRepo = module.get>(\n getRepositoryToken(DocumentNumberAudit)\n );\n (auditRepo.findOne as jest.Mock).mockResolvedValue({\n documentNumber: 'DOC-002',\n counterKey: {},\n });\n (auditRepo.save as jest.Mock).mockResolvedValue({ id: 3 });\n\n const result = await service.cancelNumber({\n documentNumber: 'DOC-002',\n reason: 'bad',\n projectId: 1,\n });\n expect(result.status).toBe('CANCELLED');\n expect(auditRepo.save as jest.Mock).toHaveBeenCalled();\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7 new file mode 100644 index 0000000..dce5304 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7 @@ -0,0 +1,19 @@ +76462e3f16c9fb6f334e9c92b0ede8e0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JwtAuthGuard = void 0; +const common_1 = require("@nestjs/common"); +const passport_1 = require("@nestjs/passport"); +let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') { +}; +exports.JwtAuthGuard = JwtAuthGuard; +exports.JwtAuthGuard = JwtAuthGuard = __decorate([ + (0, common_1.Injectable)() +], JwtAuthGuard); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXGp3dC1hdXRoLmd1YXJkLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1QywrQ0FBNkM7QUFHdEMsSUFBTSxZQUFZLEdBQWxCLE1BQU0sWUFBYSxTQUFRLElBQUEsb0JBQVMsRUFBQyxLQUFLLENBQUM7Q0FBRyxDQUFBO0FBQXhDLG9DQUFZO3VCQUFaLFlBQVk7SUFEeEIsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsWUFBWSxDQUE0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGd1YXJkc1xcand0LWF1dGguZ3VhcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJ0BuZXN0anMvcGFzc3BvcnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnd0QXV0aEd1YXJkIGV4dGVuZHMgQXV0aEd1YXJkKCdqd3QnKSB7fVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7.map new file mode 100644 index 0000000..061f854 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7f/jwtauthguard_7f60f300ab2409c47aed7a7338a1cbf7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-auth.guard.ts","mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,+CAA6C;AAGtC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;CAAG,CAAA;AAAxC,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAA4B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-auth.guard.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { AuthGuard } from '@nestjs/passport';\n\n@Injectable()\nexport class JwtAuthGuard extends AuthGuard('jwt') {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1 new file mode 100644 index 0000000..ac300a1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1 @@ -0,0 +1,86 @@ +c07b913ced6df32d8826286c9d4d7c9e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflowTemplateStep = exports.RfaActionType = void 0; +const typeorm_1 = require("typeorm"); +const rfa_workflow_template_entity_1 = require("./rfa-workflow-template.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const role_entity_1 = require("../../user/entities/role.entity"); +// ✅ 1. สร้าง Enum เพื่อให้ Type Safe +var RfaActionType; +(function (RfaActionType) { + RfaActionType["REVIEW"] = "REVIEW"; + RfaActionType["APPROVE"] = "APPROVE"; + RfaActionType["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(RfaActionType || (exports.RfaActionType = RfaActionType = {})); +let RfaWorkflowTemplateStep = class RfaWorkflowTemplateStep { +}; +exports.RfaWorkflowTemplateStep = RfaWorkflowTemplateStep; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_id' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "templateId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'step_number' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "stepNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_type', + type: 'enum', + enum: RfaActionType, // ✅ 2. ใช้ Enum ตรงนี้ + nullable: true, + }), + __metadata("design:type", String) +], RfaWorkflowTemplateStep.prototype, "actionType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'duration_days', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "durationDays", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_optional', default: false }), + __metadata("design:type", Boolean) +], RfaWorkflowTemplateStep.prototype, "isOptional", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_workflow_template_entity_1.RfaWorkflowTemplate, (template) => template.steps, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'template_id' }), + __metadata("design:type", typeof (_a = typeof rfa_workflow_template_entity_1.RfaWorkflowTemplate !== "undefined" && rfa_workflow_template_entity_1.RfaWorkflowTemplate) === "function" ? _a : Object) +], RfaWorkflowTemplateStep.prototype, "template", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_b = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _b : Object) +], RfaWorkflowTemplateStep.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => role_entity_1.Role), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_c = typeof role_entity_1.Role !== "undefined" && role_entity_1.Role) === "function" ? _c : Object) +], RfaWorkflowTemplateStep.prototype, "role", void 0); +exports.RfaWorkflowTemplateStep = RfaWorkflowTemplateStep = __decorate([ + (0, typeorm_1.Entity)('rfa_workflow_template_steps') +], RfaWorkflowTemplateStep); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLXN0ZXAuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsaUZBQXFFO0FBQ3JFLHlGQUErRTtBQUMvRSxpRUFBdUQ7QUFFdkQscUNBQXFDO0FBQ3JDLElBQVksYUFJWDtBQUpELFdBQVksYUFBYTtJQUN2QixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQiw0Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsYUFBYSw2QkFBYixhQUFhLFFBSXhCO0FBR00sSUFBTSx1QkFBdUIsR0FBN0IsTUFBTSx1QkFBdUI7Q0E0Q25DLENBQUE7QUE1Q1ksMERBQXVCO0FBRWxDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7MkRBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7OzJEQUNaO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OytEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3VEQUM1QjtBQVFoQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGFBQWEsRUFBRSx1QkFBdUI7UUFDNUMsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzsyREFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkRBQzVCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7OzJEQUMzQjtBQU9yQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrREFBbUIsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNsRSxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO2tEQUN6QixrREFBbUIsb0JBQW5CLGtEQUFtQjt5REFBQztBQUkvQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxDQUFDO0lBQzdCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2tEQUN6QixrQ0FBWSxvQkFBWixrQ0FBWTs2REFBQztBQUk1QjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztrREFDekIsa0JBQUksb0JBQUosa0JBQUk7cURBQUM7a0NBM0NELHVCQUF1QjtJQURuQyxJQUFBLGdCQUFNLEVBQUMsNkJBQTZCLENBQUM7R0FDekIsdUJBQXVCLENBNENuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtd29ya2Zsb3ctdGVtcGxhdGUtc3RlcC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBSZmFXb3JrZmxvd1RlbXBsYXRlIH0gZnJvbSAnLi9yZmEtd29ya2Zsb3ctdGVtcGxhdGUuZW50aXR5JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uLy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3JvbGUuZW50aXR5JztcblxuLy8g4pyFIDEuIOC4quC4o+C5ieC4suC4hyBFbnVtIOC5gOC4nuC4t+C5iOC4reC5g+C4q+C5iSBUeXBlIFNhZmVcbmV4cG9ydCBlbnVtIFJmYUFjdGlvblR5cGUge1xuICBSRVZJRVcgPSAnUkVWSUVXJyxcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJyxcbiAgQUNLTk9XTEVER0UgPSAnQUNLTk9XTEVER0UnLFxufVxuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dfdGVtcGxhdGVfc3RlcHMnKVxuZXhwb3J0IGNsYXNzIFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX2lkJyB9KVxuICB0ZW1wbGF0ZUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3RlcF9udW1iZXInIH0pXG4gIHN0ZXBOdW1iZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnIH0pXG4gIG9yZ2FuaXphdGlvbklkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncm9sZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJvbGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnYWN0aW9uX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSZmFBY3Rpb25UeXBlLCAvLyDinIUgMi4g4LmD4LiK4LmJIEVudW0g4LiV4Lij4LiH4LiZ4Li14LmJXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGFjdGlvblR5cGU/OiBSZmFBY3Rpb25UeXBlOyAvLyDinIUgMy4g4LmA4Lib4Lil4Li14LmI4Lii4LiZIHR5cGUg4LiI4Liy4LiBIHN0cmluZyDguYDguJvguYfguJkgRW51bVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZHVyYXRpb25fZGF5cycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGR1cmF0aW9uRGF5cz86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX29wdGlvbmFsJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNPcHRpb25hbCE6IGJvb2xlYW47XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gUmZhV29ya2Zsb3dUZW1wbGF0ZSwgKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5zdGVwcywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX2lkJyB9KVxuICB0ZW1wbGF0ZSE6IFJmYVdvcmtmbG93VGVtcGxhdGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBPcmdhbml6YXRpb24pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ29yZ2FuaXphdGlvbl9pZCcgfSlcbiAgb3JnYW5pemF0aW9uITogT3JnYW5pemF0aW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUm9sZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgcm9sZT86IFJvbGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1.map new file mode 100644 index 0000000..27d1363 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/81/rfaworkflowtemplatestepentity_8168850839465b49c52a800422cf4ea1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template-step.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,iFAAqE;AACrE,yFAA+E;AAC/E,iEAAuD;AAEvD,qCAAqC;AACrC,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,kCAAiB,CAAA;IACjB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;AAC7B,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB;AAGM,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA4CnC,CAAA;AA5CY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2DACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2DACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;+DACZ;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC5B;AAQhB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa,EAAE,uBAAuB;QAC5C,QAAQ,EAAE,IAAI;KACf,CAAC;;2DACyB;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6DAC5B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;2DAC3B;AAOrB;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;QAClE,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,kDAAmB,oBAAnB,kDAAmB;yDAAC;AAI/B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;6DAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;qDAAC;kCA3CD,uBAAuB;IADnC,IAAA,gBAAM,EAAC,6BAA6B,CAAC;GACzB,uBAAuB,CA4CnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template-step.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { RfaWorkflowTemplate } from './rfa-workflow-template.entity';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { Role } from '../../user/entities/role.entity';\n\n// ✅ 1. สร้าง Enum เพื่อให้ Type Safe\nexport enum RfaActionType {\n REVIEW = 'REVIEW',\n APPROVE = 'APPROVE',\n ACKNOWLEDGE = 'ACKNOWLEDGE',\n}\n\n@Entity('rfa_workflow_template_steps')\nexport class RfaWorkflowTemplateStep {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'template_id' })\n templateId!: number;\n\n @Column({ name: 'step_number' })\n stepNumber!: number;\n\n @Column({ name: 'organization_id' })\n organizationId!: number;\n\n @Column({ name: 'role_id', nullable: true })\n roleId?: number;\n\n @Column({\n name: 'action_type',\n type: 'enum',\n enum: RfaActionType, // ✅ 2. ใช้ Enum ตรงนี้\n nullable: true,\n })\n actionType?: RfaActionType; // ✅ 3. เปลี่ยน type จาก string เป็น Enum\n\n @Column({ name: 'duration_days', nullable: true })\n durationDays?: number;\n\n @Column({ name: 'is_optional', default: false })\n isOptional!: boolean;\n\n // Relations\n @ManyToOne(() => RfaWorkflowTemplate, (template) => template.steps, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'template_id' })\n template!: RfaWorkflowTemplate;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'organization_id' })\n organization!: Organization;\n\n @ManyToOne(() => Role)\n @JoinColumn({ name: 'role_id' })\n role?: Role;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21 new file mode 100644 index 0000000..b796bad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21 @@ -0,0 +1,109 @@ +426c5f9699779d214149eb42c5d3c3f9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Correspondence = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const correspondence_type_entity_1 = require("./correspondence-type.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const correspondence_recipient_entity_1 = require("./correspondence-recipient.entity"); +const correspondence_revision_entity_1 = require("./correspondence-revision.entity"); +const discipline_entity_1 = require("../../master/entities/discipline.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Correspondence = class Correspondence extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Correspondence = Correspondence; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Correspondence.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_number', length: 100 }), + __metadata("design:type", String) +], Correspondence.prototype, "correspondenceNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id' }), + __metadata("design:type", Number) +], Correspondence.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_id', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], Correspondence.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_id', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "originatorId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_internal_communication', + default: false, + type: 'tinyint', + }), + __metadata("design:type", Boolean) +], Correspondence.prototype, "isInternal", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Correspondence.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Correspondence.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_type_entity_1.CorrespondenceType), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", typeof (_c = typeof correspondence_type_entity_1.CorrespondenceType !== "undefined" && correspondence_type_entity_1.CorrespondenceType) === "function" ? _c : Object) +], Correspondence.prototype, "type", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], Correspondence.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'originator_id' }), + __metadata("design:type", typeof (_e = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _e : Object) +], Correspondence.prototype, "originator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_f = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _f : Object) +], Correspondence.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => discipline_entity_1.Discipline), + (0, typeorm_1.JoinColumn)({ name: 'discipline_id' }), + __metadata("design:type", typeof (_g = typeof discipline_entity_1.Discipline !== "undefined" && discipline_entity_1.Discipline) === "function" ? _g : Object) +], Correspondence.prototype, "discipline", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_revision_entity_1.CorrespondenceRevision, (revision) => revision.correspondence), + __metadata("design:type", Array) +], Correspondence.prototype, "revisions", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_recipient_entity_1.CorrespondenceRecipient, (recipient) => recipient.correspondence, { cascade: true }), + __metadata("design:type", Array) +], Correspondence.prototype, "recipients", void 0); +exports.Correspondence = Correspondence = __decorate([ + (0, typeorm_1.Entity)('correspondences') +], Correspondence); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVNpQjtBQUNqQiwwRUFBZ0U7QUFDaEUseUZBQStFO0FBQy9FLDZFQUFrRTtBQUNsRSxpRUFBdUQ7QUFDdkQsdUZBQTRFO0FBQzVFLHFGQUEwRTtBQUMxRSwrRUFBcUU7QUFDckUsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUdyQyxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFlLFNBQVEsaUNBQWM7Q0F1RWpELENBQUE7QUF2RVksd0NBQWM7QUFHekI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7MENBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzREQUN6QjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDOzs0REFDYjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztvREFDNUI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O2lEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O29EQUM1QjtBQU90QjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSwyQkFBMkI7UUFDakMsT0FBTyxFQUFFLEtBQUs7UUFDZCxJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDOztrREFDbUI7QUFHckI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7aURBQzVCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO2tEQUM1QyxJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsK0NBQWtCLENBQUM7SUFDbkMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLENBQUM7a0RBQ3hDLCtDQUFrQixvQkFBbEIsK0NBQWtCOzRDQUFDO0FBSTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzsrQ0FBQztBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxDQUFDO0lBQzdCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7a0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOytDQUFDO0FBS2Y7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsOEJBQVUsQ0FBQztJQUMzQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7a0RBQ3pCLDhCQUFVLG9CQUFWLDhCQUFVO2tEQUFDO0FBT3hCO0lBSkMsSUFBQSxtQkFBUyxFQUNSLEdBQUcsRUFBRSxDQUFDLHVEQUFzQixFQUM1QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDdEM7O2lEQUNvQztBQU9yQztJQUxDLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyx5REFBdUIsRUFDN0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQ3ZDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUNsQjs7a0RBQ3NDO3lCQXRFNUIsY0FBYztJQUQxQixJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLENBQUM7R0FDYixjQUFjLENBdUUxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxuICBPbmVUb01hbnksXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QvZW50aXRpZXMvcHJvamVjdC5lbnRpdHknO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgRGlzY2lwbGluZSB9IGZyb20gJy4uLy4uL21hc3Rlci9lbnRpdGllcy9kaXNjaXBsaW5lLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlcycpXG5leHBvcnQgY2xhc3MgQ29ycmVzcG9uZGVuY2UgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX251bWJlcicsIGxlbmd0aDogMTAwIH0pXG4gIGNvcnJlc3BvbmRlbmNlTnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfdHlwZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkaXNjaXBsaW5lX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JpZ2luYXRvcl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG9yaWdpbmF0b3JJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnaXNfaW50ZXJuYWxfY29tbXVuaWNhdGlvbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdHlwZTogJ3RpbnlpbnQnLFxuICB9KVxuICBpc0ludGVybmFsITogYm9vbGVhbjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNyZWF0ZWRCeT86IG51bWJlcjtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0Jywgc2VsZWN0OiBmYWxzZSB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlVHlwZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfdHlwZV9pZCcgfSlcbiAgdHlwZT86IENvcnJlc3BvbmRlbmNlVHlwZTtcblxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3Q/OiBQcm9qZWN0O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX2lkJyB9KVxuICBvcmlnaW5hdG9yPzogT3JnYW5pemF0aW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScgfSlcbiAgY3JlYXRvcj86IFVzZXI7XG5cbiAgLy8gW05ldyBWMS41LjFdXG4gIEBNYW55VG9PbmUoKCkgPT4gRGlzY2lwbGluZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9pZCcgfSlcbiAgZGlzY2lwbGluZT86IERpc2NpcGxpbmU7XG5cbiAgLy8gT25lIENvcnJlc3BvbmRlbmNlIGhhcyBNYW55IFJldmlzaW9uc1xuICBAT25lVG9NYW55KFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXG4gICAgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5jb3JyZXNwb25kZW5jZVxuICApXG4gIHJldmlzaW9ucz86IENvcnJlc3BvbmRlbmNlUmV2aXNpb25bXTtcblxuICBAT25lVG9NYW55KFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmVjaXBpZW50LFxuICAgIChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5jb3JyZXNwb25kZW5jZSxcbiAgICB7IGNhc2NhZGU6IHRydWUgfVxuICApXG4gIHJlY2lwaWVudHM/OiBDb3JyZXNwb25kZW5jZVJlY2lwaWVudFtdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21.map new file mode 100644 index 0000000..be25fc9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/correspondenceentity_8a90fe25ebc7d747c8be0c0026827e21.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n OneToMany,\n DeleteDateColumn,\n CreateDateColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { CorrespondenceType } from './correspondence-type.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { CorrespondenceRecipient } from './correspondence-recipient.entity';\nimport { CorrespondenceRevision } from './correspondence-revision.entity';\nimport { Discipline } from '../../master/entities/discipline.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('correspondences')\nexport class Correspondence extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_number', length: 100 })\n correspondenceNumber!: string;\n\n @Column({ name: 'correspondence_type_id' })\n correspondenceTypeId!: number;\n\n @Column({ name: 'discipline_id', nullable: true })\n disciplineId?: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'originator_id', nullable: true })\n originatorId?: number;\n\n @Column({\n name: 'is_internal_communication',\n default: false,\n type: 'tinyint',\n })\n isInternal!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @DeleteDateColumn({ name: 'deleted_at', select: false })\n deletedAt?: Date;\n\n // Relations\n @ManyToOne(() => CorrespondenceType)\n @JoinColumn({ name: 'correspondence_type_id' })\n type?: CorrespondenceType;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'originator_id' })\n originator?: Organization;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // [New V1.5.1]\n @ManyToOne(() => Discipline)\n @JoinColumn({ name: 'discipline_id' })\n discipline?: Discipline;\n\n // One Correspondence has Many Revisions\n @OneToMany(\n () => CorrespondenceRevision,\n (revision) => revision.correspondence\n )\n revisions?: CorrespondenceRevision[];\n\n @OneToMany(\n () => CorrespondenceRecipient,\n (recipient) => recipient.correspondence,\n { cascade: true }\n )\n recipients?: CorrespondenceRecipient[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248 new file mode 100644 index 0000000..fc36c4a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248 @@ -0,0 +1,64 @@ +de808bf15a7404907c767ae951b8cee1 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Role = exports.RoleScope = void 0; +const typeorm_1 = require("typeorm"); +const permission_entity_1 = require("./permission.entity"); +var RoleScope; +(function (RoleScope) { + RoleScope["GLOBAL"] = "Global"; + RoleScope["ORGANIZATION"] = "Organization"; + RoleScope["PROJECT"] = "Project"; + RoleScope["CONTRACT"] = "Contract"; +})(RoleScope || (exports.RoleScope = RoleScope = {})); +let Role = class Role { +}; +exports.Role = Role; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'role_id' }), + __metadata("design:type", Number) +], Role.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_name', length: 100 }), + __metadata("design:type", String) +], Role.prototype, "roleName", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: RoleScope, + }), + __metadata("design:type", String) +], Role.prototype, "scope", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Role.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_system', default: false }), + __metadata("design:type", Boolean) +], Role.prototype, "isSystem", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => permission_entity_1.Permission), + (0, typeorm_1.JoinTable)({ + name: 'role_permissions', + joinColumn: { name: 'role_id', referencedColumnName: 'roleId' }, + inverseJoinColumn: { + name: 'permission_id', + referencedColumnName: 'permissionId', + }, + }), + __metadata("design:type", Array) +], Role.prototype, "permissions", void 0); +exports.Role = Role = __decorate([ + (0, typeorm_1.Entity)('roles') +], Role); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHJvbGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQU1pQjtBQUNqQiwyREFBaUQ7QUFFakQsSUFBWSxTQUtYO0FBTEQsV0FBWSxTQUFTO0lBQ25CLDhCQUFpQixDQUFBO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdDQUFtQixDQUFBO0lBQ25CLGtDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxTQUFTLHlCQUFULFNBQVMsUUFLcEI7QUFHTSxJQUFNLElBQUksR0FBVixNQUFNLElBQUk7Q0E2QmhCLENBQUE7QUE3Qlksb0JBQUk7QUFFZjtJQURDLElBQUEsZ0NBQXNCLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29DQUM1QjtBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztzQ0FDekI7QUFNbEI7SUFKQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUM7O21DQUNnQjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt5Q0FDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7c0NBQzNCO0FBV25CO0lBVEMsSUFBQSxvQkFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUFVLENBQUM7SUFDNUIsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRTtRQUMvRCxpQkFBaUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsZUFBZTtZQUNyQixvQkFBb0IsRUFBRSxjQUFjO1NBQ3JDO0tBQ0YsQ0FBQzs7eUNBQ3lCO2VBNUJoQixJQUFJO0lBRGhCLElBQUEsZ0JBQU0sRUFBQyxPQUFPLENBQUM7R0FDSCxJQUFJLENBNkJoQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx1c2VyXFxlbnRpdGllc1xccm9sZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9uLmVudGl0eSc7XG5cbmV4cG9ydCBlbnVtIFJvbGVTY29wZSB7XG4gIEdMT0JBTCA9ICdHbG9iYWwnLFxuICBPUkdBTklaQVRJT04gPSAnT3JnYW5pemF0aW9uJyxcbiAgUFJPSkVDVCA9ICdQcm9qZWN0JyxcbiAgQ09OVFJBQ1QgPSAnQ29udHJhY3QnLFxufVxuXG5ARW50aXR5KCdyb2xlcycpXG5leHBvcnQgY2xhc3MgUm9sZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHsgbmFtZTogJ3JvbGVfaWQnIH0pXG4gIHJvbGVJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JvbGVfbmFtZScsIGxlbmd0aDogMTAwIH0pXG4gIHJvbGVOYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSb2xlU2NvcGUsXG4gIH0pXG4gIHNjb3BlITogUm9sZVNjb3BlO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfc3lzdGVtJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNTeXN0ZW0hOiBib29sZWFuO1xuXG4gIEBNYW55VG9NYW55KCgpID0+IFBlcm1pc3Npb24pXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdyb2xlX3Blcm1pc3Npb25zJyxcbiAgICBqb2luQ29sdW1uOiB7IG5hbWU6ICdyb2xlX2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdyb2xlSWQnIH0sXG4gICAgaW52ZXJzZUpvaW5Db2x1bW46IHtcbiAgICAgIG5hbWU6ICdwZXJtaXNzaW9uX2lkJyxcbiAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAncGVybWlzc2lvbklkJyxcbiAgICB9LFxuICB9KVxuICBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248.map new file mode 100644 index 0000000..354fcfe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8c/roleentity_8c3ad2bb237f123bec3278c961cd9248.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\role.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAMiB;AACjB,2DAAiD;AAEjD,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,8BAAiB,CAAA;IACjB,0CAA6B,CAAA;IAC7B,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;AACvB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB;AAGM,IAAM,IAAI,GAAV,MAAM,IAAI;CA6BhB,CAAA;AA7BY,oBAAI;AAEf;IADC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;oCAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sCACzB;AAMlB;IAJC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;KAChB,CAAC;;mCACgB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;sCAC3B;AAWnB;IATC,IAAA,oBAAU,EAAC,GAAG,EAAE,CAAC,8BAAU,CAAC;IAC5B,IAAA,mBAAS,EAAC;QACT,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE;QAC/D,iBAAiB,EAAE;YACjB,IAAI,EAAE,eAAe;YACrB,oBAAoB,EAAE,cAAc;SACrC;KACF,CAAC;;yCACyB;eA5BhB,IAAI;IADhB,IAAA,gBAAM,EAAC,OAAO,CAAC;GACH,IAAI,CA6BhB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\role.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToMany,\n JoinTable,\n} from 'typeorm';\nimport { Permission } from './permission.entity';\n\nexport enum RoleScope {\n GLOBAL = 'Global',\n ORGANIZATION = 'Organization',\n PROJECT = 'Project',\n CONTRACT = 'Contract',\n}\n\n@Entity('roles')\nexport class Role {\n @PrimaryGeneratedColumn({ name: 'role_id' })\n roleId!: number;\n\n @Column({ name: 'role_name', length: 100 })\n roleName!: string;\n\n @Column({\n type: 'enum',\n enum: RoleScope,\n })\n scope!: RoleScope;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'is_system', default: false })\n isSystem!: boolean;\n\n @ManyToMany(() => Permission)\n @JoinTable({\n name: 'role_permissions',\n joinColumn: { name: 'role_id', referencedColumnName: 'roleId' },\n inverseJoinColumn: {\n name: 'permission_id',\n referencedColumnName: 'permissionId',\n },\n })\n permissions?: Permission[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d new file mode 100644 index 0000000..329aa32 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d @@ -0,0 +1,75 @@ +d326bd5446a9bf0cce98c417980e8473 +"use strict"; +// File: src/modules/workflow-engine/workflow-event.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var WorkflowEventService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowEventService = void 0; +const common_1 = require("@nestjs/common"); +let WorkflowEventService = WorkflowEventService_1 = class WorkflowEventService { + constructor() { + this.logger = new common_1.Logger(WorkflowEventService_1.name); + } + // สามารถ Inject NotificationService หรือ HttpService เข้ามาได้ตรงนี้ + // constructor(private readonly notificationService: NotificationService) {} + /** + * ประมวลผลรายการ Events ที่เกิดจากการเปลี่ยนสถานะ + */ + dispatchEvents(instanceId, events, context) { + if (!events || events.length === 0) + return; + this.logger.log(`Dispatching ${events.length} events for Instance ${instanceId}`); + // ทำแบบ Async ไม่รอผล (Fire-and-forget) เพื่อไม่ให้กระทบ Response Time ของ User + void Promise.allSettled(events.map((event) => this.processSingleEvent(instanceId, event, context))).then((results) => { + // Log errors if any + results.forEach((res, idx) => { + if (res.status === 'rejected') { + this.logger.error(`Failed to process event [${idx}]: ${String(res.reason)}`); + } + }); + }); + } + async processSingleEvent(instanceId, event, context) { + await Promise.resolve(); + try { + switch (event.type) { + case 'notify': + this.handleNotify(event, context); + break; + case 'webhook': + this.handleWebhook(event, context); + break; + case 'auto_action': + // Logic สำหรับ Auto Transition (เช่น ถ้าผ่านเงื่อนไข ให้ไปต่อเลย) + this.logger.log(`Auto Action triggered for ${instanceId}`); + break; + default: + this.logger.warn(`Unknown event type: ${event.type}`); + } + } + catch (error) { + this.logger.error(`Error processing event ${event.type}: ${String(error)}`); + throw error; + } + } + // --- Handlers --- + handleNotify(event, _context) { + // Mockup: ในของจริงจะเรียก NotificationService.send() + // const recipients = this.resolveRecipients(event.target, context); + this.logger.log(`[EVENT] Notify target: "${event.target}" | Template: "${event.template}"`); + } + handleWebhook(event, _context) { + // Mockup: เรียก HttpService.post() + this.logger.log(`[EVENT] Webhook to: "${event.target}" | Payload: ${JSON.stringify(event.payload)}`); + } +}; +exports.WorkflowEventService = WorkflowEventService; +exports.WorkflowEventService = WorkflowEventService = WorkflowEventService_1 = __decorate([ + (0, common_1.Injectable)() +], WorkflowEventService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7QUFBQSw4REFBOEQ7Ozs7Ozs7Ozs7QUFFOUQsMkNBQW9EO0FBZ0I3QyxJQUFNLG9CQUFvQiw0QkFBMUIsTUFBTSxvQkFBb0I7SUFBMUI7UUFDWSxXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsc0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUErRWxFLENBQUM7SUE3RUMscUVBQXFFO0lBQ3JFLDRFQUE0RTtJQUU1RTs7T0FFRztJQUNILGNBQWMsQ0FDWixVQUFrQixFQUNsQixNQUFrQixFQUNsQixPQUFnQztRQUVoQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsZUFBZSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsVUFBVSxFQUFFLENBQ2pFLENBQUM7UUFFRixnRkFBZ0Y7UUFDaEYsS0FBSyxPQUFPLENBQUMsVUFBVSxDQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUMzRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2pCLG9CQUFvQjtZQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMzQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDRCQUE0QixHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUMxRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FDOUIsVUFBa0IsRUFDbEIsS0FBZSxFQUNmLE9BQWdDO1FBRWhDLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2xDLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssYUFBYTtvQkFDaEIsa0VBQWtFO29CQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsVUFBVSxFQUFFLENBQUMsQ0FBQztvQkFDM0QsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsMEJBQTBCLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3pELENBQUM7WUFDRixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBRVgsWUFBWSxDQUFDLEtBQWUsRUFBRSxRQUFpQztRQUNyRSxzREFBc0Q7UUFDdEQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLDJCQUEyQixLQUFLLENBQUMsTUFBTSxrQkFBa0IsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFlLEVBQUUsUUFBaUM7UUFDdEUsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLHdCQUF3QixLQUFLLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBaEZZLG9EQUFvQjsrQkFBcEIsb0JBQW9CO0lBRGhDLElBQUEsbUJBQVUsR0FBRTtHQUNBLG9CQUFvQixDQWdGaEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzXG5cbmltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IFJhd0V2ZW50IH0gZnJvbSAnLi93b3JrZmxvdy1kc2wuc2VydmljZSc7XG5cbi8vIEludGVyZmFjZSDguKrguLPguKvguKPguLHguJogRXh0ZXJuYWwgU2VydmljZXMg4LiX4Li14LmI4LiI4Liw4Lih4Liy4Lij4Lix4LiaIEV2ZW50IOC4leC5iOC4rVxuLy8gKOC5g+C4meC4reC4meC4suC4hOC4leC4hOC4p+C4o+C5g+C4iuC5iSBOZXN0SlMgRXZlbnQgRW1pdHRlciDguYDguJ7guLfguYjguK0gRGVjb3VwbGUg4Lit4Lii4LmI4Liy4LiH4Liq4Lih4Lia4Li54Lij4LiT4LmMKVxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V2ZW50SGFuZGxlciB7XG4gIGhhbmRsZU5vdGlmaWNhdGlvbihcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZVdlYmhvb2sodXJsOiBzdHJpbmcsIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlQXV0b0FjdGlvbihpbnN0YW5jZUlkOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXZlbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFdvcmtmbG93RXZlbnRTZXJ2aWNlLm5hbWUpO1xuXG4gIC8vIOC4quC4suC4oeC4suC4o+C4liBJbmplY3QgTm90aWZpY2F0aW9uU2VydmljZSDguKvguKPguLfguK0gSHR0cFNlcnZpY2Ug4LmA4LiC4LmJ4Liy4Lih4Liy4LmE4LiU4LmJ4LiV4Lij4LiH4LiZ4Li14LmJXG4gIC8vIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSkge31cblxuICAvKipcbiAgICog4Lib4Lij4Liw4Lih4Lin4Lil4Lic4Lil4Lij4Liy4Lii4LiB4Liy4LijIEV2ZW50cyDguJfguLXguYjguYDguIHguLTguJTguIjguLLguIHguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguKrguJbguLLguJnguLBcbiAgICovXG4gIGRpc3BhdGNoRXZlbnRzKFxuICAgIGluc3RhbmNlSWQ6IHN0cmluZyxcbiAgICBldmVudHM6IFJhd0V2ZW50W10sXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgaWYgKCFldmVudHMgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgYERpc3BhdGNoaW5nICR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzIGZvciBJbnN0YW5jZSAke2luc3RhbmNlSWR9YFxuICAgICk7XG5cbiAgICAvLyDguJfguLPguYHguJrguJogQXN5bmMg4LmE4Lih4LmI4Lij4Lit4Lic4LilIChGaXJlLWFuZC1mb3JnZXQpIOC5gOC4nuC4t+C5iOC4reC5hOC4oeC5iOC5g+C4q+C5ieC4geC4o+C4sOC4l+C4miBSZXNwb25zZSBUaW1lIOC4guC4reC4hyBVc2VyXG4gICAgdm9pZCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBldmVudHMubWFwKChldmVudCkgPT4gdGhpcy5wcm9jZXNzU2luZ2xlRXZlbnQoaW5zdGFuY2VJZCwgZXZlbnQsIGNvbnRleHQpKVxuICAgICkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgLy8gTG9nIGVycm9ycyBpZiBhbnlcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBldmVudCBbJHtpZHh9XTogJHtTdHJpbmcocmVzLnJlYXNvbil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzU2luZ2xlRXZlbnQoXG4gICAgaW5zdGFuY2VJZDogc3RyaW5nLFxuICAgIGV2ZW50OiBSYXdFdmVudCxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ25vdGlmeSc6XG4gICAgICAgICAgdGhpcy5oYW5kbGVOb3RpZnkoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3ZWJob29rJzpcbiAgICAgICAgICB0aGlzLmhhbmRsZVdlYmhvb2soZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhdXRvX2FjdGlvbic6XG4gICAgICAgICAgLy8gTG9naWMg4Liq4Liz4Lir4Lij4Lix4LiaIEF1dG8gVHJhbnNpdGlvbiAo4LmA4LiK4LmI4LiZIOC4luC5ieC4suC4nOC5iOC4suC4meC5gOC4h+C4t+C5iOC4reC4meC5hOC4giDguYPguKvguYnguYTguJvguJXguYjguK3guYDguKXguKIpXG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBBdXRvIEFjdGlvbiB0cmlnZ2VyZWQgZm9yICR7aW5zdGFuY2VJZH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbmtub3duIGV2ZW50IHR5cGU6ICR7ZXZlbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBFcnJvciBwcm9jZXNzaW5nIGV2ZW50ICR7ZXZlbnQudHlwZX06ICR7U3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEhhbmRsZXJzIC0tLVxuXG4gIHByaXZhdGUgaGFuZGxlTm90aWZ5KGV2ZW50OiBSYXdFdmVudCwgX2NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgLy8gTW9ja3VwOiDguYPguJnguILguK3guIfguIjguKPguLTguIfguIjguLDguYDguKPguLXguKLguIEgTm90aWZpY2F0aW9uU2VydmljZS5zZW5kKClcbiAgICAvLyBjb25zdCByZWNpcGllbnRzID0gdGhpcy5yZXNvbHZlUmVjaXBpZW50cyhldmVudC50YXJnZXQsIGNvbnRleHQpO1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBbRVZFTlRdIE5vdGlmeSB0YXJnZXQ6IFwiJHtldmVudC50YXJnZXR9XCIgfCBUZW1wbGF0ZTogXCIke2V2ZW50LnRlbXBsYXRlfVwiYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVdlYmhvb2soZXZlbnQ6IFJhd0V2ZW50LCBfY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAvLyBNb2NrdXA6IOC5gOC4o+C4teC4ouC4gSBIdHRwU2VydmljZS5wb3N0KClcbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgW0VWRU5UXSBXZWJob29rIHRvOiBcIiR7ZXZlbnQudGFyZ2V0fVwiIHwgUGF5bG9hZDogJHtKU09OLnN0cmluZ2lmeShldmVudC5wYXlsb2FkKX1gXG4gICAgKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d.map new file mode 100644 index 0000000..46b0ff0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/workfloweventservice_8d3faec06905f14ad474e25693923f7d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-event.service.ts","mappings":";AAAA,8DAA8D;;;;;;;;;;AAE9D,2CAAoD;AAgB7C,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAA1B;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IA+ElE,CAAC;IA7EC,qEAAqE;IACrE,4EAA4E;IAE5E;;OAEG;IACH,cAAc,CACZ,UAAkB,EAClB,MAAkB,EAClB,OAAgC;QAEhC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,eAAe,MAAM,CAAC,MAAM,wBAAwB,UAAU,EAAE,CACjE,CAAC;QAEF,gFAAgF;QAChF,KAAK,OAAO,CAAC,UAAU,CACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,oBAAoB;YACpB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,4BAA4B,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC1D,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,UAAkB,EAClB,KAAe,EACf,OAAgC;QAEhC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,QAAQ;oBACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAClC,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACnC,MAAM;gBACR,KAAK,aAAa;oBAChB,kEAAkE;oBAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;oBAC3D,MAAM;gBACR;oBACE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,0BAA0B,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CACzD,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,mBAAmB;IAEX,YAAY,CAAC,KAAe,EAAE,QAAiC;QACrE,sDAAsD;QACtD,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,2BAA2B,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,QAAQ,GAAG,CAC3E,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,KAAe,EAAE,QAAiC;QACtE,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,wBAAwB,KAAK,CAAC,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;CACF,CAAA;AAhFY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CAgFhC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-event.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-event.service.ts\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport { RawEvent } from './workflow-dsl.service';\n\n// Interface สำหรับ External Services ที่จะมารับ Event ต่อ\n// (ในอนาคตควรใช้ NestJS Event Emitter เพื่อ Decouple อย่างสมบูรณ์)\nexport interface WorkflowEventHandler {\n handleNotification(\n target: string,\n template: string,\n payload: Record\n ): Promise;\n handleWebhook(url: string, payload: Record): Promise;\n handleAutoAction(instanceId: string, action: string): Promise;\n}\n\n@Injectable()\nexport class WorkflowEventService {\n private readonly logger = new Logger(WorkflowEventService.name);\n\n // สามารถ Inject NotificationService หรือ HttpService เข้ามาได้ตรงนี้\n // constructor(private readonly notificationService: NotificationService) {}\n\n /**\n * ประมวลผลรายการ Events ที่เกิดจากการเปลี่ยนสถานะ\n */\n dispatchEvents(\n instanceId: string,\n events: RawEvent[],\n context: Record\n ) {\n if (!events || events.length === 0) return;\n\n this.logger.log(\n `Dispatching ${events.length} events for Instance ${instanceId}`\n );\n\n // ทำแบบ Async ไม่รอผล (Fire-and-forget) เพื่อไม่ให้กระทบ Response Time ของ User\n void Promise.allSettled(\n events.map((event) => this.processSingleEvent(instanceId, event, context))\n ).then((results) => {\n // Log errors if any\n results.forEach((res, idx) => {\n if (res.status === 'rejected') {\n this.logger.error(\n `Failed to process event [${idx}]: ${String(res.reason)}`\n );\n }\n });\n });\n }\n\n private async processSingleEvent(\n instanceId: string,\n event: RawEvent,\n context: Record\n ) {\n await Promise.resolve();\n try {\n switch (event.type) {\n case 'notify':\n this.handleNotify(event, context);\n break;\n case 'webhook':\n this.handleWebhook(event, context);\n break;\n case 'auto_action':\n // Logic สำหรับ Auto Transition (เช่น ถ้าผ่านเงื่อนไข ให้ไปต่อเลย)\n this.logger.log(`Auto Action triggered for ${instanceId}`);\n break;\n default:\n this.logger.warn(`Unknown event type: ${event.type}`);\n }\n } catch (error) {\n this.logger.error(\n `Error processing event ${event.type}: ${String(error)}`\n );\n throw error;\n }\n }\n\n // --- Handlers ---\n\n private handleNotify(event: RawEvent, _context: Record) {\n // Mockup: ในของจริงจะเรียก NotificationService.send()\n // const recipients = this.resolveRecipients(event.target, context);\n this.logger.log(\n `[EVENT] Notify target: \"${event.target}\" | Template: \"${event.template}\"`\n );\n }\n\n private handleWebhook(event: RawEvent, _context: Record) {\n // Mockup: เรียก HttpService.post()\n this.logger.log(\n `[EVENT] Webhook to: \"${event.target}\" | Payload: ${JSON.stringify(event.payload)}`\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe new file mode 100644 index 0000000..c172062 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe @@ -0,0 +1,32 @@ +29005155072f3edefc0149cd3c8a6b82 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SubmitCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +/** + * DTO for submitting correspondence to workflow + * Uses Unified Workflow Engine - no templateId required + */ +class SubmitCorrespondenceDto { +} +exports.SubmitCorrespondenceDto = SubmitCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Optional note for the submission', + example: 'Submitting for review', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], SubmitCorrespondenceDto.prototype, "note", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcc3VibWl0LWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsNkNBQXNEO0FBRXREOzs7R0FHRztBQUNILE1BQWEsdUJBQXVCO0NBUW5DO0FBUkQsMERBUUM7QUFEQztJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGtDQUFrQztRQUMvQyxPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3FEQUNDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdG9cXHN1Ym1pdC1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNPcHRpb25hbCwgSXNTdHJpbmcgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHlPcHRpb25hbCB9IGZyb20gJ0BuZXN0anMvc3dhZ2dlcic7XG5cbi8qKlxuICogRFRPIGZvciBzdWJtaXR0aW5nIGNvcnJlc3BvbmRlbmNlIHRvIHdvcmtmbG93XG4gKiBVc2VzIFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lIC0gbm8gdGVtcGxhdGVJZCByZXF1aXJlZFxuICovXG5leHBvcnQgY2xhc3MgU3VibWl0Q29ycmVzcG9uZGVuY2VEdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBub3RlIGZvciB0aGUgc3VibWlzc2lvbicsXG4gICAgZXhhbXBsZTogJ1N1Ym1pdHRpbmcgZm9yIHJldmlldycsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgbm90ZT86IHN0cmluZztcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe.map new file mode 100644 index 0000000..dc11f62 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/submitcorrespondencedto_8ec4f87f817182b7164e9e6515cf1bfe.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\submit-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAuD;AACvD,6CAAsD;AAEtD;;;GAGG;AACH,MAAa,uBAAuB;CAQnC;AARD,0DAQC;AADC;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\submit-correspondence.dto.ts"],"sourcesContent":["import { IsOptional, IsString } from 'class-validator';\nimport { ApiPropertyOptional } from '@nestjs/swagger';\n\n/**\n * DTO for submitting correspondence to workflow\n * Uses Unified Workflow Engine - no templateId required\n */\nexport class SubmitCorrespondenceDto {\n @ApiPropertyOptional({\n description: 'Optional note for the submission',\n example: 'Submitting for review',\n })\n @IsString()\n @IsOptional()\n note?: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7 new file mode 100644 index 0000000..dd5ebd0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7 @@ -0,0 +1,15 @@ +4dcc71217185c6c2dc7c0f5d3b7d21b1 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +const rnds8Pool = new Uint8Array(256); +let poolPtr = rnds8Pool.length; +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + (0, crypto_1.randomFillSync)(rnds8Pool); + poolPtr = 0; + } + return rnds8Pool.slice(poolPtr, (poolPtr += 16)); +} +exports.default = rng; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccm5nLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQy9CLFNBQVMsR0FBRztJQUNSLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccm5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuY29uc3Qgcm5kczhQb29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmxldCBwb29sUHRyID0gcm5kczhQb29sLmxlbmd0aDtcbmZ1bmN0aW9uIHJuZygpIHtcbiAgICBpZiAocG9vbFB0ciA+IHJuZHM4UG9vbC5sZW5ndGggLSAxNikge1xuICAgICAgICAoMCwgY3J5cHRvXzEucmFuZG9tRmlsbFN5bmMpKHJuZHM4UG9vbCk7XG4gICAgICAgIHBvb2xQdHIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcm5kczhQb29sLnNsaWNlKHBvb2xQdHIsIChwb29sUHRyICs9IDE2KSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7.map new file mode 100644 index 0000000..d3c5abb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/rng_904dfc3a5bd0887a6c45cb3d878fa5c7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\rng.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AACtC,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;AAC/B,SAAS,GAAG;IACR,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\rng.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n (0, crypto_1.randomFillSync)(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\nexports.default = rng;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908 new file mode 100644 index 0000000..b0572a9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908 @@ -0,0 +1,535 @@ +44890aed019b59b7b3aa7b6416eab11f +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var MigrationService_1; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const import_transaction_entity_1 = require("./entities/import-transaction.entity"); +const correspondence_entity_1 = require("../correspondence/entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("../correspondence/entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("../correspondence/entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("../correspondence/entities/correspondence-status.entity"); +const project_entity_1 = require("../project/entities/project.entity"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const migration_review_queue_entity_1 = require("./entities/migration-review-queue.entity"); +const migration_error_entity_1 = require("./entities/migration-error.entity"); +const attachment_entity_1 = require("../../common/file-storage/entities/attachment.entity"); +const fs_1 = require("fs"); +const path = __importStar(require("path")); +const rfa_entity_1 = require("../rfa/entities/rfa.entity"); +const rfa_revision_entity_1 = require("../rfa/entities/rfa-revision.entity"); +let MigrationService = MigrationService_1 = class MigrationService { + constructor(dataSource, importTransactionRepo, correspondenceTypeRepo, correspondenceStatusRepo, projectRepo, reviewQueueRepo, errorRepo, fileStorageService) { + this.dataSource = dataSource; + this.importTransactionRepo = importTransactionRepo; + this.correspondenceTypeRepo = correspondenceTypeRepo; + this.correspondenceStatusRepo = correspondenceStatusRepo; + this.projectRepo = projectRepo; + this.reviewQueueRepo = reviewQueueRepo; + this.errorRepo = errorRepo; + this.fileStorageService = fileStorageService; + this.logger = new common_1.Logger(MigrationService_1.name); + } + async importCorrespondence(dto, idempotencyKey, userId) { + if (!idempotencyKey) { + throw new common_1.BadRequestException('Idempotency-Key header is required'); + } + // 1. Idempotency Check + const existingTransaction = await this.importTransactionRepo.findOne({ + where: { idempotencyKey }, + }); + if (existingTransaction) { + if (existingTransaction.statusCode === 201) { + this.logger.log(`Idempotency key ${idempotencyKey} already processed. Returning cached success.`); + return { + message: 'Already processed', + transaction: existingTransaction, + }; + } + else { + throw new common_1.ConflictException(`Transaction failed previously with status ${existingTransaction.statusCode}`); + } + } + // 2. Fetch Dependencies + // Alias map: n8n AI categories → correspondence_types.type_code + const CATEGORY_ALIAS = { + Correspondence: 'LETTER', + Letter: 'LETTER', + Drawing: 'OTHER', + Report: 'OTHER', + Other: 'OTHER', + }; + const type = await this.correspondenceTypeRepo.findOne({ + where: { typeName: dto.category }, + }); + // If exact name isn't found, try typeCode just in case + let typeId = type + ? type.id + : (await this.correspondenceTypeRepo.findOne({ + where: { typeCode: dto.category }, + }))?.id; + // Third-level fallback: resolve via alias map + if (!typeId && dto.category && CATEGORY_ALIAS[dto.category]) { + typeId = (await this.correspondenceTypeRepo.findOne({ + where: { typeCode: CATEGORY_ALIAS[dto.category] }, + }))?.id; + } + if (!typeId) { + throw new common_1.BadRequestException(`Category "${dto.category}" not found in system.`); + } + // Default status for correspondence + let status = await this.correspondenceStatusRepo.findOne({ + where: { statusCode: 'CLBOWN' }, + }); + if (!status) { + status = await this.correspondenceStatusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + } + if (!status) { + throw new common_1.InternalServerErrorException('CRITICAL: No default correspondence status found (missing CLBOWN/DRAFT)'); + } + // We now use project_id from n8n (instead of hardcoding LCBP3) + const project = await this.projectRepo.findOne({ + where: { id: dto.projectId }, + }); + if (!project) { + throw new common_1.BadRequestException(`Project ID ${dto.projectId} not found in database`); + } + const isRFA = type?.typeCode === 'RFA' || dto.category === 'RFA'; + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // 3. Find or Create Correspondence + let correspondence = await queryRunner.manager.findOne(correspondence_entity_1.Correspondence, { + where: { + correspondenceNumber: dto.documentNumber, + projectId: project.id, + }, + }); + if (!correspondence) { + correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: dto.documentNumber, + correspondenceTypeId: typeId, + projectId: project.id, + disciplineId: dto.disciplineId || undefined, + originatorId: dto.senderId || undefined, // Set explicitly from DTO + isInternal: false, + createdBy: userId, + }); + await queryRunner.manager.save(correspondence); + // --- CTI: insert RFA class --- + if (isRFA) { + // Default RFA type generic mapping + const rfaTypeRes = await queryRunner.manager.query("SELECT id FROM rfa_types WHERE type_code = 'GEN' LIMIT 1"); + const rfa = queryRunner.manager.create(rfa_entity_1.Rfa, { + id: correspondence.id, + rfaTypeId: rfaTypeRes[0]?.id || 1, // fallback to id 1 + createdBy: userId, + }); + await queryRunner.manager.save(rfa_entity_1.Rfa, rfa); + } + } + else { + // Update values if missing + let hasChanges = false; + if (dto.disciplineId && !correspondence.disciplineId) { + correspondence.disciplineId = dto.disciplineId; + hasChanges = true; + } + if (dto.senderId && !correspondence.originatorId) { + correspondence.originatorId = dto.senderId; + hasChanges = true; + } + if (hasChanges) { + await queryRunner.manager.save(correspondence); + } + } + // 4. File Handling + let attachmentId = null; + if (dto.tempAttachmentId) { + attachmentId = dto.tempAttachmentId; + try { + // Mark attachment as permanent + await queryRunner.manager.update(attachment_entity_1.Attachment, { id: attachmentId }, { isTemporary: false }); + } + catch (fileError) { + const errMsg = fileError instanceof Error ? fileError.message : String(fileError); + this.logger.warn(`Failed to update temp_file [id:${attachmentId}]: ${errMsg}`); + } + } + else if (dto.sourceFilePath) { + try { + const attachment = await this.fileStorageService.importStagingFile(dto.sourceFilePath, userId, { documentType: dto.category }); + attachmentId = attachment.id; + } + catch (fileError) { + const errMsg = fileError instanceof Error ? fileError.message : String(fileError); + this.logger.warn(`Failed to import file for [${dto.documentNumber}], continuing without attachment: ${errMsg}`); + } + } + // Helper function to parse Date safety + const parseDateStr = (d) => { + if (!d) + return undefined; + const num = Number(d); + if (!isNaN(num) && num > 20000 && num < 100000) { + return new Date(Math.round((num - 25569) * 86400 * 1000)); + } + const parsed = new Date(d); + if (isNaN(parsed.getTime())) + return undefined; + if (parsed.getFullYear() > 2100 || parsed.getFullYear() < 1900) + return undefined; + return parsed; + }; + // 5. Create Revision + const revisionCount = await queryRunner.manager.count(correspondence_revision_entity_1.CorrespondenceRevision, { + where: { correspondenceId: correspondence.id }, + }); + const revNum = revisionCount; + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: correspondence.id, + revisionNumber: revNum, + revisionLabel: revNum === 0 ? '0' : revNum.toString(), + isCurrent: true, + statusId: status.id, + subject: dto.subject, + description: 'Migrated from legacy system via Auto Ingest', + body: dto.body || undefined, + documentDate: parseDateStr(dto.documentDate || dto.issuedDate), + issuedDate: parseDateStr(dto.issuedDate), + receivedDate: parseDateStr(dto.receivedDate), + details: { + ...dto.details, + ai_confidence: dto.aiConfidence, + ai_issues: dto.aiIssues, + source_file_path: dto.sourceFilePath, + attachment_id: attachmentId, + }, + schemaVersion: 1, + createdBy: userId, + }); + if (revisionCount > 0) { + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, { correspondenceId: correspondence.id, isCurrent: true }, { isCurrent: false }); + } + await queryRunner.manager.save(revision); + // --- CTI: insert RfaRevision --- + if (isRFA) { + // Map Status code to RFA Equivalent 'APP' (Approved) if exist, or id 3 (typically Approved) + const rfaStatusRes = await queryRunner.manager.query("SELECT id FROM rfa_status_codes WHERE status_code = 'APP' LIMIT 1"); + const rfaRev = queryRunner.manager.create(rfa_revision_entity_1.RfaRevision, { + id: revision.id, + rfaStatusCodeId: rfaStatusRes[0]?.id || 3, // Fallback to 3 if APP not found + details: { + // Keep drawingCount as 0 for migration stub + drawingCount: 0, + }, + schemaVersion: 1, + }); + await queryRunner.manager.save(rfa_revision_entity_1.RfaRevision, rfaRev); + } + // 5.5 Handle Tags + if (dto.details && + Array.isArray(dto.details.tags) && + dto.details.tags.length > 0) { + for (const tagItem of dto.details.tags) { + let tagName; + if (typeof tagItem === 'string') { + tagName = tagItem; + } + else if (tagItem && typeof tagItem === 'object') { + const tObj = tagItem; + if (typeof tObj.tagName === 'string') { + tagName = tObj.tagName; + } + } + if (!tagName) + continue; + // Find or create Tag + const tagRes = await queryRunner.manager.query('SELECT id FROM tags WHERE project_id = ? AND tag_name = ? LIMIT 1', [project.id, tagName]); + let tagId; + if (tagRes && tagRes.length > 0) { + tagId = tagRes[0].id; + } + else { + const insertRes = await queryRunner.manager.query("INSERT INTO tags (project_id, tag_name, color_code, created_by) VALUES (?, ?, 'default', ?)", [project.id, tagName, userId]); + tagId = insertRes.insertId; + } + // Link to correspondence + await queryRunner.manager.query('INSERT IGNORE INTO correspondence_tags (correspondence_id, tag_id) VALUES (?, ?)', [correspondence.id, tagId]); + } + } + // 6. Track Transaction + const transaction = queryRunner.manager.create(import_transaction_entity_1.ImportTransaction, { + idempotencyKey, + documentNumber: dto.documentNumber, + batchId: dto.batchId, + statusCode: 201, + }); + await queryRunner.manager.save(transaction); + await queryRunner.commitTransaction(); + this.logger.log(`Ingested document [${dto.documentNumber}] successfully (Batch: ${dto.batchId})`); + return { + message: 'Import successful', + correspondenceId: correspondence.id, + revisionId: revision.id, + transactionId: transaction.id, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + const errorMessage = error instanceof Error ? error.message : String(error); + const errorStack = error instanceof Error ? error.stack : undefined; + this.logger.error(`Import failed for document [${dto.documentNumber}]: ${errorMessage}`, errorStack); + const failedTransaction = this.importTransactionRepo.create({ + idempotencyKey, + documentNumber: dto.documentNumber, + batchId: dto.batchId, + statusCode: 500, + }); + await this.importTransactionRepo.save(failedTransaction).catch(() => { }); + throw new common_1.InternalServerErrorException('Migration import failed: ' + errorMessage); + } + finally { + await queryRunner.release(); + } + } + async enqueueRecord(dto) { + if (!dto.documentNumber) { + throw new common_1.BadRequestException('documentNumber is required'); + } + // Determine status based on confidence policy in ADR-017 + let autoStatus = migration_review_queue_entity_1.MigrationReviewStatus.PENDING; + if (dto.isValid === false || + (dto.confidence != null && dto.confidence < 0.6)) { + autoStatus = migration_review_queue_entity_1.MigrationReviewStatus.REJECTED; + } + // Upsert or create new queue item + let queueItem = await this.reviewQueueRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + }); + if (!queueItem) { + queueItem = this.reviewQueueRepo.create({ + documentNumber: dto.documentNumber, + }); + } + queueItem.subject = dto.subject; + queueItem.originalSubject = dto.originalSubject; + queueItem.body = dto.body; + queueItem.aiSuggestedCategory = dto.category; + queueItem.aiIssues = dto.aiIssues; + queueItem.projectId = dto.projectId; + queueItem.senderOrganizationId = dto.senderOrgId; + queueItem.receiverOrganizationId = dto.receiverOrgId; + queueItem.remarks = dto.remarks; + queueItem.aiSummary = dto.aiSummary; + queueItem.extractedTags = dto.extractedTags; + queueItem.tempAttachmentId = dto.tempAttachmentId; + queueItem.status = autoStatus; + if (dto.issuedDate) { + const parsed = new Date(dto.issuedDate); + if (!isNaN(parsed.getTime())) + queueItem.issuedDate = parsed; + } + if (dto.receivedDate) { + const parsed = new Date(dto.receivedDate); + if (!isNaN(parsed.getTime())) + queueItem.receivedDate = parsed; + } + await this.reviewQueueRepo.save(queueItem); + this.logger.log(`Enqueued document [${dto.documentNumber}] to staging queue with status [${autoStatus}]`); + return { + message: 'Document enqueued successfully', + id: queueItem.id, + status: autoStatus, + }; + } + async getReviewQueue(query) { + const { page = 1, limit = 10, status } = query; + const skip = (page - 1) * limit; + const queryBuilder = this.reviewQueueRepo.createQueryBuilder('queue'); + if (status) { + queryBuilder.where('queue.status = :status', { status }); + } + queryBuilder.orderBy('queue.createdAt', 'DESC'); + queryBuilder.skip(skip).take(limit); + const [items, total] = await queryBuilder.getManyAndCount(); + return { + items, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + async getQueueItemById(id) { + const item = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!item) { + throw new common_1.BadRequestException(`Queue item with ID ${id} not found`); + } + return item; + } + async createError(dto) { + const error = this.errorRepo.create({ + batchId: dto.batchId, + documentNumber: dto.documentNumber, + errorType: dto.errorType, + errorMessage: dto.errorMessage, + rawAiResponse: dto.rawAiResponse, + }); + const saved = await this.errorRepo.save(error); + this.logger.warn(`Migration error logged [${dto.errorType}] for doc [${dto.documentNumber}] batch [${dto.batchId}]`); + return { message: 'Error logged', id: saved.id }; + } + async getErrors(page = 1, limit = 10) { + const skip = (page - 1) * limit; + const [items, total] = await this.errorRepo.findAndCount({ + order: { createdAt: 'DESC' }, + skip, + take: limit, + }); + return { + items, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + async approveQueueItem(id, dto, idempotencyKey, userId) { + const queueItem = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!queueItem) { + throw new common_1.BadRequestException(`Queue item ${id} not found`); + } + if (queueItem.status !== migration_review_queue_entity_1.MigrationReviewStatus.PENDING) { + throw new common_1.BadRequestException(`Queue item ${id} is already ${queueItem.status}`); + } + // Attempt the import + const result = await this.importCorrespondence(dto, idempotencyKey, userId); + // If successful, update the queue item status + queueItem.status = migration_review_queue_entity_1.MigrationReviewStatus.APPROVED; + queueItem.reviewedBy = userId.toString(); + queueItem.reviewedAt = new Date(); + await this.reviewQueueRepo.save(queueItem); + return result; + } + async commitBatch(dto, idempotencyKey, userId) { + if (!idempotencyKey) { + throw new common_1.BadRequestException('Idempotency-Key header is required'); + } + const results = []; + const errors = []; + // We let each import have its own transaction via approveQueueItem + // to avoid one bad record failing the entire batch of valid ones. + for (const item of dto.items) { + // Create a unique sub-key for each item to avoid idempotency conflicts + // when using a batch idempotency key. + const subKey = `${idempotencyKey}_${item.queueId}`; + // Force batchId on the item dto + item.dto.batchId = dto.batchId; + try { + const result = await this.approveQueueItem(item.queueId, item.dto, subKey, userId); + results.push({ queueId: item.queueId, result }); + } + catch (err) { + const errorMessage = err instanceof Error ? err.message : String(err); + errors.push({ queueId: item.queueId, error: errorMessage }); + this.logger.error(`Batch commit failed for queue ID ${item.queueId}: ${errorMessage}`); + } + } + return { + message: 'Batch processing completed', + batchId: dto.batchId, + processed: results.length, + failed: errors.length, + results, + errors, + }; + } + async rejectQueueItem(id, userId) { + const queueItem = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!queueItem) { + throw new common_1.BadRequestException('Queue item not found'); + } + queueItem.status = migration_review_queue_entity_1.MigrationReviewStatus.REJECTED; + queueItem.reviewedBy = userId.toString(); + queueItem.reviewedAt = new Date(); + await this.reviewQueueRepo.save(queueItem); + return { + message: 'Document rejected successfully', + id: queueItem.id, + }; + } + getStagingFileStream(filePath) { + if (!filePath) { + throw new common_1.BadRequestException('File path is required'); + } + const resolvedPath = path.resolve(filePath); + if (!(0, fs_1.existsSync)(resolvedPath)) { + throw new common_1.BadRequestException('File not found at specified path'); + } + return (0, fs_1.createReadStream)(resolvedPath); + } +}; +exports.MigrationService = MigrationService; +exports.MigrationService = MigrationService = MigrationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(1, (0, typeorm_1.InjectRepository)(import_transaction_entity_1.ImportTransaction)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(project_entity_1.Project)), + __param(5, (0, typeorm_1.InjectRepository)(migration_review_queue_entity_1.MigrationReviewQueue)), + __param(6, (0, typeorm_1.InjectRepository)(migration_error_entity_1.MigrationError)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _g : Object, typeof (_h = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _h : Object]) +], MigrationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQU13QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQWlEO0FBS2pELG9GQUF5RTtBQUN6RSw0RkFBa0Y7QUFDbEYsOEdBQW1HO0FBQ25HLHNHQUEyRjtBQUMzRiwwR0FBK0Y7QUFDL0YsdUVBQTZEO0FBQzdELHlGQUFvRjtBQUNwRiw0RkFHa0Q7QUFDbEQsOEVBQW1FO0FBRW5FLDRGQUFrRjtBQUNsRiwyQkFBa0Q7QUFDbEQsMkNBQTZCO0FBQzdCLDJEQUFpRDtBQUNqRCw2RUFBa0U7QUFHM0QsSUFBTSxnQkFBZ0Isd0JBQXRCLE1BQU0sZ0JBQWdCO0lBRzNCLFlBQ21CLFVBQXNCLEVBRXZDLHFCQUFxRSxFQUVyRSxzQkFBdUUsRUFFdkUsd0JBQTJFLEVBRTNFLFdBQWlELEVBRWpELGVBQWtFLEVBRWxFLFNBQXNELEVBQ3JDLGtCQUFzQztRQWJ0QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRXRCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBK0I7UUFFcEQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFnQztRQUV0RCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWtDO1FBRTFELGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUVoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBa0M7UUFFakQsY0FBUyxHQUFULFNBQVMsQ0FBNEI7UUFDckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQWhCeEMsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLGtCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBaUJ6RCxDQUFDO0lBRUosS0FBSyxDQUFDLG9CQUFvQixDQUN4QixHQUE0QixFQUM1QixjQUFzQixFQUN0QixNQUFjO1FBRWQsSUFBSSxDQUFDLGNBQWMsRUFBRSxD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VixvQkFBVSxvREFFaEIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ0QseUNBQWtCLG9CQUFsQix5Q0FBa0I7R0FqQjlDLGdCQUFnQixDQStsQjVCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcbWlncmF0aW9uLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIExvZ2dlcixcclxuICBDb25mbGljdEV4Y2VwdGlvbixcclxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxyXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXHJcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBFbnF1ZXVlTWlncmF0aW9uRHRvIH0gZnJvbSAnLi9kdG8vZW5xdWV1ZS1taWdyYXRpb24uZHRvJztcclxuaW1wb3J0IHsgQ29tbWl0QmF0Y2hEdG8gfSBmcm9tICcuL2R0by9jb21taXQtYmF0Y2guZHRvJztcclxuaW1wb3J0IHsgQ3JlYXRlTWlncmF0aW9uRXJyb3JEdG8gfSBmcm9tICcuL2R0by9jcmVhdGUtbWlncmF0aW9uLWVycm9yLmR0byc7XHJcbmltcG9ydCB7IEltcG9ydFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnRpdGllcy9pbXBvcnQtdHJhbnNhY3Rpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuLi9jb3JyZXNwb25kZW5jZS9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdHlwZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXN0YXR1cy5lbnRpdHknO1xyXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIE1pZ3JhdGlvblJldmlld1F1ZXVlLFxyXG4gIE1pZ3JhdGlvblJldmlld1N0YXR1cyxcclxufSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1yZXZpZXctcXVldWUuZW50aXR5JztcclxuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1lcnJvci5lbnRpdHknO1xyXG5pbXBvcnQgeyBNaWdyYXRpb25RdWV1ZVF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vbWlncmF0aW9uLXF1ZXVlLXF1ZXJ5LmR0byc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2VudGl0aWVzL2F0dGFjaG1lbnQuZW50aXR5JztcclxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgUmZhIH0gZnJvbSAnLi4vcmZhL2VudGl0aWVzL3JmYS5lbnRpdHknO1xyXG5pbXBvcnQgeyBSZmFSZXZpc2lvbiB9IGZyb20gJy4uL3JmYS9lbnRpdGllcy9yZmEtcmV2aXNpb24uZW50aXR5JztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihNaWdyYXRpb25TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KEltcG9ydFRyYW5zYWN0aW9uKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRUcmFuc2FjdGlvblJlcG86IFJlcG9zaXRvcnk8SW1wb3J0VHJhbnNhY3Rpb24+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3JyZXNwb25kZW5jZVR5cGVSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29ycmVzcG9uZGVuY2VTdGF0dXNSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFByb2plY3QpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RSZXBvOiBSZXBvc2l0b3J5PFByb2plY3Q+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoTWlncmF0aW9uUmV2aWV3UXVldWUpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldmlld1F1ZXVlUmVwbzogUmVwb3NpdG9yeTxNaWdyYXRpb25SZXZpZXdRdWV1ZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShNaWdyYXRpb25FcnJvcilcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JSZXBvOiBSZXBvc2l0b3J5PE1pZ3JhdGlvbkVycm9yPixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZVN0b3JhZ2VTZXJ2aWNlOiBGaWxlU3RvcmFnZVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIGltcG9ydENvcnJlc3BvbmRlbmNlKFxyXG4gICAgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFpZGVtcG90ZW5jeUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignSWRlbXBvdGVuY3ktS2V5IGhlYWRlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDEuIElkZW1wb3RlbmN5IENoZWNrXHJcbiAgICBjb25zdCBleGlzdGluZ1RyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5pbXBvcnRUcmFuc2FjdGlvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkZW1wb3RlbmN5S2V5IH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoZXhpc3RpbmdUcmFuc2FjdGlvbikge1xyXG4gICAgICBpZiAoZXhpc3RpbmdUcmFuc2FjdGlvbi5zdGF0dXNDb2RlID09PSAyMDEpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgICBgSWRlbXBvdGVuY3kga2V5ICR7aWRlbXBvdGVuY3lLZXl9IGFscmVhZHkgcHJvY2Vzc2VkLiBSZXR1cm5pbmcgY2FjaGVkIHN1Y2Nlc3MuYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdBbHJlYWR5IHByb2Nlc3NlZCcsXHJcbiAgICAgICAgICB0cmFuc2FjdGlvbjogZXhpc3RpbmdUcmFuc2FjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbihcclxuICAgICAgICAgIGBUcmFuc2FjdGlvbiBmYWlsZWQgcHJldmlvdXNseSB3aXRoIHN0YXR1cyAke2V4aXN0aW5nVHJhbnNhY3Rpb24uc3RhdHVzQ29kZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIEZldGNoIERlcGVuZGVuY2llc1xyXG4gICAgLy8gQWxpYXMgbWFwOiBuOG4gQUkgY2F0ZWdvcmllcyDihpIgY29ycmVzcG9uZGVuY2VfdHlwZXMudHlwZV9jb2RlXHJcbiAgICBjb25zdCBDQVRFR09SWV9BTElBUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgQ29ycmVzcG9uZGVuY2U6ICdMRVRURVInLFxyXG4gICAgICBMZXR0ZXI6ICdMRVRURVInLFxyXG4gICAgICBEcmF3aW5nOiAnT1RIRVInLFxyXG4gICAgICBSZXBvcnQ6ICdPVEhFUicsXHJcbiAgICAgIE90aGVyOiAnT1RIRVInLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVR5cGVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyB0eXBlTmFtZTogZHRvLmNhdGVnb3J5IH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJZiBleGFjdCBuYW1lIGlzbid0IGZvdW5kLCB0cnkgdHlwZUNvZGUganVzdCBpbiBjYXNlXHJcbiAgICBsZXQgdHlwZUlkID0gdHlwZVxyXG4gICAgICA/IHR5cGUuaWRcclxuICAgICAgOiAoXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlVHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IHR5cGVDb2RlOiBkdG8uY2F0ZWdvcnkgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKT8uaWQ7XHJcblxyXG4gICAgLy8gVGhpcmQtbGV2ZWwgZmFsbGJhY2s6IHJlc29sdmUgdmlhIGFsaWFzIG1hcFxyXG4gICAgaWYgKCF0eXBlSWQgJiYgZHRvLmNhdGVnb3J5ICYmIENBVEVHT1JZX0FMSUFTW2R0by5jYXRlZ29yeV0pIHtcclxuICAgICAgdHlwZUlkID0gKFxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VUeXBlUmVwby5maW5kT25lKHtcclxuICAgICAgICAgIHdoZXJlOiB7IHR5cGVDb2RlOiBDQVRFR09SWV9BTElBU1tkdG8uY2F0ZWdvcnldIH0sXHJcbiAgICAgICAgfSlcclxuICAgICAgKT8uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0eXBlSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgYENhdGVnb3J5IFwiJHtkdG8uY2F0ZWdvcnl9XCIgbm90IGZvdW5kIGluIHN5c3RlbS5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmYXVsdCBzdGF0dXMgZm9yIGNvcnJlc3BvbmRlbmNlXHJcbiAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVN0YXR1c1JlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6ICdDTEJPV04nIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgIHN0YXR1cyA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTdGF0dXNSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6ICdEUkFGVCcgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihcclxuICAgICAgICAnQ1JJVElDQUw6IE5vIGRlZmF1bHQgY29ycmVzcG9uZGVuY2Ugc3RhdHVzIGZvdW5kIChtaXNzaW5nIENMQk9XTi9EUkFGVCknXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2Ugbm93IHVzZSBwcm9qZWN0X2lkIGZyb20gbjhuIChpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgTENCUDMpXHJcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgdGhpcy5wcm9qZWN0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGR0by5wcm9qZWN0SWQgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFwcm9qZWN0KSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgIGBQcm9qZWN0IElEICR7ZHRvLnByb2plY3RJZH0gbm90IGZvdW5kIGluIGRhdGFiYXNlYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzUkZBID0gdHlwZT8udHlwZUNvZGUgPT09ICdSRkEnIHx8IGR0by5jYXRlZ29yeSA9PT0gJ1JGQSc7XHJcblxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyAzLiBGaW5kIG9yIENyZWF0ZSBDb3JyZXNwb25kZW5jZVxyXG4gICAgICBsZXQgY29ycmVzcG9uZGVuY2UgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmZpbmRPbmUoQ29ycmVzcG9uZGVuY2UsIHtcclxuICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlLCB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IHR5cGVJZCxcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcclxuICAgICAgICAgIGRpc2NpcGxpbmVJZDogZHRvLmRpc2NpcGxpbmVJZCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9ySWQ6IGR0by5zZW5kZXJJZCB8fCB1bmRlZmluZWQsIC8vIFNldCBleHBsaWNpdGx5IGZyb20gRFRPXHJcbiAgICAgICAgICBpc0ludGVybmFsOiBmYWxzZSxcclxuICAgICAgICAgIGNyZWF0ZWRCeTogdXNlcklkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShjb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICAgIC8vIC0tLSBDVEk6IGluc2VydCBSRkEgY2xhc3MgLS0tXHJcbiAgICAgICAgaWYgKGlzUkZBKSB7XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IFJGQSB0eXBlIGdlbmVyaWMgbWFwcGluZ1xyXG4gICAgICAgICAgY29uc3QgcmZhVHlwZVJlcyA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIucXVlcnk8eyBpZDogbnVtYmVyIH1bXT4oXHJcbiAgICAgICAgICAgIFwiU0VMRUNUIGlkIEZST00gcmZhX3R5cGVzIFdIRVJFIHR5cGVfY29kZSA9ICdHRU4nIExJTUlUIDFcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IHJmYSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKFJmYSwge1xyXG4gICAgICAgICAgICBpZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgICAgIHJmYVR5cGVJZDogcmZhVHlwZVJlc1swXT8uaWQgfHwgMSwgLy8gZmFsbGJhY2sgdG8gaWQgMVxyXG4gICAgICAgICAgICBjcmVhdGVkQnk6IHVzZXJJZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKFJmYSwgcmZhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHZhbHVlcyBpZiBtaXNzaW5nXHJcbiAgICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZHRvLmRpc2NpcGxpbmVJZCAmJiAhY29ycmVzcG9uZGVuY2UuZGlzY2lwbGluZUlkKSB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZS5kaXNjaXBsaW5lSWQgPSBkdG8uZGlzY2lwbGluZUlkO1xyXG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkdG8uc2VuZGVySWQgJiYgIWNvcnJlc3BvbmRlbmNlLm9yaWdpbmF0b3JJZCkge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcklkID0gZHRvLnNlbmRlcklkO1xyXG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNDaGFuZ2VzKSB7XHJcbiAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoY29ycmVzcG9uZGVuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gNC4gRmlsZSBIYW5kbGluZ1xyXG4gICAgICBsZXQgYXR0YWNobWVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgaWYgKGR0by50ZW1wQXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgYXR0YWNobWVudElkID0gZHRvLnRlbXBBdHRhY2htZW50SWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIE1hcmsgYXR0YWNobWVudCBhcyBwZXJtYW5lbnRcclxuICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIudXBkYXRlKFxyXG4gICAgICAgICAgICBBdHRhY2htZW50LFxyXG4gICAgICAgICAgICB7IGlkOiBhdHRhY2htZW50SWQgfSxcclxuICAgICAgICAgICAgeyBpc1RlbXBvcmFyeTogZmFsc2UgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChmaWxlRXJyb3I6IHVua25vd24pIHtcclxuICAgICAgICAgIGNvbnN0IGVyck1zZyA9XHJcbiAgICAgICAgICAgIGZpbGVFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZmlsZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZmlsZUVycm9yKTtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBfZmlsZSBbaWQ6JHthdHRhY2htZW50SWR9XTogJHtlcnJNc2d9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZHRvLnNvdXJjZUZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5pbXBvcnRTdGFnaW5nRmlsZShcclxuICAgICAgICAgICAgZHRvLnNvdXJjZUZpbGVQYXRoLFxyXG4gICAgICAgICAgICB1c2VySWQsXHJcbiAgICAgICAgICAgIHsgZG9jdW1lbnRUeXBlOiBkdG8uY2F0ZWdvcnkgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGF0dGFjaG1lbnRJZCA9IGF0dGFjaG1lbnQuaWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZmlsZUVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJNc2cgPVxyXG4gICAgICAgICAgICBmaWxlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZpbGVFcnJvci5tZXNzYWdlIDogU3RyaW5nKGZpbGVFcnJvcik7XHJcblxyXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgICAgICAgYEZhaWxlZCB0byBpbXBvcnQgZmlsZSBmb3IgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0sIGNvbnRpbnVpbmcgd2l0aG91dCBhdHRhY2htZW50OiAke2Vyck1zZ31gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIERhdGUgc2FmZXR5XHJcbiAgICAgIGNvbnN0IHBhcnNlRGF0ZVN0ciA9IChkPzogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihkKTtcclxuICAgICAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtID4gMjAwMDAgJiYgbnVtIDwgMTAwMDAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoTWF0aC5yb3VuZCgobnVtIC0gMjU1NjkpICogODY0MDAgKiAxMDAwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKGQpO1xyXG4gICAgICAgIGlmIChpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocGFyc2VkLmdldEZ1bGxZZWFyKCkgPiAyMTAwIHx8IHBhcnNlZC5nZXRGdWxsWWVhcigpIDwgMTkwMClcclxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIDUuIENyZWF0ZSBSZXZpc2lvblxyXG4gICAgICBjb25zdCByZXZpc2lvbkNvdW50ID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5jb3VudChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgcmV2TnVtID0gcmV2aXNpb25Db3VudDtcclxuICAgICAgY29uc3QgcmV2aXNpb24gPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcmV2aXNpb25OdW1iZXI6IHJldk51bSxcclxuICAgICAgICByZXZpc2lvbkxhYmVsOiByZXZOdW0gPT09IDAgPyAnMCcgOiByZXZOdW0udG9TdHJpbmcoKSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IHN0YXR1cy5pZCxcclxuICAgICAgICBzdWJqZWN0OiBkdG8uc3ViamVjdCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ01pZ3JhdGVkIGZyb20gbGVnYWN5IHN5c3RlbSB2aWEgQXV0byBJbmdlc3QnLFxyXG4gICAgICAgIGJvZHk6IGR0by5ib2R5IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICBkb2N1bWVudERhdGU6IHBhcnNlRGF0ZVN0cihkdG8uZG9jdW1lbnREYXRlIHx8IGR0by5pc3N1ZWREYXRlKSxcclxuICAgICAgICBpc3N1ZWREYXRlOiBwYXJzZURhdGVTdHIoZHRvLmlzc3VlZERhdGUpLFxyXG4gICAgICAgIHJlY2VpdmVkRGF0ZTogcGFyc2VEYXRlU3RyKGR0by5yZWNlaXZlZERhdGUpLFxyXG4gICAgICAgIGRldGFpbHM6IHtcclxuICAgICAgICAgIC4uLmR0by5kZXRhaWxzLFxyXG4gICAgICAgICAgYWlfY29uZmlkZW5jZTogZHRvLmFpQ29uZmlkZW5jZSxcclxuICAgICAgICAgIGFpX2lzc3VlczogZHRvLmFpSXNzdWVzIGFzIHVua25vd24sXHJcbiAgICAgICAgICBzb3VyY2VfZmlsZV9wYXRoOiBkdG8uc291cmNlRmlsZVBhdGgsXHJcbiAgICAgICAgICBhdHRhY2htZW50X2lkOiBhdHRhY2htZW50SWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzY2hlbWFWZXJzaW9uOiAxLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlcklkLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChyZXZpc2lvbkNvdW50ID4gMCkge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIudXBkYXRlKFxyXG4gICAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICAgIHsgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsIGlzQ3VycmVudDogdHJ1ZSB9LFxyXG4gICAgICAgICAgeyBpc0N1cnJlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUocmV2aXNpb24pO1xyXG5cclxuICAgICAgLy8gLS0tIENUSTogaW5zZXJ0IFJmYVJldmlzaW9uIC0tLVxyXG4gICAgICBpZiAoaXNSRkEpIHtcclxuICAgICAgICAvLyBNYXAgU3RhdHVzIGNvZGUgdG8gUkZBIEVxdWl2YWxlbnQgJ0FQUCcgKEFwcHJvdmVkKSBpZiBleGlzdCwgb3IgaWQgMyAodHlwaWNhbGx5IEFwcHJvdmVkKVxyXG4gICAgICAgIGNvbnN0IHJmYVN0YXR1c1JlcyA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIucXVlcnk8eyBpZDogbnVtYmVyIH1bXT4oXHJcbiAgICAgICAgICBcIlNFTEVDVCBpZCBGUk9NIHJmYV9zdGF0dXNfY29kZXMgV0hFUkUgc3RhdHVzX2NvZGUgPSAnQVBQJyBMSU1JVCAxXCJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCByZmFSZXYgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShSZmFSZXZpc2lvbiwge1xyXG4gICAgICAgICAgaWQ6IHJldmlzaW9uLmlkLFxyXG4gICAgICAgICAgcmZhU3RhdHVzQ29kZUlkOiByZmFTdGF0dXNSZXNbMF0/LmlkIHx8IDMsIC8vIEZhbGxiYWNrIHRvIDMgaWYgQVBQIG5vdCBmb3VuZFxyXG4gICAgICAgICAgZGV0YWlsczoge1xyXG4gICAgICAgICAgICAvLyBLZWVwIGRyYXdpbmdDb3VudCBhcyAwIGZvciBtaWdyYXRpb24gc3R1YlxyXG4gICAgICAgICAgICBkcmF3aW5nQ291bnQ6IDAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoUmZhUmV2aXNpb24sIHJmYVJldik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIDUuNSBIYW5kbGUgVGFnc1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZHRvLmRldGFpbHMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KGR0by5kZXRhaWxzLnRhZ3MpICYmXHJcbiAgICAgICAgZHRvLmRldGFpbHMudGFncy5sZW5ndGggPiAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdGFnSXRlbSBvZiBkdG8uZGV0YWlscy50YWdzKSB7XHJcbiAgICAgICAgICBsZXQgdGFnTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFnSXRlbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGFnTmFtZSA9IHRhZ0l0ZW07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhZ0l0ZW0gJiYgdHlwZW9mIHRhZ0l0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRPYmogPSB0YWdJdGVtIGFzIHsgdGFnTmFtZT86IHVua25vd24gfTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0T2JqLnRhZ05hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgdGFnTmFtZSA9IHRPYmoudGFnTmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghdGFnTmFtZSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgVGFnXHJcbiAgICAgICAgICBjb25zdCB0YWdSZXMgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnF1ZXJ5PHsgaWQ6IG51bWJlciB9W10+KFxyXG4gICAgICAgICAgICAnU0VMRUNUIGlkIEZST00gdGFncyBXSEVSRSBwcm9qZWN0X2lkID0gPyBBTkQgdGFnX25hbWUgPSA/IExJTUlUIDEnLFxyXG4gICAgICAgICAgICBbcHJvamVjdC5pZCwgdGFnTmFtZV1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IHRhZ0lkOiBudW1iZXI7XHJcbiAgICAgICAgICBpZiAodGFnUmVzICYmIHRhZ1Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRhZ0lkID0gdGFnUmVzWzBdLmlkO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0UmVzID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5xdWVyeTx7XHJcbiAgICAgICAgICAgICAgaW5zZXJ0SWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgfT4oXHJcbiAgICAgICAgICAgICAgXCJJTlNFUlQgSU5UTyB0YWdzIChwcm9qZWN0X2lkLCB0YWdfbmFtZSwgY29sb3JfY29kZSwgY3JlYXRlZF9ieSkgVkFMVUVTICg/LCA/LCAnZGVmYXVsdCcsID8pXCIsXHJcbiAgICAgICAgICAgICAgW3Byb2plY3QuaWQsIHRhZ05hbWUsIHVzZXJJZF1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGFnSWQgPSBpbnNlcnRSZXMuaW5zZXJ0SWQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gTGluayB0byBjb3JyZXNwb25kZW5jZVxyXG4gICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5xdWVyeShcclxuICAgICAgICAgICAgJ0lOU0VSVCBJR05PUkUgSU5UTyBjb3JyZXNwb25kZW5jZV90YWdzIChjb3JyZXNwb25kZW5jZV9pZCwgdGFnX2lkKSBWQUxVRVMgKD8sID8pJyxcclxuICAgICAgICAgICAgW2NvcnJlc3BvbmRlbmNlLmlkLCB0YWdJZF1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDYuIFRyYWNrIFRyYW5zYWN0aW9uXHJcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoSW1wb3J0VHJhbnNhY3Rpb24sIHtcclxuICAgICAgICBpZGVtcG90ZW5jeUtleSxcclxuICAgICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgIGJhdGNoSWQ6IGR0by5iYXRjaElkLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMSxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZSh0cmFuc2FjdGlvbik7XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICAgIGBJbmdlc3RlZCBkb2N1bWVudCBbJHtkdG8uZG9jdW1lbnROdW1iZXJ9XSBzdWNjZXNzZnVsbHkgKEJhdGNoOiAke2R0by5iYXRjaElkfSlgXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdJbXBvcnQgc3VjY2Vzc2Z1bCcsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXHJcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb24uaWQsXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XHJcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xyXG4gICAgICBjb25zdCBlcnJvclN0YWNrID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEltcG9ydCBmYWlsZWQgZm9yIGRvY3VtZW50IFske2R0by5kb2N1bWVudE51bWJlcn1dOiAke2Vycm9yTWVzc2FnZX1gLFxyXG4gICAgICAgIGVycm9yU3RhY2tcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZhaWxlZFRyYW5zYWN0aW9uID0gdGhpcy5pbXBvcnRUcmFuc2FjdGlvblJlcG8uY3JlYXRlKHtcclxuICAgICAgICBpZGVtcG90ZW5jeUtleSxcclxuICAgICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgIGJhdGNoSWQ6IGR0by5iYXRjaElkLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0VHJhbnNhY3Rpb25SZXBvLnNhdmUoZmFpbGVkVHJhbnNhY3Rpb24pLmNhdGNoKCgpID0+IHt9KTtcclxuXHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxyXG4gICAgICAgICdNaWdyYXRpb24gaW1wb3J0IGZhaWxlZDogJyArIGVycm9yTWVzc2FnZVxyXG4gICAgICApO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5xdWV1ZVJlY29yZChkdG86IEVucXVldWVNaWdyYXRpb25EdG8pIHtcclxuICAgIGlmICghZHRvLmRvY3VtZW50TnVtYmVyKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdkb2N1bWVudE51bWJlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERldGVybWluZSBzdGF0dXMgYmFzZWQgb24gY29uZmlkZW5jZSBwb2xpY3kgaW4gQURSLTAxN1xyXG4gICAgbGV0IGF1dG9TdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORztcclxuICAgIGlmIChcclxuICAgICAgZHRvLmlzVmFsaWQgPT09IGZhbHNlIHx8XHJcbiAgICAgIChkdG8uY29uZmlkZW5jZSAhPSBudWxsICYmIGR0by5jb25maWRlbmNlIDwgMC42KVxyXG4gICAgKSB7XHJcbiAgICAgIGF1dG9TdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUkVKRUNURUQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBzZXJ0IG9yIGNyZWF0ZSBuZXcgcXVldWUgaXRlbVxyXG4gICAgbGV0IHF1ZXVlSXRlbSA9IGF3YWl0IHRoaXMucmV2aWV3UXVldWVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXF1ZXVlSXRlbSkge1xyXG4gICAgICBxdWV1ZUl0ZW0gPSB0aGlzLnJldmlld1F1ZXVlUmVwby5jcmVhdGUoe1xyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiBkdG8uZG9jdW1lbnROdW1iZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlSXRlbS5zdWJqZWN0ID0gZHRvLnN1YmplY3Q7XHJcbiAgICBxdWV1ZUl0ZW0ub3JpZ2luYWxTdWJqZWN0ID0gZHRvLm9yaWdpbmFsU3ViamVjdDtcclxuICAgIHF1ZXVlSXRlbS5ib2R5ID0gZHRvLmJvZHk7XHJcbiAgICBxdWV1ZUl0ZW0uYWlTdWdnZXN0ZWRDYXRlZ29yeSA9IGR0by5jYXRlZ29yeTtcclxuICAgIHF1ZXVlSXRlbS5haUlzc3VlcyA9IGR0by5haUlzc3VlcztcclxuICAgIHF1ZXVlSXRlbS5wcm9qZWN0SWQgPSBkdG8ucHJvamVjdElkO1xyXG4gICAgcXVldWVJdGVtLnNlbmRlck9yZ2FuaXphdGlvbklkID0gZHRvLnNlbmRlck9yZ0lkO1xyXG4gICAgcXVldWVJdGVtLnJlY2VpdmVyT3JnYW5pemF0aW9uSWQgPSBkdG8ucmVjZWl2ZXJPcmdJZDtcclxuICAgIHF1ZXVlSXRlbS5yZW1hcmtzID0gZHRvLnJlbWFya3M7XHJcbiAgICBxdWV1ZUl0ZW0uYWlTdW1tYXJ5ID0gZHRvLmFpU3VtbWFyeTtcclxuICAgIHF1ZXVlSXRlbS5leHRyYWN0ZWRUYWdzID0gZHRvLmV4dHJhY3RlZFRhZ3M7XHJcbiAgICBxdWV1ZUl0ZW0udGVtcEF0dGFjaG1lbnRJZCA9IGR0by50ZW1wQXR0YWNobWVudElkO1xyXG4gICAgcXVldWVJdGVtLnN0YXR1cyA9IGF1dG9TdGF0dXM7XHJcblxyXG4gICAgaWYgKGR0by5pc3N1ZWREYXRlKSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKGR0by5pc3N1ZWREYXRlKTtcclxuICAgICAgaWYgKCFpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcXVldWVJdGVtLmlzc3VlZERhdGUgPSBwYXJzZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoZHRvLnJlY2VpdmVkRGF0ZSkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZShkdG8ucmVjZWl2ZWREYXRlKTtcclxuICAgICAgaWYgKCFpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcXVldWVJdGVtLnJlY2VpdmVkRGF0ZSA9IHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5zYXZlKHF1ZXVlSXRlbSk7XHJcblxyXG4gICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICBgRW5xdWV1ZWQgZG9jdW1lbnQgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0gdG8gc3RhZ2luZyBxdWV1ZSB3aXRoIHN0YXR1cyBbJHthdXRvU3RhdHVzfV1gXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1lc3NhZ2U6ICdEb2N1bWVudCBlbnF1ZXVlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICBpZDogcXVldWVJdGVtLmlkLFxyXG4gICAgICBzdGF0dXM6IGF1dG9TdGF0dXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UmV2aWV3UXVldWUocXVlcnk6IE1pZ3JhdGlvblF1ZXVlUXVlcnlEdG8pIHtcclxuICAgIGNvbnN0IHsgcGFnZSA9IDEsIGxpbWl0ID0gMTAsIHN0YXR1cyB9ID0gcXVlcnk7XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXMucmV2aWV3UXVldWVSZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncXVldWUnKTtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcXVlcnlCdWlsZGVyLndoZXJlKCdxdWV1ZS5zdGF0dXMgPSA6c3RhdHVzJywgeyBzdGF0dXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlCdWlsZGVyLm9yZGVyQnkoJ3F1ZXVlLmNyZWF0ZWRBdCcsICdERVNDJyk7XHJcbiAgICBxdWVyeUJ1aWxkZXIuc2tpcChza2lwKS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5QnVpbGRlci5nZXRNYW55QW5kQ291bnQoKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtcyxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UXVldWVJdGVtQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5yZXZpZXdRdWV1ZVJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYFF1ZXVlIGl0ZW0gd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlRXJyb3IoZHRvOiBDcmVhdGVNaWdyYXRpb25FcnJvckR0bykge1xyXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yUmVwby5jcmVhdGUoe1xyXG4gICAgICBiYXRjaElkOiBkdG8uYmF0Y2hJZCxcclxuICAgICAgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgZXJyb3JUeXBlOiBkdG8uZXJyb3JUeXBlLFxyXG4gICAgICBlcnJvck1lc3NhZ2U6IGR0by5lcnJvck1lc3NhZ2UsXHJcbiAgICAgIHJhd0FpUmVzcG9uc2U6IGR0by5yYXdBaVJlc3BvbnNlLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuZXJyb3JSZXBvLnNhdmUoZXJyb3IpO1xyXG4gICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgYE1pZ3JhdGlvbiBlcnJvciBsb2dnZWQgWyR7ZHRvLmVycm9yVHlwZX1dIGZvciBkb2MgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0gYmF0Y2ggWyR7ZHRvLmJhdGNoSWR9XWBcclxuICAgICk7XHJcbiAgICByZXR1cm4geyBtZXNzYWdlOiAnRXJyb3IgbG9nZ2VkJywgaWQ6IHNhdmVkLmlkIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcnJvcnMocGFnZTogbnVtYmVyID0gMSwgbGltaXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgdGhpcy5lcnJvclJlcG8uZmluZEFuZENvdW50KHtcclxuICAgICAgb3JkZXI6IHsgY3JlYXRlZEF0OiAnREVTQycgfSxcclxuICAgICAgc2tpcCxcclxuICAgICAgdGFrZTogbGltaXQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtcyxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXBwcm92ZVF1ZXVlSXRlbShcclxuICAgIGlkOiBudW1iZXIsXHJcbiAgICBkdG86IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcclxuICAgIHVzZXJJZDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBxdWV1ZUl0ZW0gPSBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIGlmICghcXVldWVJdGVtKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBRdWV1ZSBpdGVtICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChxdWV1ZUl0ZW0uc3RhdHVzICE9PSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORykge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICBgUXVldWUgaXRlbSAke2lkfSBpcyBhbHJlYWR5ICR7cXVldWVJdGVtLnN0YXR1c31gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXR0ZW1wdCB0aGUgaW1wb3J0XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmltcG9ydENvcnJlc3BvbmRlbmNlKGR0bywgaWRlbXBvdGVuY3lLZXksIHVzZXJJZCk7XHJcblxyXG4gICAgLy8gSWYgc3VjY2Vzc2Z1bCwgdXBkYXRlIHRoZSBxdWV1ZSBpdGVtIHN0YXR1c1xyXG4gICAgcXVldWVJdGVtLnN0YXR1cyA9IE1pZ3JhdGlvblJldmlld1N0YXR1cy5BUFBST1ZFRDtcclxuICAgIHF1ZXVlSXRlbS5yZXZpZXdlZEJ5ID0gdXNlcklkLnRvU3RyaW5nKCk7XHJcbiAgICBxdWV1ZUl0ZW0ucmV2aWV3ZWRBdCA9IG5ldyBEYXRlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5zYXZlKHF1ZXVlSXRlbSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbW1pdEJhdGNoKFxyXG4gICAgZHRvOiBDb21taXRCYXRjaER0byxcclxuICAgIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFpZGVtcG90ZW5jeUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignSWRlbXBvdGVuY3ktS2V5IGhlYWRlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xyXG5cclxuICAgIC8vIFdlIGxldCBlYWNoIGltcG9ydCBoYXZlIGl0cyBvd24gdHJhbnNhY3Rpb24gdmlhIGFwcHJvdmVRdWV1ZUl0ZW1cclxuICAgIC8vIHRvIGF2b2lkIG9uZSBiYWQgcmVjb3JkIGZhaWxpbmcgdGhlIGVudGlyZSBiYXRjaCBvZiB2YWxpZCBvbmVzLlxyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkdG8uaXRlbXMpIHtcclxuICAgICAgLy8gQ3JlYXRlIGEgdW5pcXVlIHN1Yi1rZXkgZm9yIGVhY2ggaXRlbSB0byBhdm9pZCBpZGVtcG90ZW5jeSBjb25mbGljdHNcclxuICAgICAgLy8gd2hlbiB1c2luZyBhIGJhdGNoIGlkZW1wb3RlbmN5IGtleS5cclxuICAgICAgY29uc3Qgc3ViS2V5ID0gYCR7aWRlbXBvdGVuY3lLZXl9XyR7aXRlbS5xdWV1ZUlkfWA7XHJcblxyXG4gICAgICAvLyBGb3JjZSBiYXRjaElkIG9uIHRoZSBpdGVtIGR0b1xyXG4gICAgICBpdGVtLmR0by5iYXRjaElkID0gZHRvLmJhdGNoSWQ7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBwcm92ZVF1ZXVlSXRlbShcclxuICAgICAgICAgIGl0ZW0ucXVldWVJZCxcclxuICAgICAgICAgIGl0ZW0uZHRvLFxyXG4gICAgICAgICAgc3ViS2V5LFxyXG4gICAgICAgICAgdXNlcklkXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXN1bHRzLnB1c2goeyBxdWV1ZUlkOiBpdGVtLnF1ZXVlSWQsIHJlc3VsdCB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xyXG4gICAgICAgIGVycm9ycy5wdXNoKHsgcXVldWVJZDogaXRlbS5xdWV1ZUlkLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgICAgYEJhdGNoIGNvbW1pdCBmYWlsZWQgZm9yIHF1ZXVlIElEICR7aXRlbS5xdWV1ZUlkfTogJHtlcnJvck1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXNzYWdlOiAnQmF0Y2ggcHJvY2Vzc2luZyBjb21wbGV0ZWQnLFxyXG4gICAgICBiYXRjaElkOiBkdG8uYmF0Y2hJZCxcclxuICAgICAgcHJvY2Vzc2VkOiByZXN1bHRzLmxlbmd0aCxcclxuICAgICAgZmFpbGVkOiBlcnJvcnMubGVuZ3RoLFxyXG4gICAgICByZXN1bHRzLFxyXG4gICAgICBlcnJvcnMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqZWN0UXVldWVJdGVtKGlkOiBudW1iZXIsIHVzZXJJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBxdWV1ZUl0ZW0gPSBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIGlmICghcXVldWVJdGVtKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdRdWV1ZSBpdGVtIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlSXRlbS5zdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUkVKRUNURUQ7XHJcbiAgICBxdWV1ZUl0ZW0ucmV2aWV3ZWRCeSA9IHVzZXJJZC50b1N0cmluZygpO1xyXG4gICAgcXVldWVJdGVtLnJldmlld2VkQXQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXZpZXdRdWV1ZVJlcG8uc2F2ZShxdWV1ZUl0ZW0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1lc3NhZ2U6ICdEb2N1bWVudCByZWplY3RlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICBpZDogcXVldWVJdGVtLmlkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldFN0YWdpbmdGaWxlU3RyZWFtKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICAgIGlmICghZmlsZVBhdGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0ZpbGUgcGF0aCBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XHJcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmlsZSBub3QgZm91bmQgYXQgc3BlY2lmaWVkIHBhdGgnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlUmVhZFN0cmVhbShyZXNvbHZlZFBhdGgpO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908.map new file mode 100644 index 0000000..b75a639 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/migrationservice_91acfa9d9eced11413bfd00b1cf7e908.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.ts"],"sourcesContent":["import {\r\n Injectable,\r\n Logger,\r\n ConflictException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\r\nimport { EnqueueMigrationDto } from './dto/enqueue-migration.dto';\r\nimport { CommitBatchDto } from './dto/commit-batch.dto';\r\nimport { CreateMigrationErrorDto } from './dto/create-migration-error.dto';\r\nimport { ImportTransaction } from './entities/import-transaction.entity';\r\nimport { Correspondence } from '../correspondence/entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from '../correspondence/entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from '../correspondence/entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from '../correspondence/entities/correspondence-status.entity';\r\nimport { Project } from '../project/entities/project.entity';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport {\r\n MigrationReviewQueue,\r\n MigrationReviewStatus,\r\n} from './entities/migration-review-queue.entity';\r\nimport { MigrationError } from './entities/migration-error.entity';\r\nimport { MigrationQueueQueryDto } from './dto/migration-queue-query.dto';\r\nimport { Attachment } from '../../common/file-storage/entities/attachment.entity';\r\nimport { createReadStream, existsSync } from 'fs';\r\nimport * as path from 'path';\r\nimport { Rfa } from '../rfa/entities/rfa.entity';\r\nimport { RfaRevision } from '../rfa/entities/rfa-revision.entity';\r\n\r\n@Injectable()\r\nexport class MigrationService {\r\n private readonly logger = new Logger(MigrationService.name);\r\n\r\n constructor(\r\n private readonly dataSource: DataSource,\r\n @InjectRepository(ImportTransaction)\r\n private readonly importTransactionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private readonly correspondenceTypeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private readonly correspondenceStatusRepo: Repository,\r\n @InjectRepository(Project)\r\n private readonly projectRepo: Repository,\r\n @InjectRepository(MigrationReviewQueue)\r\n private readonly reviewQueueRepo: Repository,\r\n @InjectRepository(MigrationError)\r\n private readonly errorRepo: Repository,\r\n private readonly fileStorageService: FileStorageService\r\n ) {}\r\n\r\n async importCorrespondence(\r\n dto: ImportCorrespondenceDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n if (!idempotencyKey) {\r\n throw new BadRequestException('Idempotency-Key header is required');\r\n }\r\n\r\n // 1. Idempotency Check\r\n const existingTransaction = await this.importTransactionRepo.findOne({\r\n where: { idempotencyKey },\r\n });\r\n\r\n if (existingTransaction) {\r\n if (existingTransaction.statusCode === 201) {\r\n this.logger.log(\r\n `Idempotency key ${idempotencyKey} already processed. Returning cached success.`\r\n );\r\n return {\r\n message: 'Already processed',\r\n transaction: existingTransaction,\r\n };\r\n } else {\r\n throw new ConflictException(\r\n `Transaction failed previously with status ${existingTransaction.statusCode}`\r\n );\r\n }\r\n }\r\n\r\n // 2. Fetch Dependencies\r\n // Alias map: n8n AI categories → correspondence_types.type_code\r\n const CATEGORY_ALIAS: Record = {\r\n Correspondence: 'LETTER',\r\n Letter: 'LETTER',\r\n Drawing: 'OTHER',\r\n Report: 'OTHER',\r\n Other: 'OTHER',\r\n };\r\n\r\n const type = await this.correspondenceTypeRepo.findOne({\r\n where: { typeName: dto.category },\r\n });\r\n\r\n // If exact name isn't found, try typeCode just in case\r\n let typeId = type\r\n ? type.id\r\n : (\r\n await this.correspondenceTypeRepo.findOne({\r\n where: { typeCode: dto.category },\r\n })\r\n )?.id;\r\n\r\n // Third-level fallback: resolve via alias map\r\n if (!typeId && dto.category && CATEGORY_ALIAS[dto.category]) {\r\n typeId = (\r\n await this.correspondenceTypeRepo.findOne({\r\n where: { typeCode: CATEGORY_ALIAS[dto.category] },\r\n })\r\n )?.id;\r\n }\r\n\r\n if (!typeId) {\r\n throw new BadRequestException(\r\n `Category \"${dto.category}\" not found in system.`\r\n );\r\n }\r\n\r\n // Default status for correspondence\r\n let status = await this.correspondenceStatusRepo.findOne({\r\n where: { statusCode: 'CLBOWN' },\r\n });\r\n if (!status) {\r\n status = await this.correspondenceStatusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n }\r\n if (!status) {\r\n throw new InternalServerErrorException(\r\n 'CRITICAL: No default correspondence status found (missing CLBOWN/DRAFT)'\r\n );\r\n }\r\n\r\n // We now use project_id from n8n (instead of hardcoding LCBP3)\r\n const project = await this.projectRepo.findOne({\r\n where: { id: dto.projectId },\r\n });\r\n if (!project) {\r\n throw new BadRequestException(\r\n `Project ID ${dto.projectId} not found in database`\r\n );\r\n }\r\n\r\n const isRFA = type?.typeCode === 'RFA' || dto.category === 'RFA';\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // 3. Find or Create Correspondence\r\n let correspondence = await queryRunner.manager.findOne(Correspondence, {\r\n where: {\r\n correspondenceNumber: dto.documentNumber,\r\n projectId: project.id,\r\n },\r\n });\r\n\r\n if (!correspondence) {\r\n correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: dto.documentNumber,\r\n correspondenceTypeId: typeId,\r\n projectId: project.id,\r\n disciplineId: dto.disciplineId || undefined,\r\n originatorId: dto.senderId || undefined, // Set explicitly from DTO\r\n isInternal: false,\r\n createdBy: userId,\r\n });\r\n await queryRunner.manager.save(correspondence);\r\n\r\n // --- CTI: insert RFA class ---\r\n if (isRFA) {\r\n // Default RFA type generic mapping\r\n const rfaTypeRes = await queryRunner.manager.query<{ id: number }[]>(\r\n \"SELECT id FROM rfa_types WHERE type_code = 'GEN' LIMIT 1\"\r\n );\r\n const rfa = queryRunner.manager.create(Rfa, {\r\n id: correspondence.id,\r\n rfaTypeId: rfaTypeRes[0]?.id || 1, // fallback to id 1\r\n createdBy: userId,\r\n });\r\n await queryRunner.manager.save(Rfa, rfa);\r\n }\r\n } else {\r\n // Update values if missing\r\n let hasChanges = false;\r\n if (dto.disciplineId && !correspondence.disciplineId) {\r\n correspondence.disciplineId = dto.disciplineId;\r\n hasChanges = true;\r\n }\r\n if (dto.senderId && !correspondence.originatorId) {\r\n correspondence.originatorId = dto.senderId;\r\n hasChanges = true;\r\n }\r\n if (hasChanges) {\r\n await queryRunner.manager.save(correspondence);\r\n }\r\n }\r\n\r\n // 4. File Handling\r\n let attachmentId: number | null = null;\r\n if (dto.tempAttachmentId) {\r\n attachmentId = dto.tempAttachmentId;\r\n try {\r\n // Mark attachment as permanent\r\n await queryRunner.manager.update(\r\n Attachment,\r\n { id: attachmentId },\r\n { isTemporary: false }\r\n );\r\n } catch (fileError: unknown) {\r\n const errMsg =\r\n fileError instanceof Error ? fileError.message : String(fileError);\r\n this.logger.warn(\r\n `Failed to update temp_file [id:${attachmentId}]: ${errMsg}`\r\n );\r\n }\r\n } else if (dto.sourceFilePath) {\r\n try {\r\n const attachment = await this.fileStorageService.importStagingFile(\r\n dto.sourceFilePath,\r\n userId,\r\n { documentType: dto.category }\r\n );\r\n attachmentId = attachment.id;\r\n } catch (fileError: unknown) {\r\n const errMsg =\r\n fileError instanceof Error ? fileError.message : String(fileError);\r\n\r\n this.logger.warn(\r\n `Failed to import file for [${dto.documentNumber}], continuing without attachment: ${errMsg}`\r\n );\r\n }\r\n }\r\n\r\n // Helper function to parse Date safety\r\n const parseDateStr = (d?: string | number) => {\r\n if (!d) return undefined;\r\n const num = Number(d);\r\n if (!isNaN(num) && num > 20000 && num < 100000) {\r\n return new Date(Math.round((num - 25569) * 86400 * 1000));\r\n }\r\n const parsed = new Date(d);\r\n if (isNaN(parsed.getTime())) return undefined;\r\n if (parsed.getFullYear() > 2100 || parsed.getFullYear() < 1900)\r\n return undefined;\r\n return parsed;\r\n };\r\n\r\n // 5. Create Revision\r\n const revisionCount = await queryRunner.manager.count(\r\n CorrespondenceRevision,\r\n {\r\n where: { correspondenceId: correspondence.id },\r\n }\r\n );\r\n\r\n const revNum = revisionCount;\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: correspondence.id,\r\n revisionNumber: revNum,\r\n revisionLabel: revNum === 0 ? '0' : revNum.toString(),\r\n isCurrent: true,\r\n statusId: status.id,\r\n subject: dto.subject,\r\n description: 'Migrated from legacy system via Auto Ingest',\r\n body: dto.body || undefined,\r\n documentDate: parseDateStr(dto.documentDate || dto.issuedDate),\r\n issuedDate: parseDateStr(dto.issuedDate),\r\n receivedDate: parseDateStr(dto.receivedDate),\r\n details: {\r\n ...dto.details,\r\n ai_confidence: dto.aiConfidence,\r\n ai_issues: dto.aiIssues as unknown,\r\n source_file_path: dto.sourceFilePath,\r\n attachment_id: attachmentId,\r\n },\r\n schemaVersion: 1,\r\n createdBy: userId,\r\n });\r\n\r\n if (revisionCount > 0) {\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n { correspondenceId: correspondence.id, isCurrent: true },\r\n { isCurrent: false }\r\n );\r\n }\r\n\r\n await queryRunner.manager.save(revision);\r\n\r\n // --- CTI: insert RfaRevision ---\r\n if (isRFA) {\r\n // Map Status code to RFA Equivalent 'APP' (Approved) if exist, or id 3 (typically Approved)\r\n const rfaStatusRes = await queryRunner.manager.query<{ id: number }[]>(\r\n \"SELECT id FROM rfa_status_codes WHERE status_code = 'APP' LIMIT 1\"\r\n );\r\n\r\n const rfaRev = queryRunner.manager.create(RfaRevision, {\r\n id: revision.id,\r\n rfaStatusCodeId: rfaStatusRes[0]?.id || 3, // Fallback to 3 if APP not found\r\n details: {\r\n // Keep drawingCount as 0 for migration stub\r\n drawingCount: 0,\r\n },\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(RfaRevision, rfaRev);\r\n }\r\n\r\n // 5.5 Handle Tags\r\n if (\r\n dto.details &&\r\n Array.isArray(dto.details.tags) &&\r\n dto.details.tags.length > 0\r\n ) {\r\n for (const tagItem of dto.details.tags) {\r\n let tagName: string | undefined;\r\n\r\n if (typeof tagItem === 'string') {\r\n tagName = tagItem;\r\n } else if (tagItem && typeof tagItem === 'object') {\r\n const tObj = tagItem as { tagName?: unknown };\r\n if (typeof tObj.tagName === 'string') {\r\n tagName = tObj.tagName;\r\n }\r\n }\r\n\r\n if (!tagName) continue;\r\n\r\n // Find or create Tag\r\n const tagRes = await queryRunner.manager.query<{ id: number }[]>(\r\n 'SELECT id FROM tags WHERE project_id = ? AND tag_name = ? LIMIT 1',\r\n [project.id, tagName]\r\n );\r\n\r\n let tagId: number;\r\n if (tagRes && tagRes.length > 0) {\r\n tagId = tagRes[0].id;\r\n } else {\r\n const insertRes = await queryRunner.manager.query<{\r\n insertId: number;\r\n }>(\r\n \"INSERT INTO tags (project_id, tag_name, color_code, created_by) VALUES (?, ?, 'default', ?)\",\r\n [project.id, tagName, userId]\r\n );\r\n tagId = insertRes.insertId;\r\n }\r\n\r\n // Link to correspondence\r\n await queryRunner.manager.query(\r\n 'INSERT IGNORE INTO correspondence_tags (correspondence_id, tag_id) VALUES (?, ?)',\r\n [correspondence.id, tagId]\r\n );\r\n }\r\n }\r\n // 6. Track Transaction\r\n const transaction = queryRunner.manager.create(ImportTransaction, {\r\n idempotencyKey,\r\n documentNumber: dto.documentNumber,\r\n batchId: dto.batchId,\r\n statusCode: 201,\r\n });\r\n await queryRunner.manager.save(transaction);\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n this.logger.log(\r\n `Ingested document [${dto.documentNumber}] successfully (Batch: ${dto.batchId})`\r\n );\r\n\r\n return {\r\n message: 'Import successful',\r\n correspondenceId: correspondence.id,\r\n revisionId: revision.id,\r\n transactionId: transaction.id,\r\n };\r\n } catch (error: unknown) {\r\n await queryRunner.rollbackTransaction();\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n const errorStack = error instanceof Error ? error.stack : undefined;\r\n\r\n this.logger.error(\r\n `Import failed for document [${dto.documentNumber}]: ${errorMessage}`,\r\n errorStack\r\n );\r\n\r\n const failedTransaction = this.importTransactionRepo.create({\r\n idempotencyKey,\r\n documentNumber: dto.documentNumber,\r\n batchId: dto.batchId,\r\n statusCode: 500,\r\n });\r\n await this.importTransactionRepo.save(failedTransaction).catch(() => {});\r\n\r\n throw new InternalServerErrorException(\r\n 'Migration import failed: ' + errorMessage\r\n );\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async enqueueRecord(dto: EnqueueMigrationDto) {\r\n if (!dto.documentNumber) {\r\n throw new BadRequestException('documentNumber is required');\r\n }\r\n\r\n // Determine status based on confidence policy in ADR-017\r\n let autoStatus = MigrationReviewStatus.PENDING;\r\n if (\r\n dto.isValid === false ||\r\n (dto.confidence != null && dto.confidence < 0.6)\r\n ) {\r\n autoStatus = MigrationReviewStatus.REJECTED;\r\n }\r\n\r\n // Upsert or create new queue item\r\n let queueItem = await this.reviewQueueRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n });\r\n\r\n if (!queueItem) {\r\n queueItem = this.reviewQueueRepo.create({\r\n documentNumber: dto.documentNumber,\r\n });\r\n }\r\n\r\n queueItem.subject = dto.subject;\r\n queueItem.originalSubject = dto.originalSubject;\r\n queueItem.body = dto.body;\r\n queueItem.aiSuggestedCategory = dto.category;\r\n queueItem.aiIssues = dto.aiIssues;\r\n queueItem.projectId = dto.projectId;\r\n queueItem.senderOrganizationId = dto.senderOrgId;\r\n queueItem.receiverOrganizationId = dto.receiverOrgId;\r\n queueItem.remarks = dto.remarks;\r\n queueItem.aiSummary = dto.aiSummary;\r\n queueItem.extractedTags = dto.extractedTags;\r\n queueItem.tempAttachmentId = dto.tempAttachmentId;\r\n queueItem.status = autoStatus;\r\n\r\n if (dto.issuedDate) {\r\n const parsed = new Date(dto.issuedDate);\r\n if (!isNaN(parsed.getTime())) queueItem.issuedDate = parsed;\r\n }\r\n if (dto.receivedDate) {\r\n const parsed = new Date(dto.receivedDate);\r\n if (!isNaN(parsed.getTime())) queueItem.receivedDate = parsed;\r\n }\r\n\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n this.logger.log(\r\n `Enqueued document [${dto.documentNumber}] to staging queue with status [${autoStatus}]`\r\n );\r\n\r\n return {\r\n message: 'Document enqueued successfully',\r\n id: queueItem.id,\r\n status: autoStatus,\r\n };\r\n }\r\n\r\n async getReviewQueue(query: MigrationQueueQueryDto) {\r\n const { page = 1, limit = 10, status } = query;\r\n const skip = (page - 1) * limit;\r\n\r\n const queryBuilder = this.reviewQueueRepo.createQueryBuilder('queue');\r\n if (status) {\r\n queryBuilder.where('queue.status = :status', { status });\r\n }\r\n\r\n queryBuilder.orderBy('queue.createdAt', 'DESC');\r\n queryBuilder.skip(skip).take(limit);\r\n\r\n const [items, total] = await queryBuilder.getManyAndCount();\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n async getQueueItemById(id: number) {\r\n const item = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!item) {\r\n throw new BadRequestException(`Queue item with ID ${id} not found`);\r\n }\r\n return item;\r\n }\r\n\r\n async createError(dto: CreateMigrationErrorDto) {\r\n const error = this.errorRepo.create({\r\n batchId: dto.batchId,\r\n documentNumber: dto.documentNumber,\r\n errorType: dto.errorType,\r\n errorMessage: dto.errorMessage,\r\n rawAiResponse: dto.rawAiResponse,\r\n });\r\n const saved = await this.errorRepo.save(error);\r\n this.logger.warn(\r\n `Migration error logged [${dto.errorType}] for doc [${dto.documentNumber}] batch [${dto.batchId}]`\r\n );\r\n return { message: 'Error logged', id: saved.id };\r\n }\r\n\r\n async getErrors(page: number = 1, limit: number = 10) {\r\n const skip = (page - 1) * limit;\r\n\r\n const [items, total] = await this.errorRepo.findAndCount({\r\n order: { createdAt: 'DESC' },\r\n skip,\r\n take: limit,\r\n });\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n async approveQueueItem(\r\n id: number,\r\n dto: ImportCorrespondenceDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n const queueItem = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!queueItem) {\r\n throw new BadRequestException(`Queue item ${id} not found`);\r\n }\r\n\r\n if (queueItem.status !== MigrationReviewStatus.PENDING) {\r\n throw new BadRequestException(\r\n `Queue item ${id} is already ${queueItem.status}`\r\n );\r\n }\r\n\r\n // Attempt the import\r\n const result = await this.importCorrespondence(dto, idempotencyKey, userId);\r\n\r\n // If successful, update the queue item status\r\n queueItem.status = MigrationReviewStatus.APPROVED;\r\n queueItem.reviewedBy = userId.toString();\r\n queueItem.reviewedAt = new Date();\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n return result;\r\n }\r\n\r\n async commitBatch(\r\n dto: CommitBatchDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n if (!idempotencyKey) {\r\n throw new BadRequestException('Idempotency-Key header is required');\r\n }\r\n\r\n const results = [];\r\n const errors = [];\r\n\r\n // We let each import have its own transaction via approveQueueItem\r\n // to avoid one bad record failing the entire batch of valid ones.\r\n\r\n for (const item of dto.items) {\r\n // Create a unique sub-key for each item to avoid idempotency conflicts\r\n // when using a batch idempotency key.\r\n const subKey = `${idempotencyKey}_${item.queueId}`;\r\n\r\n // Force batchId on the item dto\r\n item.dto.batchId = dto.batchId;\r\n\r\n try {\r\n const result = await this.approveQueueItem(\r\n item.queueId,\r\n item.dto,\r\n subKey,\r\n userId\r\n );\r\n results.push({ queueId: item.queueId, result });\r\n } catch (err: unknown) {\r\n const errorMessage = err instanceof Error ? err.message : String(err);\r\n errors.push({ queueId: item.queueId, error: errorMessage });\r\n this.logger.error(\r\n `Batch commit failed for queue ID ${item.queueId}: ${errorMessage}`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n message: 'Batch processing completed',\r\n batchId: dto.batchId,\r\n processed: results.length,\r\n failed: errors.length,\r\n results,\r\n errors,\r\n };\r\n }\r\n\r\n async rejectQueueItem(id: number, userId: number) {\r\n const queueItem = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!queueItem) {\r\n throw new BadRequestException('Queue item not found');\r\n }\r\n\r\n queueItem.status = MigrationReviewStatus.REJECTED;\r\n queueItem.reviewedBy = userId.toString();\r\n queueItem.reviewedAt = new Date();\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n return {\r\n message: 'Document rejected successfully',\r\n id: queueItem.id,\r\n };\r\n }\r\n\r\n getStagingFileStream(filePath: string) {\r\n if (!filePath) {\r\n throw new BadRequestException('File path is required');\r\n }\r\n\r\n const resolvedPath = path.resolve(filePath);\r\n if (!existsSync(resolvedPath)) {\r\n throw new BadRequestException('File not found at specified path');\r\n }\r\n\r\n return createReadStream(resolvedPath);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3 new file mode 100644 index 0000000..2534821 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3 @@ -0,0 +1,9 @@ +ada04982f3e0721c905644351f267966 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Audit = exports.AUDIT_KEY = void 0; +const common_1 = require("@nestjs/common"); +exports.AUDIT_KEY = 'audit'; +const Audit = (action, entityType) => (0, common_1.SetMetadata)(exports.AUDIT_KEY, { action, entityType }); +exports.Audit = Audit; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxhdWRpdC5kZWNvcmF0b3IudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTZDO0FBRWhDLFFBQUEsU0FBUyxHQUFHLE9BQU8sQ0FBQztBQU8xQixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQWMsRUFBRSxVQUFtQixFQUFFLEVBQUUsQ0FDM0QsSUFBQSxvQkFBVyxFQUFDLGlCQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQURwQyxRQUFBLEtBQUssU0FDK0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxhdWRpdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V0TWV0YWRhdGEgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCBBVURJVF9LRVkgPSAnYXVkaXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0TWV0YWRhdGEge1xuICBhY3Rpb246IHN0cmluZzsgLy8g4LiK4Li34LmI4Lit4LiB4Liy4Lij4LiB4Lij4Liw4LiX4LizICjguYDguIrguYjguJkgJ3JmYS5jcmVhdGUnLCAndXNlci5sb2dpbicpXG4gIGVudGl0eVR5cGU/OiBzdHJpbmc7IC8vIOC4iuC4t+C5iOC4rSBFbnRpdHkgKOC5gOC4iuC5iOC4mSAncmZhJywgJ3VzZXInKSAtIOC4luC5ieC4suC5hOC4oeC5iOC4o+C4sOC4muC4uOC4reC4suC4iOC4iOC4sOC4nuC4ouC4suC4ouC4suC4oeC5gOC4lOC4slxufVxuXG5leHBvcnQgY29uc3QgQXVkaXQgPSAoYWN0aW9uOiBzdHJpbmcsIGVudGl0eVR5cGU/OiBzdHJpbmcpID0+XG4gIFNldE1ldGFkYXRhKEFVRElUX0tFWSwgeyBhY3Rpb24sIGVudGl0eVR5cGUgfSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3.map new file mode 100644 index 0000000..d1818a5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/92/auditdecorator_9256d2962798c77203d8fb44810f8ca3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\audit.decorator.ts","mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,SAAS,GAAG,OAAO,CAAC;AAO1B,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,UAAmB,EAAE,EAAE,CAC3D,IAAA,oBAAW,EAAC,iBAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AADpC,QAAA,KAAK,SAC+B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\audit.decorator.ts"],"sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\nexport const AUDIT_KEY = 'audit';\n\nexport interface AuditMetadata {\n action: string; // ชื่อการกระทำ (เช่น 'rfa.create', 'user.login')\n entityType?: string; // ชื่อ Entity (เช่น 'rfa', 'user') - ถ้าไม่ระบุอาจจะพยายามเดา\n}\n\nexport const Audit = (action: string, entityType?: string) =>\n SetMetadata(AUDIT_KEY, { action, entityType });\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7 new file mode 100644 index 0000000..3571b1e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7 @@ -0,0 +1,41 @@ +6fa83a86bc2faa50d71e1e700c1485aa +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceStatus = void 0; +const typeorm_1 = require("typeorm"); +let CorrespondenceStatus = class CorrespondenceStatus { +}; +exports.CorrespondenceStatus = CorrespondenceStatus; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], CorrespondenceStatus.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', unique: true, length: 50 }), + __metadata("design:type", String) +], CorrespondenceStatus.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_name', length: 255 }), + __metadata("design:type", String) +], CorrespondenceStatus.prototype, "statusName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], CorrespondenceStatus.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true, type: 'tinyint' }), + __metadata("design:type", Boolean) +], CorrespondenceStatus.prototype, "isActive", void 0); +exports.CorrespondenceStatus = CorrespondenceStatus = __decorate([ + (0, typeorm_1.Entity)('correspondence_status') +], CorrespondenceStatus); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUcxRCxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFvQjtDQWVoQyxDQUFBO0FBZlksb0RBQW9CO0FBRS9CO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7Z0RBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3dEQUN0QztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt3REFDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7dURBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7c0RBQzNDOytCQWRSLG9CQUFvQjtJQURoQyxJQUFBLGdCQUFNLEVBQUMsdUJBQXVCLENBQUM7R0FDbkIsb0JBQW9CLENBZWhDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIENvbHVtbiwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9zdGF0dXMnKVxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlU3RhdHVzIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YXR1c19jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXG4gIHN0YXR1c0NvZGUhOiBzdHJpbmc7IC8vIOC5gOC4iuC5iOC4mSBEUkFGVCwgU1VCT1dOXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGF0dXNfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIHN0YXR1c05hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlLCB0eXBlOiAndGlueWludCcgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7.map new file mode 100644 index 0000000..8fcebde --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/correspondencestatusentity_97a32e7d167aa3e187cb27726d61bab7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-status.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAehC,CAAA;AAfY,oDAAoB;AAE/B;IADC,IAAA,gCAAsB,GAAE;;gDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;wDACtC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;uDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;sDAC3C;+BAdR,oBAAoB;IADhC,IAAA,gBAAM,EAAC,uBAAuB,CAAC;GACnB,oBAAoB,CAehC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-status.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('correspondence_status')\nexport class CorrespondenceStatus {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'status_code', unique: true, length: 50 })\n statusCode!: string; // เช่น DRAFT, SUBOWN\n\n @Column({ name: 'status_name', length: 255 })\n statusName!: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true, type: 'tinyint' })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70 new file mode 100644 index 0000000..f1e89a5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70 @@ -0,0 +1,61 @@ +beff9fb990d618231a57f26f3950b8a6 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Project = void 0; +// File: backend/src/modules/project/entities/project.entity.ts +const typeorm_1 = require("typeorm"); +const class_transformer_1 = require("class-transformer"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); +// Change Log: +// - 2026-03-27: เพิ่ม createdAt, updatedAt, deletedAt ที่ขาดหายไปตาม DB schema (แก้ Unknown column 'project.createdAt') +let Project = class Project extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Project = Project; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Project.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_code', unique: true, length: 50 }), + __metadata("design:type", String) +], Project.prototype, "projectCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_name', length: 255 }), + __metadata("design:type", String) +], Project.prototype, "projectName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: 1, type: 'tinyint' }), + __metadata("design:type", Boolean) +], Project.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Project.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Project.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Project.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => contract_entity_1.Contract, (contract) => contract.project), + __metadata("design:type", Array) +], Project.prototype, "contracts", void 0); +exports.Project = Project = __decorate([ + (0, typeorm_1.Entity)('projects') +], Project); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxcZW50aXRpZXNcXHByb2plY3QuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSwrREFBK0Q7QUFDL0QscUNBUWlCO0FBQ2pCLHlEQUE0QztBQUM1QyxnRkFBMkU7QUFDM0UsNkVBQW1FO0FBRW5FLGNBQWM7QUFDZCx3SEFBd0g7QUFHakgsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFRLFNBQVEsaUNBQWM7Q0EyQjFDLENBQUE7QUEzQlksMEJBQU87QUFHbEI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7bUNBQ0U7QUFLWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7OzRDQUN0QztBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs0Q0FDekI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt5Q0FDeEM7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7MENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7MENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7a0RBQzVDLElBQUksb0JBQUosSUFBSTswQ0FBQztBQUdqQjtJQURDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDOzswQ0FDbkM7a0JBMUJaLE9BQU87SUFEbkIsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQztHQUNOLE9BQU8sQ0EyQm5CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHByb2plY3RcXGVudGl0aWVzXFxwcm9qZWN0LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBiYWNrZW5kL3NyYy9tb2R1bGVzL3Byb2plY3QvZW50aXRpZXMvcHJvamVjdC5lbnRpdHkudHNcclxuaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgT25lVG9NYW55LFxyXG4gIENyZWF0ZURhdGVDb2x1bW4sXHJcbiAgVXBkYXRlRGF0ZUNvbHVtbixcclxuICBEZWxldGVEYXRlQ29sdW1uLFxyXG59IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xyXG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi8uLi9jb250cmFjdC9lbnRpdGllcy9jb250cmFjdC5lbnRpdHknO1xyXG5cclxuLy8gQ2hhbmdlIExvZzpcclxuLy8gLSAyMDI2LTAzLTI3OiDguYDguJ7guLTguYjguKEgY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGRlbGV0ZWRBdCDguJfguLXguYjguILguLLguJTguKvguLLguKLguYTguJvguJXguLLguKEgREIgc2NoZW1hICjguYHguIHguYkgVW5rbm93biBjb2x1bW4gJ3Byb2plY3QuY3JlYXRlZEF0JylcclxuXHJcbkBFbnRpdHkoJ3Byb2plY3RzJylcclxuZXhwb3J0IGNsYXNzIFByb2plY3QgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIEBFeGNsdWRlKClcclxuICBpZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gcHVibGljSWQgaW5oZXJpdGVkIGZyb20gVXVpZEJhc2VFbnRpdHkgKERCIGNvbHVtbjogdXVpZClcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2NvZGUnLCB1bmlxdWU6IHRydWUsIGxlbmd0aDogNTAgfSlcclxuICBwcm9qZWN0Q29kZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X25hbWUnLCBsZW5ndGg6IDI1NSB9KVxyXG4gIHByb2plY3ROYW1lITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IDEsIHR5cGU6ICd0aW55aW50JyB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlO1xyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7XHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnLCBzZWxlY3Q6IGZhbHNlIH0pXHJcbiAgZGVsZXRlZEF0PzogRGF0ZTtcclxuXHJcbiAgQE9uZVRvTWFueSgoKSA9PiBDb250cmFjdCwgKGNvbnRyYWN0KSA9PiBjb250cmFjdC5wcm9qZWN0KVxyXG4gIGNvbnRyYWN0cyE6IENvbnRyYWN0W107XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70.map new file mode 100644 index 0000000..e622716 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/97/projectentity_9707fed5c8901f41acce5eed06457e70.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\entities\\project.entity.ts","mappings":";;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,qCAQiB;AACjB,yDAA4C;AAC5C,gFAA2E;AAC3E,6EAAmE;AAEnE,cAAc;AACd,wHAAwH;AAGjH,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,iCAAc;CA2B1C,CAAA;AA3BY,0BAAO;AAGlB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;mCACE;AAKZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;4CACtC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCACxC;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;kDAC5C,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;;0CACnC;kBA1BZ,OAAO;IADnB,IAAA,gBAAM,EAAC,UAAU,CAAC;GACN,OAAO,CA2BnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\entities\\project.entity.ts"],"sourcesContent":["// File: backend/src/modules/project/entities/project.entity.ts\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n OneToMany,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n} from 'typeorm';\r\nimport { Exclude } from 'class-transformer';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Contract } from '../../contract/entities/contract.entity';\r\n\r\n// Change Log:\r\n// - 2026-03-27: เพิ่ม createdAt, updatedAt, deletedAt ที่ขาดหายไปตาม DB schema (แก้ Unknown column 'project.createdAt')\r\n\r\n@Entity('projects')\r\nexport class Project extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn()\r\n @Exclude()\r\n id!: number;\r\n\r\n // publicId inherited from UuidBaseEntity (DB column: uuid)\r\n\r\n @Column({ name: 'project_code', unique: true, length: 50 })\r\n projectCode!: string;\r\n\r\n @Column({ name: 'project_name', length: 255 })\r\n projectName!: string;\r\n\r\n @Column({ name: 'is_active', default: 1, type: 'tinyint' })\r\n isActive!: boolean;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n\r\n @DeleteDateColumn({ name: 'deleted_at', select: false })\r\n deletedAt?: Date;\r\n\r\n @OneToMany(() => Contract, (contract) => contract.project)\r\n contracts!: Contract[];\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291 new file mode 100644 index 0000000..344c0ad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291 @@ -0,0 +1,71 @@ +9b5fd4168cdbfbc97853f7ddca5b5c25 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var DocumentNumberingLockService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberingLockService = void 0; +const common_1 = require("@nestjs/common"); +const ioredis_1 = require("@nestjs-modules/ioredis"); +const ioredis_2 = __importDefault(require("ioredis")); +const redlock_1 = __importDefault(require("redlock")); +let DocumentNumberingLockService = DocumentNumberingLockService_1 = class DocumentNumberingLockService { + constructor(redis) { + this.redis = redis; + this.logger = new common_1.Logger(DocumentNumberingLockService_1.name); + this.redlock = new redlock_1.default([redis], { + driftFactor: 0.01, + retryCount: 5, + retryDelay: 100, + retryJitter: 50, + }); + } + async acquireLock(key) { + const lockKey = this.buildLockKey(key); + const ttl = 5000; // 5 seconds + try { + const lock = await this.redlock.acquire([lockKey], ttl); + this.logger.debug(`Acquired lock: ${lockKey}`); + return lock; + } + catch (error) { + this.logger.error(`Failed to acquire lock: ${lockKey}`, error); + throw error; + } + } + async releaseLock(lock) { + try { + await lock.release(); + this.logger.debug(`Released lock`); + } + catch (error) { + this.logger.warn('Failed to release lock (may have expired)', error); + } + } + buildLockKey(key) { + return (`lock:docnum:${key.projectId}:${key.originatorOrgId}:` + + `${key.recipientOrgId ?? 0}:${key.correspondenceTypeId}:` + + `${key.subTypeId}:${key.rfaTypeId}:${key.disciplineId}:${key.resetScope}`); + } +}; +exports.DocumentNumberingLockService = DocumentNumberingLockService; +exports.DocumentNumberingLockService = DocumentNumberingLockService = DocumentNumberingLockService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, ioredis_1.InjectRedis)()), + __metadata("design:paramtypes", [typeof (_a = typeof ioredis_2.default !== "undefined" && ioredis_2.default) === "function" ? _a : Object]) +], DocumentNumberingLockService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLWxvY2suc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUNwRCxxREFBc0Q7QUFDdEQsc0RBQTRCO0FBQzVCLHNEQUF3QztBQWNqQyxJQUFNLDRCQUE0QixvQ0FBbEMsTUFBTSw0QkFBNEI7SUFJdkMsWUFBMkIsS0FBNkI7UUFBWixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBSHZDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyw4QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUl0RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFtQjtRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7UUFFOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBVTtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLEdBQW1CO1FBQ3RDLE9BQU8sQ0FDTCxlQUFlLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLGVBQWUsR0FBRztZQUN0RCxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRztZQUN6RCxHQUFHLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDMUUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBM0NZLG9FQUE0Qjt1Q0FBNUIsNEJBQTRCO0lBRHhDLElBQUEsbUJBQVUsR0FBRTtJQUtFLFdBQUEsSUFBQSxxQkFBVyxHQUFFLENBQUE7eURBQXlCLGlCQUFLLG9CQUFMLGlCQUFLO0dBSjdDLDRCQUE0QixDQTJDeEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLWxvY2suc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RSZWRpcyB9IGZyb20gJ0BuZXN0anMtbW9kdWxlcy9pb3JlZGlzJztcbmltcG9ydCBSZWRpcyBmcm9tICdpb3JlZGlzJztcbmltcG9ydCBSZWRsb2NrLCB7IExvY2sgfSBmcm9tICdyZWRsb2NrJztcblxuaW50ZXJmYWNlIExvY2tDb3VudGVyS2V5IHtcbiAgcHJvamVjdElkOiBudW1iZXI7XG4gIG9yaWdpbmF0b3JPcmdJZDogbnVtYmVyO1xuICByZWNpcGllbnRPcmdJZDogbnVtYmVyO1xuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xuICBzdWJUeXBlSWQ6IG51bWJlcjtcbiAgcmZhVHlwZUlkOiBudW1iZXI7XG4gIGRpc2NpcGxpbmVJZDogbnVtYmVyO1xuICByZXNldFNjb3BlOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlcmluZ0xvY2tTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVkbG9jazogUmVkbG9jaztcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0UmVkaXMoKSBwcml2YXRlIHJlYWRvbmx5IHJlZGlzOiBSZWRpcykge1xuICAgIHRoaXMucmVkbG9jayA9IG5ldyBSZWRsb2NrKFtyZWRpc10sIHtcbiAgICAgIGRyaWZ0RmFjdG9yOiAwLjAxLFxuICAgICAgcmV0cnlDb3VudDogNSxcbiAgICAgIHJldHJ5RGVsYXk6IDEwMCxcbiAgICAgIHJldHJ5Sml0dGVyOiA1MCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFjcXVpcmVMb2NrKGtleTogTG9ja0NvdW50ZXJLZXkpOiBQcm9taXNlPExvY2s+IHtcbiAgICBjb25zdCBsb2NrS2V5ID0gdGhpcy5idWlsZExvY2tLZXkoa2V5KTtcbiAgICBjb25zdCB0dGwgPSA1MDAwOyAvLyA1IHNlY29uZHNcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWRsb2NrLmFjcXVpcmUoW2xvY2tLZXldLCB0dGwpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEFjcXVpcmVkIGxvY2s6ICR7bG9ja0tleX1gKTtcbiAgICAgIHJldHVybiBsb2NrO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgbG9jazogJHtsb2NrS2V5fWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VMb2NrKGxvY2s6IExvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbG9jay5yZWxlYXNlKCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmVsZWFzZWQgbG9ja2ApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVsZWFzZSBsb2NrIChtYXkgaGF2ZSBleHBpcmVkKScsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTG9ja0tleShrZXk6IExvY2tDb3VudGVyS2V5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgYGxvY2s6ZG9jbnVtOiR7a2V5LnByb2plY3RJZH06JHtrZXkub3JpZ2luYXRvck9yZ0lkfTpgICtcbiAgICAgIGAke2tleS5yZWNpcGllbnRPcmdJZCA/PyAwfToke2tleS5jb3JyZXNwb25kZW5jZVR5cGVJZH06YCArXG4gICAgICBgJHtrZXkuc3ViVHlwZUlkfToke2tleS5yZmFUeXBlSWR9OiR7a2V5LmRpc2NpcGxpbmVJZH06JHtrZXkucmVzZXRTY29wZX1gXG4gICAgKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291.map new file mode 100644 index 0000000..f406c0e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/documentnumberinglockservice_9bc5e59087d93dee3598caf55c875291.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering-lock.service.ts","mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qDAAsD;AACtD,sDAA4B;AAC5B,sDAAwC;AAcjC,IAAM,4BAA4B,oCAAlC,MAAM,4BAA4B;IAIvC,YAA2B,KAA6B;QAAZ,UAAK,GAAL,KAAK,CAAO;QAHvC,WAAM,GAAG,IAAI,eAAM,CAAC,8BAA4B,CAAC,IAAI,CAAC,CAAC;QAItE,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,CAAC,KAAK,CAAC,EAAE;YAClC,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAmB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,YAAY;QAE9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAmB;QACtC,OAAO,CACL,eAAe,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,eAAe,GAAG;YACtD,GAAG,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,oBAAoB,GAAG;YACzD,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,EAAE,CAC1E,CAAC;IACJ,CAAC;CACF,CAAA;AA3CY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;IAKE,WAAA,IAAA,qBAAW,GAAE,CAAA;yDAAyB,iBAAK,oBAAL,iBAAK;GAJ7C,4BAA4B,CA2CxC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering-lock.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { InjectRedis } from '@nestjs-modules/ioredis';\nimport Redis from 'ioredis';\nimport Redlock, { Lock } from 'redlock';\n\ninterface LockCounterKey {\n projectId: number;\n originatorOrgId: number;\n recipientOrgId: number;\n correspondenceTypeId: number;\n subTypeId: number;\n rfaTypeId: number;\n disciplineId: number;\n resetScope: string;\n}\n\n@Injectable()\nexport class DocumentNumberingLockService {\n private readonly logger = new Logger(DocumentNumberingLockService.name);\n private redlock: Redlock;\n\n constructor(@InjectRedis() private readonly redis: Redis) {\n this.redlock = new Redlock([redis], {\n driftFactor: 0.01,\n retryCount: 5,\n retryDelay: 100,\n retryJitter: 50,\n });\n }\n\n async acquireLock(key: LockCounterKey): Promise {\n const lockKey = this.buildLockKey(key);\n const ttl = 5000; // 5 seconds\n\n try {\n const lock = await this.redlock.acquire([lockKey], ttl);\n this.logger.debug(`Acquired lock: ${lockKey}`);\n return lock;\n } catch (error) {\n this.logger.error(`Failed to acquire lock: ${lockKey}`, error);\n throw error;\n }\n }\n\n async releaseLock(lock: Lock): Promise {\n try {\n await lock.release();\n this.logger.debug(`Released lock`);\n } catch (error) {\n this.logger.warn('Failed to release lock (may have expired)', error);\n }\n }\n\n private buildLockKey(key: LockCounterKey): string {\n return (\n `lock:docnum:${key.projectId}:${key.originatorOrgId}:` +\n `${key.recipientOrgId ?? 0}:${key.correspondenceTypeId}:` +\n `${key.subTypeId}:${key.rfaTypeId}:${key.disciplineId}:${key.resetScope}`\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04 new file mode 100644 index 0000000..f99e17e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04 @@ -0,0 +1,86 @@ +0c24b9f8be734e3fd27c98767cdcec9a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawing = void 0; +const typeorm_1 = require("typeorm"); +const shop_drawing_revision_entity_1 = require("./shop-drawing-revision.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +const shop_drawing_main_category_entity_1 = require("./shop-drawing-main-category.entity"); +const shop_drawing_sub_category_entity_1 = require("./shop-drawing-sub-category.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ShopDrawing = class ShopDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ShopDrawing = ShopDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ShopDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'drawing_number', length: 100, unique: true }), + __metadata("design:type", String) +], ShopDrawing.prototype, "drawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "mainCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], ShopDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], ShopDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_main_category_entity_1.ShopDrawingMainCategory), + (0, typeorm_1.JoinColumn)({ name: 'main_category_id' }), + __metadata("design:type", typeof (_e = typeof shop_drawing_main_category_entity_1.ShopDrawingMainCategory !== "undefined" && shop_drawing_main_category_entity_1.ShopDrawingMainCategory) === "function" ? _e : Object) +], ShopDrawing.prototype, "mainCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_sub_category_entity_1.ShopDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_category_id' }), + __metadata("design:type", typeof (_f = typeof shop_drawing_sub_category_entity_1.ShopDrawingSubCategory !== "undefined" && shop_drawing_sub_category_entity_1.ShopDrawingSubCategory) === "function" ? _f : Object) +], ShopDrawing.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => shop_drawing_revision_entity_1.ShopDrawingRevision, (revision) => revision.shopDrawing, { + cascade: true, + }), + __metadata("design:type", Array) +], ShopDrawing.prototype, "revisions", void 0); +exports.ShopDrawing = ShopDrawing = __decorate([ + (0, typeorm_1.Entity)('shop_drawings') +], ShopDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixpRkFBcUU7QUFDckUsMEVBQWdFO0FBQ2hFLDJGQUE4RTtBQUM5RSx5RkFBNEU7QUFDNUUsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUdyQyxJQUFNLFdBQVcsR0FBakIsTUFBTSxXQUFZLFNBQVEsaUNBQWM7Q0ErQzlDLENBQUE7QUEvQ1ksa0NBQVc7QUFHdEI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7dUNBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7OENBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUN2QztBQUd2QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzttREFDYjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztrREFDYjtBQUd2QjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4Q0FDNUI7QUFNbkI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPOzRDQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLDJEQUF1QixDQUFDO0lBQ3hDLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO2tEQUMxQiwyREFBdUIsb0JBQXZCLDJEQUF1QjtpREFBQztBQUl2QztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx5REFBc0IsQ0FBQztJQUN2QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIseURBQXNCLG9CQUF0Qix5REFBc0I7Z0RBQUM7QUFLckM7SUFIQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0RBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDeEUsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOzs4Q0FDZ0M7c0JBOUN2QixXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBK0N2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcc2hvcC1kcmF3aW5nLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgRGVsZXRlRGF0ZUNvbHVtbixcbiAgT25lVG9NYW55LFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgU2hvcERyYXdpbmdSZXZpc2lvbiB9IGZyb20gJy4vc2hvcC1kcmF3aW5nLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5pbXBvcnQgeyBTaG9wRHJhd2luZ01haW5DYXRlZ29yeSB9IGZyb20gJy4vc2hvcC1kcmF3aW5nLW1haW4tY2F0ZWdvcnkuZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkgfSBmcm9tICcuL3Nob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5JztcbmltcG9ydCB7IFV1aWRCYXNlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudGl0aWVzL3V1aWQtYmFzZS5lbnRpdHknO1xuaW1wb3J0IHsgRXhjbHVkZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuQEVudGl0eSgnc2hvcF9kcmF3aW5ncycpXG5leHBvcnQgY2xhc3MgU2hvcERyYXdpbmcgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3RJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RyYXdpbmdfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIHVuaXF1ZTogdHJ1ZSB9KVxuICBkcmF3aW5nTnVtYmVyITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWFpbl9jYXRlZ29yeV9pZCcgfSlcbiAgbWFpbkNhdGVnb3J5SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdWJfY2F0ZWdvcnlfaWQnIH0pXG4gIHN1YkNhdGVnb3J5SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXG4gIGRlbGV0ZWRBdD86IERhdGU7IC8vIG51bGxhYmxlXG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyOyAvLyBudWxsYWJsZVxuXG4gIC8vIC0tLSBSZWxhdGlvbnMgLS0tXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDsgLy8g4LmA4LiV4Li04LihICEgKOC4leC4seC4p+C4l+C4teC5iCBlcnJvcilcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nTWFpbkNhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2lkJyB9KVxuICBtYWluQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ01haW5DYXRlZ29yeTsgLy8g4LmA4LiV4Li04LihICFcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5OyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBPbmVUb01hbnkoKCkgPT4gU2hvcERyYXdpbmdSZXZpc2lvbiwgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5zaG9wRHJhd2luZywge1xuICAgIGNhc2NhZGU6IHRydWUsXG4gIH0pXG4gIHJldmlzaW9ucyE6IFNob3BEcmF3aW5nUmV2aXNpb25bXTsgLy8g4LmA4LiV4Li04LihICFcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04.map new file mode 100644 index 0000000..be80b4d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/shopdrawingentity_9b1bd1c97b8cbc018b22efc9e21f4a04.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,iFAAqE;AACrE,0EAAgE;AAChE,2FAA8E;AAC9E,yFAA4E;AAC5E,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,iCAAc;CA+C9C,CAAA;AA/CY,kCAAW;AAGtB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;uCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;8CACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACvC;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;mDACb;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;kDACb;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC5B;AAMnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;4CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;kDAC1B,2DAAuB,oBAAvB,2DAAuB;iDAAC;AAIvC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,yDAAsB,oBAAtB,yDAAsB;gDAAC;AAKrC;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;QACxE,OAAO,EAAE,IAAI;KACd,CAAC;;8CACgC;sBA9CvB,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CA+CvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n OneToMany,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { ShopDrawingRevision } from './shop-drawing-revision.entity';\nimport { Project } from '../../project/entities/project.entity';\nimport { ShopDrawingMainCategory } from './shop-drawing-main-category.entity';\nimport { ShopDrawingSubCategory } from './shop-drawing-sub-category.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('shop_drawings')\nexport class ShopDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'drawing_number', length: 100, unique: true })\n drawingNumber!: string; // เติม !\n\n @Column({ name: 'main_category_id' })\n mainCategoryId!: number; // เติม !\n\n @Column({ name: 'sub_category_id' })\n subCategoryId!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date; // nullable\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number; // nullable\n\n // --- Relations ---\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม ! (ตัวที่ error)\n\n @ManyToOne(() => ShopDrawingMainCategory)\n @JoinColumn({ name: 'main_category_id' })\n mainCategory!: ShopDrawingMainCategory; // เติม !\n\n @ManyToOne(() => ShopDrawingSubCategory)\n @JoinColumn({ name: 'sub_category_id' })\n subCategory!: ShopDrawingSubCategory; // เติม !\n\n @OneToMany(() => ShopDrawingRevision, (revision) => revision.shopDrawing, {\n cascade: true,\n })\n revisions!: ShopDrawingRevision[]; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636 new file mode 100644 index 0000000..4e0778b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636 @@ -0,0 +1,83 @@ +b3e8d734de8ac3b4c98f29fc8f434bc9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Attachment = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../../modules/user/entities/user.entity"); +const uuid_base_entity_1 = require("../../entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Attachment = class Attachment extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Attachment = Attachment; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Attachment.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'original_filename', length: 255 }), + __metadata("design:type", String) +], Attachment.prototype, "originalFilename", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'stored_filename', length: 255 }), + __metadata("design:type", String) +], Attachment.prototype, "storedFilename", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'file_path', length: 500 }), + __metadata("design:type", String) +], Attachment.prototype, "filePath", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'mime_type', length: 100 }), + __metadata("design:type", String) +], Attachment.prototype, "mimeType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'file_size' }), + __metadata("design:type", Number) +], Attachment.prototype, "fileSize", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_temporary', default: true }), + __metadata("design:type", Boolean) +], Attachment.prototype, "isTemporary", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'temp_id', length: 100, nullable: true }), + __metadata("design:type", String) +], Attachment.prototype, "tempId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'expires_at', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Attachment.prototype, "expiresAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 64, nullable: true }), + __metadata("design:type", String) +], Attachment.prototype, "checksum", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reference_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Attachment.prototype, "referenceDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'uploaded_by_user_id' }), + __metadata("design:type", Number) +], Attachment.prototype, "uploadedByUserId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Attachment.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'uploaded_by_user_id' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], Attachment.prototype, "uploadedBy", void 0); +exports.Attachment = Attachment = __decorate([ + (0, typeorm_1.Entity)('attachments') +], Attachment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGVudGl0aWVzXFxhdHRhY2htZW50LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBT2lCO0FBQ2pCLDRFQUFrRTtBQUNsRSxzRUFBaUU7QUFDakUseURBQTRDO0FBR3JDLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVcsU0FBUSxpQ0FBYztDQTZDN0MsQ0FBQTtBQTdDWSxnQ0FBVTtBQUdyQjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztzQ0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7b0RBQ3pCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7a0RBQ3pCO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzRDQUN6QjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs0Q0FDekI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7OzRDQUNaO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUMxQjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN6QztBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ3JELElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0Q0FDckI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELElBQUksb0JBQUosSUFBSTtpREFBQztBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDOztvREFDZDtBQUcxQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2tEQUMvQixrQkFBSSxvQkFBSixrQkFBSTs4Q0FBQztxQkE1Q1AsVUFBVTtJQUR0QixJQUFBLGdCQUFNLEVBQUMsYUFBYSxDQUFDO0dBQ1QsVUFBVSxDQTZDdEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGVudGl0aWVzXFxhdHRhY2htZW50LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi8uLi9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2F0dGFjaG1lbnRzJylcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50IGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hbF9maWxlbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIG9yaWdpbmFsRmlsZW5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdG9yZWRfZmlsZW5hbWUnLCBsZW5ndGg6IDI1NSB9KVxuICBzdG9yZWRGaWxlbmFtZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2ZpbGVfcGF0aCcsIGxlbmd0aDogNTAwIH0pXG4gIGZpbGVQYXRoITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWltZV90eXBlJywgbGVuZ3RoOiAxMDAgfSlcbiAgbWltZVR5cGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmaWxlX3NpemUnIH0pXG4gIGZpbGVTaXplITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfdGVtcG9yYXJ5JywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc1RlbXBvcmFyeSE6IGJvb2xlYW47XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0ZW1wX2lkJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHRlbXBJZD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2V4cGlyZXNfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBleHBpcmVzQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBsZW5ndGg6IDY0LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjaGVja3N1bT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlZmVyZW5jZV9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWZlcmVuY2VEYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VwbG9hZGVkX2J5X3VzZXJfaWQnIH0pXG4gIHVwbG9hZGVkQnlVc2VySWQhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICAvLyBSZWxhdGlvbiDguIHguLHguJogVXNlciAo4LiE4LiZ4Lit4Lix4Lib4LmC4Lir4Lil4LiUKVxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VwbG9hZGVkX2J5X3VzZXJfaWQnIH0pXG4gIHVwbG9hZGVkQnk/OiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636.map new file mode 100644 index 0000000..d471340 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/attachmententity_9c5087d09ec8b700527ffb7c83f91636.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\entities\\attachment.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,4EAAkE;AAClE,sEAAiE;AACjE,yDAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,iCAAc;CA6C7C,CAAA;AA7CY,gCAAU;AAGrB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;sCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDACzB;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;kDACzB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;4CACZ;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACzC;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACrB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;iDAAC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;;oDACd;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC/B,kBAAI,oBAAJ,kBAAI;8CAAC;qBA5CP,UAAU;IADtB,IAAA,gBAAM,EAAC,aAAa,CAAC;GACT,UAAU,CA6CtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\entities\\attachment.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { User } from '../../../modules/user/entities/user.entity';\nimport { UuidBaseEntity } from '../../entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('attachments')\nexport class Attachment extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'original_filename', length: 255 })\n originalFilename!: string;\n\n @Column({ name: 'stored_filename', length: 255 })\n storedFilename!: string;\n\n @Column({ name: 'file_path', length: 500 })\n filePath!: string;\n\n @Column({ name: 'mime_type', length: 100 })\n mimeType!: string;\n\n @Column({ name: 'file_size' })\n fileSize!: number;\n\n @Column({ name: 'is_temporary', default: true })\n isTemporary!: boolean;\n\n @Column({ name: 'temp_id', length: 100, nullable: true })\n tempId?: string;\n\n @Column({ name: 'expires_at', type: 'datetime', nullable: true })\n expiresAt?: Date;\n\n @Column({ length: 64, nullable: true })\n checksum?: string;\n\n @Column({ name: 'reference_date', type: 'date', nullable: true })\n referenceDate?: Date;\n\n @Column({ name: 'uploaded_by_user_id' })\n uploadedByUserId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n // Relation กับ User (คนอัปโหลด)\n @ManyToOne(() => User)\n @JoinColumn({ name: 'uploaded_by_user_id' })\n uploadedBy?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb new file mode 100644 index 0000000..adc8170 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb @@ -0,0 +1,46 @@ +8bb7fdaff06a8f8552c678ad1cb9c886 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateMigrationErrorDto = void 0; +const class_validator_1 = require("class-validator"); +const migration_error_entity_1 = require("../entities/migration-error.entity"); +class CreateMigrationErrorDto { +} +exports.CreateMigrationErrorDto = CreateMigrationErrorDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "batchId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsEnum)(migration_error_entity_1.MigrationErrorType), + __metadata("design:type", typeof (_a = typeof migration_error_entity_1.MigrationErrorType !== "undefined" && migration_error_entity_1.MigrationErrorType) === "function" ? _a : Object) +], CreateMigrationErrorDto.prototype, "errorType", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "errorMessage", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "rawAiResponse", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGNyZWF0ZS1taWdyYXRpb24tZXJyb3IuZHRvLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBK0Q7QUFDL0QsK0VBQXdFO0FBRXhFLE1BQWEsdUJBQXVCO0NBcUJuQztBQXJCRCwwREFxQkM7QUFsQkM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3dEQUNJO0FBSWpCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUt4QjtJQUhDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQU0sRUFBQywyQ0FBa0IsQ0FBQztrREFDZiwyQ0FBa0Isb0JBQWxCLDJDQUFrQjswREFBQztBQUkvQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFJdEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzhEQUNVIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZHRvXFxjcmVhdGUtbWlncmF0aW9uLWVycm9yLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1N0cmluZywgSXNPcHRpb25hbCwgSXNFbnVtIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3JUeXBlIH0gZnJvbSAnLi4vZW50aXRpZXMvbWlncmF0aW9uLWVycm9yLmVudGl0eSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlTWlncmF0aW9uRXJyb3JEdG8ge1xyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGJhdGNoSWQ/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGRvY3VtZW50TnVtYmVyPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNFbnVtKE1pZ3JhdGlvbkVycm9yVHlwZSlcclxuICBlcnJvclR5cGU/OiBNaWdyYXRpb25FcnJvclR5cGU7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmF3QWlSZXNwb25zZT86IHN0cmluZztcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb.map new file mode 100644 index 0000000..83167c3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/createmigrationerrordto_9c87a190d3006b7b975b97854ae143fb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\create-migration-error.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAA+D;AAC/D,+EAAwE;AAExE,MAAa,uBAAuB;CAqBnC;AArBD,0DAqBC;AAlBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAKxB;IAHC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,2CAAkB,CAAC;kDACf,2CAAkB,oBAAlB,2CAAkB;0DAAC;AAI/B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;8DACU","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\create-migration-error.dto.ts"],"sourcesContent":["import { IsString, IsOptional, IsEnum } from 'class-validator';\r\nimport { MigrationErrorType } from '../entities/migration-error.entity';\r\n\r\nexport class CreateMigrationErrorDto {\r\n @IsString()\r\n @IsOptional()\r\n batchId?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n documentNumber?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n @IsEnum(MigrationErrorType)\r\n errorType?: MigrationErrorType;\r\n\r\n @IsString()\r\n @IsOptional()\r\n errorMessage?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n rawAiResponse?: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7 new file mode 100644 index 0000000..eff7459 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7 @@ -0,0 +1,5 @@ +953273cd2789fc4731de75cc9fe93c69 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff'; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWF4LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWF4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZic7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7.map new file mode 100644 index 0000000..4278ab8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/max_9db8a27964de625b0f36563abf6232a7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\max.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,sCAAsC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\max.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff';\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b new file mode 100644 index 0000000..2c29059 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b @@ -0,0 +1,201 @@ +eef37cfa9b4ca3b7e0bb60d18781ecd4 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const due_date_reminder_service_1 = require("./due-date-reminder.service"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +describe('DueDateReminderService', () => { + let service; + let revisionRepo; + let notificationService; + let userService; + const mockRevisionRepo = () => ({ + find: jest.fn(), + }); + const mockNotificationService = () => ({ + send: jest.fn().mockResolvedValue(undefined), + }); + const mockUserService = () => ({ + findDocControlIdByOrg: jest.fn(), + }); + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + due_date_reminder_service_1.DueDateReminderService, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision), + useFactory: mockRevisionRepo, + }, + { + provide: notification_service_1.NotificationService, + useFactory: mockNotificationService, + }, + { + provide: user_service_1.UserService, + useFactory: mockUserService, + }, + ], + }).compile(); + service = module.get(due_date_reminder_service_1.DueDateReminderService); + revisionRepo = module.get((0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision)); + notificationService = module.get(notification_service_1.NotificationService); + userService = module.get(user_service_1.UserService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + describe('sendDueDateReminders', () => { + it('should do nothing when no revisions are approaching due date', async () => { + revisionRepo.find.mockResolvedValue([]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip revisions with no correspondence', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: null, + status: { statusCode: 'DRAFT' }, + dueDate: new Date(), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip cancelled correspondences', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'CANCELLED' }, + subject: 'Test', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip closed (CLBOWN) correspondences', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'CLBOWN' }, + subject: 'Test', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip when no doc-control user found for org', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'DRAFT' }, + subject: 'Test Subject', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(null); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should send EMAIL notification for a valid approaching due date', async () => { + const dueDate = new Date(Date.now() + 86400000 * 2); // 2 days later + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 5, + publicId: 'corr-uuid-1', + correspondenceNumber: 'LC-TEST-001', + originatorId: 10, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'Design Review Request', + dueDate, + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(42); + await service.sendDueDateReminders(); + expect(userService.findDocControlIdByOrg).toHaveBeenCalledWith(10); + expect(notificationService.send).toHaveBeenCalledWith(expect.objectContaining({ + userId: 42, + title: 'Due Date Approaching', + type: 'EMAIL', + entityType: 'correspondence', + entityId: 5, + link: '/correspondences/corr-uuid-1', + })); + }); + it('should handle errors per revision without stopping other notifications', async () => { + const dueDate = new Date(Date.now() + 86400000); + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'First', + dueDate, + }, + { + correspondence: { + id: 2, + publicId: 'uuid-2', + correspondenceNumber: 'LC-002', + originatorId: 20, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'Second', + dueDate, + }, + ]); + userService.findDocControlIdByOrg + .mockResolvedValueOnce(42) + .mockRejectedValueOnce(new Error('DB error')); + await service.sendDueDateReminders(); + expect(notificationService.send).toHaveBeenCalledTimes(1); + }); + it('should correctly calculate daysLeft in the message', async () => { + const dueDate = new Date(Date.now() + 86400000); // exactly 1 day + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 3, + publicId: 'uuid-3', + correspondenceNumber: 'LC-003', + originatorId: 5, + }, + status: { statusCode: 'DRAFT' }, + subject: 'Urgent Document', + dueDate, + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(99); + await service.sendDueDateReminders(); + expect(notificationService.send).toHaveBeenCalledWith(expect.objectContaining({ + message: expect.stringContaining('1 day'), + })); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCw2Q0FBcUQ7QUFDckQsMkVBQXFFO0FBQ3JFLDhGQUFtRjtBQUNuRiwrRUFBMkU7QUFDM0UsdURBQW1EO0FBRW5ELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxPQUErQixDQUFDO0lBQ3BDLElBQUksWUFBaUMsQ0FBQztJQUN0QyxJQUFJLG1CQUF3QyxDQUFDO0lBQzdDLElBQUksV0FBaUQsQ0FBQztJQUV0RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUVILE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxrREFBc0I7Z0JBQ3RCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLHVEQUFzQixDQUFDO29CQUNuRCxVQUFVLEVBQUUsZ0JBQWdCO2lCQUM3QjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsMENBQW1CO29CQUM1QixVQUFVLEVBQUUsdUJBQXVCO2lCQUNwQztnQkFDRDtvQkFDRSxPQUFPLEVB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QixDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXhELE1BQU0sT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFckMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUNuRCxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2FBQzFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdWUtZGF0ZS1yZW1pbmRlci5zZXJ2aWNlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XHJcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IER1ZURhdGVSZW1pbmRlclNlcnZpY2UgfSBmcm9tICcuL2R1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyL3VzZXIuc2VydmljZSc7XHJcblxyXG5kZXNjcmliZSgnRHVlRGF0ZVJlbWluZGVyU2VydmljZScsICgpID0+IHtcclxuICBsZXQgc2VydmljZTogRHVlRGF0ZVJlbWluZGVyU2VydmljZTtcclxuICBsZXQgcmV2aXNpb25SZXBvOiB7IGZpbmQ6IGplc3QuTW9jayB9O1xyXG4gIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiB7IHNlbmQ6IGplc3QuTW9jayB9O1xyXG4gIGxldCB1c2VyU2VydmljZTogeyBmaW5kRG9jQ29udHJvbElkQnlPcmc6IGplc3QuTW9jayB9O1xyXG5cclxuICBjb25zdCBtb2NrUmV2aXNpb25SZXBvID0gKCkgPT4gKHtcclxuICAgIGZpbmQ6IGplc3QuZm4oKSxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbW9ja05vdGlmaWNhdGlvblNlcnZpY2UgPSAoKSA9PiAoe1xyXG4gICAgc2VuZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG1vY2tVc2VyU2VydmljZSA9ICgpID0+ICh7XHJcbiAgICBmaW5kRG9jQ29udHJvbElkQnlPcmc6IGplc3QuZm4oKSxcclxuICB9KTtcclxuXHJcbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGU6IFRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBEdWVEYXRlUmVtaW5kZXJTZXJ2aWNlLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uKSxcclxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG1vY2tSZXZpc2lvblJlcG8sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlRmFjdG9yeTogbW9ja05vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBVc2VyU2VydmljZSxcclxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG1vY2tVc2VyU2VydmljZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSkuY29tcGlsZSgpO1xyXG5cclxuICAgIHNlcnZpY2UgPSBtb2R1bGUuZ2V0PER1ZURhdGVSZW1pbmRlclNlcnZpY2U+KER1ZURhdGVSZW1pbmRlclNlcnZpY2UpO1xyXG4gICAgcmV2aXNpb25SZXBvID0gbW9kdWxlLmdldChnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VSZXZpc2lvbikpO1xyXG4gICAgbm90aWZpY2F0aW9uU2VydmljZSA9IG1vZHVsZS5nZXQoTm90aWZpY2F0aW9uU2VydmljZSk7XHJcbiAgICB1c2VyU2VydmljZSA9IG1vZHVsZS5nZXQoVXNlclNlcnZpY2UpO1xyXG4gIH0pO1xyXG5cclxuICBhZnRlckVhY2goKCkgPT4ge1xyXG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdzZW5kRHVlRGF0ZVJlbWluZGVycycsICgpID0+IHtcclxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyB3aGVuIG5vIHJldmlzaW9ucyBhcmUgYXBwcm9hY2hpbmcgZHVlIGRhdGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHJldmlzaW9uUmVwby5maW5kLm1vY2tSZXNvbHZlZFZhbHVlKFtdKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNraXAgcmV2aXNpb25zIHdpdGggbm8gY29ycmVzcG9uZGVuY2UnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHJldmlzaW9uUmVwby5maW5kLm1vY2tSZXNvbHZlZFZhbHVlKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZTogbnVsbCxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICAgICAgICBkdWVEYXRlOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5zZW5kRHVlRGF0ZVJlbWluZGVycygpO1xyXG5cclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgc2tpcCBjYW5jZWxsZWQgY29ycmVzcG9uZGVuY2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnQ0FOQ0VMTEVEJyB9LFxyXG4gICAgICAgICAgc3ViamVjdDogJ1Rlc3QnLFxyXG4gICAgICAgICAgZHVlRGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNraXAgY2xvc2VkIChDTEJPV04pIGNvcnJlc3BvbmRlbmNlcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgcmV2aXNpb25SZXBvLmZpbmQubW9ja1Jlc29sdmVkVmFsdWUoW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlOiB7XHJcbiAgICAgICAgICAgIGlkOiAxLFxyXG4gICAgICAgICAgICBwdWJsaWNJZDogJ3V1aWQtMScsXHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnTEMtMDAxJyxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdGF0dXM6IHsgc3RhdHVzQ29kZTogJ0NMQk9XTicgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdUZXN0JyxcclxuICAgICAgICAgIGR1ZURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCksXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnNlbmREdWVEYXRlUmVtaW5kZXJzKCk7XHJcblxyXG4gICAgICBleHBlY3Qobm90aWZpY2F0aW9uU2VydmljZS5zZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBza2lwIHdoZW4gbm8gZG9jLWNvbnRyb2wgdXNlciBmb3VuZCBmb3Igb3JnJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICAgIGR1ZURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCksXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcbiAgICAgIHVzZXJTZXJ2aWNlLmZpbmREb2NDb250cm9sSWRCeU9yZy5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNlbmQgRU1BSUwgbm90aWZpY2F0aW9uIGZvciBhIHZhbGlkIGFwcHJvYWNoaW5nIGR1ZSBkYXRlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwICogMik7IC8vIDIgZGF5cyBsYXRlclxyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDUsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAnY29yci11dWlkLTEnLFxyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ0xDLVRFU1QtMDAxJyxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdGF0dXM6IHsgc3RhdHVzQ29kZTogJ1NVQk9XTicgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdEZXNpZ24gUmV2aWV3IFJlcXVlc3QnLFxyXG4gICAgICAgICAgZHVlRGF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuICAgICAgdXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnLm1vY2tSZXNvbHZlZFZhbHVlKDQyKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdCh1c2VyU2VydmljZS5maW5kRG9jQ29udHJvbElkQnlPcmcpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTtcclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xyXG4gICAgICAgICAgdXNlcklkOiA0MixcclxuICAgICAgICAgIHRpdGxlOiAnRHVlIERhdGUgQXBwcm9hY2hpbmcnLFxyXG4gICAgICAgICAgdHlwZTogJ0VNQUlMJyxcclxuICAgICAgICAgIGVudGl0eVR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgICBlbnRpdHlJZDogNSxcclxuICAgICAgICAgIGxpbms6ICcvY29ycmVzcG9uZGVuY2VzL2NvcnItdXVpZC0xJyxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZXJyb3JzIHBlciByZXZpc2lvbiB3aXRob3V0IHN0b3BwaW5nIG90aGVyIG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGR1ZURhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgODY0MDAwMDApO1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnU1VCT1dOJyB9LFxyXG4gICAgICAgICAgc3ViamVjdDogJ0ZpcnN0JyxcclxuICAgICAgICAgIGR1ZURhdGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZToge1xyXG4gICAgICAgICAgICBpZDogMixcclxuICAgICAgICAgICAgcHVibGljSWQ6ICd1dWlkLTInLFxyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ0xDLTAwMicsXHJcbiAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogMjAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3RhdHVzOiB7IHN0YXR1c0NvZGU6ICdTVUJPV04nIH0sXHJcbiAgICAgICAgICBzdWJqZWN0OiAnU2Vjb25kJyxcclxuICAgICAgICAgIGR1ZURhdGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcbiAgICAgIHVzZXJTZXJ2aWNlLmZpbmREb2NDb250cm9sSWRCeU9yZ1xyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoNDIpXHJcbiAgICAgICAgLm1vY2tSZWplY3RlZFZhbHVlT25jZShuZXcgRXJyb3IoJ0RCIGVycm9yJykpO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5zZW5kRHVlRGF0ZVJlbWluZGVycygpO1xyXG5cclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY2FsY3VsYXRlIGRheXNMZWZ0IGluIHRoZSBtZXNzYWdlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gZXhhY3RseSAxIGRheVxyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDMsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0zJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDMnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3RhdHVzOiB7IHN0YXR1c0NvZGU6ICdEUkFGVCcgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdVcmdlbnQgRG9jdW1lbnQnLFxyXG4gICAgICAgICAgZHVlRGF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuICAgICAgdXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnLm1vY2tSZXNvbHZlZFZhbHVlKDk5KTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCcxIGRheScpLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b.map new file mode 100644 index 0000000..62921bb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/duedatereminderservicespec_a2810b2dce33226f556c08aa01ca2f2b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\r\nimport { getRepositoryToken } from '@nestjs/typeorm';\r\nimport { DueDateReminderService } from './due-date-reminder.service';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\ndescribe('DueDateReminderService', () => {\r\n let service: DueDateReminderService;\r\n let revisionRepo: { find: jest.Mock };\r\n let notificationService: { send: jest.Mock };\r\n let userService: { findDocControlIdByOrg: jest.Mock };\r\n\r\n const mockRevisionRepo = () => ({\r\n find: jest.fn(),\r\n });\r\n\r\n const mockNotificationService = () => ({\r\n send: jest.fn().mockResolvedValue(undefined),\r\n });\r\n\r\n const mockUserService = () => ({\r\n findDocControlIdByOrg: jest.fn(),\r\n });\r\n\r\n beforeEach(async () => {\r\n const module: TestingModule = await Test.createTestingModule({\r\n providers: [\r\n DueDateReminderService,\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevision),\r\n useFactory: mockRevisionRepo,\r\n },\r\n {\r\n provide: NotificationService,\r\n useFactory: mockNotificationService,\r\n },\r\n {\r\n provide: UserService,\r\n useFactory: mockUserService,\r\n },\r\n ],\r\n }).compile();\r\n\r\n service = module.get(DueDateReminderService);\r\n revisionRepo = module.get(getRepositoryToken(CorrespondenceRevision));\r\n notificationService = module.get(NotificationService);\r\n userService = module.get(UserService);\r\n });\r\n\r\n afterEach(() => {\r\n jest.clearAllMocks();\r\n });\r\n\r\n describe('sendDueDateReminders', () => {\r\n it('should do nothing when no revisions are approaching due date', async () => {\r\n revisionRepo.find.mockResolvedValue([]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip revisions with no correspondence', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: null,\r\n status: { statusCode: 'DRAFT' },\r\n dueDate: new Date(),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip cancelled correspondences', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'CANCELLED' },\r\n subject: 'Test',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip closed (CLBOWN) correspondences', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'CLBOWN' },\r\n subject: 'Test',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip when no doc-control user found for org', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'DRAFT' },\r\n subject: 'Test Subject',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(null);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should send EMAIL notification for a valid approaching due date', async () => {\r\n const dueDate = new Date(Date.now() + 86400000 * 2); // 2 days later\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 5,\r\n publicId: 'corr-uuid-1',\r\n correspondenceNumber: 'LC-TEST-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'Design Review Request',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(42);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(userService.findDocControlIdByOrg).toHaveBeenCalledWith(10);\r\n expect(notificationService.send).toHaveBeenCalledWith(\r\n expect.objectContaining({\r\n userId: 42,\r\n title: 'Due Date Approaching',\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: 5,\r\n link: '/correspondences/corr-uuid-1',\r\n })\r\n );\r\n });\r\n\r\n it('should handle errors per revision without stopping other notifications', async () => {\r\n const dueDate = new Date(Date.now() + 86400000);\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'First',\r\n dueDate,\r\n },\r\n {\r\n correspondence: {\r\n id: 2,\r\n publicId: 'uuid-2',\r\n correspondenceNumber: 'LC-002',\r\n originatorId: 20,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'Second',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg\r\n .mockResolvedValueOnce(42)\r\n .mockRejectedValueOnce(new Error('DB error'));\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n it('should correctly calculate daysLeft in the message', async () => {\r\n const dueDate = new Date(Date.now() + 86400000); // exactly 1 day\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 3,\r\n publicId: 'uuid-3',\r\n correspondenceNumber: 'LC-003',\r\n originatorId: 5,\r\n },\r\n status: { statusCode: 'DRAFT' },\r\n subject: 'Urgent Document',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(99);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).toHaveBeenCalledWith(\r\n expect.objectContaining({\r\n message: expect.stringContaining('1 day'),\r\n })\r\n );\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec new file mode 100644 index 0000000..59eab36 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec @@ -0,0 +1,108 @@ +ead1d7b154ca83a2638455ae76606ffa +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSecurityService = void 0; +// File: src/modules/json-schema/services/json-security.service.ts +const common_1 = require("@nestjs/common"); +const crypto_service_1 = require("../../../common/services/crypto.service"); +let JsonSecurityService = class JsonSecurityService { + constructor(cryptoService) { + this.cryptoService = cryptoService; + } + /** + * ขาเข้า (Write): เข้ารหัสข้อมูล Sensitive ก่อนบันทึก + */ + encryptFields(data, schemaDefinition) { + if (!data || typeof data !== 'object') + return data; + const processed = { ...data }; + // Traverse schema properties + const properties = schemaDefinition.properties; + if (properties) { + for (const [key, propSchema] of Object.entries(properties)) { + if (data[key] !== undefined) { + // 1. Check encryption flag + if (propSchema['x-encrypt'] === true) { + processed[key] = this.cryptoService.encrypt(data[key]); + } + // 2. Recursive for nested objects/arrays + if (propSchema.type === 'object' && propSchema.properties) { + processed[key] = this.encryptFields(data[key], propSchema); + } + else if (propSchema.type === 'array' && propSchema.items) { + if (Array.isArray(data[key])) { + processed[key] = data[key].map((item) => this.encryptFields(item, propSchema.items)); + } + } + } + } + } + return processed; + } + /** + * ขาออก (Read): ถอดรหัส และ กรองข้อมูลตามสิทธิ์ + */ + decryptAndFilterFields(data, schemaDefinition, context) { + if (!data || typeof data !== 'object') + return data; + // Clone data to avoid mutation + const processed = { ...data }; + const properties = schemaDefinition.properties; + if (properties) { + for (const [key, propSchema] of Object.entries(properties)) { + if (data[key] !== undefined) { + // 1. Decrypt (ถ้ามีค่าและถูกเข้ารหัสไว้) + if (propSchema['x-encrypt'] === true) { + processed[key] = this.cryptoService.decrypt(data[key]); + } + // 2. Security Check (Role-based Access Control) + if (propSchema['x-security']) { + const rule = propSchema['x-security']; + const requiredRoles = rule.roles || []; + const hasPermission = requiredRoles.some((role) => context.userRoles.includes(role) || + context.userRoles.includes('SUPERADMIN')); + if (!hasPermission) { + if (rule.onDeny === 'REMOVE') { + delete processed[key]; + continue; // ข้ามไป field ถัดไป + } + else { + // Default: MASK + processed[key] = '********'; + } + } + } + // 3. Recursive for nested objects/arrays + // (ทำต่อเมื่อ Field ยังไม่ถูกลบ) + if (processed[key] !== undefined) { + if (propSchema.type === 'object' && propSchema.properties) { + processed[key] = this.decryptAndFilterFields(processed[key], propSchema, context); + } + else if (propSchema.type === 'array' && propSchema.items) { + if (Array.isArray(processed[key])) { + processed[key] = processed[key].map((item) => this.decryptAndFilterFields(item, propSchema.items, context)); + } + } + } + } + } + } + return processed; + } +}; +exports.JsonSecurityService = JsonSecurityService; +exports.JsonSecurityService = JsonSecurityService = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof crypto_service_1.CryptoService !== "undefined" && crypto_service_1.CryptoService) === "function" ? _a : Object]) +], JsonSecurityService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFxqc29uLXNlY3VyaXR5LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLGtFQUFrRTtBQUNsRSwyQ0FBNEM7QUFDNUMsNEVBQXdFO0FBT2pFLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBQzlCLFlBQTZCLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU3RDs7T0FFRztJQUNILGFBQWEsQ0FDWCxJQUE2QixFQUM3QixnQkFBeUM7UUFFekMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQTRCLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUV2RCw2QkFBNkI7UUFDN0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFFdkIsQ0FBQztRQUNkLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsMkJBQTJCO29CQUMzQixJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDckMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUN6QyxJQUFJLENBQUMsR0FBRyxDQUE4QixDQUN2QyxDQUFDO29CQUNKLENBQUM7b0JBRUQseUNBQXlDO29CQUN6QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDMUQsU0FBUyxDQUFD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U0FBUyxDQUFDLEdBQUcsQ0FBNEIsRUFDekMsVUFBVSxFQUNWLE9BQU8sQ0FDUixDQUFDO3dCQUNKLENBQUM7NkJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQzNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNsQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQ1osU0FBUyxDQUFDLEdBQUcsQ0FDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUN6QixJQUFJLEVBQ0osVUFBVSxDQUFDLEtBQWdDLEVBQzNDLE9BQU8sQ0FDUixDQUNGLENBQUM7NEJBQ0osQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGLENBQUE7QUEzSFksa0RBQW1COzhCQUFuQixtQkFBbUI7SUFEL0IsSUFBQSxtQkFBVSxHQUFFO3lEQUVpQyw4QkFBYSxvQkFBYiw4QkFBYTtHQUQ5QyxtQkFBbUIsQ0EySC9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxzZXJ2aWNlc1xcanNvbi1zZWN1cml0eS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2pzb24tc2NoZW1hL3NlcnZpY2VzL2pzb24tc2VjdXJpdHkuc2VydmljZS50c1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vc2VydmljZXMvY3J5cHRvLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5Q29udGV4dCB7XG4gIHVzZXJSb2xlczogc3RyaW5nW107IC8vIFJvbGUg4LiC4Lit4LiHIHVzZXIg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZICjguYDguIrguYjguJkgWydFRElUT1InLCAndmlld2VyJ10pXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc29uU2VjdXJpdHlTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiDguILguLLguYDguILguYnguLIgKFdyaXRlKTog4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4LiC4LmJ4Lit4Lih4Li54LilIFNlbnNpdGl2ZSDguIHguYjguK3guJnguJrguLHguJnguJfguLbguIFcbiAgICovXG4gIGVuY3J5cHRGaWVsZHMoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc2NoZW1hRGVmaW5pdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHByb2Nlc3NlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmRhdGEgfTtcblxuICAgIC8vIFRyYXZlcnNlIHNjaGVtYSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYURlZmluaXRpb24ucHJvcGVydGllcyBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDEuIENoZWNrIGVuY3J5cHRpb24gZmxhZ1xuICAgICAgICAgIGlmIChwcm9wU2NoZW1hWyd4LWVuY3J5cHQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgICAgZGF0YVtrZXldIGFzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMi4gUmVjdXJzaXZlIGZvciBuZXN0ZWQgb2JqZWN0cy9hcnJheXNcbiAgICAgICAgICBpZiAocHJvcFNjaGVtYS50eXBlID09PSAnb2JqZWN0JyAmJiBwcm9wU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gdGhpcy5lbmNyeXB0RmllbGRzKFxuICAgICAgICAgICAgICBkYXRhW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgIHByb3BTY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wU2NoZW1hLnR5cGUgPT09ICdhcnJheScgJiYgcHJvcFNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IChkYXRhW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkubWFwKFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5lbmNyeXB0RmllbGRzKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcm9wU2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH1cblxuICAvKipcbiAgICog4LiC4Liy4Lit4Lit4LiBIChSZWFkKTog4LiW4Lit4LiU4Lij4Lir4Lix4LiqIOC5geC4peC4sCDguIHguKPguK3guIfguILguYnguK3guKHguLnguKXguJXguLLguKHguKrguLTguJfguJjguLTguYxcbiAgICovXG4gIGRlY3J5cHRBbmRGaWx0ZXJGaWVsZHMoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc2NoZW1hRGVmaW5pdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29udGV4dDogU2VjdXJpdHlDb250ZXh0XG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gZGF0YTtcblxuICAgIC8vIENsb25lIGRhdGEgdG8gYXZvaWQgbXV0YXRpb25cbiAgICBjb25zdCBwcm9jZXNzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5kYXRhIH07XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hRGVmaW5pdGlvbi5wcm9wZXJ0aWVzIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykpIHtcbiAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gMS4gRGVjcnlwdCAo4LiW4LmJ4Liy4Lih4Li14LiE4LmI4Liy4LmB4Lil4Liw4LiW4Li54LiB4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4LmE4Lin4LmJKVxuICAgICAgICAgIGlmIChwcm9wU2NoZW1hWyd4LWVuY3J5cHQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmNyeXB0b1NlcnZpY2UuZGVjcnlwdChkYXRhW2tleV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLiBTZWN1cml0eSBDaGVjayAoUm9sZS1iYXNlZCBBY2Nlc3MgQ29udHJvbClcbiAgICAgICAgICBpZiAocHJvcFNjaGVtYVsneC1zZWN1cml0eSddKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlID0gcHJvcFNjaGVtYVsneC1zZWN1cml0eSddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IChydWxlLnJvbGVzIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSByZXF1aXJlZFJvbGVzLnNvbWUoXG4gICAgICAgICAgICAgIChyb2xlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgY29udGV4dC51c2VyUm9sZXMuaW5jbHVkZXMocm9sZSkgfHxcbiAgICAgICAgICAgICAgICBjb250ZXh0LnVzZXJSb2xlcy5pbmNsdWRlcygnU1VQRVJBRE1JTicpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgICAgICAgICAgaWYgKHJ1bGUub25EZW55ID09PSAnUkVNT1ZFJykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzZWRba2V5XTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8g4LiC4LmJ4Liy4Lih4LmE4LibIGZpZWxkIOC4luC4seC4lOC5hOC4m1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERlZmF1bHQ6IE1BU0tcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9ICcqKioqKioqKic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAzLiBSZWN1cnNpdmUgZm9yIG5lc3RlZCBvYmplY3RzL2FycmF5c1xuICAgICAgICAgIC8vICjguJfguLPguJXguYjguK3guYDguKHguLfguYjguK0gRmllbGQg4Lii4Lix4LiH4LmE4Lih4LmI4LiW4Li54LiB4Lil4LiaKVxuICAgICAgICAgIGlmIChwcm9jZXNzZWRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAocHJvcFNjaGVtYS50eXBlID09PSAnb2JqZWN0JyAmJiBwcm9wU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmRlY3J5cHRBbmRGaWx0ZXJGaWVsZHMoXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgcHJvcFNjaGVtYSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BTY2hlbWEudHlwZSA9PT0gJ2FycmF5JyAmJiBwcm9wU2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2Nlc3NlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVxuICAgICAgICAgICAgICAgICkubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWNyeXB0QW5kRmlsdGVyRmllbGRzKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcm9wU2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec.map new file mode 100644 index 0000000..b7b1b1d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a8/jsonsecurityservice_a80c65ba7eccf9dcb6d35e92983955ec.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\json-security.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\json-security.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/json-security.service.ts\nimport { Injectable } from '@nestjs/common';\nimport { CryptoService } from '../../../common/services/crypto.service';\n\nexport interface SecurityContext {\n userRoles: string[]; // Role ของ user ปัจจุบัน (เช่น ['EDITOR', 'viewer'])\n}\n\n@Injectable()\nexport class JsonSecurityService {\n constructor(private readonly cryptoService: CryptoService) {}\n\n /**\n * ขาเข้า (Write): เข้ารหัสข้อมูล Sensitive ก่อนบันทึก\n */\n encryptFields(\n data: Record,\n schemaDefinition: Record\n ): Record {\n if (!data || typeof data !== 'object') return data;\n const processed: Record = { ...data };\n\n // Traverse schema properties\n const properties = schemaDefinition.properties as\n | Record>\n | undefined;\n if (properties) {\n for (const [key, propSchema] of Object.entries(properties)) {\n if (data[key] !== undefined) {\n // 1. Check encryption flag\n if (propSchema['x-encrypt'] === true) {\n processed[key] = this.cryptoService.encrypt(\n data[key] as string | number | boolean\n );\n }\n\n // 2. Recursive for nested objects/arrays\n if (propSchema.type === 'object' && propSchema.properties) {\n processed[key] = this.encryptFields(\n data[key] as Record,\n propSchema\n );\n } else if (propSchema.type === 'array' && propSchema.items) {\n if (Array.isArray(data[key])) {\n processed[key] = (data[key] as Record[]).map(\n (item) =>\n this.encryptFields(\n item,\n propSchema.items as Record\n )\n );\n }\n }\n }\n }\n }\n return processed;\n }\n\n /**\n * ขาออก (Read): ถอดรหัส และ กรองข้อมูลตามสิทธิ์\n */\n decryptAndFilterFields(\n data: Record,\n schemaDefinition: Record,\n context: SecurityContext\n ): Record {\n if (!data || typeof data !== 'object') return data;\n\n // Clone data to avoid mutation\n const processed: Record = { ...data };\n\n const properties = schemaDefinition.properties as\n | Record>\n | undefined;\n if (properties) {\n for (const [key, propSchema] of Object.entries(properties)) {\n if (data[key] !== undefined) {\n // 1. Decrypt (ถ้ามีค่าและถูกเข้ารหัสไว้)\n if (propSchema['x-encrypt'] === true) {\n processed[key] = this.cryptoService.decrypt(data[key] as string);\n }\n\n // 2. Security Check (Role-based Access Control)\n if (propSchema['x-security']) {\n const rule = propSchema['x-security'] as Record;\n const requiredRoles = (rule.roles as string[]) || [];\n const hasPermission = requiredRoles.some(\n (role: string) =>\n context.userRoles.includes(role) ||\n context.userRoles.includes('SUPERADMIN')\n );\n\n if (!hasPermission) {\n if (rule.onDeny === 'REMOVE') {\n delete processed[key];\n continue; // ข้ามไป field ถัดไป\n } else {\n // Default: MASK\n processed[key] = '********';\n }\n }\n }\n\n // 3. Recursive for nested objects/arrays\n // (ทำต่อเมื่อ Field ยังไม่ถูกลบ)\n if (processed[key] !== undefined) {\n if (propSchema.type === 'object' && propSchema.properties) {\n processed[key] = this.decryptAndFilterFields(\n processed[key] as Record,\n propSchema,\n context\n );\n } else if (propSchema.type === 'array' && propSchema.items) {\n if (Array.isArray(processed[key])) {\n processed[key] = (\n processed[key] as Record[]\n ).map((item) =>\n this.decryptAndFilterFields(\n item,\n propSchema.items as Record,\n context\n )\n );\n }\n }\n }\n }\n }\n }\n return processed;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6 new file mode 100644 index 0000000..daff489 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6 @@ -0,0 +1,71 @@ +a61c4ba4d5fdbac05238ed3724e66b2c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberCounter = void 0; +// File: src/modules/document-numbering/entities/document-number-counter.entity.ts +const typeorm_1 = require("typeorm"); +let DocumentNumberCounter = class DocumentNumberCounter { +}; +exports.DocumentNumberCounter = DocumentNumberCounter; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'project_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'originator_organization_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "originatorId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'sub_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "subTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'rfa_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "rfaTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'discipline_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'reset_scope', length: 20 }), + __metadata("design:type", String) +], DocumentNumberCounter.prototype, "resetScope", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_number', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "lastNumber", void 0); +__decorate([ + (0, typeorm_1.VersionColumn)({ name: 'version' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberCounter.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberCounter.prototype, "updatedAt", void 0); +exports.DocumentNumberCounter = DocumentNumberCounter = __decorate([ + (0, typeorm_1.Entity)('document_number_counters') +], DocumentNumberCounter); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWNvdW50ZXIuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxrRkFBa0Y7QUFDbEYscUNBQXVFO0FBR2hFLElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXFCO0NBb0NqQyxDQUFBO0FBcENZLHNEQUFxQjtBQUVoQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7d0RBQ25CO0FBR25CO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLENBQUM7OzJEQUNoQztBQUd0QjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxDQUFDOztzRUFDcEI7QUFHakM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7bUVBQ3BCO0FBRzlCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOzt3REFDcEI7QUFHbkI7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7O3dEQUNwQjtBQUduQjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7MkRBQ25CO0FBR3RCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3lEQUMvQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt5REFDeEI7QUFHcEI7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O3NEQUNsQjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDbkIsSUFBSSxvQkFBSixJQUFJO3dEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNuQixJQUFJLG9CQUFKLElBQUk7d0RBQUM7Z0NBbkNOLHFCQUFxQjtJQURqQyxJQUFBLGdCQUFNLEVBQUMsMEJBQTBCLENBQUM7R0FDdEIscUJBQXFCLENBb0NqQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXGVudGl0aWVzXFxkb2N1bWVudC1udW1iZXItY291bnRlci5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvZG9jdW1lbnQtbnVtYmVyaW5nL2VudGl0aWVzL2RvY3VtZW50LW51bWJlci1jb3VudGVyLmVudGl0eS50c1xuaW1wb3J0IHsgRW50aXR5LCBDb2x1bW4sIFByaW1hcnlDb2x1bW4sIFZlcnNpb25Db2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2NvdW50ZXJzJylcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckNvdW50ZXIge1xuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnb3JpZ2luYXRvcl9vcmdhbml6YXRpb25faWQnIH0pXG4gIG9yaWdpbmF0b3JJZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdyZWNpcGllbnRfb3JnYW5pemF0aW9uX2lkJyB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZVR5cGVJZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdzdWJfdHlwZV9pZCcgfSlcbiAgc3ViVHlwZUlkITogbnVtYmVyO1xuXG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3JmYV90eXBlX2lkJyB9KVxuICByZmFUeXBlSWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9pZCcgfSlcbiAgZGlzY2lwbGluZUlkITogbnVtYmVyO1xuXG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3Jlc2V0X3Njb3BlJywgbGVuZ3RoOiAyMCB9KVxuICByZXNldFNjb3BlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGFzdF9udW1iZXInLCBkZWZhdWx0OiAwIH0pXG4gIGxhc3ROdW1iZXIhOiBudW1iZXI7XG5cbiAgQFZlcnNpb25Db2x1bW4oeyBuYW1lOiAndmVyc2lvbicgfSlcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6.map new file mode 100644 index 0000000..33474c7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ac/documentnumbercounterentity_ac7c837fe0596322eaacc4fdba0240e6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-counter.entity.ts","mappings":";;;;;;;;;;;;;AAAA,kFAAkF;AAClF,qCAAuE;AAGhE,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAoCjC,CAAA;AApCY,sDAAqB;AAEhC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;wDACnB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;;2DAChC;AAGtB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;;sEACpB;AAGjC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;;mEACpB;AAG9B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;wDACpB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;wDACpB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;2DACnB;AAGtB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yDAC/B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;yDACxB;AAGpB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;sDAClB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACnB,IAAI,oBAAJ,IAAI;wDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACnB,IAAI,oBAAJ,IAAI;wDAAC;gCAnCN,qBAAqB;IADjC,IAAA,gBAAM,EAAC,0BAA0B,CAAC;GACtB,qBAAqB,CAoCjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-counter.entity.ts"],"sourcesContent":["// File: src/modules/document-numbering/entities/document-number-counter.entity.ts\nimport { Entity, Column, PrimaryColumn, VersionColumn } from 'typeorm';\n\n@Entity('document_number_counters')\nexport class DocumentNumberCounter {\n @PrimaryColumn({ name: 'project_id' })\n projectId!: number;\n\n @PrimaryColumn({ name: 'originator_organization_id' })\n originatorId!: number;\n\n @PrimaryColumn({ name: 'recipient_organization_id' })\n recipientOrganizationId!: number;\n\n @PrimaryColumn({ name: 'correspondence_type_id' })\n correspondenceTypeId!: number;\n\n @PrimaryColumn({ name: 'sub_type_id' })\n subTypeId!: number;\n\n @PrimaryColumn({ name: 'rfa_type_id' })\n rfaTypeId!: number;\n\n @PrimaryColumn({ name: 'discipline_id' })\n disciplineId!: number;\n\n @PrimaryColumn({ name: 'reset_scope', length: 20 })\n resetScope!: string;\n\n @Column({ name: 'last_number', default: 0 })\n lastNumber!: number;\n\n @VersionColumn({ name: 'version' })\n version!: number;\n\n @Column({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'updated_at' })\n updatedAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af new file mode 100644 index 0000000..144c1f9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af @@ -0,0 +1,898 @@ +366a7abbf78371a8be93587157e09461 +"use strict"; +// File: src/modules/correspondence/correspondence.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const tag_entity_1 = require("../master/entities/tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +// Services +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +let CorrespondenceService = CorrespondenceService_1 = class CorrespondenceService { + async hasSystemManageAllPermission(userId) { + const permissions = await this.userService.getUserPermissions(userId); + return permissions.includes('system.manage_all'); + } + /** + * Business Rule: Revision Label Strategy + * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...) + * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...) + */ + getInitialRevisionLabel(typeCode) { + const alphabetTypes = ['RFA', 'RFI']; + if (alphabetTypes.includes(typeCode.toUpperCase())) { + return 'A'; // Alphabet for RFA, RFI + } + return undefined; // Numeric (no label for revision 0) + } + constructor(correspondenceRepo, revisionRepo, typeRepo, statusRepo, referenceRepo, tagRepo, numberingService, jsonSchemaService, workflowEngine, userService, dataSource, searchService, fileStorageService, uuidResolver, notificationService) { + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.typeRepo = typeRepo; + this.statusRepo = statusRepo; + this.referenceRepo = referenceRepo; + this.tagRepo = tagRepo; + this.numberingService = numberingService; + this.jsonSchemaService = jsonSchemaService; + this.workflowEngine = workflowEngine; + this.userService = userService; + this.dataSource = dataSource; + this.searchService = searchService; + this.fileStorageService = fileStorageService; + this.uuidResolver = uuidResolver; + this.notificationService = notificationService; + this.logger = new common_1.Logger(CorrespondenceService_1.name); + } + /** + * Business Rule Validation: EC-CORR-003 - Correspondence to Self + * Prevent external correspondence to same organization + */ + async validateCorrespondenceRecipients(createDto, user) { + // Get user's organization + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + if (!userOrgId) { + if (createDto.originatorId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (canManageAll) { + userOrgId = await this.uuidResolver.resolveOrganizationId(createDto.originatorId); + } + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + } + // For impersonation, use the specified originator + const originatorOrgId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : userOrgId; + // Check if it's internal communication + if (createDto.isInternal) { + // Internal communications should use Circulation instead + throw new common_1.BadRequestException('Internal communications should use Circulation Sheet instead of Correspondence'); + } + // Validate recipients + if (!createDto.recipients || createDto.recipients.length === 0) { + throw new common_1.BadRequestException('At least one recipient (TO or CC) is required'); + } + const toRecipients = createDto.recipients.filter((r) => r.type === 'TO'); + const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC'); + if (toRecipients.length === 0 && ccRecipients.length === 0) { + throw new common_1.BadRequestException('At least one TO or CC recipient is required'); + } + // Check for same organization correspondence + for (const recipient of createDto.recipients) { + const recipientOrgId = await this.uuidResolver.resolveOrganizationId(recipient.organizationId); + if (recipientOrgId === originatorOrgId) { + throw new common_1.BadRequestException('Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'); + } + } + } + async create(createDto, user) { + // Business Rule Validation: EC-CORR-003 - Correspondence to Self + await this.validateCorrespondenceRecipients(createDto, user); + // ADR-019: Resolve UUID references to internal INT IDs + const resolvedProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const resolvedOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const resolvedRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + const statusDraft = await this.statusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + if (!statusDraft) { + throw new common_1.InternalServerErrorException('Status DRAFT not found in Master Data'); + } + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + // Impersonation Logic + if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (!canManageAll) { + throw new common_1.ForbiddenException('You do not have permission to create documents on behalf of other organizations.'); + } + userOrgId = resolvedOriginatorId; + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + if (createDto.details) { + try { + await this.jsonSchemaService.validate(type.typeCode, createDto.details); + } + catch (error) { + this.logger.warn(`Schema validation warning for ${type.typeCode}: ${error.message}`); + } + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // [Fix #6] Fetch real ORG Code from Organization entity + const originatorOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: userOrgId }, + }); + const orgCode = originatorOrg?.organizationCode ?? 'UNK'; + // [v1.5.1] Extract recipient organization from recipients array (Primary TO) + const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + const docNumber = await this.numberingService.generateNextNumber({ + projectId: resolvedProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, // [v1.5.1] Pass recipient for document number format + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + const correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: docNumber.number, + correspondenceTypeId: createDto.typeId, + disciplineId: createDto.disciplineId, + projectId: resolvedProjectId, + originatorId: userOrgId, + isInternal: createDto.isInternal || false, + createdBy: user.user_id, + }); + const savedCorr = await queryRunner.manager.save(correspondence); + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: savedCorr.id, + revisionNumber: 0, + revisionLabel: this.getInitialRevisionLabel(type.typeCode), + isCurrent: true, + statusId: statusDraft.id, + subject: createDto.subject, + body: createDto.body, + remarks: createDto.remarks, + dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined, + documentDate: createDto.documentDate + ? new Date(createDto.documentDate) + : undefined, + issuedDate: createDto.issuedDate + ? new Date(createDto.issuedDate) + : undefined, + receivedDate: createDto.receivedDate + ? new Date(createDto.receivedDate) + : undefined, + description: createDto.description, + details: createDto.details, + createdBy: user.user_id, + schemaVersion: 1, + }); + await queryRunner.manager.save(revision); + // Save Recipients (using resolved INT IDs) + if (resolvedRecipients && resolvedRecipients.length > 0) { + const recipients = resolvedRecipients.map((r) => queryRunner.manager.create(correspondence_recipient_entity_1.CorrespondenceRecipient, { + correspondenceId: savedCorr.id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await queryRunner.manager.save(recipients); + } + // Commit attachments from Temp → Permanent (Two-Phase Storage) + if (createDto.attachmentTempIds?.length) { + const issueDate = createDto.issuedDate + ? new Date(createDto.issuedDate) + : createDto.documentDate + ? new Date(createDto.documentDate) + : undefined; + await this.fileStorageService.commit(createDto.attachmentTempIds, { + issueDate, + documentType: 'Correspondence', + }); + } + await queryRunner.commitTransaction(); + // Start Workflow Instance (non-blocking) + try { + const workflowCode = `CORRESPONDENCE_${type.typeCode}`; + await this.workflowEngine.createInstance(workflowCode, 'correspondence', savedCorr.id.toString(), { + projectId: resolvedProjectId, + originatorId: userOrgId, + disciplineId: createDto.disciplineId, + initiatorId: user.user_id, + }); + } + catch (error) { + this.logger.warn(`Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${error.message}`); + } + // Fire-and-forget search indexing (non-blocking, void intentional) + void this.searchService.indexDocument({ + id: savedCorr.id, + publicId: savedCorr.publicId, + type: 'correspondence', + docNumber: docNumber.number, + title: createDto.subject, + description: createDto.description, + status: 'DRAFT', + projectId: resolvedProjectId, + createdAt: new Date(), + }); + return { + ...savedCorr, + currentRevision: revision, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to create correspondence: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + async findAll(searchDto = {}) { + const { search, typeId, projectId, statusId, status, page = 1, limit = 10, } = searchDto; + const skip = (page - 1) * limit; + // Change: Query from Revision Repo + const query = this.revisionRepo + .createQueryBuilder('rev') + .leftJoinAndSelect('rev.correspondence', 'corr') + .leftJoinAndSelect('corr.type', 'type') + .leftJoinAndSelect('corr.project', 'project') + .leftJoinAndSelect('corr.originator', 'org') + .leftJoinAndSelect('rev.status', 'status'); + // Filter by Revision Status + const revStatus = searchDto.revisionStatus || 'CURRENT'; + if (revStatus === 'CURRENT') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: true }); + } + else if (revStatus === 'OLD') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: false }); + } + // If 'ALL', no filter needed on isCurrent + if (projectId) { + query.andWhere('corr.projectId = :projectId', { projectId }); + } + if (typeId) { + query.andWhere('corr.correspondenceTypeId = :typeId', { typeId }); + } + if (statusId) { + query.andWhere('rev.statusId = :statusId', { statusId }); + } + if (status) { + query.andWhere('status.statusCode = :status', { status }); + } + if (search) { + query.andWhere('(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)', { search: `%${search}%` }); + } + // Default Sort: Latest Created + query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit); + const [items, total] = await query.getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + relations: [ + 'revisions', + 'revisions.status', + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with ID ${id} not found`); + } + return correspondence; + } + async findOneByUuid(publicId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { publicId }, + relations: [ + 'revisions', + 'revisions.status', + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with UUID ${publicId} not found`); + } + return correspondence; + } + async addReference(id, dto) { + const source = await this.correspondenceRepo.findOne({ where: { id } }); + // ADR-019: Resolve target publicId → internal INT id + const target = await this.correspondenceRepo.findOne({ + where: { publicId: dto.targetUuid }, + }); + if (!source || !target) { + throw new common_1.NotFoundException('Source or Target correspondence not found'); + } + if (source.id === target.id) { + throw new common_1.BadRequestException('Cannot reference self'); + } + const exists = await this.referenceRepo.findOne({ + where: { + sourceId: id, + targetId: target.id, + }, + }); + if (exists) { + return exists; + } + const ref = this.referenceRepo.create({ + sourceId: id, + targetId: target.id, + }); + return this.referenceRepo.save(ref); + } + async removeReference(id, targetId) { + const result = await this.referenceRepo.delete({ + sourceId: id, + targetId: targetId, + }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Reference not found'); + } + } + async getTags(id) { + const rows = await this.tagRepo.find({ + where: { correspondenceId: id }, + relations: ['tag'], + }); + return rows.map((r) => r.tag).filter(Boolean); + } + async addTag(id, tagId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence ${id} not found`); + } + const tag = await this.dataSource.manager.findOne(tag_entity_1.Tag, { + where: { id: tagId }, + }); + if (!tag) { + throw new common_1.NotFoundException(`Tag ${tagId} not found`); + } + const exists = await this.tagRepo.findOne({ + where: { correspondenceId: id, tagId }, + }); + if (exists) + return exists; + const row = this.tagRepo.create({ correspondenceId: id, tagId }); + return this.tagRepo.save(row); + } + async removeTag(id, tagId) { + const result = await this.tagRepo.delete({ correspondenceId: id, tagId }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Tag assignment not found'); + } + } + async getReferences(id) { + const outgoing = await this.referenceRepo.find({ + where: { sourceId: id }, + relations: ['target', 'target.type'], + }); + const incoming = await this.referenceRepo.find({ + where: { targetId: id }, + relations: ['source', 'source.type'], + }); + return { outgoing, incoming }; + } + async update(id, updateDto, user) { + // 1. Find Current Revision + const revision = await this.revisionRepo.findOne({ + where: { + correspondenceId: id, + isCurrent: true, + }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Current revision for correspondence ${id} not found`); + } + // 2. Check Permission + if (revision.statusId) { + const status = await this.statusRepo.findOne({ + where: { id: revision.statusId }, + }); + if (status && status.statusCode !== 'DRAFT') { + const permissions = await this.userService.getUserPermissions(user.user_id); + const canEditSubmittedOrLater = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canEditSubmittedOrLater) { + throw new common_1.ForbiddenException('Only Org Admin or Superadmin can edit non-draft correspondences'); + } + } + } + // ADR-019: Resolve UUID references in update DTO + const updResolvedProjectId = updateDto.projectId + ? await this.uuidResolver.resolveProjectId(updateDto.projectId) + : undefined; + const updResolvedOriginatorId = updateDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId) + : undefined; + const updResolvedRecipients = updateDto.recipients + ? await Promise.all(updateDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + // 3. Update Correspondence Entity if needed + const correspondenceUpdate = {}; + if (updateDto.disciplineId) + correspondenceUpdate.disciplineId = updateDto.disciplineId; + if (updResolvedProjectId) + correspondenceUpdate.projectId = updResolvedProjectId; + if (updResolvedOriginatorId) + correspondenceUpdate.originatorId = updResolvedOriginatorId; + if (Object.keys(correspondenceUpdate).length > 0) { + await this.correspondenceRepo.update(id, correspondenceUpdate); + } + // 4. Update Revision Entity + const revisionUpdate = {}; + if (updateDto.subject) + revisionUpdate.subject = updateDto.subject; + if (updateDto.body) + revisionUpdate.body = updateDto.body; + if (updateDto.remarks) + revisionUpdate.remarks = updateDto.remarks; + // Format Date correctly if string + if (updateDto.dueDate) + revisionUpdate.dueDate = new Date(updateDto.dueDate); + if (updateDto.documentDate) + revisionUpdate.documentDate = new Date(updateDto.documentDate); + if (updateDto.issuedDate) + revisionUpdate.issuedDate = new Date(updateDto.issuedDate); + if (updateDto.receivedDate) + revisionUpdate.receivedDate = new Date(updateDto.receivedDate); + if (updateDto.description) + revisionUpdate.description = updateDto.description; + if (updateDto.details) + revisionUpdate.details = updateDto.details; + if (Object.keys(revisionUpdate).length > 0) { + await this.revisionRepo.update(revision.id, revisionUpdate); + } + // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage) + if (updateDto.attachmentTempIds?.length) { + const issueDate = updateDto.issuedDate + ? new Date(updateDto.issuedDate) + : updateDto.documentDate + ? new Date(updateDto.documentDate) + : revision.issuedDate || revision.documentDate || undefined; + await this.fileStorageService.commit(updateDto.attachmentTempIds, { + issueDate: issueDate ? new Date(issueDate) : undefined, + documentType: 'Correspondence', + }); + } + // 5. Update Recipients if provided + if (updResolvedRecipients) { + const recipientRepo = this.dataSource.getRepository(correspondence_recipient_entity_1.CorrespondenceRecipient); + await recipientRepo.delete({ correspondenceId: id }); + const newRecipients = updResolvedRecipients.map((r) => recipientRepo.create({ + correspondenceId: id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await recipientRepo.save(newRecipients); + } + // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project) + // AND it is a DRAFT. + // Fetch fresh data for context and comparison + const currentCorr = await this.correspondenceRepo.findOne({ + where: { id }, + relations: ['type', 'recipients', 'recipients.recipientOrganization'], + }); + if (currentCorr) { + const currentToRecipient = currentCorr.recipients?.find((r) => r.recipientType === 'TO'); + const currentRecipientId = currentToRecipient?.recipientOrganizationId; + // Check for ACTUAL value changes + const isProjectChanged = updResolvedProjectId !== undefined && + updResolvedProjectId !== currentCorr.projectId; + const isOriginatorChanged = updResolvedOriginatorId !== undefined && + updResolvedOriginatorId !== currentCorr.originatorId; + const isDisciplineChanged = updateDto.disciplineId !== undefined && + updateDto.disciplineId !== currentCorr.disciplineId; + const isTypeChanged = updateDto.typeId !== undefined && + updateDto.typeId !== currentCorr.correspondenceTypeId; + let isRecipientChanged = false; + let newRecipientId; + if (updResolvedRecipients) { + const newToRecipient = updResolvedRecipients.find((r) => r.type === 'TO'); + newRecipientId = newToRecipient?.organizationId; + if (newRecipientId !== currentRecipientId) { + isRecipientChanged = true; + } + } + if (isProjectChanged || + isDisciplineChanged || + isTypeChanged || + isRecipientChanged || + isOriginatorChanged) { + const targetRecipientId = isRecipientChanged + ? newRecipientId + : currentRecipientId; + // Resolve Recipient Code for the NEW context + let recipientCode = ''; + if (targetRecipientId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: targetRecipientId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + // [Fix #6] Fetch real ORG Code from originator organization + const originatorOrgForUpdate = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { + id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + }, + }); + const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK'; + // Prepare Contexts + const oldCtx = { + projectId: currentCorr.projectId, + originatorOrganizationId: currentCorr.originatorId ?? 0, + typeId: currentCorr.correspondenceTypeId, + disciplineId: currentCorr.disciplineId, + recipientOrganizationId: currentRecipientId, + year: new Date().getFullYear(), + }; + const newCtx = { + projectId: updResolvedProjectId ?? currentCorr.projectId, + originatorOrganizationId: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId, + disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId, + recipientOrganizationId: targetRecipientId, + year: new Date().getFullYear(), + userId: user.user_id, // Pass User ID for Audit + customTokens: { + TYPE_CODE: currentCorr.type?.typeCode || '', + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }; + // If Type Changed, need NEW Type Code + if (isTypeChanged) { + const newType = await this.typeRepo.findOne({ + where: { id: newCtx.typeId }, + }); + if (newType) + newCtx.customTokens.TYPE_CODE = newType.typeCode; + } + const newDocNumber = await this.numberingService.updateNumberForDraft(currentCorr.correspondenceNumber, oldCtx, newCtx); + await this.correspondenceRepo.update(id, { + correspondenceNumber: newDocNumber, + }); + } + } + const updated = await this.findOne(id); + // Re-index updated document in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: updated.id, + publicId: updated.publicId, + type: 'correspondence', + docNumber: updated.correspondenceNumber, + title: updateDto.subject ?? updated.revisions?.[0]?.subject, + description: updateDto.description ?? updated.revisions?.[0]?.description, + status: 'DRAFT', + projectId: updated.projectId, + createdAt: updated.createdAt, + }); + return updated; + } + async previewDocumentNumber(createDto, user) { + // ADR-019: Resolve UUID references + const previewProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const previewOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const previewRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) + userOrgId = fullUser.primaryOrganizationId; + } + if (previewOriginatorId && previewOriginatorId !== userOrgId) { + // Allow impersonation for preview + userOrgId = previewOriginatorId; + } + // Extract recipient from recipients array + const toRecipient = previewRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + return this.numberingService.previewNumber({ + projectId: previewProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + } + /** + * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation + * Cancel correspondence and handle related circulations + */ + async cancel(publicId, reason, user) { + const correspondence = await this.findOneByUuid(publicId); + // Check if user has permission to cancel (Org Admin or Superadmin only) + const permissions = await this.userService.getUserPermissions(user.user_id); + const canCancel = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canCancel) { + throw new common_1.ForbiddenException('Only administrators can cancel correspondences'); + } + // Check if there are any active circulations + const circulationRepo = this.dataSource.getRepository('Circulation'); + const activeCirculations = await circulationRepo.find({ + where: { + correspondenceId: correspondence.id, + status: 'OPEN', + }, + }); + const warningMessage = activeCirculations.length > 0 + ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.` + : ''; + // Get the current revision to update status + const currentRevision = await this.revisionRepo.findOne({ + where: { + correspondenceId: correspondence.id, + isCurrent: true, + }, + }); + if (!currentRevision) { + throw new common_1.NotFoundException('Current revision not found'); + } + // Get cancelled status + const cancelledStatus = await this.statusRepo.findOne({ + where: { statusCode: 'CANCELLED' }, + }); + if (!cancelledStatus) { + throw new common_1.InternalServerErrorException('CANCELLED status not found'); + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // Update correspondence revision status to CANCELLED + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, currentRevision.id, { + statusId: cancelledStatus.id, + remarks: `Cancelled: ${reason}`, + }); + // Force close all active circulations + if (activeCirculations.length > 0) { + await queryRunner.manager.update('Circulation', { + correspondenceId: correspondence.id, + status: 'OPEN', + }, { + status: 'FORCE_CLOSED', + closedAt: new Date(), + closedBy: user.user_id, + closeReason: `Correspondence cancelled: ${reason}`, + }); + } + await queryRunner.commitTransaction(); + // Re-index cancelled status in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: correspondence.id, + publicId: correspondence.publicId, + type: 'correspondence', + docNumber: correspondence.correspondenceNumber, + title: currentRevision.subject, + status: 'CANCELLED', + projectId: correspondence.projectId, + createdAt: correspondence.createdAt, + }); + // Notify originator's doc-control user about cancellation (fire-and-forget) + if (correspondence.originatorId) { + void this.userService + .findDocControlIdByOrg(correspondence.originatorId) + .then((targetUserId) => { + if (targetUserId) { + void this.notificationService.send({ + userId: targetUserId, + title: 'Correspondence Cancelled', + message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: correspondence.id, + link: `/correspondences/${correspondence.publicId}`, + }); + } + }) + .catch((err) => this.logger.warn(`Cancel notification failed: ${err.message}`)); + } + return { + success: true, + message: warningMessage || 'Correspondence cancelled successfully', + activeCirculationsCount: activeCirculations.length, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to cancel correspondence: ${error.message}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async bulkCancel(publicIds, reason, user) { + const succeeded = []; + const failed = []; + for (const publicId of publicIds) { + try { + await this.cancel(publicId, reason, user); + succeeded.push(publicId); + } + catch { + failed.push(publicId); + } + } + return { succeeded, failed }; + } + async exportCsv(searchDto) { + const { data } = await this.findAll(searchDto); + const header = [ + 'Document No.', + 'Rev', + 'Subject', + 'Type', + 'Status', + 'Project', + 'From', + 'Due Date', + 'Created At', + ]; + const rows = data.map((rev) => { + const corr = rev.correspondence ?? rev; + return [ + this.escapeCsv(corr.correspondenceNumber ?? ''), + this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)), + this.escapeCsv(rev.subject ?? ''), + this.escapeCsv(corr.type?.typeCode ?? ''), + this.escapeCsv(rev.status?.statusCode ?? ''), + this.escapeCsv(corr.project?.projectCode ?? ''), + this.escapeCsv(corr.originator?.organizationCode ?? ''), + rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '', + new Date(rev.createdAt).toISOString().split('T')[0], + ].join(','); + }); + return [header.join(','), ...rows].join('\n'); + } + escapeCsv(value) { + if (value.includes(',') || value.includes('"') || value.includes('\n')) { + return `"${value.replace(/"/g, '""')}"`; + } + return value; + } +}; +exports.CorrespondenceService = CorrespondenceService; +exports.CorrespondenceService = CorrespondenceService = CorrespondenceService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_reference_entity_1.CorrespondenceReference)), + __param(5, (0, typeorm_1.InjectRepository)(correspondence_tag_entity_1.CorrespondenceTag)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof document_numbering_service_1.DocumentNumberingService !== "undefined" && document_numbering_service_1.DocumentNumberingService) === "function" ? _g : Object, typeof (_h = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _h : Object, typeof (_j = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _j : Object, typeof (_k = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _l : Object, typeof (_m = typeof search_service_1.SearchService !== "undefined" && search_service_1.SearchService) === "function" ? _m : Object, typeof (_o = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _o : Object, typeof (_p = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _p : Object, typeof (_q = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _q : Object]) +], CorrespondenceService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDZEQUE2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0QsMkNBT3dCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFFakQsV0FBVztBQUNYLDRFQUFrRTtBQUNsRSw4RkFBbUY7QUFDbkYsc0ZBQTJFO0FBQzNFLDBGQUErRTtBQUMvRSxnR0FBcUY7QUFDckYsZ0dBQXFGO0FBQ3JGLG9GQUF5RTtBQUN6RSw4REFBb0Q7QUFFcEQsc0ZBQTRFO0FBUTVFLFdBQVc7QUFDWCwwR0FBcUc7QUFDckcsNEVBQXVFO0FBQ3ZFLHdGQUFtRjtBQUNuRix1REFBbUQ7QUFDbkQsNkRBQXlEO0FBQ3pELHlGQUFvRjtBQUNwRix1RkFBa0Y7QUFDbEYsK0VBQTJFO0FBVXBFLElBQU0scUJBQXFCLDZCQUEzQixNQUFNLHFCQUFxQjtJQUd4QixLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBYztRQUN2RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEUsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx1QkFBdUIsQ0FBQyxRQUFnQjtRQUM5QyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLHdCQUF3QjtRQUN0QyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxvQ0FBb0M7SUFDeEQsQ0FBQztJQUVELFlBRUUsa0JBQXNELEVBRXRELFlBQXdELEVBRXhELFFBQWdELEVB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YXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxjb3JyZXNwb25kZW5jZS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2NvcnJlc3BvbmRlbmNlL2NvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHNcclxuXHJcbmltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBOb3RGb3VuZEV4Y2VwdGlvbixcclxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxyXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXHJcbiAgRm9yYmlkZGVuRXhjZXB0aW9uLFxyXG4gIExvZ2dlcixcclxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5LCBEYXRhU291cmNlIH0gZnJvbSAndHlwZW9ybSc7XHJcblxyXG4vLyBFbnRpdGllc1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWZlcmVuY2UgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlZmVyZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVGFnIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS10YWcuZW50aXR5JztcclxuaW1wb3J0IHsgVGFnIH0gZnJvbSAnLi4vbWFzdGVyL2VudGl0aWVzL3RhZy5lbnRpdHknO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcclxuXHJcbi8vIERUT3NcclxuaW1wb3J0IHsgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2R0by9jcmVhdGUtY29ycmVzcG9uZGVuY2UuZHRvJztcclxuaW1wb3J0IHsgVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2R0by91cGRhdGUtY29ycmVzcG9uZGVuY2UuZHRvJztcclxuaW1wb3J0IHsgQWRkUmVmZXJlbmNlRHRvIH0gZnJvbSAnLi9kdG8vYWRkLXJlZmVyZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3NlYXJjaC1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZG9jdW1lbnQtbnVtYmVyaW5nL3NlcnZpY2VzL2RvY3VtZW50LW51bWJlcmluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSnNvblNjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi9qc29uLXNjaGVtYS9qc29uLXNjaGVtYS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgV29ya2Zsb3dFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vd29ya2Zsb3ctZW5naW5lL3dvcmtmbG93LWVuZ2luZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2ZpbGUtc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXVpZFJlc29sdmVyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy91dWlkLXJlc29sdmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBDb3JyZXNwb25kZW5jZVNlcnZpY2UgLSBEb2N1bWVudCBtYW5hZ2VtZW50IChDUlVEKVxyXG4gKi9cclxuaW50ZXJmYWNlIFJlc29sdmVkUmVjaXBpZW50IHtcclxuICBvcmdhbml6YXRpb25JZDogbnVtYmVyO1xyXG4gIHR5cGU6ICdUTycgfCAnQ0MnO1xyXG59XHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENvcnJlc3BvbmRlbmNlU2VydmljZS5uYW1lKTtcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYXNTeXN0ZW1NYW5hZ2VBbGxQZXJtaXNzaW9uKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKHVzZXJJZCk7XHJcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3N5c3RlbS5tYW5hZ2VfYWxsJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdXNpbmVzcyBSdWxlOiBSZXZpc2lvbiBMYWJlbCBTdHJhdGVneVxyXG4gICAqIC0gUkZBLCBSRkk6IFVzZSBhbHBoYWJldCBzdGFydGluZyB3aXRoICdBJyAoQSwgQiwgQy4uLilcclxuICAgKiAtIE90aGVyIHR5cGVzIChMRVRURVIsIE1FTU8sIGV0Yy4pOiBVc2UgbnVtZXJpYyAobnVsbCBmb3IgZmlyc3QsIHRoZW4gMSwgMiwgMy4uLilcclxuICAgKi9cclxuICBwcml2YXRlIGdldEluaXRpYWxSZXZpc2lvbkxhYmVsKHR5cGVDb2RlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgYWxwaGFiZXRUeXBlcyA9IFsnUkZBJywgJ1JGSSddO1xyXG4gICAgaWYgKGFscGhhYmV0VHlwZXMuaW5jbHVkZXModHlwZUNvZGUudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgcmV0dXJuICdBJzsgLy8gQWxwaGFiZXQgZm9yIFJGQSwgUkZJXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBOdW1lcmljIChubyBsYWJlbCBmb3IgcmV2aXNpb24gMClcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2UpXHJcbiAgICBwcml2YXRlIGNvcnJlc3BvbmRlbmNlUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVJldmlzaW9uKVxyXG4gICAgcHJpdmF0ZSByZXZpc2lvblJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZXZpc2lvbj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVR5cGUpXHJcbiAgICBwcml2YXRlIHR5cGVSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgIHByaXZhdGUgc3RhdHVzUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSlcclxuICAgIHByaXZhdGUgcmVmZXJlbmNlUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVJlZmVyZW5jZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVRhZylcclxuICAgIHByaXZhdGUgdGFnUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVRhZz4sXHJcbiAgICBwcml2YXRlIG51bWJlcmluZ1NlcnZpY2U6IERvY3VtZW50TnVtYmVyaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUganNvblNjaGVtYVNlcnZpY2U6IEpzb25TY2hlbWFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3b3JrZmxvd0VuZ2luZTogV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpbGVTdG9yYWdlU2VydmljZTogRmlsZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dWlkUmVzb2x2ZXI6IFV1aWRSZXNvbHZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGUgVmFsaWRhdGlvbjogRUMtQ09SUi0wMDMgLSBDb3JyZXNwb25kZW5jZSB0byBTZWxmXHJcbiAgICogUHJldmVudCBleHRlcm5hbCBjb3JyZXNwb25kZW5jZSB0byBzYW1lIG9yZ2FuaXphdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVDb3JyZXNwb25kZW5jZVJlY2lwaWVudHMoXHJcbiAgICBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgdXNlcjogVXNlclxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gR2V0IHVzZXIncyBvcmdhbml6YXRpb25cclxuICAgIGxldCB1c2VyT3JnSWQgPSB1c2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikge1xyXG4gICAgICAgIHVzZXJPcmdJZCA9IGZ1bGxVc2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGlmIChjcmVhdGVEdG8ub3JpZ2luYXRvcklkKSB7XHJcbiAgICAgICAgY29uc3QgY2FuTWFuYWdlQWxsID0gYXdhaXQgdGhpcy5oYXNTeXN0ZW1NYW5hZ2VBbGxQZXJtaXNzaW9uKFxyXG4gICAgICAgICAgdXNlci51c2VyX2lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY2FuTWFuYWdlQWxsKSB7XHJcbiAgICAgICAgICB1c2VyT3JnSWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICAgIGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXVzZXJPcmdJZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICAgJ1VzZXIgbXVzdCBiZWxvbmcgdG8gYW4gb3JnYW5pemF0aW9uIHRvIGNyZWF0ZSBkb2N1bWVudHMnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBpbXBlcnNvbmF0aW9uLCB1c2UgdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yXHJcbiAgICBjb25zdCBvcmlnaW5hdG9yT3JnSWQgPSBjcmVhdGVEdG8ub3JpZ2luYXRvcklkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKGNyZWF0ZUR0by5vcmlnaW5hdG9ySWQpXHJcbiAgICAgIDogdXNlck9yZ0lkO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIGl0J3MgaW50ZXJuYWwgY29tbXVuaWNhdGlvblxyXG4gICAgaWYgKGNyZWF0ZUR0by5pc0ludGVybmFsKSB7XHJcbiAgICAgIC8vIEludGVybmFsIGNvbW11bmljYXRpb25zIHNob3VsZCB1c2UgQ2lyY3VsYXRpb24gaW5zdGVhZFxyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAnSW50ZXJuYWwgY29tbXVuaWNhdGlvbnMgc2hvdWxkIHVzZSBDaXJjdWxhdGlvbiBTaGVldCBpbnN0ZWFkIG9mIENvcnJlc3BvbmRlbmNlJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYXRlIHJlY2lwaWVudHNcclxuICAgIGlmICghY3JlYXRlRHRvLnJlY2lwaWVudHMgfHwgY3JlYXRlRHRvLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICdBdCBsZWFzdCBvbmUgcmVjaXBpZW50IChUTyBvciBDQykgaXMgcmVxdWlyZWQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdG9SZWNpcGllbnRzID0gY3JlYXRlRHRvLnJlY2lwaWVudHMuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09ICdUTycpO1xyXG4gICAgY29uc3QgY2NSZWNpcGllbnRzID0gY3JlYXRlRHRvLnJlY2lwaWVudHMuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09ICdDQycpO1xyXG5cclxuICAgIGlmICh0b1JlY2lwaWVudHMubGVuZ3RoID09PSAwICYmIGNjUmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ0F0IGxlYXN0IG9uZSBUTyBvciBDQyByZWNpcGllbnQgaXMgcmVxdWlyZWQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHNhbWUgb3JnYW5pemF0aW9uIGNvcnJlc3BvbmRlbmNlXHJcbiAgICBmb3IgKGNvbnN0IHJlY2lwaWVudCBvZiBjcmVhdGVEdG8ucmVjaXBpZW50cykge1xyXG4gICAgICBjb25zdCByZWNpcGllbnRPcmdJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChcclxuICAgICAgICByZWNpcGllbnQub3JnYW5pemF0aW9uSWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChyZWNpcGllbnRPcmdJZCA9PT0gb3JpZ2luYXRvck9yZ0lkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgICAnQ2Fubm90IHNlbmQgY29ycmVzcG9uZGVuY2UgdG8geW91ciBvd24gb3JnYW5pemF0aW9uLiBVc2UgQ2lyY3VsYXRpb24gU2hlZXQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24uJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZShjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyBCdXNpbmVzcyBSdWxlIFZhbGlkYXRpb246IEVDLUNPUlItMDAzIC0gQ29ycmVzcG9uZGVuY2UgdG8gU2VsZlxyXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUNvcnJlc3BvbmRlbmNlUmVjaXBpZW50cyhjcmVhdGVEdG8sIHVzZXIpO1xyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXMgdG8gaW50ZXJuYWwgSU5UIElEc1xyXG4gICAgY29uc3QgcmVzb2x2ZWRQcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKFxyXG4gICAgICBjcmVhdGVEdG8ucHJvamVjdElkXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmVzb2x2ZWRPcmlnaW5hdG9ySWQgPSBjcmVhdGVEdG8ub3JpZ2luYXRvcklkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKGNyZWF0ZUR0by5vcmlnaW5hdG9ySWQpXHJcbiAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVzb2x2ZWRSZWNpcGllbnRzID0gY3JlYXRlRHRvLnJlY2lwaWVudHNcclxuICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgIGNyZWF0ZUR0by5yZWNpcGllbnRzLm1hcChcclxuICAgICAgICAgICAgYXN5bmMgKHIpOiBQcm9taXNlPFJlc29sdmVkUmVjaXBpZW50PiA9PiAoe1xyXG4gICAgICAgICAgICAgIG9yZ2FuaXphdGlvbklkOiBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICAgICAgICByLm9yZ2FuaXphdGlvbklkXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB0eXBlOiByLnR5cGUsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHR5cGUgPSBhd2FpdCB0aGlzLnR5cGVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZDogY3JlYXRlRHRvLnR5cGVJZCB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIXR5cGUpIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignRG9jdW1lbnQgVHlwZSBub3QgZm91bmQnKTtcclxuXHJcbiAgICBjb25zdCBzdGF0dXNEcmFmdCA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgc3RhdHVzQ29kZTogJ0RSQUZUJyB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIXN0YXR1c0RyYWZ0KSB7XHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxyXG4gICAgICAgICdTdGF0dXMgRFJBRlQgbm90IGZvdW5kIGluIE1hc3RlciBEYXRhJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB1c2VyT3JnSWQgPSB1c2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuXHJcbiAgICBpZiAoIXVzZXJPcmdJZCkge1xyXG4gICAgICBjb25zdCBmdWxsVXNlciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZE9uZSh1c2VyLnVzZXJfaWQpO1xyXG4gICAgICBpZiAoZnVsbFVzZXIpIHtcclxuICAgICAgICB1c2VyT3JnSWQgPSBmdWxsVXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBJbXBlcnNvbmF0aW9uIExvZ2ljXHJcbiAgICBpZiAocmVzb2x2ZWRPcmlnaW5hdG9ySWQgJiYgcmVzb2x2ZWRPcmlnaW5hdG9ySWQgIT09IHVzZXJPcmdJZCkge1xyXG4gICAgICBjb25zdCBjYW5NYW5hZ2VBbGwgPSBhd2FpdCB0aGlzLmhhc1N5c3RlbU1hbmFnZUFsbFBlcm1pc3Npb24oXHJcbiAgICAgICAgdXNlci51c2VyX2lkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghY2FuTWFuYWdlQWxsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAgICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBjcmVhdGUgZG9jdW1lbnRzIG9uIGJlaGFsZiBvZiBvdGhlciBvcmdhbml6YXRpb25zLidcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHVzZXJPcmdJZCA9IHJlc29sdmVkT3JpZ2luYXRvcklkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICdVc2VyIG11c3QgYmVsb25nIHRvIGFuIG9yZ2FuaXphdGlvbiB0byBjcmVhdGUgZG9jdW1lbnRzJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjcmVhdGVEdG8uZGV0YWlscykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuanNvblNjaGVtYVNlcnZpY2UudmFsaWRhdGUodHlwZS50eXBlQ29kZSwgY3JlYXRlRHRvLmRldGFpbHMpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBgU2NoZW1hIHZhbGlkYXRpb24gd2FybmluZyBmb3IgJHt0eXBlLnR5cGVDb2RlfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xyXG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xyXG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFtGaXggIzZdIEZldGNoIHJlYWwgT1JHIENvZGUgZnJvbSBPcmdhbml6YXRpb24gZW50aXR5XHJcbiAgICAgIGNvbnN0IG9yaWdpbmF0b3JPcmcgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKFxyXG4gICAgICAgIE9yZ2FuaXphdGlvbixcclxuICAgICAgICB7XHJcbiAgICAgICAgICB3aGVyZTogeyBpZDogdXNlck9yZ0lkIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBvcmdDb2RlID0gb3JpZ2luYXRvck9yZz8ub3JnYW5pemF0aW9uQ29kZSA/PyAnVU5LJztcclxuXHJcbiAgICAgIC8vIFt2MS41LjFdIEV4dHJhY3QgcmVjaXBpZW50IG9yZ2FuaXphdGlvbiBmcm9tIHJlY2lwaWVudHMgYXJyYXkgKFByaW1hcnkgVE8pXHJcbiAgICAgIGNvbnN0IHRvUmVjaXBpZW50ID0gcmVzb2x2ZWRSZWNpcGllbnRzPy5maW5kKChyKSA9PiByLnR5cGUgPT09ICdUTycpO1xyXG4gICAgICBjb25zdCByZWNpcGllbnRPcmdhbml6YXRpb25JZCA9IHRvUmVjaXBpZW50Py5vcmdhbml6YXRpb25JZDtcclxuXHJcbiAgICAgIGxldCByZWNpcGllbnRDb2RlID0gJyc7XHJcbiAgICAgIGlmIChyZWNpcGllbnRPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICAgIGNvbnN0IHJlY09yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoT3JnYW5pemF0aW9uLCB7XHJcbiAgICAgICAgICB3aGVyZTogeyBpZDogcmVjaXBpZW50T3JnYW5pemF0aW9uSWQgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVjT3JnKSByZWNpcGllbnRDb2RlID0gcmVjT3JnLm9yZ2FuaXphdGlvbkNvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRvY051bWJlciA9IGF3YWl0IHRoaXMubnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIoe1xyXG4gICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiB1c2VyT3JnSWQsXHJcbiAgICAgICAgdHlwZUlkOiBjcmVhdGVEdG8udHlwZUlkLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICBzdWJUeXBlSWQ6IGNyZWF0ZUR0by5zdWJUeXBlSWQsXHJcbiAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQsIC8vIFt2MS41LjFdIFBhc3MgcmVjaXBpZW50IGZvciBkb2N1bWVudCBudW1iZXIgZm9ybWF0XHJcbiAgICAgICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgIGN1c3RvbVRva2Vuczoge1xyXG4gICAgICAgICAgVFlQRV9DT0RFOiB0eXBlLnR5cGVDb2RlLFxyXG4gICAgICAgICAgT1JHX0NPREU6IG9yZ0NvZGUsXHJcbiAgICAgICAgICBSRUNJUElFTlRfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICAgIFJFQ19DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgY29ycmVzcG9uZGVuY2UgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZSwge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiBkb2NOdW1iZXIubnVtYmVyLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBjcmVhdGVEdG8udHlwZUlkLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICBwcm9qZWN0SWQ6IHJlc29sdmVkUHJvamVjdElkLFxyXG4gICAgICAgIG9yaWdpbmF0b3JJZDogdXNlck9yZ0lkLFxyXG4gICAgICAgIGlzSW50ZXJuYWw6IGNyZWF0ZUR0by5pc0ludGVybmFsIHx8IGZhbHNlLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlci51c2VyX2lkLFxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3Qgc2F2ZWRDb3JyID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKGNvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGNvbnN0IHJldmlzaW9uID0gcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiwge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IHNhdmVkQ29yci5pZCxcclxuICAgICAgICByZXZpc2lvbk51bWJlcjogMCxcclxuICAgICAgICByZXZpc2lvbkxhYmVsOiB0aGlzLmdldEluaXRpYWxSZXZpc2lvbkxhYmVsKHR5cGUudHlwZUNvZGUpLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogc3RhdHVzRHJhZnQuaWQsXHJcbiAgICAgICAgc3ViamVjdDogY3JlYXRlRHRvLnN1YmplY3QsXHJcbiAgICAgICAgYm9keTogY3JlYXRlRHRvLmJvZHksXHJcbiAgICAgICAgcmVtYXJrczogY3JlYXRlRHRvLnJlbWFya3MsXHJcbiAgICAgICAgZHVlRGF0ZTogY3JlYXRlRHRvLmR1ZURhdGUgPyBuZXcgRGF0ZShjcmVhdGVEdG8uZHVlRGF0ZSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZG9jdW1lbnREYXRlOiBjcmVhdGVEdG8uZG9jdW1lbnREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5kb2N1bWVudERhdGUpXHJcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICBpc3N1ZWREYXRlOiBjcmVhdGVEdG8uaXNzdWVkRGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8uaXNzdWVkRGF0ZSlcclxuICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHJlY2VpdmVkRGF0ZTogY3JlYXRlRHRvLnJlY2VpdmVkRGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8ucmVjZWl2ZWREYXRlKVxyXG4gICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGNyZWF0ZUR0by5kZXNjcmlwdGlvbixcclxuICAgICAgICBkZXRhaWxzOiBjcmVhdGVEdG8uZGV0YWlscyxcclxuICAgICAgICBjcmVhdGVkQnk6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICBzY2hlbWFWZXJzaW9uOiAxLFxyXG4gICAgICB9KTtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKHJldmlzaW9uKTtcclxuXHJcbiAgICAgIC8vIFNhdmUgUmVjaXBpZW50cyAodXNpbmcgcmVzb2x2ZWQgSU5UIElEcylcclxuICAgICAgaWYgKHJlc29sdmVkUmVjaXBpZW50cyAmJiByZXNvbHZlZFJlY2lwaWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSByZXNvbHZlZFJlY2lwaWVudHMubWFwKChyKSA9PlxyXG4gICAgICAgICAgcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQsIHtcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogc2F2ZWRDb3JyLmlkLFxyXG4gICAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogci5vcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgICAgcmVjaXBpZW50VHlwZTogci50eXBlLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShyZWNpcGllbnRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ29tbWl0IGF0dGFjaG1lbnRzIGZyb20gVGVtcCDihpIgUGVybWFuZW50IChUd28tUGhhc2UgU3RvcmFnZSlcclxuICAgICAgaWYgKGNyZWF0ZUR0by5hdHRhY2htZW50VGVtcElkcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaXNzdWVEYXRlID0gY3JlYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgICAgICA6IGNyZWF0ZUR0by5kb2N1bWVudERhdGVcclxuICAgICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlU3RvcmFnZVNlcnZpY2UuY29tbWl0KGNyZWF0ZUR0by5hdHRhY2htZW50VGVtcElkcywge1xyXG4gICAgICAgICAgaXNzdWVEYXRlLFxyXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29ycmVzcG9uZGVuY2UnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgICAgLy8gU3RhcnQgV29ya2Zsb3cgSW5zdGFuY2UgKG5vbi1ibG9ja2luZylcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB3b3JrZmxvd0NvZGUgPSBgQ09SUkVTUE9OREVOQ0VfJHt0eXBlLnR5cGVDb2RlfWA7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd0VuZ2luZS5jcmVhdGVJbnN0YW5jZShcclxuICAgICAgICAgIHdvcmtmbG93Q29kZSxcclxuICAgICAgICAgICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgICBzYXZlZENvcnIuaWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgcHJvamVjdElkOiByZXNvbHZlZFByb2plY3RJZCxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiB1c2VyT3JnSWQsXHJcbiAgICAgICAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgICAgaW5pdGlhdG9ySWQ6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgICApO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBgV29ya2Zsb3cgbm90IHN0YXJ0ZWQgZm9yICR7ZG9jTnVtYmVyLm51bWJlcn0gKENvZGU6IENPUlJFU1BPTkRFTkNFXyR7dHlwZS50eXBlQ29kZX0pOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlyZS1hbmQtZm9yZ2V0IHNlYXJjaCBpbmRleGluZyAobm9uLWJsb2NraW5nLCB2b2lkIGludGVudGlvbmFsKVxyXG4gICAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgICBpZDogc2F2ZWRDb3JyLmlkLFxyXG4gICAgICAgIHB1YmxpY0lkOiBzYXZlZENvcnIucHVibGljSWQsXHJcbiAgICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICBkb2NOdW1iZXI6IGRvY051bWJlci5udW1iZXIsXHJcbiAgICAgICAgdGl0bGU6IGNyZWF0ZUR0by5zdWJqZWN0LFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjcmVhdGVEdG8uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgc3RhdHVzOiAnRFJBRlQnLFxyXG4gICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uc2F2ZWRDb3JyLFxyXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbjogcmV2aXNpb24sXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBjb3JyZXNwb25kZW5jZTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgKTtcclxuICAgICAgdGhyb3cgZXJyO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEFsbChzZWFyY2hEdG86IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvID0ge30pIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgc2VhcmNoLFxyXG4gICAgICB0eXBlSWQsXHJcbiAgICAgIHByb2plY3RJZCxcclxuICAgICAgc3RhdHVzSWQsXHJcbiAgICAgIHN0YXR1cyxcclxuICAgICAgcGFnZSA9IDEsXHJcbiAgICAgIGxpbWl0ID0gMTAsXHJcbiAgICB9ID0gc2VhcmNoRHRvO1xyXG4gICAgY29uc3Qgc2tpcCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcclxuXHJcbiAgICAvLyBDaGFuZ2U6IFF1ZXJ5IGZyb20gUmV2aXNpb24gUmVwb1xyXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJldmlzaW9uUmVwb1xyXG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCdyZXYnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3Jldi5jb3JyZXNwb25kZW5jZScsICdjb3JyJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdjb3JyLnR5cGUnLCAndHlwZScpXHJcbiAgICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdCgnY29yci5wcm9qZWN0JywgJ3Byb2plY3QnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ2NvcnIub3JpZ2luYXRvcicsICdvcmcnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3Jldi5zdGF0dXMnLCAnc3RhdHVzJyk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGJ5IFJldmlzaW9uIFN0YXR1c1xyXG4gICAgY29uc3QgcmV2U3RhdHVzID0gc2VhcmNoRHRvLnJldmlzaW9uU3RhdHVzIHx8ICdDVVJSRU5UJztcclxuXHJcbiAgICBpZiAocmV2U3RhdHVzID09PSAnQ1VSUkVOVCcpIHtcclxuICAgICAgcXVlcnkud2hlcmUoJ3Jldi5pc0N1cnJlbnQgPSA6aXNDdXJyZW50JywgeyBpc0N1cnJlbnQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHJldlN0YXR1cyA9PT0gJ09MRCcpIHtcclxuICAgICAgcXVlcnkud2hlcmUoJ3Jldi5pc0N1cnJlbnQgPSA6aXNDdXJyZW50JywgeyBpc0N1cnJlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgJ0FMTCcsIG5vIGZpbHRlciBuZWVkZWQgb24gaXNDdXJyZW50XHJcblxyXG4gICAgaWYgKHByb2plY3RJZCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnY29yci5wcm9qZWN0SWQgPSA6cHJvamVjdElkJywgeyBwcm9qZWN0SWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVJZCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnY29yci5jb3JyZXNwb25kZW5jZVR5cGVJZCA9IDp0eXBlSWQnLCB7IHR5cGVJZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdHVzSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3Jldi5zdGF0dXNJZCA9IDpzdGF0dXNJZCcsIHsgc3RhdHVzSWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXR1cykge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnc3RhdHVzLnN0YXR1c0NvZGUgPSA6c3RhdHVzJywgeyBzdGF0dXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlYXJjaCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZShcclxuICAgICAgICAnKGNvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXIgTElLRSA6c2VhcmNoIE9SIHJldi5zdWJqZWN0IExJS0UgOnNlYXJjaCknLFxyXG4gICAgICAgIHsgc2VhcmNoOiBgJSR7c2VhcmNofSVgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWZhdWx0IFNvcnQ6IExhdGVzdCBDcmVhdGVkXHJcbiAgICBxdWVyeS5vcmRlckJ5KCdyZXYuY3JlYXRlZEF0JywgJ0RFU0MnKS5za2lwKHNraXApLnRha2UobGltaXQpO1xyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgcXVlcnkuZ2V0TWFueUFuZENvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0YTogaXRlbXMsXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICB0b3RhbCxcclxuICAgICAgICBwYWdlLFxyXG4gICAgICAgIGxpbWl0LFxyXG4gICAgICAgIHRvdGFsUGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdyZXZpc2lvbnMnLFxyXG4gICAgICAgICdyZXZpc2lvbnMuc3RhdHVzJyxcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJywgLy8gW3YxLjUuMV0gRml4ZWQgcmVsYXRpb24gbmFtZVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFjb3JyZXNwb25kZW5jZSkge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYENvcnJlc3BvbmRlbmNlIHdpdGggSUQgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29ycmVzcG9uZGVuY2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lQnlVdWlkKHB1YmxpY0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHB1YmxpY0lkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdyZXZpc2lvbnMnLFxyXG4gICAgICAgICdyZXZpc2lvbnMuc3RhdHVzJyxcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJyxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDb3JyZXNwb25kZW5jZSB3aXRoIFVVSUQgJHtwdWJsaWNJZH0gbm90IGZvdW5kYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKGlkOiBudW1iZXIsIGR0bzogQWRkUmVmZXJlbmNlRHRvKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgdGFyZ2V0IHB1YmxpY0lkIOKGkiBpbnRlcm5hbCBJTlQgaWRcclxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogZHRvLnRhcmdldFV1aWQgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdTb3VyY2Ugb3IgVGFyZ2V0IGNvcnJlc3BvbmRlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzb3VyY2UuaWQgPT09IHRhcmdldC5pZCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQ2Fubm90IHJlZmVyZW5jZSBzZWxmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHNvdXJjZUlkOiBpZCxcclxuICAgICAgICB0YXJnZXRJZDogdGFyZ2V0LmlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICByZXR1cm4gZXhpc3RzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZiA9IHRoaXMucmVmZXJlbmNlUmVwby5jcmVhdGUoe1xyXG4gICAgICBzb3VyY2VJZDogaWQsXHJcbiAgICAgIHRhcmdldElkOiB0YXJnZXQuaWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VSZXBvLnNhdmUocmVmKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShpZDogbnVtYmVyLCB0YXJnZXRJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZGVsZXRlKHtcclxuICAgICAgc291cmNlSWQ6IGlkLFxyXG4gICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignUmVmZXJlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGFncyhpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy50YWdSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBjb3JyZXNwb25kZW5jZUlkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsndGFnJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci50YWcpLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFRhZyhpZDogbnVtYmVyLCB0YWdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWNvcnJlc3BvbmRlbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQ29ycmVzcG9uZGVuY2UgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShUYWcsIHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdGFnKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVGFnICR7dGFnSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMudGFnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgY29ycmVzcG9uZGVuY2VJZDogaWQsIHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChleGlzdHMpIHJldHVybiBleGlzdHM7XHJcblxyXG4gICAgY29uc3Qgcm93ID0gdGhpcy50YWdSZXBvLmNyZWF0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkLCB0YWdJZCB9KTtcclxuICAgIHJldHVybiB0aGlzLnRhZ1JlcG8uc2F2ZShyb3cpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlVGFnKGlkOiBudW1iZXIsIHRhZ0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFnUmVwby5kZWxldGUoeyBjb3JyZXNwb25kZW5jZUlkOiBpZCwgdGFnSWQgfSk7XHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignVGFnIGFzc2lnbm1lbnQgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSZWZlcmVuY2VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG91dGdvaW5nID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBzb3VyY2VJZDogaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3RhcmdldCcsICd0YXJnZXQudHlwZSddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5jb21pbmcgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7IHRhcmdldElkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnc291cmNlJywgJ3NvdXJjZS50eXBlJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBvdXRnb2luZywgaW5jb21pbmcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZShpZDogbnVtYmVyLCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyAxLiBGaW5kIEN1cnJlbnQgUmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uID0gYXdhaXQgdGhpcy5yZXZpc2lvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDdXJyZW50IHJldmlzaW9uIGZvciBjb3JyZXNwb25kZW5jZSAke2lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQ2hlY2sgUGVybWlzc2lvblxyXG4gICAgaWYgKHJldmlzaW9uLnN0YXR1c0lkKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgICB3aGVyZTogeyBpZDogcmV2aXNpb24uc3RhdHVzSWQgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5zdGF0dXNDb2RlICE9PSAnRFJBRlQnKSB7XHJcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyhcclxuICAgICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2FuRWRpdFN1Ym1pdHRlZE9yTGF0ZXIgPVxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpIHx8XHJcbiAgICAgICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5FZGl0U3VibWl0dGVkT3JMYXRlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgJ09ubHkgT3JnIEFkbWluIG9yIFN1cGVyYWRtaW4gY2FuIGVkaXQgbm9uLWRyYWZ0IGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXMgaW4gdXBkYXRlIERUT1xyXG4gICAgY29uc3QgdXBkUmVzb2x2ZWRQcm9qZWN0SWQgPSB1cGRhdGVEdG8ucHJvamVjdElkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCh1cGRhdGVEdG8ucHJvamVjdElkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID0gdXBkYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCh1cGRhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkUmVjaXBpZW50cyA9IHVwZGF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICB1cGRhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gMy4gVXBkYXRlIENvcnJlc3BvbmRlbmNlIEVudGl0eSBpZiBuZWVkZWRcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlVXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLmRpc2NpcGxpbmVJZCA9IHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQ7XHJcbiAgICBpZiAodXBkUmVzb2x2ZWRQcm9qZWN0SWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLnByb2plY3RJZCA9IHVwZFJlc29sdmVkUHJvamVjdElkO1xyXG4gICAgaWYgKHVwZFJlc29sdmVkT3JpZ2luYXRvcklkKVxyXG4gICAgICBjb3JyZXNwb25kZW5jZVVwZGF0ZS5vcmlnaW5hdG9ySWQgPSB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29ycmVzcG9uZGVuY2VVcGRhdGUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8udXBkYXRlKGlkLCBjb3JyZXNwb25kZW5jZVVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gVXBkYXRlIFJldmlzaW9uIEVudGl0eVxyXG4gICAgY29uc3QgcmV2aXNpb25VcGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBpZiAodXBkYXRlRHRvLnN1YmplY3QpIHJldmlzaW9uVXBkYXRlLnN1YmplY3QgPSB1cGRhdGVEdG8uc3ViamVjdDtcclxuICAgIGlmICh1cGRhdGVEdG8uYm9keSkgcmV2aXNpb25VcGRhdGUuYm9keSA9IHVwZGF0ZUR0by5ib2R5O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5yZW1hcmtzKSByZXZpc2lvblVwZGF0ZS5yZW1hcmtzID0gdXBkYXRlRHRvLnJlbWFya3M7XHJcbiAgICAvLyBGb3JtYXQgRGF0ZSBjb3JyZWN0bHkgaWYgc3RyaW5nXHJcbiAgICBpZiAodXBkYXRlRHRvLmR1ZURhdGUpIHJldmlzaW9uVXBkYXRlLmR1ZURhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uZHVlRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUuZG9jdW1lbnREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgIHJldmlzaW9uVXBkYXRlLmlzc3VlZERhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uaXNzdWVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUucmVjZWl2ZWREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRlc2NyaXB0aW9uKVxyXG4gICAgICByZXZpc2lvblVwZGF0ZS5kZXNjcmlwdGlvbiA9IHVwZGF0ZUR0by5kZXNjcmlwdGlvbjtcclxuICAgIGlmICh1cGRhdGVEdG8uZGV0YWlscykgcmV2aXNpb25VcGRhdGUuZGV0YWlscyA9IHVwZGF0ZUR0by5kZXRhaWxzO1xyXG5cclxuICAgIGlmIChPYmplY3Qua2V5cyhyZXZpc2lvblVwZGF0ZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby51cGRhdGUocmV2aXNpb24uaWQsIHJldmlzaW9uVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LjUgQ29tbWl0IG5ldyBhdHRhY2htZW50cyBmcm9tIFRlbXAg4oaSIFBlcm1hbmVudCAoVHdvLVBoYXNlIFN0b3JhZ2UpXHJcbiAgICBpZiAodXBkYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgaXNzdWVEYXRlID0gdXBkYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKHVwZGF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgIDogdXBkYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZSh1cGRhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgOiByZXZpc2lvbi5pc3N1ZWREYXRlIHx8IHJldmlzaW9uLmRvY3VtZW50RGF0ZSB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5jb21taXQodXBkYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzLCB7XHJcbiAgICAgICAgaXNzdWVEYXRlOiBpc3N1ZURhdGUgPyBuZXcgRGF0ZShpc3N1ZURhdGUpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRvY3VtZW50VHlwZTogJ0NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNS4gVXBkYXRlIFJlY2lwaWVudHMgaWYgcHJvdmlkZWRcclxuICAgIGlmICh1cGRSZXNvbHZlZFJlY2lwaWVudHMpIHtcclxuICAgICAgY29uc3QgcmVjaXBpZW50UmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlUmVjaXBpZW50XHJcbiAgICAgICk7XHJcbiAgICAgIGF3YWl0IHJlY2lwaWVudFJlcG8uZGVsZXRlKHsgY29ycmVzcG9uZGVuY2VJZDogaWQgfSk7XHJcblxyXG4gICAgICBjb25zdCBuZXdSZWNpcGllbnRzID0gdXBkUmVzb2x2ZWRSZWNpcGllbnRzLm1hcCgocikgPT5cclxuICAgICAgICByZWNpcGllbnRSZXBvLmNyZWF0ZSh7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBpZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiByLm9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgcmVjaXBpZW50VHlwZTogci50eXBlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGF3YWl0IHJlY2lwaWVudFJlcG8uc2F2ZShuZXdSZWNpcGllbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA2LiBSZWdlbmVyYXRlIERvY3VtZW50IE51bWJlciBpZiBzdHJ1Y3R1cmFsIGZpZWxkcyBjaGFuZ2VkIChSZWNpcGllbnQsIERpc2NpcGxpbmUsIFR5cGUsIFByb2plY3QpXHJcbiAgICAvLyBBTkQgaXQgaXMgYSBEUkFGVC5cclxuXHJcbiAgICAvLyBGZXRjaCBmcmVzaCBkYXRhIGZvciBjb250ZXh0IGFuZCBjb21wYXJpc29uXHJcbiAgICBjb25zdCBjdXJyZW50Q29yciA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsndHlwZScsICdyZWNpcGllbnRzJywgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoY3VycmVudENvcnIpIHtcclxuICAgICAgY29uc3QgY3VycmVudFRvUmVjaXBpZW50ID0gY3VycmVudENvcnIucmVjaXBpZW50cz8uZmluZChcclxuICAgICAgICAocikgPT4gci5yZWNpcGllbnRUeXBlID09PSAnVE8nXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRJZCA9IGN1cnJlbnRUb1JlY2lwaWVudD8ucmVjaXBpZW50T3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgICAvLyBDaGVjayBmb3IgQUNUVUFMIHZhbHVlIGNoYW5nZXNcclxuICAgICAgY29uc3QgaXNQcm9qZWN0Q2hhbmdlZCA9XHJcbiAgICAgICAgdXBkUmVzb2x2ZWRQcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIHVwZFJlc29sdmVkUHJvamVjdElkICE9PSBjdXJyZW50Q29yci5wcm9qZWN0SWQ7XHJcbiAgICAgIGNvbnN0IGlzT3JpZ2luYXRvckNoYW5nZWQgPVxyXG4gICAgICAgIHVwZFJlc29sdmVkT3JpZ2luYXRvcklkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gY3VycmVudENvcnIub3JpZ2luYXRvcklkO1xyXG4gICAgICBjb25zdCBpc0Rpc2NpcGxpbmVDaGFuZ2VkID1cclxuICAgICAgICB1cGRhdGVEdG8uZGlzY2lwbGluZUlkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRhdGVEdG8uZGlzY2lwbGluZUlkICE9PSBjdXJyZW50Q29yci5kaXNjaXBsaW5lSWQ7XHJcbiAgICAgIGNvbnN0IGlzVHlwZUNoYW5nZWQgPVxyXG4gICAgICAgIHVwZGF0ZUR0by50eXBlSWQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIHVwZGF0ZUR0by50eXBlSWQgIT09IGN1cnJlbnRDb3JyLmNvcnJlc3BvbmRlbmNlVHlwZUlkO1xyXG5cclxuICAgICAgbGV0IGlzUmVjaXBpZW50Q2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICBsZXQgbmV3UmVjaXBpZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh1cGRSZXNvbHZlZFJlY2lwaWVudHMpIHtcclxuICAgICAgICBjb25zdCBuZXdUb1JlY2lwaWVudCA9IHVwZFJlc29sdmVkUmVjaXBpZW50cy5maW5kKFxyXG4gICAgICAgICAgKHIpID0+IHIudHlwZSA9PT0gJ1RPJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3UmVjaXBpZW50SWQgPSBuZXdUb1JlY2lwaWVudD8ub3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgICAgIGlmIChuZXdSZWNpcGllbnRJZCAhPT0gY3VycmVudFJlY2lwaWVudElkKSB7XHJcbiAgICAgICAgICBpc1JlY2lwaWVudENoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGlzUHJvamVjdENoYW5nZWQgfHxcclxuICAgICAgICBpc0Rpc2NpcGxpbmVDaGFuZ2VkIHx8XHJcbiAgICAgICAgaXNUeXBlQ2hhbmdlZCB8fFxyXG4gICAgICAgIGlzUmVjaXBpZW50Q2hhbmdlZCB8fFxyXG4gICAgICAgIGlzT3JpZ2luYXRvckNoYW5nZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjaXBpZW50SWQgPSBpc1JlY2lwaWVudENoYW5nZWRcclxuICAgICAgICAgID8gbmV3UmVjaXBpZW50SWRcclxuICAgICAgICAgIDogY3VycmVudFJlY2lwaWVudElkO1xyXG5cclxuICAgICAgICAvLyBSZXNvbHZlIFJlY2lwaWVudCBDb2RlIGZvciB0aGUgTkVXIGNvbnRleHRcclxuICAgICAgICBsZXQgcmVjaXBpZW50Q29kZSA9ICcnO1xyXG4gICAgICAgIGlmICh0YXJnZXRSZWNpcGllbnRJZCkge1xyXG4gICAgICAgICAgY29uc3QgcmVjT3JnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShPcmdhbml6YXRpb24sIHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgaWQ6IHRhcmdldFJlY2lwaWVudElkIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChyZWNPcmcpIHJlY2lwaWVudENvZGUgPSByZWNPcmcub3JnYW5pemF0aW9uQ29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFtGaXggIzZdIEZldGNoIHJlYWwgT1JHIENvZGUgZnJvbSBvcmlnaW5hdG9yIG9yZ2FuaXphdGlvblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmF0b3JPcmdGb3JVcGRhdGUgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKFxyXG4gICAgICAgICAgT3JnYW5pemF0aW9uLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgICAgIGlkOiB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZCA/PyBjdXJyZW50Q29yci5vcmlnaW5hdG9ySWQgPz8gMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IG9yZ0NvZGUgPSBvcmlnaW5hdG9yT3JnRm9yVXBkYXRlPy5vcmdhbml6YXRpb25Db2RlID8/ICdVTksnO1xyXG5cclxuICAgICAgICAvLyBQcmVwYXJlIENvbnRleHRzXHJcbiAgICAgICAgY29uc3Qgb2xkQ3R4ID0ge1xyXG4gICAgICAgICAgcHJvamVjdElkOiBjdXJyZW50Q29yci5wcm9qZWN0SWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZCA/PyAwLFxyXG4gICAgICAgICAgdHlwZUlkOiBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZVR5cGVJZCxcclxuICAgICAgICAgIGRpc2NpcGxpbmVJZDogY3VycmVudENvcnIuZGlzY2lwbGluZUlkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN1cnJlbnRSZWNpcGllbnRJZCxcclxuICAgICAgICAgIHllYXI6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBuZXdDdHggPSB7XHJcbiAgICAgICAgICBwcm9qZWN0SWQ6IHVwZFJlc29sdmVkUHJvamVjdElkID8/IGN1cnJlbnRDb3JyLnByb2plY3RJZCxcclxuICAgICAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDpcclxuICAgICAgICAgICAgdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgPz8gY3VycmVudENvcnIub3JpZ2luYXRvcklkID8/IDAsXHJcbiAgICAgICAgICB0eXBlSWQ6IHVwZGF0ZUR0by50eXBlSWQgPz8gY3VycmVudENvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQgPz8gY3VycmVudENvcnIuZGlzY2lwbGluZUlkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IHRhcmdldFJlY2lwaWVudElkLFxyXG4gICAgICAgICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJfaWQsIC8vIFBhc3MgVXNlciBJRCBmb3IgQXVkaXRcclxuICAgICAgICAgIGN1c3RvbVRva2Vuczoge1xyXG4gICAgICAgICAgICBUWVBFX0NPREU6IGN1cnJlbnRDb3JyLnR5cGU/LnR5cGVDb2RlIHx8ICcnLFxyXG4gICAgICAgICAgICBPUkdfQ09ERTogb3JnQ29kZSxcclxuICAgICAgICAgICAgUkVDSVBJRU5UX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgICAgIFJFQ19DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBJZiBUeXBlIENoYW5nZWQsIG5lZWQgTkVXIFR5cGUgQ29kZVxyXG4gICAgICAgIGlmIChpc1R5cGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdUeXBlID0gYXdhaXQgdGhpcy50eXBlUmVwby5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgaWQ6IG5ld0N0eC50eXBlSWQgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKG5ld1R5cGUpIG5ld0N0eC5jdXN0b21Ub2tlbnMuVFlQRV9DT0RFID0gbmV3VHlwZS50eXBlQ29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0RvY051bWJlciA9IGF3YWl0IHRoaXMubnVtYmVyaW5nU2VydmljZS51cGRhdGVOdW1iZXJGb3JEcmFmdChcclxuICAgICAgICAgIGN1cnJlbnRDb3JyLmNvcnJlc3BvbmRlbmNlTnVtYmVyLFxyXG4gICAgICAgICAgb2xkQ3R4LFxyXG4gICAgICAgICAgbmV3Q3R4XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8udXBkYXRlKGlkLCB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogbmV3RG9jTnVtYmVyLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuZmluZE9uZShpZCk7XHJcblxyXG4gICAgLy8gUmUtaW5kZXggdXBkYXRlZCBkb2N1bWVudCBpbiBFbGFzdGljc2VhcmNoIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgaWQ6IHVwZGF0ZWQuaWQsXHJcbiAgICAgIHB1YmxpY0lkOiB1cGRhdGVkLnB1YmxpY0lkLFxyXG4gICAgICB0eXBlOiAnY29ycmVzcG9uZGVuY2UnLFxyXG4gICAgICBkb2NOdW1iZXI6IHVwZGF0ZWQuY29ycmVzcG9uZGVuY2VOdW1iZXIsXHJcbiAgICAgIHRpdGxlOiB1cGRhdGVEdG8uc3ViamVjdCA/PyB1cGRhdGVkLnJldmlzaW9ucz8uWzBdPy5zdWJqZWN0LFxyXG4gICAgICBkZXNjcmlwdGlvbjogdXBkYXRlRHRvLmRlc2NyaXB0aW9uID8/IHVwZGF0ZWQucmV2aXNpb25zPy5bMF0/LmRlc2NyaXB0aW9uLFxyXG4gICAgICBzdGF0dXM6ICdEUkFGVCcsXHJcbiAgICAgIHByb2plY3RJZDogdXBkYXRlZC5wcm9qZWN0SWQsXHJcbiAgICAgIGNyZWF0ZWRBdDogdXBkYXRlZC5jcmVhdGVkQXQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHByZXZpZXdEb2N1bWVudE51bWJlcihjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUQgcmVmZXJlbmNlc1xyXG4gICAgY29uc3QgcHJldmlld1Byb2plY3RJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQoXHJcbiAgICAgIGNyZWF0ZUR0by5wcm9qZWN0SWRcclxuICAgICk7XHJcbiAgICBjb25zdCBwcmV2aWV3T3JpZ2luYXRvcklkID0gY3JlYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChjcmVhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHByZXZpZXdSZWNpcGllbnRzID0gY3JlYXRlRHRvLnJlY2lwaWVudHNcclxuICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgIGNyZWF0ZUR0by5yZWNpcGllbnRzLm1hcChcclxuICAgICAgICAgICAgYXN5bmMgKHIpOiBQcm9taXNlPFJlc29sdmVkUmVjaXBpZW50PiA9PiAoe1xyXG4gICAgICAgICAgICAgIG9yZ2FuaXphdGlvbklkOiBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICAgICAgICByLm9yZ2FuaXphdGlvbklkXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB0eXBlOiByLnR5cGUsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy50eXBlUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGNyZWF0ZUR0by50eXBlSWQgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0RvY3VtZW50IFR5cGUgbm90IGZvdW5kJyk7XHJcblxyXG4gICAgbGV0IHVzZXJPcmdJZCA9IHVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgY29uc3QgZnVsbFVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRPbmUodXNlci51c2VyX2lkKTtcclxuICAgICAgaWYgKGZ1bGxVc2VyKSB1c2VyT3JnSWQgPSBmdWxsVXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByZXZpZXdPcmlnaW5hdG9ySWQgJiYgcHJldmlld09yaWdpbmF0b3JJZCAhPT0gdXNlck9yZ0lkKSB7XHJcbiAgICAgIC8vIEFsbG93IGltcGVyc29uYXRpb24gZm9yIHByZXZpZXdcclxuICAgICAgdXNlck9yZ0lkID0gcHJldmlld09yaWdpbmF0b3JJZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHRyYWN0IHJlY2lwaWVudCBmcm9tIHJlY2lwaWVudHMgYXJyYXlcclxuICAgIGNvbnN0IHRvUmVjaXBpZW50ID0gcHJldmlld1JlY2lwaWVudHM/LmZpbmQoKHIpID0+IHIudHlwZSA9PT0gJ1RPJyk7XHJcbiAgICBjb25zdCByZWNpcGllbnRPcmdhbml6YXRpb25JZCA9IHRvUmVjaXBpZW50Py5vcmdhbml6YXRpb25JZDtcclxuXHJcbiAgICBsZXQgcmVjaXBpZW50Q29kZSA9ICcnO1xyXG4gICAgaWYgKHJlY2lwaWVudE9yZ2FuaXphdGlvbklkKSB7XHJcbiAgICAgIGNvbnN0IHJlY09yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoT3JnYW5pemF0aW9uLCB7XHJcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHJlY2lwaWVudE9yZ2FuaXphdGlvbklkIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocmVjT3JnKSByZWNpcGllbnRDb2RlID0gcmVjT3JnLm9yZ2FuaXphdGlvbkNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubnVtYmVyaW5nU2VydmljZS5wcmV2aWV3TnVtYmVyKHtcclxuICAgICAgcHJvamVjdElkOiBwcmV2aWV3UHJvamVjdElkLFxyXG4gICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IHVzZXJPcmdJZCEsXHJcbiAgICAgIHR5cGVJZDogY3JlYXRlRHRvLnR5cGVJZCxcclxuICAgICAgZGlzY2lwbGluZUlkOiBjcmVhdGVEdG8uZGlzY2lwbGluZUlkLFxyXG4gICAgICBzdWJUeXBlSWQ6IGNyZWF0ZUR0by5zdWJUeXBlSWQsXHJcbiAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkLFxyXG4gICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIGN1c3RvbVRva2Vuczoge1xyXG4gICAgICAgIFRZUEVfQ09ERTogdHlwZS50eXBlQ29kZSxcclxuICAgICAgICBSRUNJUElFTlRfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICBSRUNfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzaW5lc3MgUnVsZSBJbXBsZW1lbnRhdGlvbjogRUMtQ09SUi0wMDEgLSBDYW5jZWwgQ29ycmVzcG9uZGVuY2Ugd2l0aCBEb3duc3RyZWFtIENpcmN1bGF0aW9uXHJcbiAgICogQ2FuY2VsIGNvcnJlc3BvbmRlbmNlIGFuZCBoYW5kbGUgcmVsYXRlZCBjaXJjdWxhdGlvbnNcclxuICAgKi9cclxuICBhc3luYyBjYW5jZWwocHVibGljSWQ6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHVzZXI6IFVzZXIpIHtcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gYXdhaXQgdGhpcy5maW5kT25lQnlVdWlkKHB1YmxpY0lkKTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNhbmNlbCAoT3JnIEFkbWluIG9yIFN1cGVyYWRtaW4gb25seSlcclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnModXNlci51c2VyX2lkKTtcclxuICAgIGNvbnN0IGNhbkNhbmNlbCA9XHJcbiAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKCdjb3JyZXNwb25kZW5jZS5jYW5jZWwnKSB8fFxyXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuXHJcbiAgICBpZiAoIWNhbkNhbmNlbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKFxyXG4gICAgICAgICdPbmx5IGFkbWluaXN0cmF0b3JzIGNhbiBjYW5jZWwgY29ycmVzcG9uZGVuY2VzJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgYWN0aXZlIGNpcmN1bGF0aW9uc1xyXG4gICAgY29uc3QgY2lyY3VsYXRpb25SZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoJ0NpcmN1bGF0aW9uJyk7XHJcbiAgICBjb25zdCBhY3RpdmVDaXJjdWxhdGlvbnMgPSBhd2FpdCBjaXJjdWxhdGlvblJlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgc3RhdHVzOiAnT1BFTicsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9XHJcbiAgICAgIGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGggPiAwXHJcbiAgICAgICAgPyBgVGhlcmUgYXJlICR7YWN0aXZlQ2lyY3VsYXRpb25zLmxlbmd0aH0gYWN0aXZlIGNpcmN1bGF0aW9uKHMpIGZvciB0aGlzIGNvcnJlc3BvbmRlbmNlLiBDYW5jZWxpbmcgd2lsbCBmb3JjZSBjbG9zZSBhbGwgcmVsYXRlZCBjaXJjdWxhdGlvbnMuYFxyXG4gICAgICAgIDogJyc7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIHRvIHVwZGF0ZSBzdGF0dXNcclxuICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbiA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY3VycmVudFJldmlzaW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ3VycmVudCByZXZpc2lvbiBub3QgZm91bmQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgY2FuY2VsbGVkIHN0YXR1c1xyXG4gICAgY29uc3QgY2FuY2VsbGVkU3RhdHVzID0gYXdhaXQgdGhpcy5zdGF0dXNSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBzdGF0dXNDb2RlOiAnQ0FOQ0VMTEVEJyB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFjYW5jZWxsZWRTdGF0dXMpIHtcclxuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oJ0NBTkNFTExFRCBzdGF0dXMgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBVcGRhdGUgY29ycmVzcG9uZGVuY2UgcmV2aXNpb24gc3RhdHVzIHRvIENBTkNFTExFRFxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnVwZGF0ZShcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbi5pZCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzdGF0dXNJZDogY2FuY2VsbGVkU3RhdHVzLmlkLFxyXG4gICAgICAgICAgcmVtYXJrczogYENhbmNlbGxlZDogJHtyZWFzb259YCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBGb3JjZSBjbG9zZSBhbGwgYWN0aXZlIGNpcmN1bGF0aW9uc1xyXG4gICAgICBpZiAoYWN0aXZlQ2lyY3VsYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnVwZGF0ZShcclxuICAgICAgICAgICdDaXJjdWxhdGlvbicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgICAgICBzdGF0dXM6ICdPUEVOJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0YXR1czogJ0ZPUkNFX0NMT1NFRCcsXHJcbiAgICAgICAgICAgIGNsb3NlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICBjbG9zZWRCeTogdXNlci51c2VyX2lkLFxyXG4gICAgICAgICAgICBjbG9zZVJlYXNvbjogYENvcnJlc3BvbmRlbmNlIGNhbmNlbGxlZDogJHtyZWFzb259YCxcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgICAgLy8gUmUtaW5kZXggY2FuY2VsbGVkIHN0YXR1cyBpbiBFbGFzdGljc2VhcmNoIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIHZvaWQgdGhpcy5zZWFyY2hTZXJ2aWNlLmluZGV4RG9jdW1lbnQoe1xyXG4gICAgICAgIGlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICBwdWJsaWNJZDogY29ycmVzcG9uZGVuY2UucHVibGljSWQsXHJcbiAgICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICBkb2NOdW1iZXI6IGNvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlTnVtYmVyLFxyXG4gICAgICAgIHRpdGxlOiBjdXJyZW50UmV2aXNpb24uc3ViamVjdCxcclxuICAgICAgICBzdGF0dXM6ICdDQU5DRUxMRUQnLFxyXG4gICAgICAgIHByb2plY3RJZDogY29ycmVzcG9uZGVuY2UucHJvamVjdElkLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogY29ycmVzcG9uZGVuY2UuY3JlYXRlZEF0LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIE5vdGlmeSBvcmlnaW5hdG9yJ3MgZG9jLWNvbnRyb2wgdXNlciBhYm91dCBjYW5jZWxsYXRpb24gKGZpcmUtYW5kLWZvcmdldClcclxuICAgICAgaWYgKGNvcnJlc3BvbmRlbmNlLm9yaWdpbmF0b3JJZCkge1xyXG4gICAgICAgIHZvaWQgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgLmZpbmREb2NDb250cm9sSWRCeU9yZyhjb3JyZXNwb25kZW5jZS5vcmlnaW5hdG9ySWQpXHJcbiAgICAgICAgICAudGhlbigodGFyZ2V0VXNlcklkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXRVc2VySWQpIHtcclxuICAgICAgICAgICAgICB2b2lkIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zZW5kKHtcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdGFyZ2V0VXNlcklkLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb3JyZXNwb25kZW5jZSBDYW5jZWxsZWQnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYCR7Y29ycmVzcG9uZGVuY2UuY29ycmVzcG9uZGVuY2VOdW1iZXJ9IOKAlCAke2N1cnJlbnRSZXZpc2lvbi5zdWJqZWN0fSBoYXMgYmVlbiBjYW5jZWxsZWQuIFJlYXNvbjogJHtyZWFzb259YCxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdFTUFJTCcsXHJcbiAgICAgICAgICAgICAgICBlbnRpdHlUeXBlOiAnY29ycmVzcG9uZGVuY2UnLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgICAgICAgICAgbGluazogYC9jb3JyZXNwb25kZW5jZXMvJHtjb3JyZXNwb25kZW5jZS5wdWJsaWNJZH1gLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBDYW5jZWwgbm90aWZpY2F0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIG1lc3NhZ2U6IHdhcm5pbmdNZXNzYWdlIHx8ICdDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICAgICAgICBhY3RpdmVDaXJjdWxhdGlvbnNDb3VudDogYWN0aXZlQ2lyY3VsYXRpb25zLmxlbmd0aCxcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byBjYW5jZWwgY29ycmVzcG9uZGVuY2U6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBidWxrQ2FuY2VsKFxyXG4gICAgcHVibGljSWRzOiBzdHJpbmdbXSxcclxuICAgIHJlYXNvbjogc3RyaW5nLFxyXG4gICAgdXNlcjogVXNlclxyXG4gICk6IFByb21pc2U8eyBzdWNjZWVkZWQ6IHN0cmluZ1tdOyBmYWlsZWQ6IHN0cmluZ1tdIH0+IHtcclxuICAgIGNvbnN0IHN1Y2NlZWRlZDogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IGZhaWxlZDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0lkIG9mIHB1YmxpY0lkcykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsKHB1YmxpY0lkLCByZWFzb24sIHVzZXIpO1xyXG4gICAgICAgIHN1Y2NlZWRlZC5wdXNoKHB1YmxpY0lkKTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgZmFpbGVkLnB1c2gocHVibGljSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgc3VjY2VlZGVkLCBmYWlsZWQgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGV4cG9ydENzdihzZWFyY2hEdG86IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kQWxsKHNlYXJjaER0byk7XHJcblxyXG4gICAgY29uc3QgaGVhZGVyID0gW1xyXG4gICAgICAnRG9jdW1lbnQgTm8uJyxcclxuICAgICAgJ1JldicsXHJcbiAgICAgICdTdWJqZWN0JyxcclxuICAgICAgJ1R5cGUnLFxyXG4gICAgICAnU3RhdHVzJyxcclxuICAgICAgJ1Byb2plY3QnLFxyXG4gICAgICAnRnJvbScsXHJcbiAgICAgICdEdWUgRGF0ZScsXHJcbiAgICAgICdDcmVhdGVkIEF0JyxcclxuICAgIF07XHJcbiAgICBjb25zdCByb3dzID0gZGF0YS5tYXAoKHJldikgPT4ge1xyXG4gICAgICBjb25zdCBjb3JyID0gcmV2LmNvcnJlc3BvbmRlbmNlID8/IChyZXYgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgdGhpcy5lc2NhcGVDc3YoY29yci5jb3JyZXNwb25kZW5jZU51bWJlciA/PyAnJyksXHJcbiAgICAgICAgdGhpcy5lc2NhcGVDc3YocmV2LnJldmlzaW9uTGFiZWwgPz8gU3RyaW5nKHJldi5yZXZpc2lvbk51bWJlciA/PyAwKSksXHJcbiAgICAgICAgdGhpcy5lc2NhcGVDc3YocmV2LnN1YmplY3QgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIudHlwZT8udHlwZUNvZGUgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5zdGF0dXM/LnN0YXR1c0NvZGUgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIucHJvamVjdD8ucHJvamVjdENvZGUgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIub3JpZ2luYXRvcj8ub3JnYW5pemF0aW9uQ29kZSA/PyAnJyksXHJcbiAgICAgICAgcmV2LmR1ZURhdGUgPyBuZXcgRGF0ZShyZXYuZHVlRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIDogJycsXHJcbiAgICAgICAgbmV3IERhdGUocmV2LmNyZWF0ZWRBdCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdLFxyXG4gICAgICBdLmpvaW4oJywnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBbaGVhZGVyLmpvaW4oJywnKSwgLi4ucm93c10uam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVzY2FwZUNzdih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnLCcpIHx8IHZhbHVlLmluY2x1ZGVzKCdcIicpIHx8IHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xyXG4gICAgICByZXR1cm4gYFwiJHt2YWx1ZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af.map new file mode 100644 index 0000000..38e16bd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceservice_ad1118bded3627ccd60dfa57cfd690af.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence.service.ts\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n ForbiddenException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\n\r\n// Entities\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Tag } from '../master/entities/tag.entity';\r\nimport { User } from '../user/entities/user.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\n\r\n// DTOs\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\n\r\n// Services\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\n\r\n/**\r\n * CorrespondenceService - Document management (CRUD)\r\n */\r\ninterface ResolvedRecipient {\r\n organizationId: number;\r\n type: 'TO' | 'CC';\r\n}\r\n@Injectable()\r\nexport class CorrespondenceService {\r\n private readonly logger = new Logger(CorrespondenceService.name);\r\n\r\n private async hasSystemManageAllPermission(userId: number): Promise {\r\n const permissions = await this.userService.getUserPermissions(userId);\r\n return permissions.includes('system.manage_all');\r\n }\r\n\r\n /**\r\n * Business Rule: Revision Label Strategy\r\n * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...)\r\n * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...)\r\n */\r\n private getInitialRevisionLabel(typeCode: string): string | undefined {\r\n const alphabetTypes = ['RFA', 'RFI'];\r\n if (alphabetTypes.includes(typeCode.toUpperCase())) {\r\n return 'A'; // Alphabet for RFA, RFI\r\n }\r\n return undefined; // Numeric (no label for revision 0)\r\n }\r\n\r\n constructor(\r\n @InjectRepository(Correspondence)\r\n private correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private statusRepo: Repository,\r\n @InjectRepository(CorrespondenceReference)\r\n private referenceRepo: Repository,\r\n @InjectRepository(CorrespondenceTag)\r\n private tagRepo: Repository,\r\n private numberingService: DocumentNumberingService,\r\n private jsonSchemaService: JsonSchemaService,\r\n private workflowEngine: WorkflowEngineService,\r\n private userService: UserService,\r\n private dataSource: DataSource,\r\n private searchService: SearchService,\r\n private fileStorageService: FileStorageService,\r\n private uuidResolver: UuidResolverService,\r\n private notificationService: NotificationService\r\n ) {}\r\n\r\n /**\r\n * Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n * Prevent external correspondence to same organization\r\n */\r\n private async validateCorrespondenceRecipients(\r\n createDto: CreateCorrespondenceDto,\r\n user: User\r\n ): Promise {\r\n // Get user's organization\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n if (createDto.originatorId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (canManageAll) {\r\n userOrgId = await this.uuidResolver.resolveOrganizationId(\r\n createDto.originatorId\r\n );\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n }\r\n\r\n // For impersonation, use the specified originator\r\n const originatorOrgId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : userOrgId;\r\n\r\n // Check if it's internal communication\r\n if (createDto.isInternal) {\r\n // Internal communications should use Circulation instead\r\n throw new BadRequestException(\r\n 'Internal communications should use Circulation Sheet instead of Correspondence'\r\n );\r\n }\r\n\r\n // Validate recipients\r\n if (!createDto.recipients || createDto.recipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one recipient (TO or CC) is required'\r\n );\r\n }\r\n\r\n const toRecipients = createDto.recipients.filter((r) => r.type === 'TO');\r\n const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC');\r\n\r\n if (toRecipients.length === 0 && ccRecipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one TO or CC recipient is required'\r\n );\r\n }\r\n\r\n // Check for same organization correspondence\r\n for (const recipient of createDto.recipients) {\r\n const recipientOrgId = await this.uuidResolver.resolveOrganizationId(\r\n recipient.organizationId\r\n );\r\n\r\n if (recipientOrgId === originatorOrgId) {\r\n throw new BadRequestException(\r\n 'Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'\r\n );\r\n }\r\n }\r\n }\r\n\r\n async create(createDto: CreateCorrespondenceDto, user: User) {\r\n // Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n await this.validateCorrespondenceRecipients(createDto, user);\r\n // ADR-019: Resolve UUID references to internal INT IDs\r\n const resolvedProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const resolvedOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const resolvedRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n const statusDraft = await this.statusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n if (!statusDraft) {\r\n throw new InternalServerErrorException(\r\n 'Status DRAFT not found in Master Data'\r\n );\r\n }\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n // Impersonation Logic\r\n if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (!canManageAll) {\r\n throw new ForbiddenException(\r\n 'You do not have permission to create documents on behalf of other organizations.'\r\n );\r\n }\r\n userOrgId = resolvedOriginatorId;\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n\r\n if (createDto.details) {\r\n try {\r\n await this.jsonSchemaService.validate(type.typeCode, createDto.details);\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Schema validation warning for ${type.typeCode}: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // [Fix #6] Fetch real ORG Code from Organization entity\r\n const originatorOrg = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: { id: userOrgId },\r\n }\r\n );\r\n const orgCode = originatorOrg?.organizationCode ?? 'UNK';\r\n\r\n // [v1.5.1] Extract recipient organization from recipients array (Primary TO)\r\n const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n const docNumber = await this.numberingService.generateNextNumber({\r\n projectId: resolvedProjectId,\r\n originatorOrganizationId: userOrgId,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId, // [v1.5.1] Pass recipient for document number format\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n\r\n const correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: docNumber.number,\r\n correspondenceTypeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n isInternal: createDto.isInternal || false,\r\n createdBy: user.user_id,\r\n });\r\n const savedCorr = await queryRunner.manager.save(correspondence);\r\n\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: savedCorr.id,\r\n revisionNumber: 0,\r\n revisionLabel: this.getInitialRevisionLabel(type.typeCode),\r\n isCurrent: true,\r\n statusId: statusDraft.id,\r\n subject: createDto.subject,\r\n body: createDto.body,\r\n remarks: createDto.remarks,\r\n dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined,\r\n documentDate: createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined,\r\n issuedDate: createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : undefined,\r\n receivedDate: createDto.receivedDate\r\n ? new Date(createDto.receivedDate)\r\n : undefined,\r\n description: createDto.description,\r\n details: createDto.details,\r\n createdBy: user.user_id,\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(revision);\r\n\r\n // Save Recipients (using resolved INT IDs)\r\n if (resolvedRecipients && resolvedRecipients.length > 0) {\r\n const recipients = resolvedRecipients.map((r) =>\r\n queryRunner.manager.create(CorrespondenceRecipient, {\r\n correspondenceId: savedCorr.id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await queryRunner.manager.save(recipients);\r\n }\r\n\r\n // Commit attachments from Temp → Permanent (Two-Phase Storage)\r\n if (createDto.attachmentTempIds?.length) {\r\n const issueDate = createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined;\r\n\r\n await this.fileStorageService.commit(createDto.attachmentTempIds, {\r\n issueDate,\r\n documentType: 'Correspondence',\r\n });\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Start Workflow Instance (non-blocking)\r\n try {\r\n const workflowCode = `CORRESPONDENCE_${type.typeCode}`;\r\n await this.workflowEngine.createInstance(\r\n workflowCode,\r\n 'correspondence',\r\n savedCorr.id.toString(),\r\n {\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n disciplineId: createDto.disciplineId,\r\n initiatorId: user.user_id,\r\n } as Record\r\n );\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${(error as Error).message}`\r\n );\r\n }\r\n\r\n // Fire-and-forget search indexing (non-blocking, void intentional)\r\n void this.searchService.indexDocument({\r\n id: savedCorr.id,\r\n publicId: savedCorr.publicId,\r\n type: 'correspondence',\r\n docNumber: docNumber.number,\r\n title: createDto.subject,\r\n description: createDto.description,\r\n status: 'DRAFT',\r\n projectId: resolvedProjectId,\r\n createdAt: new Date(),\r\n });\r\n\r\n return {\r\n ...savedCorr,\r\n currentRevision: revision,\r\n };\r\n } catch (err) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to create correspondence: ${(err as Error).message}`\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async findAll(searchDto: SearchCorrespondenceDto = {}) {\r\n const {\r\n search,\r\n typeId,\r\n projectId,\r\n statusId,\r\n status,\r\n page = 1,\r\n limit = 10,\r\n } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n // Change: Query from Revision Repo\r\n const query = this.revisionRepo\r\n .createQueryBuilder('rev')\r\n .leftJoinAndSelect('rev.correspondence', 'corr')\r\n .leftJoinAndSelect('corr.type', 'type')\r\n .leftJoinAndSelect('corr.project', 'project')\r\n .leftJoinAndSelect('corr.originator', 'org')\r\n .leftJoinAndSelect('rev.status', 'status');\r\n\r\n // Filter by Revision Status\r\n const revStatus = searchDto.revisionStatus || 'CURRENT';\r\n\r\n if (revStatus === 'CURRENT') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: true });\r\n } else if (revStatus === 'OLD') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: false });\r\n }\r\n // If 'ALL', no filter needed on isCurrent\r\n\r\n if (projectId) {\r\n query.andWhere('corr.projectId = :projectId', { projectId });\r\n }\r\n\r\n if (typeId) {\r\n query.andWhere('corr.correspondenceTypeId = :typeId', { typeId });\r\n }\r\n\r\n if (statusId) {\r\n query.andWhere('rev.statusId = :statusId', { statusId });\r\n }\r\n\r\n if (status) {\r\n query.andWhere('status.statusCode = :status', { status });\r\n }\r\n\r\n if (search) {\r\n query.andWhere(\r\n '(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n // Default Sort: Latest Created\r\n query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit);\r\n\r\n const [items, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence with ID ${id} not found`);\r\n }\r\n return correspondence;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization',\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(\r\n `Correspondence with UUID ${publicId} not found`\r\n );\r\n }\r\n return correspondence;\r\n }\r\n\r\n async addReference(id: number, dto: AddReferenceDto) {\r\n const source = await this.correspondenceRepo.findOne({ where: { id } });\r\n // ADR-019: Resolve target publicId → internal INT id\r\n const target = await this.correspondenceRepo.findOne({\r\n where: { publicId: dto.targetUuid },\r\n });\r\n\r\n if (!source || !target) {\r\n throw new NotFoundException('Source or Target correspondence not found');\r\n }\r\n\r\n if (source.id === target.id) {\r\n throw new BadRequestException('Cannot reference self');\r\n }\r\n\r\n const exists = await this.referenceRepo.findOne({\r\n where: {\r\n sourceId: id,\r\n targetId: target.id,\r\n },\r\n });\r\n\r\n if (exists) {\r\n return exists;\r\n }\r\n\r\n const ref = this.referenceRepo.create({\r\n sourceId: id,\r\n targetId: target.id,\r\n });\r\n\r\n return this.referenceRepo.save(ref);\r\n }\r\n\r\n async removeReference(id: number, targetId: number) {\r\n const result = await this.referenceRepo.delete({\r\n sourceId: id,\r\n targetId: targetId,\r\n });\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Reference not found');\r\n }\r\n }\r\n\r\n async getTags(id: number) {\r\n const rows = await this.tagRepo.find({\r\n where: { correspondenceId: id },\r\n relations: ['tag'],\r\n });\r\n return rows.map((r) => r.tag).filter(Boolean);\r\n }\r\n\r\n async addTag(id: number, tagId: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n });\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence ${id} not found`);\r\n }\r\n\r\n const tag = await this.dataSource.manager.findOne(Tag, {\r\n where: { id: tagId },\r\n });\r\n if (!tag) {\r\n throw new NotFoundException(`Tag ${tagId} not found`);\r\n }\r\n\r\n const exists = await this.tagRepo.findOne({\r\n where: { correspondenceId: id, tagId },\r\n });\r\n if (exists) return exists;\r\n\r\n const row = this.tagRepo.create({ correspondenceId: id, tagId });\r\n return this.tagRepo.save(row);\r\n }\r\n\r\n async removeTag(id: number, tagId: number) {\r\n const result = await this.tagRepo.delete({ correspondenceId: id, tagId });\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Tag assignment not found');\r\n }\r\n }\r\n\r\n async getReferences(id: number) {\r\n const outgoing = await this.referenceRepo.find({\r\n where: { sourceId: id },\r\n relations: ['target', 'target.type'],\r\n });\r\n\r\n const incoming = await this.referenceRepo.find({\r\n where: { targetId: id },\r\n relations: ['source', 'source.type'],\r\n });\r\n\r\n return { outgoing, incoming };\r\n }\r\n\r\n async update(id: number, updateDto: UpdateCorrespondenceDto, user: User) {\r\n // 1. Find Current Revision\r\n const revision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: id,\r\n isCurrent: true,\r\n },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Current revision for correspondence ${id} not found`\r\n );\r\n }\r\n\r\n // 2. Check Permission\r\n if (revision.statusId) {\r\n const status = await this.statusRepo.findOne({\r\n where: { id: revision.statusId },\r\n });\r\n\r\n if (status && status.statusCode !== 'DRAFT') {\r\n const permissions = await this.userService.getUserPermissions(\r\n user.user_id\r\n );\r\n const canEditSubmittedOrLater =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canEditSubmittedOrLater) {\r\n throw new ForbiddenException(\r\n 'Only Org Admin or Superadmin can edit non-draft correspondences'\r\n );\r\n }\r\n }\r\n }\r\n\r\n // ADR-019: Resolve UUID references in update DTO\r\n const updResolvedProjectId = updateDto.projectId\r\n ? await this.uuidResolver.resolveProjectId(updateDto.projectId)\r\n : undefined;\r\n const updResolvedOriginatorId = updateDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId)\r\n : undefined;\r\n const updResolvedRecipients = updateDto.recipients\r\n ? await Promise.all(\r\n updateDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n // 3. Update Correspondence Entity if needed\r\n const correspondenceUpdate: Record = {};\r\n if (updateDto.disciplineId)\r\n correspondenceUpdate.disciplineId = updateDto.disciplineId;\r\n if (updResolvedProjectId)\r\n correspondenceUpdate.projectId = updResolvedProjectId;\r\n if (updResolvedOriginatorId)\r\n correspondenceUpdate.originatorId = updResolvedOriginatorId;\r\n\r\n if (Object.keys(correspondenceUpdate).length > 0) {\r\n await this.correspondenceRepo.update(id, correspondenceUpdate);\r\n }\r\n\r\n // 4. Update Revision Entity\r\n const revisionUpdate: Record = {};\r\n if (updateDto.subject) revisionUpdate.subject = updateDto.subject;\r\n if (updateDto.body) revisionUpdate.body = updateDto.body;\r\n if (updateDto.remarks) revisionUpdate.remarks = updateDto.remarks;\r\n // Format Date correctly if string\r\n if (updateDto.dueDate) revisionUpdate.dueDate = new Date(updateDto.dueDate);\r\n if (updateDto.documentDate)\r\n revisionUpdate.documentDate = new Date(updateDto.documentDate);\r\n if (updateDto.issuedDate)\r\n revisionUpdate.issuedDate = new Date(updateDto.issuedDate);\r\n if (updateDto.receivedDate)\r\n revisionUpdate.receivedDate = new Date(updateDto.receivedDate);\r\n if (updateDto.description)\r\n revisionUpdate.description = updateDto.description;\r\n if (updateDto.details) revisionUpdate.details = updateDto.details;\r\n\r\n if (Object.keys(revisionUpdate).length > 0) {\r\n await this.revisionRepo.update(revision.id, revisionUpdate);\r\n }\r\n\r\n // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage)\r\n if (updateDto.attachmentTempIds?.length) {\r\n const issueDate = updateDto.issuedDate\r\n ? new Date(updateDto.issuedDate)\r\n : updateDto.documentDate\r\n ? new Date(updateDto.documentDate)\r\n : revision.issuedDate || revision.documentDate || undefined;\r\n\r\n await this.fileStorageService.commit(updateDto.attachmentTempIds, {\r\n issueDate: issueDate ? new Date(issueDate) : undefined,\r\n documentType: 'Correspondence',\r\n });\r\n }\r\n\r\n // 5. Update Recipients if provided\r\n if (updResolvedRecipients) {\r\n const recipientRepo = this.dataSource.getRepository(\r\n CorrespondenceRecipient\r\n );\r\n await recipientRepo.delete({ correspondenceId: id });\r\n\r\n const newRecipients = updResolvedRecipients.map((r) =>\r\n recipientRepo.create({\r\n correspondenceId: id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await recipientRepo.save(newRecipients);\r\n }\r\n\r\n // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project)\r\n // AND it is a DRAFT.\r\n\r\n // Fetch fresh data for context and comparison\r\n const currentCorr = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: ['type', 'recipients', 'recipients.recipientOrganization'],\r\n });\r\n\r\n if (currentCorr) {\r\n const currentToRecipient = currentCorr.recipients?.find(\r\n (r) => r.recipientType === 'TO'\r\n );\r\n const currentRecipientId = currentToRecipient?.recipientOrganizationId;\r\n\r\n // Check for ACTUAL value changes\r\n const isProjectChanged =\r\n updResolvedProjectId !== undefined &&\r\n updResolvedProjectId !== currentCorr.projectId;\r\n const isOriginatorChanged =\r\n updResolvedOriginatorId !== undefined &&\r\n updResolvedOriginatorId !== currentCorr.originatorId;\r\n const isDisciplineChanged =\r\n updateDto.disciplineId !== undefined &&\r\n updateDto.disciplineId !== currentCorr.disciplineId;\r\n const isTypeChanged =\r\n updateDto.typeId !== undefined &&\r\n updateDto.typeId !== currentCorr.correspondenceTypeId;\r\n\r\n let isRecipientChanged = false;\r\n let newRecipientId: number | undefined;\r\n\r\n if (updResolvedRecipients) {\r\n const newToRecipient = updResolvedRecipients.find(\r\n (r) => r.type === 'TO'\r\n );\r\n newRecipientId = newToRecipient?.organizationId;\r\n\r\n if (newRecipientId !== currentRecipientId) {\r\n isRecipientChanged = true;\r\n }\r\n }\r\n\r\n if (\r\n isProjectChanged ||\r\n isDisciplineChanged ||\r\n isTypeChanged ||\r\n isRecipientChanged ||\r\n isOriginatorChanged\r\n ) {\r\n const targetRecipientId = isRecipientChanged\r\n ? newRecipientId\r\n : currentRecipientId;\r\n\r\n // Resolve Recipient Code for the NEW context\r\n let recipientCode = '';\r\n if (targetRecipientId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: targetRecipientId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n // [Fix #6] Fetch real ORG Code from originator organization\r\n const originatorOrgForUpdate = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: {\r\n id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n },\r\n }\r\n );\r\n const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK';\r\n\r\n // Prepare Contexts\r\n const oldCtx = {\r\n projectId: currentCorr.projectId,\r\n originatorOrganizationId: currentCorr.originatorId ?? 0,\r\n typeId: currentCorr.correspondenceTypeId,\r\n disciplineId: currentCorr.disciplineId,\r\n recipientOrganizationId: currentRecipientId,\r\n year: new Date().getFullYear(),\r\n };\r\n\r\n const newCtx = {\r\n projectId: updResolvedProjectId ?? currentCorr.projectId,\r\n originatorOrganizationId:\r\n updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId,\r\n disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId,\r\n recipientOrganizationId: targetRecipientId,\r\n year: new Date().getFullYear(),\r\n userId: user.user_id, // Pass User ID for Audit\r\n customTokens: {\r\n TYPE_CODE: currentCorr.type?.typeCode || '',\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n };\r\n\r\n // If Type Changed, need NEW Type Code\r\n if (isTypeChanged) {\r\n const newType = await this.typeRepo.findOne({\r\n where: { id: newCtx.typeId },\r\n });\r\n if (newType) newCtx.customTokens.TYPE_CODE = newType.typeCode;\r\n }\r\n\r\n const newDocNumber = await this.numberingService.updateNumberForDraft(\r\n currentCorr.correspondenceNumber,\r\n oldCtx,\r\n newCtx\r\n );\r\n\r\n await this.correspondenceRepo.update(id, {\r\n correspondenceNumber: newDocNumber,\r\n });\r\n }\r\n }\r\n\r\n const updated = await this.findOne(id);\r\n\r\n // Re-index updated document in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: updated.id,\r\n publicId: updated.publicId,\r\n type: 'correspondence',\r\n docNumber: updated.correspondenceNumber,\r\n title: updateDto.subject ?? updated.revisions?.[0]?.subject,\r\n description: updateDto.description ?? updated.revisions?.[0]?.description,\r\n status: 'DRAFT',\r\n projectId: updated.projectId,\r\n createdAt: updated.createdAt,\r\n });\r\n\r\n return updated;\r\n }\r\n\r\n async previewDocumentNumber(createDto: CreateCorrespondenceDto, user: User) {\r\n // ADR-019: Resolve UUID references\r\n const previewProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const previewOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const previewRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n\r\n if (previewOriginatorId && previewOriginatorId !== userOrgId) {\r\n // Allow impersonation for preview\r\n userOrgId = previewOriginatorId;\r\n }\r\n\r\n // Extract recipient from recipients array\r\n const toRecipient = previewRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n return this.numberingService.previewNumber({\r\n projectId: previewProjectId,\r\n originatorOrganizationId: userOrgId!,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId,\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation\r\n * Cancel correspondence and handle related circulations\r\n */\r\n async cancel(publicId: string, reason: string, user: User) {\r\n const correspondence = await this.findOneByUuid(publicId);\r\n\r\n // Check if user has permission to cancel (Org Admin or Superadmin only)\r\n const permissions = await this.userService.getUserPermissions(user.user_id);\r\n const canCancel =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canCancel) {\r\n throw new ForbiddenException(\r\n 'Only administrators can cancel correspondences'\r\n );\r\n }\r\n\r\n // Check if there are any active circulations\r\n const circulationRepo = this.dataSource.getRepository('Circulation');\r\n const activeCirculations = await circulationRepo.find({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n });\r\n\r\n const warningMessage =\r\n activeCirculations.length > 0\r\n ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.`\r\n : '';\r\n\r\n // Get the current revision to update status\r\n const currentRevision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n isCurrent: true,\r\n },\r\n });\r\n\r\n if (!currentRevision) {\r\n throw new NotFoundException('Current revision not found');\r\n }\r\n\r\n // Get cancelled status\r\n const cancelledStatus = await this.statusRepo.findOne({\r\n where: { statusCode: 'CANCELLED' },\r\n });\r\n\r\n if (!cancelledStatus) {\r\n throw new InternalServerErrorException('CANCELLED status not found');\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // Update correspondence revision status to CANCELLED\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n currentRevision.id,\r\n {\r\n statusId: cancelledStatus.id,\r\n remarks: `Cancelled: ${reason}`,\r\n }\r\n );\r\n\r\n // Force close all active circulations\r\n if (activeCirculations.length > 0) {\r\n await queryRunner.manager.update(\r\n 'Circulation',\r\n {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n {\r\n status: 'FORCE_CLOSED',\r\n closedAt: new Date(),\r\n closedBy: user.user_id,\r\n closeReason: `Correspondence cancelled: ${reason}`,\r\n }\r\n );\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Re-index cancelled status in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: correspondence.id,\r\n publicId: correspondence.publicId,\r\n type: 'correspondence',\r\n docNumber: correspondence.correspondenceNumber,\r\n title: currentRevision.subject,\r\n status: 'CANCELLED',\r\n projectId: correspondence.projectId,\r\n createdAt: correspondence.createdAt,\r\n });\r\n\r\n // Notify originator's doc-control user about cancellation (fire-and-forget)\r\n if (correspondence.originatorId) {\r\n void this.userService\r\n .findDocControlIdByOrg(correspondence.originatorId)\r\n .then((targetUserId) => {\r\n if (targetUserId) {\r\n void this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Correspondence Cancelled',\r\n message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: correspondence.id,\r\n link: `/correspondences/${correspondence.publicId}`,\r\n });\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Cancel notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: warningMessage || 'Correspondence cancelled successfully',\r\n activeCirculationsCount: activeCirculations.length,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to cancel correspondence: ${(error as Error).message}`\r\n );\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async bulkCancel(\r\n publicIds: string[],\r\n reason: string,\r\n user: User\r\n ): Promise<{ succeeded: string[]; failed: string[] }> {\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const publicId of publicIds) {\r\n try {\r\n await this.cancel(publicId, reason, user);\r\n succeeded.push(publicId);\r\n } catch {\r\n failed.push(publicId);\r\n }\r\n }\r\n\r\n return { succeeded, failed };\r\n }\r\n\r\n async exportCsv(searchDto: SearchCorrespondenceDto): Promise {\r\n const { data } = await this.findAll(searchDto);\r\n\r\n const header = [\r\n 'Document No.',\r\n 'Rev',\r\n 'Subject',\r\n 'Type',\r\n 'Status',\r\n 'Project',\r\n 'From',\r\n 'Due Date',\r\n 'Created At',\r\n ];\r\n const rows = data.map((rev) => {\r\n const corr = rev.correspondence ?? (rev as unknown as Correspondence);\r\n return [\r\n this.escapeCsv(corr.correspondenceNumber ?? ''),\r\n this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)),\r\n this.escapeCsv(rev.subject ?? ''),\r\n this.escapeCsv(corr.type?.typeCode ?? ''),\r\n this.escapeCsv(rev.status?.statusCode ?? ''),\r\n this.escapeCsv(corr.project?.projectCode ?? ''),\r\n this.escapeCsv(corr.originator?.organizationCode ?? ''),\r\n rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '',\r\n new Date(rev.createdAt).toISOString().split('T')[0],\r\n ].join(',');\r\n });\r\n\r\n return [header.join(','), ...rows].join('\\n');\r\n }\r\n\r\n private escapeCsv(value: string): string {\r\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f new file mode 100644 index 0000000..5cea06a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f @@ -0,0 +1,156 @@ +a1c6979146d5af61f48f6da4287a8e42 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class CreateCorrespondenceDto { +} +exports.CreateCorrespondenceDto = CreateCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'Project ID or UUID', example: 1 }), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Object) +], CreateCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'Document Type ID', example: 1 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "typeId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Discipline ID', example: 2 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "disciplineId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Sub Type ID', example: 3 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "subTypeId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Correspondence Subject', + example: 'Monthly Progress Report', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "subject", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Body/Content', + example: '

...

', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "body", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Remarks', + example: 'Note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "remarks", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Due Date', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "dueDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Correspondence Description', + example: 'Detailed report...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "description", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Additional details (JSON)', + example: { key: 'value' }, + }), + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], CreateCorrespondenceDto.prototype, "details", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Is internal document?', default: false }), + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], CreateCorrespondenceDto.prototype, "isInternal", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Document Date (วันที่เอกสาร)', + example: '2025-12-06', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "documentDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Issued Date (วันที่ออกเอกสาร) — ใช้จัดเก็บไฟล์ตาม YYYY/MM', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "issuedDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Received Date (วันที่รับเอกสาร)', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "receivedDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Attachment temp IDs from upload phase (Two-Phase Storage)', + example: ['uuid-temp-1', 'uuid-temp-2'], + }), + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], CreateCorrespondenceDto.prototype, "attachmentTempIds", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Originator Organization ID or UUID (for impersonation)', + example: 1, + }), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Object) +], CreateCorrespondenceDto.prototype, "originatorId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Recipients', + example: [{ organizationId: 1, type: 'TO' }], + }), + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], CreateCorrespondenceDto.prototype, "recipients", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcY3JlYXRlLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBU3lCO0FBQ3pCLDZDQUFtRTtBQUVuRSxNQUFhLHVCQUF1QjtDQXdIbkM7QUF4SEQsMERBd0hDO0FBckhDO0lBRkMsSUFBQSxxQkFBVyxFQUFDLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RCxJQUFBLDRCQUFVLEdBQUU7OzBEQUNlO0FBSzVCO0lBSEMsSUFBQSxxQkFBVyxFQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM1RCxJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLDRCQUFVLEdBQUU7O3VEQUNHO0FBS2hCO0lBSEMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pFLElBQUEsdUJBQUssR0FBRTtJQUNQLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFLdEI7SUFIQyxJQUFBLDZCQUFtQixFQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDL0QsSUFBQSx1QkFBSyxHQUFFO0lBQ1AsSUFBQSw0QkFBVSxHQUFFOzswREFDTTtBQVFuQjtJQU5DLElBQUEscUJBQVcsRUFBQztRQUNYLFdBQVcsRUFBRSx3QkFBd0I7UUFDckMsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQyxDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDSTtBQVFqQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGNBQWM7UUFDM0IsT0FBTyxFQUFFLFlBQVk7S0FDdEIsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7cURBQ0M7QUFRZDtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsT0FBTyxFQUFFLFNBQVM7S0FDbkIsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFRakI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0I7S0FDaEMsQ0FBQztJQUNELElBQUEsOEJBQVksR0FBRTtJQUNkLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFRakI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw0QkFBNEI7UUFDekMsT0FBTyxFQUFFLG9CQUFvQjtLQUM5QixDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzs0REFDUTtBQVFyQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0tBQzFCLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7a0RBQ0gsTUFBTSxvQkFBTixNQUFNO3dEQUFrQjtBQUtsQztJQUhDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzdFLElBQUEsMkJBQVMsR0FBRTtJQUNYLElBQUEsNEJBQVUsR0FBRTs7MkRBQ1E7QUFRckI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw4QkFBOEI7UUFDM0MsT0FBTyxFQUFFLFlBQVk7S0FDdEIsQ0FBQztJQUNELElBQUEsOEJBQVksR0FBRTtJQUNkLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFRdEI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSwyREFBMkQ7UUFDeEUsT0FBTyxFQUFFLHNCQUFzQjtLQUNoQyxDQUFDO0lBQ0QsSUFBQSw4QkFBWSxHQUFFO0lBQ2QsSUFBQSw0QkFBVSxHQUFFOzsyREFDTztBQVFwQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxPQUFPLEVBQUUsc0JBQXNCO0tBQ2hDLENBQUM7SUFDRCxJQUFBLDhCQUFZLEdBQUU7SUFDZCxJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBUXRCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsMkRBQTJEO1FBQ3hFLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUM7S0FDeEMsQ0FBQztJQUNELElBQUEseUJBQU8sR0FBRTtJQUNULElBQUEsNEJBQVUsR0FBRTs7a0VBQ2dCO0FBUTdCO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsd0RBQXdEO1FBQ3JFLE9BQU8sRUFBRSxDQUFDO0tBQ1gsQ0FBQztJQUNELElBQUEsNEJBQVUsR0FBRTs7NkRBQ2tCO0FBUS9CO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsWUFBWTtRQUN6QixPQUFPLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzdDLENBQUM7SUFDRCxJQUFBLHlCQUFPLEdBQUU7SUFDVCxJQUFBLDRCQUFVLEdBQUU7OzJEQUN5RCIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxjcmVhdGUtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElzSW50LFxuICBJc1N0cmluZyxcbiAgSXNOb3RFbXB0eSxcbiAgSXNPcHRpb25hbCxcbiAgSXNCb29sZWFuLFxuICBJc09iamVjdCxcbiAgSXNEYXRlU3RyaW5nLFxuICBJc0FycmF5LFxufSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHksIEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8ge1xuICBAQXBpUHJvcGVydHkoeyBkZXNjcmlwdGlvbjogJ1Byb2plY3QgSUQgb3IgVVVJRCcsIGV4YW1wbGU6IDEgfSlcbiAgQElzTm90RW1wdHkoKVxuICBwcm9qZWN0SWQhOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5KHsgZGVzY3JpcHRpb246ICdEb2N1bWVudCBUeXBlIElEJywgZXhhbXBsZTogMSB9KVxuICBASXNJbnQoKVxuICBASXNOb3RFbXB0eSgpXG4gIHR5cGVJZCE6IG51bWJlcjsgLy8gSUQg4LiC4Lit4LiH4Lib4Lij4Liw4LmA4Lig4LiX4LmA4Lit4LiB4Liq4Liy4LijICjguYDguIrguYjguJkgUkZBLCBMRVRURVIpXG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZXNjcmlwdGlvbjogJ0Rpc2NpcGxpbmUgSUQnLCBleGFtcGxlOiAyIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyOyAvLyBbUmVxIDZCXSDguKrguLLguILguLLguIfguLLguJkgKOC5gOC4iuC5iOC4mSBHRU4sIFNUUilcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlc2NyaXB0aW9uOiAnU3ViIFR5cGUgSUQnLCBleGFtcGxlOiAzIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgc3ViVHlwZUlkPzogbnVtYmVyOyAvLyBbUmVxIDZCXSDguJvguKPguLDguYDguKDguJfguKLguYjguK3guKIgKOC5gOC4iuC5iOC4mSBNQVQsIFNIUCDguKrguLPguKvguKPguLHguJogVHJhbnNtaXR0YWwvUkZBKVxuXG4gIEBBcGlQcm9wZXJ0eSh7XG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBTdWJqZWN0JyxcbiAgICBleGFtcGxlOiAnTW9udGhseSBQcm9ncmVzcyBSZXBvcnQnLFxuICB9KVxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIHN1YmplY3QhOiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnQm9keS9Db250ZW50JyxcbiAgICBleGFtcGxlOiAnPHA+Li4uPC9wPicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgYm9keT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdSZW1hcmtzJyxcbiAgICBleGFtcGxlOiAnTm90ZS4uLicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgcmVtYXJrcz86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdEdWUgRGF0ZScsXG4gICAgZXhhbXBsZTogJzIwMjUtMTItMDZUMDA6MDA6MDBaJyxcbiAgfSlcbiAgQElzRGF0ZVN0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgZHVlRGF0ZT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBEZXNjcmlwdGlvbicsXG4gICAgZXhhbXBsZTogJ0RldGFpbGVkIHJlcG9ydC4uLicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBkZXRhaWxzIChKU09OKScsXG4gICAgZXhhbXBsZTogeyBrZXk6ICd2YWx1ZScgfSxcbiAgfSlcbiAgQElzT2JqZWN0KClcbiAgQElzT3B0aW9uYWwoKVxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IC8vIOC4guC5ieC4reC4oeC4ueC4pSBKU09OICjguYDguIrguYjguJkgUkZJIHF1ZXN0aW9uKVxuXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdJcyBpbnRlcm5hbCBkb2N1bWVudD8nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBASXNCb29sZWFuKClcbiAgQElzT3B0aW9uYWwoKVxuICBpc0ludGVybmFsPzogYm9vbGVhbjtcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdEb2N1bWVudCBEYXRlICjguKfguLHguJnguJfguLXguYjguYDguK3guIHguKrguLLguKMpJyxcbiAgICBleGFtcGxlOiAnMjAyNS0xMi0wNicsXG4gIH0pXG4gIEBJc0RhdGVTdHJpbmcoKVxuICBASXNPcHRpb25hbCgpXG4gIGRvY3VtZW50RGF0ZT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdJc3N1ZWQgRGF0ZSAo4Lin4Lix4LiZ4LiX4Li14LmI4Lit4Lit4LiB4LmA4Lit4LiB4Liq4Liy4LijKSDigJQg4LmD4LiK4LmJ4LiI4Lix4LiU4LmA4LiB4LmH4Lia4LmE4Lif4Lil4LmM4LiV4Liy4LihIFlZWVkvTU0nLFxuICAgIGV4YW1wbGU6ICcyMDI1LTEyLTA2VDAwOjAwOjAwWicsXG4gIH0pXG4gIEBJc0RhdGVTdHJpbmcoKVxuICBASXNPcHRpb25hbCgpXG4gIGlzc3VlZERhdGU/OiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVjZWl2ZWQgRGF0ZSAo4Lin4Lix4LiZ4LiX4Li14LmI4Lij4Lix4Lia4LmA4Lit4LiB4Liq4Liy4LijKScsXG4gICAgZXhhbXBsZTogJzIwMjUtMTItMDZUMDA6MDA6MDBaJyxcbiAgfSlcbiAgQElzRGF0ZVN0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xuXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ0F0dGFjaG1lbnQgdGVtcCBJRHMgZnJvbSB1cGxvYWQgcGhhc2UgKFR3by1QaGFzZSBTdG9yYWdlKScsXG4gICAgZXhhbXBsZTogWyd1dWlkLXRlbXAtMScsICd1dWlkLXRlbXAtMiddLFxuICB9KVxuICBASXNBcnJheSgpXG4gIEBJc09wdGlvbmFsKClcbiAgYXR0YWNobWVudFRlbXBJZHM/OiBzdHJpbmdbXTtcblxuICAvLyDinIUg4LmA4Lie4Li04LmI4LihIEZpZWxkIOC4quC4s+C4q+C4o+C4seC4miBJbXBlcnNvbmF0aW9uICjguYDguKXguLfguK3guIHguK3guIfguITguYzguIHguKPguJzguLnguYnguKrguYjguIcpXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ09yaWdpbmF0b3IgT3JnYW5pemF0aW9uIElEIG9yIFVVSUQgKGZvciBpbXBlcnNvbmF0aW9uKScsXG4gICAgZXhhbXBsZTogMSxcbiAgfSlcbiAgQElzT3B0aW9uYWwoKVxuICBvcmlnaW5hdG9ySWQ/OiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVjaXBpZW50cycsXG4gICAgZXhhbXBsZTogW3sgb3JnYW5pemF0aW9uSWQ6IDEsIHR5cGU6ICdUTycgfV0sXG4gIH0pXG4gIEBJc0FycmF5KClcbiAgQElzT3B0aW9uYWwoKVxuICByZWNpcGllbnRzPzogeyBvcmdhbml6YXRpb25JZDogbnVtYmVyIHwgc3RyaW5nOyB0eXBlOiAnVE8nIHwgJ0NDJyB9W107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f.map new file mode 100644 index 0000000..34c3665 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/createcorrespondencedto_ae633c62db2423c3d35f3355bdfe8a8f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\create-correspondence.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDASyB;AACzB,6CAAmE;AAEnE,MAAa,uBAAuB;CAwHnC;AAxHD,0DAwHC;AArHC;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9D,IAAA,4BAAU,GAAE;;0DACe;AAK5B;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC5D,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;uDACG;AAKhB;IAHC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACjE,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;6DACS;AAKtB;IAHC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC/D,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;0DACM;AAQnB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,yBAAyB;KACnC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAQjB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,YAAY;KACtB,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACC;AAQd;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,SAAS;KACnB,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAQjB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACD,IAAA,8BAAY,GAAE;IACd,IAAA,4BAAU,GAAE;;wDACI;AAQjB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,oBAAoB;KAC9B,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;4DACQ;AAQrB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KAC1B,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;wDAAkB;AAKlC;IAHC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7E,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;2DACQ;AAQrB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,YAAY;KACtB,CAAC;IACD,IAAA,8BAAY,GAAE;IACd,IAAA,4BAAU,GAAE;;6DACS;AAQtB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACD,IAAA,8BAAY,GAAE;IACd,IAAA,4BAAU,GAAE;;2DACO;AAQpB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACD,IAAA,8BAAY,GAAE;IACd,IAAA,4BAAU,GAAE;;6DACS;AAQtB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KACxC,CAAC;IACD,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;kEACgB;AAQ7B;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,wDAAwD;QACrE,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,4BAAU,GAAE;;6DACkB;AAQ/B;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KAC7C,CAAC;IACD,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;2DACyD","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\create-correspondence.dto.ts"],"sourcesContent":["import {\n IsInt,\n IsString,\n IsNotEmpty,\n IsOptional,\n IsBoolean,\n IsObject,\n IsDateString,\n IsArray,\n} from 'class-validator';\nimport { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class CreateCorrespondenceDto {\n @ApiProperty({ description: 'Project ID or UUID', example: 1 })\n @IsNotEmpty()\n projectId!: number | string;\n\n @ApiProperty({ description: 'Document Type ID', example: 1 })\n @IsInt()\n @IsNotEmpty()\n typeId!: number; // ID ของประเภทเอกสาร (เช่น RFA, LETTER)\n\n @ApiPropertyOptional({ description: 'Discipline ID', example: 2 })\n @IsInt()\n @IsOptional()\n disciplineId?: number; // [Req 6B] สาขางาน (เช่น GEN, STR)\n\n @ApiPropertyOptional({ description: 'Sub Type ID', example: 3 })\n @IsInt()\n @IsOptional()\n subTypeId?: number; // [Req 6B] ประเภทย่อย (เช่น MAT, SHP สำหรับ Transmittal/RFA)\n\n @ApiProperty({\n description: 'Correspondence Subject',\n example: 'Monthly Progress Report',\n })\n @IsString()\n @IsNotEmpty()\n subject!: string;\n\n @ApiPropertyOptional({\n description: 'Body/Content',\n example: '

...

',\n })\n @IsString()\n @IsOptional()\n body?: string;\n\n @ApiPropertyOptional({\n description: 'Remarks',\n example: 'Note...',\n })\n @IsString()\n @IsOptional()\n remarks?: string;\n\n @ApiPropertyOptional({\n description: 'Due Date',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n dueDate?: string;\n\n @ApiPropertyOptional({\n description: 'Correspondence Description',\n example: 'Detailed report...',\n })\n @IsString()\n @IsOptional()\n description?: string;\n\n @ApiPropertyOptional({\n description: 'Additional details (JSON)',\n example: { key: 'value' },\n })\n @IsObject()\n @IsOptional()\n details?: Record; // ข้อมูล JSON (เช่น RFI question)\n\n @ApiPropertyOptional({ description: 'Is internal document?', default: false })\n @IsBoolean()\n @IsOptional()\n isInternal?: boolean;\n\n @ApiPropertyOptional({\n description: 'Document Date (วันที่เอกสาร)',\n example: '2025-12-06',\n })\n @IsDateString()\n @IsOptional()\n documentDate?: string;\n\n @ApiPropertyOptional({\n description: 'Issued Date (วันที่ออกเอกสาร) — ใช้จัดเก็บไฟล์ตาม YYYY/MM',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n issuedDate?: string;\n\n @ApiPropertyOptional({\n description: 'Received Date (วันที่รับเอกสาร)',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n receivedDate?: string;\n\n @ApiPropertyOptional({\n description: 'Attachment temp IDs from upload phase (Two-Phase Storage)',\n example: ['uuid-temp-1', 'uuid-temp-2'],\n })\n @IsArray()\n @IsOptional()\n attachmentTempIds?: string[];\n\n // ✅ เพิ่ม Field สำหรับ Impersonation (เลือกองค์กรผู้ส่ง)\n @ApiPropertyOptional({\n description: 'Originator Organization ID or UUID (for impersonation)',\n example: 1,\n })\n @IsOptional()\n originatorId?: number | string;\n\n @ApiPropertyOptional({\n description: 'Recipients',\n example: [{ organizationId: 1, type: 'TO' }],\n })\n @IsArray()\n @IsOptional()\n recipients?: { organizationId: number | string; type: 'TO' | 'CC' }[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872 new file mode 100644 index 0000000..e2cf0ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872 @@ -0,0 +1,9 @@ +97ce9981402cb6375346f5c4bb5e8a22 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const regex_js_1 = require("./regex.js"); +function validate(uuid) { + return typeof uuid === 'string' && regex_js_1.default.test(uuid); +} +exports.default = validate; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdmFsaWRhdGUuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pDLFNBQVMsUUFBUSxDQUFDLElBQUk7SUFDbEIsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHZhbGlkYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcmVnZXhfanNfMSA9IHJlcXVpcmUoXCIuL3JlZ2V4LmpzXCIpO1xuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICAgIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgcmVnZXhfanNfMS5kZWZhdWx0LnRlc3QodXVpZCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB2YWxpZGF0ZTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872.map new file mode 100644 index 0000000..f5c50f3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/validate_ae536be84542361d213e0db90352f872.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\validate.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,SAAS,QAAQ,CAAC,IAAI;IAClB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\validate.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst regex_js_1 = require(\"./regex.js\");\nfunction validate(uuid) {\n return typeof uuid === 'string' && regex_js_1.default.test(uuid);\n}\nexports.default = validate;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602 new file mode 100644 index 0000000..454de30 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602 @@ -0,0 +1,80 @@ +13e308fb67dff5b4ad5214fe705328de +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-history.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowHistory = void 0; +const typeorm_1 = require("typeorm"); +const workflow_instance_entity_1 = require("./workflow-instance.entity"); +/** + * เก็บประวัติการเปลี่ยนสถานะ (Audit Trail) + * สำคัญมากสำหรับการตรวจสอบย้อนหลัง (Who did What, When) + */ +let WorkflowHistory = class WorkflowHistory { +}; +exports.WorkflowHistory = WorkflowHistory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowHistory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => workflow_instance_entity_1.WorkflowInstance, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'instance_id' }), + __metadata("design:type", typeof (_a = typeof workflow_instance_entity_1.WorkflowInstance !== "undefined" && workflow_instance_entity_1.WorkflowInstance) === "function" ? _a : Object) +], WorkflowHistory.prototype, "instance", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'instance_id' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "instanceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'from_state', length: 50, comment: 'สถานะต้นทาง' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "fromState", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'to_state', length: 50, comment: 'สถานะปลายทาง' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "toState", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, comment: 'Action ที่ User กด (เช่น APPROVE, REJECT)' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "action", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_by_user_id', + nullable: true, + comment: 'User ID ผู้ดำเนินการ (Nullable กรณี System Auto)', + }), + __metadata("design:type", Number) +], WorkflowHistory.prototype, "actionByUserId", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: 'ความเห็นประกอบการอนุมัติ' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "comment", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + nullable: true, + comment: 'Snapshot of Context or Metadata', + }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowHistory.prototype, "metadata", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowHistory.prototype, "createdAt", void 0); +exports.WorkflowHistory = WorkflowHistory = __decorate([ + (0, typeorm_1.Entity)('workflow_histories'), + (0, typeorm_1.Index)(['instanceId']) // ค้นหาประวัติของ Instance นี้ + , + (0, typeorm_1.Index)(['actionByUserId']) // ค้นหาว่า User คนนี้ทำอะไรไปบ้าง +], WorkflowHistory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctaGlzdG9yeS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHdFQUF3RTs7Ozs7Ozs7Ozs7OztBQUV4RSxxQ0FRaUI7QUFDakIseUVBQThEO0FBRTlEOzs7R0FHRztBQUlJLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWU7Q0F3QzNCLENBQUE7QUF4Q1ksMENBQWU7QUFFMUI7SUFEQyxJQUFBLGdDQUFzQixFQUFDLE1BQU0sQ0FBQzs7MkNBQ25CO0FBSVo7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMkNBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDMUQsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO2tEQUN6QiwyQ0FBZ0Isb0JBQWhCLDJDQUFnQjtpREFBQztBQUc1QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7bURBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDOztrREFDaEQ7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDOztnREFDakQ7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxDQUFDOzsrQ0FDN0Q7QUFPaEI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLGtEQUFrRDtLQUM1RCxDQUFDOzt1REFDc0I7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUM7O2dEQUM3RDtBQVFqQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLElBQUk7UUFDZCxPQUFPLEVBQUUsaUNBQWlDO0tBQzNDLENBQUM7a0RBQ1MsTUFBTSxvQkFBTixNQUFNO2lEQUFrQjtBQUduQztJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtrREFBQzswQkF2Q04sZUFBZTtJQUgzQixJQUFBLGdCQUFNLEVBQUMsb0JBQW9CLENBQUM7SUFDNUIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLCtCQUErQjs7SUFDckQsSUFBQSxlQUFLLEVBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO0dBQ2hELGVBQWUsQ0F3QzNCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcZW50aXRpZXNcXHdvcmtmbG93LWhpc3RvcnkuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS9lbnRpdGllcy93b3JrZmxvdy1oaXN0b3J5LmVudGl0eS50c1xuXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBXb3JrZmxvd0luc3RhbmNlIH0gZnJvbSAnLi93b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHknO1xuXG4vKipcbiAqIOC5gOC4geC5h+C4muC4m+C4o+C4sOC4p+C4seC4leC4tOC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC4quC4luC4suC4meC4sCAoQXVkaXQgVHJhaWwpXG4gKiDguKrguLPguITguLHguI3guKHguLLguIHguKrguLPguKvguKPguLHguJrguIHguLLguKPguJXguKPguKfguIjguKrguK3guJrguKLguYnguK3guJnguKvguKXguLHguIcgKFdobyBkaWQgV2hhdCwgV2hlbilcbiAqL1xuQEVudGl0eSgnd29ya2Zsb3dfaGlzdG9yaWVzJylcbkBJbmRleChbJ2luc3RhbmNlSWQnXSkgLy8g4LiE4LmJ4LiZ4Lir4Liy4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiHIEluc3RhbmNlIOC4meC4teC5iVxuQEluZGV4KFsnYWN0aW9uQnlVc2VySWQnXSkgLy8g4LiE4LmJ4LiZ4Lir4Liy4Lin4LmI4LiyIFVzZXIg4LiE4LiZ4LiZ4Li14LmJ4LiX4Liz4Lit4Liw4LmE4Lij4LmE4Lib4Lia4LmJ4Liy4LiHXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dIaXN0b3J5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oJ3V1aWQnKVxuICBpZCE6IHN0cmluZztcblxuICBATWFueVRvT25lKCgpID0+IFdvcmtmbG93SW5zdGFuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdpbnN0YW5jZV9pZCcgfSlcbiAgaW5zdGFuY2UhOiBXb3JrZmxvd0luc3RhbmNlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaW5zdGFuY2VfaWQnIH0pXG4gIGluc3RhbmNlSWQhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmcm9tX3N0YXRlJywgbGVuZ3RoOiA1MCwgY29tbWVudDogJ+C4quC4luC4suC4meC4sOC4leC5ieC4meC4l+C4suC4hycgfSlcbiAgZnJvbVN0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndG9fc3RhdGUnLCBsZW5ndGg6IDUwLCBjb21tZW50OiAn4Liq4LiW4Liy4LiZ4Liw4Lib4Lil4Liy4Lii4LiX4Liy4LiHJyB9KVxuICB0b1N0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBsZW5ndGg6IDUwLCBjb21tZW50OiAnQWN0aW9uIOC4l+C4teC5iCBVc2VyIOC4geC4lCAo4LmA4LiK4LmI4LiZIEFQUFJPVkUsIFJFSkVDVCknIH0pXG4gIGFjdGlvbiE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnYWN0aW9uX2J5X3VzZXJfaWQnLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIGNvbW1lbnQ6ICdVc2VyIElEIOC4nOC4ueC5ieC4lOC4s+C5gOC4meC4tOC4meC4geC4suC4oyAoTnVsbGFibGUg4LiB4Lij4LiT4Li1IFN5c3RlbSBBdXRvKScsXG4gIH0pXG4gIGFjdGlvbkJ5VXNlcklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlLCBjb21tZW50OiAn4LiE4Lin4Liy4Lih4LmA4Lir4LmH4LiZ4Lib4Lij4Liw4LiB4Lit4Lia4LiB4Liy4Lij4Lit4LiZ4Li44Lih4Lix4LiV4Li0JyB9KVxuICBjb21tZW50Pzogc3RyaW5nO1xuXG4gIC8vIFNuYXBzaG90IOC4guC5ieC4reC4oeC4ueC4pSDguJMg4LmA4Lin4Lil4Liy4LiX4Li14LmI4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Liq4LiW4Liy4LiZ4LiwIOC5gOC4nuC4t+C5iOC4reC5gOC4m+C5h+C4meC4q+C4peC4seC4geC4kOC4suC4meC4q+C4suC4gSBDb250ZXh0IOC5gOC4m+C4peC4teC5iOC4ouC4meC5g+C4meC4reC4meC4suC4hOC4lVxuICBAQ29sdW1uKHtcbiAgICB0eXBlOiAnanNvbicsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gICAgY29tbWVudDogJ1NuYXBzaG90IG9mIENvbnRleHQgb3IgTWV0YWRhdGEnLFxuICB9KVxuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602.map new file mode 100644 index 0000000..d5804d5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ae/workflowhistoryentity_ae45cdc722f7fb5008d9c9545adb2602.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-history.entity.ts","mappings":";AAAA,wEAAwE;;;;;;;;;;;;;AAExE,qCAQiB;AACjB,yEAA8D;AAE9D;;;GAGG;AAII,IAAM,eAAe,GAArB,MAAM,eAAe;CAwC3B,CAAA;AAxCY,0CAAe;AAE1B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;2CACnB;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2CAAgB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,2CAAgB,oBAAhB,2CAAgB;iDAAC;AAG5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;mDACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;kDAChD;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;;gDACjD;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC;;+CAC7D;AAOhB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,kDAAkD;KAC5D,CAAC;;uDACsB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;;gDAC7D;AAQjB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,iCAAiC;KAC3C,CAAC;kDACS,MAAM,oBAAN,MAAM;iDAAkB;AAGnC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;0BAvCN,eAAe;IAH3B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;IAC5B,IAAA,eAAK,EAAC,CAAC,YAAY,CAAC,CAAC,CAAC,+BAA+B;;IACrD,IAAA,eAAK,EAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kCAAkC;GAChD,eAAe,CAwC3B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-history.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-history.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n} from 'typeorm';\nimport { WorkflowInstance } from './workflow-instance.entity';\n\n/**\n * เก็บประวัติการเปลี่ยนสถานะ (Audit Trail)\n * สำคัญมากสำหรับการตรวจสอบย้อนหลัง (Who did What, When)\n */\n@Entity('workflow_histories')\n@Index(['instanceId']) // ค้นหาประวัติของ Instance นี้\n@Index(['actionByUserId']) // ค้นหาว่า User คนนี้ทำอะไรไปบ้าง\nexport class WorkflowHistory {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n @ManyToOne(() => WorkflowInstance, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'instance_id' })\n instance!: WorkflowInstance;\n\n @Column({ name: 'instance_id' })\n instanceId!: string;\n\n @Column({ name: 'from_state', length: 50, comment: 'สถานะต้นทาง' })\n fromState!: string;\n\n @Column({ name: 'to_state', length: 50, comment: 'สถานะปลายทาง' })\n toState!: string;\n\n @Column({ length: 50, comment: 'Action ที่ User กด (เช่น APPROVE, REJECT)' })\n action!: string;\n\n @Column({\n name: 'action_by_user_id',\n nullable: true,\n comment: 'User ID ผู้ดำเนินการ (Nullable กรณี System Auto)',\n })\n actionByUserId?: number;\n\n @Column({ type: 'text', nullable: true, comment: 'ความเห็นประกอบการอนุมัติ' })\n comment?: string;\n\n // Snapshot ข้อมูล ณ เวลาที่เปลี่ยนสถานะ เพื่อเป็นหลักฐานหาก Context เปลี่ยนในอนาคต\n @Column({\n type: 'json',\n nullable: true,\n comment: 'Snapshot of Context or Metadata',\n })\n metadata?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01 new file mode 100644 index 0000000..9b27ba1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01 @@ -0,0 +1,29 @@ +0dddd1ba96dd9d62bf4bdec40b2cf10d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BulkCancelDto = void 0; +const class_validator_1 = require("class-validator"); +class BulkCancelDto { +} +exports.BulkCancelDto = BulkCancelDto; +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.ArrayMinSize)(1), + (0, class_validator_1.IsUUID)('all', { each: true }), + __metadata("design:type", Array) +], BulkCancelDto.prototype, "uuids", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.MinLength)(3), + __metadata("design:type", String) +], BulkCancelDto.prototype, "reason", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYnVsay1jYW5jZWwuZHRvLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFEQU15QjtBQUV6QixNQUFhLGFBQWE7Q0FTekI7QUFURCxzQ0FTQztBQUxDO0lBSEMsSUFBQSx5QkFBTyxHQUFFO0lBQ1QsSUFBQSw4QkFBWSxFQUFDLENBQUMsQ0FBQztJQUNmLElBQUEsd0JBQU0sRUFBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUNiO0FBSWpCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSwyQkFBUyxFQUFDLENBQUMsQ0FBQzs7NkNBQ0ciLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYnVsay1jYW5jZWwuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSXNBcnJheSxcclxuICBJc1N0cmluZyxcclxuICBJc1VVSUQsXHJcbiAgTWluTGVuZ3RoLFxyXG4gIEFycmF5TWluU2l6ZSxcclxufSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJ1bGtDYW5jZWxEdG8ge1xyXG4gIEBJc0FycmF5KClcclxuICBAQXJyYXlNaW5TaXplKDEpXHJcbiAgQElzVVVJRCgnYWxsJywgeyBlYWNoOiB0cnVlIH0pXHJcbiAgdXVpZHMhOiBzdHJpbmdbXTtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBATWluTGVuZ3RoKDMpXHJcbiAgcmVhc29uITogc3RyaW5nO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01.map new file mode 100644 index 0000000..f2ec4ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b1/bulkcanceldto_b188ef1e37c9aa6e5dfb479a7b13df01.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\bulk-cancel.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAMyB;AAEzB,MAAa,aAAa;CASzB;AATD,sCASC;AALC;IAHC,IAAA,yBAAO,GAAE;IACT,IAAA,8BAAY,EAAC,CAAC,CAAC;IACf,IAAA,wBAAM,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;4CACb;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;;6CACG","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\bulk-cancel.dto.ts"],"sourcesContent":["import {\r\n IsArray,\r\n IsString,\r\n IsUUID,\r\n MinLength,\r\n ArrayMinSize,\r\n} from 'class-validator';\r\n\r\nexport class BulkCancelDto {\r\n @IsArray()\r\n @ArrayMinSize(1)\r\n @IsUUID('all', { each: true })\r\n uuids!: string[];\r\n\r\n @IsString()\r\n @MinLength(3)\r\n reason!: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486 new file mode 100644 index 0000000..c1e3465 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486 @@ -0,0 +1,41 @@ +688f6163b48210e8a7ecc58566c1199a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceType = void 0; +const typeorm_1 = require("typeorm"); +let CorrespondenceType = class CorrespondenceType { +}; +exports.CorrespondenceType = CorrespondenceType; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], CorrespondenceType.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_code', unique: true, length: 50 }), + __metadata("design:type", String) +], CorrespondenceType.prototype, "typeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name', length: 255 }), + __metadata("design:type", String) +], CorrespondenceType.prototype, "typeName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], CorrespondenceType.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true, type: 'tinyint' }), + __metadata("design:type", Boolean) +], CorrespondenceType.prototype, "isActive", void 0); +exports.CorrespondenceType = CorrespondenceType = __decorate([ + (0, typeorm_1.Entity)('correspondence_types') +], CorrespondenceType); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUU7QUFHMUQsSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBa0I7Q0FlOUIsQ0FBQTtBQWZZLGdEQUFrQjtBQUU3QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7OzhDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztvREFDdEM7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7b0RBQ3pCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O3FEQUN4QjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29EQUMzQzs2QkFkUixrQkFBa0I7SUFEOUIsSUFBQSxnQkFBTSxFQUFDLHNCQUFzQixDQUFDO0dBQ2xCLGtCQUFrQixDQWU5QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSwgQ29sdW1uLCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSAndHlwZW9ybSc7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3R5cGVzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVR5cGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXG4gIHR5cGVDb2RlITogc3RyaW5nOyAvLyDguYDguIrguYjguJkgUkZBLCBSRkksIExFVFRFUlxuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgdHlwZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlLCB0eXBlOiAndGlueWludCcgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486.map new file mode 100644 index 0000000..f61c10f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/correspondencetypeentity_b2926735481aee304b6d8e6c648d2486.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-type.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAe9B,CAAA;AAfY,gDAAkB;AAE7B;IADC,IAAA,gCAAsB,GAAE;;8CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;oDACtC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;qDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;oDAC3C;6BAdR,kBAAkB;IAD9B,IAAA,gBAAM,EAAC,sBAAsB,CAAC;GAClB,kBAAkB,CAe9B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-type.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('correspondence_types')\nexport class CorrespondenceType {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'type_code', unique: true, length: 50 })\n typeCode!: string; // เช่น RFA, RFI, LETTER\n\n @Column({ name: 'type_name', length: 255 })\n typeName!: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true, type: 'tinyint' })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635 new file mode 100644 index 0000000..e888ba4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635 @@ -0,0 +1,186 @@ +bae4fb474a3591f7ce1fded0fb3309ff +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var SearchService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchService = void 0; +const common_1 = require("@nestjs/common"); +const elasticsearch_1 = require("@nestjs/elasticsearch"); +const config_1 = require("@nestjs/config"); +let SearchService = SearchService_1 = class SearchService { + constructor(esService, configService) { + this.esService = esService; + this.configService = configService; + this.logger = new common_1.Logger(SearchService_1.name); + this.indexName = 'dms_documents'; + this.isElasticsearchAvailable = false; + } + async onModuleInit() { + // Test Elasticsearch connection first + try { + await this.esService.ping(); + this.logger.log('Elasticsearch connection successful'); + this.isElasticsearchAvailable = true; + } + catch (error) { + this.logger.error(`Elasticsearch connection failed: ${error.message}`, error.stack); + this.isElasticsearchAvailable = false; + return; // Don't try to create index if connection fails + } + await this.createIndexIfNotExists(); + } + /** + * สร้าง Index และกำหนด Mapping (Schema) + */ + async createIndexIfNotExists() { + try { + const indexExists = await this.esService.indices.exists({ + index: this.indexName, + }); + if (!indexExists) { + // ✅ FIX: Cast 'body' เป็น any เพื่อแก้ปัญหา Type Mismatch ของ Library + await this.esService.indices.create({ + index: this.indexName, + body: { + mappings: { + properties: { + id: { type: 'integer' }, + uuid: { type: 'keyword' }, // ADR-019: public identifier + type: { type: 'keyword' }, // correspondence, rfa, drawing + docNumber: { type: 'text' }, + title: { type: 'text', analyzer: 'standard' }, + description: { type: 'text', analyzer: 'standard' }, + status: { type: 'keyword' }, + projectId: { type: 'integer' }, + createdAt: { type: 'date' }, + tags: { type: 'text' }, + }, + }, + }, + }); + this.logger.log(`Elasticsearch index '${this.indexName}' created.`); + } + } + catch (error) { + this.logger.error(`Failed to create index: ${error.message}`); + } + } + /** + * Index เอกสาร (Create/Update) + */ + async indexDocument(doc) { + try { + return await this.esService.index({ + index: this.indexName, + id: doc.publicId + ? `${doc.type}_${doc.publicId}` + : `${doc.type}_${doc.id}`, // ADR-019: prefer publicId key + document: doc, // ✅ Library รุ่นใหม่ใช้ 'document' แทน 'body' ในบางเวอร์ชัน + }); + } + catch (error) { + this.logger.error(`Failed to index document: ${error.message}`); + } + } + /** + * ลบเอกสารออกจาก Index + */ + async removeDocument(type, id) { + try { + await this.esService.delete({ + index: this.indexName, + id: `${type}_${id}`, + }); + } + catch (error) { + this.logger.error(`Failed to remove document: ${error.message}`); + } + } + /** + * ค้นหาเอกสาร (Full-text Search) + */ + async search(queryDto) { + const { q, type, status, projectId, page = 1, limit = 20 } = queryDto; + const from = (page - 1) * limit; + // Early fallback if Elasticsearch is not available + if (!this.isElasticsearchAvailable) { + this.logger.warn('Search unavailable - Elasticsearch not connected'); + return { data: [], meta: { total: 0, page, limit, took: 0 } }; + } + const mustQueries = []; + // 1. Full-text search logic + if (q) { + mustQueries.push({ + multi_match: { + query: q, + fields: ['title^3', 'docNumber^2', 'description', 'tags'], // Boost ความสำคัญ + fuzziness: 'AUTO', + }, + }); + } + else { + mustQueries.push({ match_all: {} }); + } + // 2. Filter logic + const filterQueries = []; + if (type) + filterQueries.push({ term: { type } }); + if (status) + filterQueries.push({ term: { status } }); + if (projectId) + filterQueries.push({ term: { projectId } }); + try { + const result = await this.esService.search({ + index: this.indexName, + from, + size: limit, + // ✅ ส่ง Query Structure โดยตรง + query: { + bool: { + must: mustQueries, + filter: filterQueries, + }, + }, + sort: [{ createdAt: { order: 'desc' } }], + }); + // 3. Format Result + const hits = result.hits.hits; + const total = typeof result.hits.total === 'number' + ? result.hits.total + : result.hits.total?.value || 0; + return { + data: hits.map((hit) => hit._source), + meta: { + total, + page, + limit, + took: result.took, + }, + }; + } + catch (error) { + const err = error; + this.logger.error(`Search failed: ${err.message}`, err.stack); + this.logger.debug(`Search query context: ${JSON.stringify({ + query: queryDto, + esNode: String(this.configService.get('ELASTICSEARCH_NODE') ?? ''), + })}`); + return { data: [], meta: { total: 0, page, limit, took: 0 } }; + } + } +}; +exports.SearchService = SearchService; +exports.SearchService = SearchService = SearchService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof elasticsearch_1.ElasticsearchService !== "undefined" && elasticsearch_1.ElasticsearchService) === "function" ? _a : Object, typeof (_b = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _b : Object]) +], SearchService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcc2VhcmNoXFxzZWFyY2guc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFrRTtBQUNsRSx5REFBNkQ7QUFDN0QsMkNBQStDO0FBSXhDLElBQU0sYUFBYSxxQkFBbkIsTUFBTSxhQUFhO0lBS3hCLFlBQ21CLFNBQStCLEVBQy9CLGFBQTRCO1FBRDVCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTjlCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxlQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNyQyw2QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFLdEMsQ0FBQztJQUVKLEtBQUssQ0FBQyxZQUFZO1FBQ2hCLHNDQUFzQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysb0NBQXFDLEtBQWUsQ0FBQyxPQUFPLEVBQUUsRUFDN0QsS0FBZSxDQUFDLEtBQUssQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7WUFDdEMsT0FBTyxDQUFDLGdEQUFnRDtRQUMxRCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsc0JBQXNCO1FBQ2xDLElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0RCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixzRUFBc0U7Z0JBQ3RFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3JCLElBQUksRUFBRTt3QkFDSixRQUFRLEVBQUU7NEJBQ1IsVUFBVSxFQUFFO2dDQUNWLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0NBQ3ZCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSw2QkFBNkI7Z0NBQ3hELElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSwrQkFBK0I7Z0NBQzFELFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0NBQzNCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtnQ0FDN0MsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO2dDQUNuRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2dDQUMzQixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2dDQUM5QixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2dDQUMzQixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFOzZCQUN2Qjt5QkFDRjtxQkFDb0M7aUJBQ3hDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTRCLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUNqQixHQUlDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3JCLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUTtvQkFDZCxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQy9CLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLCtCQUErQjtnQkFDNUQsUUFBUSxFQUFFLEdBQUcsRUFBRSw0REFBNEQ7YUFDNUUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiw2QkFBOEIsS0FBZSxDQUFDLE9BQU8sRUFBRSxDQUN4RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBWSxFQUFFLEVBQVU7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUNyQixFQUFFLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsOEJBQStCLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FDekQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQXdCO1FBQ25DLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVoQyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7WUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBOEIsRUFBRSxDQUFDO1FBRWxELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ04sV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDZixXQUFXLEVBQUU7b0JBQ1gsS0FBSyxFQUFFLENBQUM7b0JBQ1IsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLEVBQUUsa0JBQWtCO29CQUM3RSxTQUFTLEVBQUUsTUFBTTtpQkFDbEI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE1BQU0sYUFBYSxHQUE4QixFQUFFLENBQUM7UUFDcEQsSUFBSSxJQUFJO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU07WUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELElBQUksU0FBUztZQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUNyQixJQUFJO2dCQUNKLElBQUksRUFBRSxLQUFLO2dCQUNYLCtCQUErQjtnQkFDL0IsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLGFBQWE7cUJBQ3RCO2lCQUNGO2dCQUNELElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQWUsRUFBRSxFQUFFLENBQUM7YUFDbEQsQ0FBQyxDQUFDO1lBRUgsbUJBQW1CO1lBQ25CLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLE1BQU0sS0FBSyxHQUNULE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtnQkFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDbkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7WUFFcEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDcEMsSUFBSSxFQUFFO29CQUNKLEtBQUs7b0JBQ0wsSUFBSTtvQkFDSixLQUFLO29CQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtpQkFDbEI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLEdBQUcsR0FBRyxLQUFjLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxRQUFRO2dCQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbkUsQ0FBQyxFQUFFLENBQ0wsQ0FBQztZQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUF2TFksc0NBQWE7d0JBQWIsYUFBYTtJQUR6QixJQUFBLG1CQUFVLEdBQUU7eURBT21CLG9DQUFvQixvQkFBcEIsb0NBQW9CLG9EQUNoQixzQkFBYSxvQkFBYixzQkFBYTtHQVBwQyxhQUFhLENBdUx6QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxzZWFyY2hcXHNlYXJjaC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgT25Nb2R1bGVJbml0IH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBFbGFzdGljc2VhcmNoU2VydmljZSB9IGZyb20gJ0BuZXN0anMvZWxhc3RpY3NlYXJjaCc7XHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAbmVzdGpzL2NvbmZpZyc7XHJcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLXF1ZXJ5LmR0byc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgT25Nb2R1bGVJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoU2VhcmNoU2VydmljZS5uYW1lKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4TmFtZSA9ICdkbXNfZG9jdW1lbnRzJztcclxuICBwcml2YXRlIGlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXNTZXJ2aWNlOiBFbGFzdGljc2VhcmNoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgb25Nb2R1bGVJbml0KCkge1xyXG4gICAgLy8gVGVzdCBFbGFzdGljc2VhcmNoIGNvbm5lY3Rpb24gZmlyc3RcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXNTZXJ2aWNlLnBpbmcoKTtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKCdFbGFzdGljc2VhcmNoIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCcpO1xyXG4gICAgICB0aGlzLmlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSA9IHRydWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRWxhc3RpY3NlYXJjaCBjb25uZWN0aW9uIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcclxuICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuaXNFbGFzdGljc2VhcmNoQXZhaWxhYmxlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjsgLy8gRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpbmRleCBpZiBjb25uZWN0aW9uIGZhaWxzXHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVJbmRleElmTm90RXhpc3RzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKrguKPguYnguLLguIcgSW5kZXgg4LmB4Lil4Liw4LiB4Liz4Lir4LiZ4LiUIE1hcHBpbmcgKFNjaGVtYSlcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUluZGV4SWZOb3RFeGlzdHMoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbmRleEV4aXN0cyA9IGF3YWl0IHRoaXMuZXNTZXJ2aWNlLmluZGljZXMuZXhpc3RzKHtcclxuICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFpbmRleEV4aXN0cykge1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhc3QgJ2JvZHknIOC5gOC4m+C5h+C4mSBhbnkg4LmA4Lie4Li34LmI4Lit4LmB4LiB4LmJ4Lib4Lix4LiN4Lir4LiyIFR5cGUgTWlzbWF0Y2gg4LiC4Lit4LiHIExpYnJhcnlcclxuICAgICAgICBhd2FpdCB0aGlzLmVzU2VydmljZS5pbmRpY2VzLmNyZWF0ZSh7XHJcbiAgICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgIG1hcHBpbmdzOiB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHsgdHlwZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgICAgICB1dWlkOiB7IHR5cGU6ICdrZXl3b3JkJyB9LCAvLyBBRFItMDE5OiBwdWJsaWMgaWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgdHlwZTogeyB0eXBlOiAna2V5d29yZCcgfSwgLy8gY29ycmVzcG9uZGVuY2UsIHJmYSwgZHJhd2luZ1xyXG4gICAgICAgICAgICAgICAgZG9jTnVtYmVyOiB7IHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHsgdHlwZTogJ3RleHQnLCBhbmFseXplcjogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHsgdHlwZTogJ3RleHQnLCBhbmFseXplcjogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiB7IHR5cGU6ICdrZXl3b3JkJyB9LFxyXG4gICAgICAgICAgICAgICAgcHJvamVjdElkOiB7IHR5cGU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiB7IHR5cGU6ICdkYXRlJyB9LFxyXG4gICAgICAgICAgICAgICAgdGFnczogeyB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgRWxhc3RpY3NlYXJjaCBpbmRleCAnJHt0aGlzLmluZGV4TmFtZX0nIGNyZWF0ZWQuYCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGluZGV4OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGV4IOC5gOC4reC4geC4quC4suC4oyAoQ3JlYXRlL1VwZGF0ZSlcclxuICAgKi9cclxuICBhc3luYyBpbmRleERvY3VtZW50KFxyXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcclxuICAgICAgdHlwZTogc3RyaW5nO1xyXG4gICAgICBpZD86IG51bWJlcjtcclxuICAgICAgcHVibGljSWQ/OiBzdHJpbmc7XHJcbiAgICB9XHJcbiAgKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lc1NlcnZpY2UuaW5kZXgoe1xyXG4gICAgICAgIGluZGV4OiB0aGlzLmluZGV4TmFtZSxcclxuICAgICAgICBpZDogZG9jLnB1YmxpY0lkXHJcbiAgICAgICAgICA/IGAke2RvYy50eXBlfV8ke2RvYy5wdWJsaWNJZH1gXHJcbiAgICAgICAgICA6IGAke2RvYy50eXBlfV8ke2RvYy5pZH1gLCAvLyBBRFItMDE5OiBwcmVmZXIgcHVibGljSWQga2V5XHJcbiAgICAgICAgZG9jdW1lbnQ6IGRvYywgLy8g4pyFIExpYnJhcnkg4Lij4Li44LmI4LiZ4LmD4Lir4Lih4LmI4LmD4LiK4LmJICdkb2N1bWVudCcg4LmB4LiX4LiZICdib2R5JyDguYPguJnguJrguLLguIfguYDguKfguK3guKPguYzguIrguLHguJlcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIGluZGV4IGRvY3VtZW50OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKXguJrguYDguK3guIHguKrguLLguKPguK3guK3guIHguIjguLLguIEgSW5kZXhcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVEb2N1bWVudCh0eXBlOiBzdHJpbmcsIGlkOiBudW1iZXIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXNTZXJ2aWNlLmRlbGV0ZSh7XHJcbiAgICAgICAgaW5kZXg6IHRoaXMuaW5kZXhOYW1lLFxyXG4gICAgICAgIGlkOiBgJHt0eXBlfV8ke2lkfWAsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byByZW1vdmUgZG9jdW1lbnQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4hOC5ieC4meC4q+C4suC5gOC4reC4geC4quC4suC4oyAoRnVsbC10ZXh0IFNlYXJjaClcclxuICAgKi9cclxuICBhc3luYyBzZWFyY2gocXVlcnlEdG86IFNlYXJjaFF1ZXJ5RHRvKSB7XHJcbiAgICBjb25zdCB7IHEsIHR5cGUsIHN0YXR1cywgcHJvamVjdElkLCBwYWdlID0gMSwgbGltaXQgPSAyMCB9ID0gcXVlcnlEdG87XHJcbiAgICBjb25zdCBmcm9tID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIC8vIEVhcmx5IGZhbGxiYWNrIGlmIEVsYXN0aWNzZWFyY2ggaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgaWYgKCF0aGlzLmlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSkge1xyXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdTZWFyY2ggdW5hdmFpbGFibGUgLSBFbGFzdGljc2VhcmNoIG5vdCBjb25uZWN0ZWQnKTtcclxuICAgICAgcmV0dXJuIHsgZGF0YTogW10sIG1ldGE6IHsgdG90YWw6IDAsIHBhZ2UsIGxpbWl0LCB0b29rOiAwIH0gfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtdXN0UXVlcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xyXG5cclxuICAgIC8vIDEuIEZ1bGwtdGV4dCBzZWFyY2ggbG9naWNcclxuICAgIGlmIChxKSB7XHJcbiAgICAgIG11c3RRdWVyaWVzLnB1c2goe1xyXG4gICAgICAgIG11bHRpX21hdGNoOiB7XHJcbiAgICAgICAgICBxdWVyeTogcSxcclxuICAgICAgICAgIGZpZWxkczogWyd0aXRsZV4zJywgJ2RvY051bWJlcl4yJywgJ2Rlc2NyaXB0aW9uJywgJ3RhZ3MnXSwgLy8gQm9vc3Qg4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiNXHJcbiAgICAgICAgICBmdXp6aW5lc3M6ICdBVVRPJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG11c3RRdWVyaWVzLnB1c2goeyBtYXRjaF9hbGw6IHt9IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIEZpbHRlciBsb2dpY1xyXG4gICAgY29uc3QgZmlsdGVyUXVlcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xyXG4gICAgaWYgKHR5cGUpIGZpbHRlclF1ZXJpZXMucHVzaCh7IHRlcm06IHsgdHlwZSB9IH0pO1xyXG4gICAgaWYgKHN0YXR1cykgZmlsdGVyUXVlcmllcy5wdXNoKHsgdGVybTogeyBzdGF0dXMgfSB9KTtcclxuICAgIGlmIChwcm9qZWN0SWQpIGZpbHRlclF1ZXJpZXMucHVzaCh7IHRlcm06IHsgcHJvamVjdElkIH0gfSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lc1NlcnZpY2Uuc2VhcmNoKHtcclxuICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICBzaXplOiBsaW1pdCxcclxuICAgICAgICAvLyDinIUg4Liq4LmI4LiHIFF1ZXJ5IFN0cnVjdHVyZSDguYLguJTguKLguJXguKPguIdcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgYm9vbDoge1xyXG4gICAgICAgICAgICBtdXN0OiBtdXN0UXVlcmllcyxcclxuICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXJRdWVyaWVzLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnQ6IFt7IGNyZWF0ZWRBdDogeyBvcmRlcjogJ2Rlc2MnIGFzIGNvbnN0IH0gfV0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gMy4gRm9ybWF0IFJlc3VsdFxyXG4gICAgICBjb25zdCBoaXRzID0gcmVzdWx0LmhpdHMuaGl0cztcclxuICAgICAgY29uc3QgdG90YWwgPVxyXG4gICAgICAgIHR5cGVvZiByZXN1bHQuaGl0cy50b3RhbCA9PT0gJ251bWJlcidcclxuICAgICAgICAgID8gcmVzdWx0LmhpdHMudG90YWxcclxuICAgICAgICAgIDogcmVzdWx0LmhpdHMudG90YWw/LnZhbHVlIHx8IDA7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGE6IGhpdHMubWFwKChoaXQpID0+IGhpdC5fc291cmNlKSxcclxuICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICB0b3RhbCxcclxuICAgICAgICAgIHBhZ2UsXHJcbiAgICAgICAgICBsaW1pdCxcclxuICAgICAgICAgIHRvb2s6IHJlc3VsdC50b29rLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFNlYXJjaCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCwgZXJyLnN0YWNrKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXHJcbiAgICAgICAgYFNlYXJjaCBxdWVyeSBjb250ZXh0OiAke0pTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIHF1ZXJ5OiBxdWVyeUR0byxcclxuICAgICAgICAgIGVzTm9kZTogU3RyaW5nKHRoaXMuY29uZmlnU2VydmljZS5nZXQoJ0VMQVNUSUNTRUFSQ0hfTk9ERScpID8/ICcnKSxcclxuICAgICAgICB9KX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB7IGRhdGE6IFtdLCBtZXRhOiB7IHRvdGFsOiAwLCBwYWdlLCBsaW1pdCwgdG9vazogMCB9IH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635.map new file mode 100644 index 0000000..dc2e8da --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b2/searchservice_b2eb472a97423f29f2b961fef6e04635.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\search\\search.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\search\\search.service.ts"],"sourcesContent":["import { Injectable, Logger, OnModuleInit } from '@nestjs/common';\r\nimport { ElasticsearchService } from '@nestjs/elasticsearch';\r\nimport { ConfigService } from '@nestjs/config';\r\nimport { SearchQueryDto } from './dto/search-query.dto';\r\n\r\n@Injectable()\r\nexport class SearchService implements OnModuleInit {\r\n private readonly logger = new Logger(SearchService.name);\r\n private readonly indexName = 'dms_documents';\r\n private isElasticsearchAvailable = false;\r\n\r\n constructor(\r\n private readonly esService: ElasticsearchService,\r\n private readonly configService: ConfigService\r\n ) {}\r\n\r\n async onModuleInit() {\r\n // Test Elasticsearch connection first\r\n try {\r\n await this.esService.ping();\r\n this.logger.log('Elasticsearch connection successful');\r\n this.isElasticsearchAvailable = true;\r\n } catch (error) {\r\n this.logger.error(\r\n `Elasticsearch connection failed: ${(error as Error).message}`,\r\n (error as Error).stack\r\n );\r\n this.isElasticsearchAvailable = false;\r\n return; // Don't try to create index if connection fails\r\n }\r\n\r\n await this.createIndexIfNotExists();\r\n }\r\n\r\n /**\r\n * สร้าง Index และกำหนด Mapping (Schema)\r\n */\r\n private async createIndexIfNotExists() {\r\n try {\r\n const indexExists = await this.esService.indices.exists({\r\n index: this.indexName,\r\n });\r\n\r\n if (!indexExists) {\r\n // ✅ FIX: Cast 'body' เป็น any เพื่อแก้ปัญหา Type Mismatch ของ Library\r\n await this.esService.indices.create({\r\n index: this.indexName,\r\n body: {\r\n mappings: {\r\n properties: {\r\n id: { type: 'integer' },\r\n uuid: { type: 'keyword' }, // ADR-019: public identifier\r\n type: { type: 'keyword' }, // correspondence, rfa, drawing\r\n docNumber: { type: 'text' },\r\n title: { type: 'text', analyzer: 'standard' },\r\n description: { type: 'text', analyzer: 'standard' },\r\n status: { type: 'keyword' },\r\n projectId: { type: 'integer' },\r\n createdAt: { type: 'date' },\r\n tags: { type: 'text' },\r\n },\r\n },\r\n } as unknown as Record,\r\n });\r\n this.logger.log(`Elasticsearch index '${this.indexName}' created.`);\r\n }\r\n } catch (error) {\r\n this.logger.error(`Failed to create index: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Index เอกสาร (Create/Update)\r\n */\r\n async indexDocument(\r\n doc: Record & {\r\n type: string;\r\n id?: number;\r\n publicId?: string;\r\n }\r\n ) {\r\n try {\r\n return await this.esService.index({\r\n index: this.indexName,\r\n id: doc.publicId\r\n ? `${doc.type}_${doc.publicId}`\r\n : `${doc.type}_${doc.id}`, // ADR-019: prefer publicId key\r\n document: doc, // ✅ Library รุ่นใหม่ใช้ 'document' แทน 'body' ในบางเวอร์ชัน\r\n });\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to index document: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * ลบเอกสารออกจาก Index\r\n */\r\n async removeDocument(type: string, id: number) {\r\n try {\r\n await this.esService.delete({\r\n index: this.indexName,\r\n id: `${type}_${id}`,\r\n });\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to remove document: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * ค้นหาเอกสาร (Full-text Search)\r\n */\r\n async search(queryDto: SearchQueryDto) {\r\n const { q, type, status, projectId, page = 1, limit = 20 } = queryDto;\r\n const from = (page - 1) * limit;\r\n\r\n // Early fallback if Elasticsearch is not available\r\n if (!this.isElasticsearchAvailable) {\r\n this.logger.warn('Search unavailable - Elasticsearch not connected');\r\n return { data: [], meta: { total: 0, page, limit, took: 0 } };\r\n }\r\n\r\n const mustQueries: Record[] = [];\r\n\r\n // 1. Full-text search logic\r\n if (q) {\r\n mustQueries.push({\r\n multi_match: {\r\n query: q,\r\n fields: ['title^3', 'docNumber^2', 'description', 'tags'], // Boost ความสำคัญ\r\n fuzziness: 'AUTO',\r\n },\r\n });\r\n } else {\r\n mustQueries.push({ match_all: {} });\r\n }\r\n\r\n // 2. Filter logic\r\n const filterQueries: Record[] = [];\r\n if (type) filterQueries.push({ term: { type } });\r\n if (status) filterQueries.push({ term: { status } });\r\n if (projectId) filterQueries.push({ term: { projectId } });\r\n\r\n try {\r\n const result = await this.esService.search({\r\n index: this.indexName,\r\n from,\r\n size: limit,\r\n // ✅ ส่ง Query Structure โดยตรง\r\n query: {\r\n bool: {\r\n must: mustQueries,\r\n filter: filterQueries,\r\n },\r\n },\r\n sort: [{ createdAt: { order: 'desc' as const } }],\r\n });\r\n\r\n // 3. Format Result\r\n const hits = result.hits.hits;\r\n const total =\r\n typeof result.hits.total === 'number'\r\n ? result.hits.total\r\n : result.hits.total?.value || 0;\r\n\r\n return {\r\n data: hits.map((hit) => hit._source),\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n took: result.took,\r\n },\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n this.logger.error(`Search failed: ${err.message}`, err.stack);\r\n this.logger.debug(\r\n `Search query context: ${JSON.stringify({\r\n query: queryDto,\r\n esNode: String(this.configService.get('ELASTICSEARCH_NODE') ?? ''),\r\n })}`\r\n );\r\n return { data: [], meta: { total: 0, page, limit, took: 0 } };\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1 new file mode 100644 index 0000000..c327004 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1 @@ -0,0 +1,21 @@ +3c6110ba362330cccb4dc850c183a921 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const stringify_js_1 = require("./stringify.js"); +const v1_js_1 = require("./v1.js"); +const v1ToV6_js_1 = require("./v1ToV6.js"); +function v6(options, buf, offset) { + options ??= {}; + offset ??= 0; + let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16)); + bytes = (0, v1ToV6_js_1.default)(bytes); + if (buf) { + for (let i = 0; i < 16; i++) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(bytes); +} +exports.default = v6; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjYuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMzQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDNUIsT0FBTyxLQUFLLEVBQUUsQ0FBQztJQUNmLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2Ni5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmluZ2lmeV9qc18xID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuY29uc3QgdjFfanNfMSA9IHJlcXVpcmUoXCIuL3YxLmpzXCIpO1xuY29uc3QgdjFUb1Y2X2pzXzEgPSByZXF1aXJlKFwiLi92MVRvVjYuanNcIik7XG5mdW5jdGlvbiB2NihvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIG9wdGlvbnMgPz89IHt9O1xuICAgIG9mZnNldCA/Pz0gMDtcbiAgICBsZXQgYnl0ZXMgPSAoMCwgdjFfanNfMS5kZWZhdWx0KSh7IC4uLm9wdGlvbnMsIF92NjogdHJ1ZSB9LCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIGJ5dGVzID0gKDAsIHYxVG9WNl9qc18xLmRlZmF1bHQpKGJ5dGVzKTtcbiAgICBpZiAoYnVmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBzdHJpbmdpZnlfanNfMS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHY2O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1.map new file mode 100644 index 0000000..e0ae320 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b6/v6_b61d978f58f084d58983295cb79d1da1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM;IAC5B,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,KAAK,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,GAAG,EAAE,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stringify_js_1 = require(\"./stringify.js\");\nconst v1_js_1 = require(\"./v1.js\");\nconst v1ToV6_js_1 = require(\"./v1ToV6.js\");\nfunction v6(options, buf, offset) {\n options ??= {};\n offset ??= 0;\n let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16));\n bytes = (0, v1ToV6_js_1.default)(bytes);\n if (buf) {\n for (let i = 0; i < 16; i++) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v6;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e new file mode 100644 index 0000000..fd0c706 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e @@ -0,0 +1,6 @@ +9d5c5bc352a8575d29bebd327603ef17 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +exports.default = { randomUUID: crypto_1.randomUUID }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmF0aXZlLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxuYXRpdmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjcnlwdG9fMSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5leHBvcnRzLmRlZmF1bHQgPSB7IHJhbmRvbVVVSUQ6IGNyeXB0b18xLnJhbmRvbVVVSUQgfTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e.map new file mode 100644 index 0000000..feffffb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b7/native_b77b78527393b2531b1a463b25d5082e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\native.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,OAAO,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\native.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nexports.default = { randomUUID: crypto_1.randomUUID };\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90 new file mode 100644 index 0000000..33af9f6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90 @@ -0,0 +1,60 @@ +54b3d231c625a5d63d6782fc95c10ab9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingVolume = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingVolume = class ContractDrawingVolume { +}; +exports.ContractDrawingVolume = ContractDrawingVolume; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "volumeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "volumeName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingVolume.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingVolume.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingVolume.prototype, "project", void 0); +exports.ContractDrawingVolume = ContractDrawingVolume = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_volumes') +], ContractDrawingVolume); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctdm9sdW1lLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLDBFQUFnRTtBQUd6RCxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFxQjtDQTRCakMsQ0FBQTtBQTVCWSxzREFBcUI7QUFFaEM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztpREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt3REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzt5REFDeEI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7eURBQ3pCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt3REFDeEI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7d0RBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7d0RBQUM7QUFJakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO3NEQUFDO2dDQTNCUCxxQkFBcUI7SUFEakMsSUFBQSxnQkFBTSxFQUFDLDBCQUEwQixDQUFDO0dBQ3RCLHFCQUFxQixDQTRCakMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctdm9sdW1lLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ192b2x1bWVzJylcbmV4cG9ydCBjbGFzcyBDb250cmFjdERyYXdpbmdWb2x1bWUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAndm9sdW1lX2NvZGUnLCBsZW5ndGg6IDUwIH0pXG4gIHZvbHVtZUNvZGUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICd2b2x1bWVfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIHZvbHVtZU5hbWUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7IC8vIE51bGxhYmxlIOC5g+C4iuC5iSA/XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7IC8vIOC5gOC4leC4tOC4oSAhICjguJXguLHguKfguJfguLXguYggRXJyb3IpXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90.map new file mode 100644 index 0000000..ad203e2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/contractdrawingvolumeentity_bae4c506ae52548a1cf4e9a173bafb90.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-volume.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CA4BjC,CAAA;AA5BY,sDAAqB;AAEhC;IADC,IAAA,gCAAsB,GAAE;;iDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;wDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yDACxB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;wDACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;wDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;wDAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;sDAAC;gCA3BP,qBAAqB;IADjC,IAAA,gBAAM,EAAC,0BAA0B,CAAC;GACtB,qBAAqB,CA4BjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-volume.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_volumes')\nexport class ContractDrawingVolume {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'volume_code', length: 50 })\n volumeCode!: string; // เติม !\n\n @Column({ name: 'volume_name', length: 255 })\n volumeName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // Nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม ! (ตัวที่ Error)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a new file mode 100644 index 0000000..47e7a56 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a @@ -0,0 +1,13 @@ +cc16276d35ff8c1c7eafb178b6495c8d +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const validate_js_1 = require("./validate.js"); +function parse(uuid) { + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + let v; + return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff); +} +exports.default = parse; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccGFyc2UuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLFNBQVMsS0FBSyxDQUFDLElBQUk7SUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDO0lBQ04sT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6YixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccGFyc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB2YWxpZGF0ZV9qc18xID0gcmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIik7XG5mdW5jdGlvbiBwYXJzZSh1dWlkKSB7XG4gICAgaWYgKCEoMCwgdmFsaWRhdGVfanNfMS5kZWZhdWx0KSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICAgIH1cbiAgICBsZXQgdjtcbiAgICByZXR1cm4gVWludDhBcnJheS5vZigodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0LCAodiA+Pj4gMTYpICYgMHhmZiwgKHYgPj4+IDgpICYgMHhmZiwgdiAmIDB4ZmYsICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDgsIHYgJiAweGZmLCAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gOCwgdiAmIDB4ZmYsICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4LCB2ICYgMHhmZiwgKCh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgyNCwgMzYpLCAxNikpIC8gMHgxMDAwMDAwMDAwMCkgJiAweGZmLCAodiAvIDB4MTAwMDAwMDAwKSAmIDB4ZmYsICh2ID4+PiAyNCkgJiAweGZmLCAodiA+Pj4gMTYpICYgMHhmZiwgKHYgPj4+IDgpICYgMHhmZiwgdiAmIDB4ZmYpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2U7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a.map new file mode 100644 index 0000000..17a3f81 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ba/parse_bad41695a1f7cd948f08f7e09b13d54a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\parse.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,SAAS,KAAK,CAAC,IAAI;IACf,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,CAAC;IACN,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACzb,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\parse.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction parse(uuid) {\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexports.default = parse;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9 new file mode 100644 index 0000000..94241a6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9 @@ -0,0 +1,152 @@ +89023636803885cb4a0675797e878550 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevision = void 0; +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("../../rfa/entities/rfa-revision.entity"); +const correspondence_entity_1 = require("./correspondence.entity"); +const correspondence_status_entity_1 = require("./correspondence-status.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +const correspondence_revision_attachment_entity_1 = require("./correspondence-revision-attachment.entity"); +let CorrespondenceRevision = class CorrespondenceRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.CorrespondenceRevision = CorrespondenceRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', nullable: true, length: 10 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_current', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_status_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "statusId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 500 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], CorrespondenceRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_project_id', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))", + nullable: true, + }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "vRefProjectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_doc_subtype', + type: 'varchar', + length: 50, + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))", + nullable: true, + }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "vRefType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], CorrespondenceRevision.prototype, "documentDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], CorrespondenceRevision.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], CorrespondenceRevision.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'due_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], CorrespondenceRevision.prototype, "dueDate", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], CorrespondenceRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_f = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _f : Object) +], CorrespondenceRevision.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_status_entity_1.CorrespondenceStatus), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_status_id' }), + __metadata("design:type", typeof (_g = typeof correspondence_status_entity_1.CorrespondenceStatus !== "undefined" && correspondence_status_entity_1.CorrespondenceStatus) === "function" ? _g : Object) +], CorrespondenceRevision.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], CorrespondenceRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.correspondenceRevision), + __metadata("design:type", typeof (_j = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _j : Object) +], CorrespondenceRevision.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, (link) => link.revision), + __metadata("design:type", Array) +], CorrespondenceRevision.prototype, "attachmentLinks", void 0); +exports.CorrespondenceRevision = CorrespondenceRevision = __decorate([ + (0, typeorm_1.Entity)('correspondence_revisions') + // ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น + , + (0, typeorm_1.Index)('idx_corr_rev_v_project', ['vRefProjectId']), + (0, typeorm_1.Index)('idx_corr_rev_v_type', ['vRefType']) +], CorrespondenceRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixnRkFBcUU7QUFDckUsbUVBQXlEO0FBQ3pELGlGQUFzRTtBQUN0RSxpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUM1QywyR0FBK0Y7QUFNeEYsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxpQ0FBYztDQW9HekQsQ0FBQTtBQXBHWSx3REFBc0I7QUFHakM7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7a0RBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztnRUFDWjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4REFDWjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7NkRBQ3hDO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3lEQUMzQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDOzt3REFDM0I7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3VEQUNQO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEs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RSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFEQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO2tEQUN6RCxpQ0FBVyxvQkFBWCxpQ0FBVzsyREFBQztBQUkxQjtJQURDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyw0RUFBZ0MsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7K0RBQ3RCO2lDQW5HMUMsc0JBQXNCO0lBSmxDLElBQUEsZ0JBQU0sRUFBQywwQkFBMEIsQ0FBQztJQUNuQyxnRUFBZ0U7O0lBQy9ELElBQUEsZUFBSyxFQUFDLHdCQUF3QixFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsSUFBQSxlQUFLLEVBQUMscUJBQXFCLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztHQUM5QixzQkFBc0IsQ0FvR2xDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxuICBPbmVUb09uZSxcbiAgT25lVG9NYW55LFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFJmYVJldmlzaW9uIH0gZnJvbSAnLi4vLi4vcmZhL2VudGl0aWVzL3JmYS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9yZXZpc2lvbnMnKVxuLy8g4pyFIOC5gOC4nuC4tOC5iOC4oSBJbmRleCDguKrguLPguKvguKPguLHguJogVmlydHVhbCBDb2x1bW5zIOC5gOC4nuC4t+C5iOC4reC5g+C4q+C5iSBTZWFyY2gg4LmA4Lij4LmH4Lin4LiC4Li24LmJ4LiZXG5ASW5kZXgoJ2lkeF9jb3JyX3Jldl92X3Byb2plY3QnLCBbJ3ZSZWZQcm9qZWN0SWQnXSlcbkBJbmRleCgnaWR4X2NvcnJfcmV2X3ZfdHlwZScsIFsndlJlZlR5cGUnXSlcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2VJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7IC8vIDAsIDEsIDIuLi5cblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX2xhYmVsJywgbnVsbGFibGU6IHRydWUsIGxlbmd0aDogMTAgfSlcbiAgcmV2aXNpb25MYWJlbD86IHN0cmluZzsgLy8gQSwgQiwgMDAxLi4uXG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19jdXJyZW50JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNDdXJyZW50ITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3N0YXR1c19pZCcgfSlcbiAgc3RhdHVzSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogNTAwIH0pXG4gIHN1YmplY3QhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZXNjcmlwdGlvbicsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgYm9keT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZW1hcmtzPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAnanNvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRldGFpbHM/OiBvYmplY3Q7IC8vIER5bmFtaWMgSlNPTiDigJQgdHlwZWQgYXMgYG9iamVjdGAgcGVyIFR5cGVPUk0gSlNPTiBjb2x1bW4gY29udmVudGlvbiAobm8tYW55LCBBRFItMDE5KVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2NoZW1hX3ZlcnNpb24nLCBkZWZhdWx0OiAxIH0pXG4gIHNjaGVtYVZlcnNpb24hOiBudW1iZXI7XG5cbiAgLy8g4pyFIFtOZXddIFZpcnR1YWwgQ29sdW1uOiDguJTguLbguIcgUHJvamVjdCBJRCDguIjguLLguIEgSlNPTiBkZXRhaWxzXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X3JlZl9wcm9qZWN0X2lkJyxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQucHJvamVjdElkJykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZQcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgLy8g4pyFIFtOZXddIFZpcnR1YWwgQ29sdW1uOiDguJTguLbguIcgRG9jdW1lbnQgU3ViVHlwZSDguIjguLLguIEgSlNPTiBkZXRhaWxzXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X2RvY19zdWJ0eXBlJyxcbiAgICB0eXBlOiAndmFyY2hhcicsXG4gICAgbGVuZ3RoOiA1MCxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQuc3ViVHlwZScpKVwiLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICB2UmVmVHlwZT86IHN0cmluZztcblxuICAvLyBEYXRlc1xuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRvY3VtZW50RGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc3N1ZWRfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlzc3VlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVjZWl2ZWRfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlY2VpdmVkRGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkdWVfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGR1ZURhdGU/OiBEYXRlO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgY3JlYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCAoY29ycikgPT4gY29yci5yZXZpc2lvbnMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2U/OiBDb3JyZXNwb25kZW5jZTtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlU3RhdHVzKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9zdGF0dXNfaWQnIH0pXG4gIHN0YXR1cz86IENvcnJlc3BvbmRlbmNlU3RhdHVzO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScgfSlcbiAgY3JlYXRvcj86IFVzZXI7XG5cbiAgLy8gQWRkZWQgaW52ZXJzZSByZWxhdGlvbiBmb3IgQ1RJIG1hcHBpbmcgdG8gc3ViY2xhc3NlcyAoUkZBKVxuICBAT25lVG9PbmUoKCkgPT4gUmZhUmV2aXNpb24sIChyZmFSZXYpID0+IHJmYVJldi5jb3JyZXNwb25kZW5jZVJldmlzaW9uKVxuICByZmFSZXZpc2lvbj86IFJmYVJldmlzaW9uO1xuXG4gIC8vIFtGSVggdjEuOC4xXSBSZWxhdGlvbjog4LmE4Lif4Lil4LmM4LmB4LiZ4Lia4LiC4Lit4LiHIHJldmlzaW9uIOC4meC4teC5ieC4nOC5iOC4suC4mSBqdW5jdGlvbiB0YWJsZVxuICBAT25lVG9NYW55KCgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50LCAobGluaykgPT4gbGluay5yZXZpc2lvbilcbiAgYXR0YWNobWVudExpbmtzPzogQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnRbXTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9.map new file mode 100644 index 0000000..84bbae2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bb/correspondencerevisionentity_bbb192a25e7ecf4868b9d699378da1d9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,gFAAqE;AACrE,mEAAyD;AACzD,iFAAsE;AACtE,iEAAuD;AACvD,gFAA2E;AAC3E,yDAA4C;AAC5C,2GAA+F;AAMxF,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,iCAAc;CAoGzD,CAAA;AApGY,wDAAsB;AAGjC;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;kDACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;gEACZ;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;8DACZ;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;6DACxC;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;yDAC3B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;;wDAC3B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;uDACP;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACzC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oDAC3B;AAGd;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDACxB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDACxB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;6DACxB;AAUvB;IAPC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,KAAK;QACX,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,oDAAoD;QAClE,QAAQ,EAAE,IAAI;KACf,CAAC;;6DACqB;AAWvB;IARC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,kDAAkD;QAChE,QAAQ,EAAE,IAAI;KACf,CAAC;;wDACgB;AAIlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;4DAAC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;0DAAC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;4DAAC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;uDAAC;AAGf;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;yDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC5B;AAOnB;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;QACzD,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;kDACzB,sCAAc,oBAAd,sCAAc;8DAAC;AAIhC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,mDAAoB,CAAC;IACrC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;kDACxC,mDAAoB,oBAApB,mDAAoB;sDAAC;AAI9B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;uDAAC;AAIf;IADC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC;kDACzD,iCAAW,oBAAX,iCAAW;2DAAC;AAI1B;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4EAAgC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;;+DACtB;iCAnG1C,sBAAsB;IAJlC,IAAA,gBAAM,EAAC,0BAA0B,CAAC;IACnC,gEAAgE;;IAC/D,IAAA,eAAK,EAAC,wBAAwB,EAAE,CAAC,eAAe,CAAC,CAAC;IAClD,IAAA,eAAK,EAAC,qBAAqB,EAAE,CAAC,UAAU,CAAC,CAAC;GAC9B,sBAAsB,CAoGlC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n Index,\n OneToOne,\n OneToMany,\n} from 'typeorm';\nimport { RfaRevision } from '../../rfa/entities/rfa-revision.entity';\nimport { Correspondence } from './correspondence.entity';\nimport { CorrespondenceStatus } from './correspondence-status.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\nimport { CorrespondenceRevisionAttachment } from './correspondence-revision-attachment.entity';\n\n@Entity('correspondence_revisions')\n// ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น\n@Index('idx_corr_rev_v_project', ['vRefProjectId'])\n@Index('idx_corr_rev_v_type', ['vRefType'])\nexport class CorrespondenceRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_id' })\n correspondenceId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // 0, 1, 2...\n\n @Column({ name: 'revision_label', nullable: true, length: 10 })\n revisionLabel?: string; // A, B, 001...\n\n @Column({ name: 'is_current', default: false })\n isCurrent!: boolean;\n\n @Column({ name: 'correspondence_status_id' })\n statusId!: number;\n\n @Column({ length: 500 })\n subject!: string;\n\n @Column({ name: 'description', type: 'text', nullable: true })\n description?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ [New] Virtual Column: ดึง Project ID จาก JSON details\n @Column({\n name: 'v_ref_project_id',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))\",\n nullable: true,\n })\n vRefProjectId?: number;\n\n // ✅ [New] Virtual Column: ดึง Document SubType จาก JSON details\n @Column({\n name: 'v_doc_subtype',\n type: 'varchar',\n length: 50,\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))\",\n nullable: true,\n })\n vRefType?: string;\n\n // Dates\n @Column({ name: 'document_date', type: 'date', nullable: true })\n documentDate?: Date;\n\n @Column({ name: 'issued_date', type: 'datetime', nullable: true })\n issuedDate?: Date;\n\n @Column({ name: 'received_date', type: 'datetime', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'due_date', type: 'datetime', nullable: true })\n dueDate?: Date;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n // Relations\n @ManyToOne(() => Correspondence, (corr) => corr.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'correspondence_id' })\n correspondence?: Correspondence;\n\n @ManyToOne(() => CorrespondenceStatus)\n @JoinColumn({ name: 'correspondence_status_id' })\n status?: CorrespondenceStatus;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Added inverse relation for CTI mapping to subclasses (RFA)\n @OneToOne(() => RfaRevision, (rfaRev) => rfaRev.correspondenceRevision)\n rfaRevision?: RfaRevision;\n\n // [FIX v1.8.1] Relation: ไฟล์แนบของ revision นี้ผ่าน junction table\n @OneToMany(() => CorrespondenceRevisionAttachment, (link) => link.revision)\n attachmentLinks?: CorrespondenceRevisionAttachment[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a new file mode 100644 index 0000000..10500af --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a @@ -0,0 +1,22 @@ +24b511d71d21304c1d719b743bba89fe +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CounterKeyDto = void 0; +exports.buildCounterKey = buildCounterKey; +class CounterKeyDto { +} +exports.CounterKeyDto = CounterKeyDto; +function buildCounterKey(context) { + const currentYear = context.year || new Date().getFullYear(); + return { + projectId: context.projectId, + originatorOrganizationId: context.originatorOrgId, + recipientOrganizationId: context.recipientOrgId || 0, + correspondenceTypeId: context.correspondenceTypeId, + subTypeId: context.subTypeId || 0, + rfaTypeId: context.rfaTypeId || 0, + disciplineId: context.disciplineId || 0, + resetScope: context.isRFA ? 'NONE' : `YEAR_${currentYear + 543}`, // Buddhist year + }; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkdG9cXGNvdW50ZXIta2V5LmR0by50cyIsIm1hcHBpbmdzIjoiOzs7QUFXQSwwQ0F1QkM7QUFsQ0QsTUFBYSxhQUFhO0NBU3pCO0FBVEQsc0NBU0M7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FVL0I7SUFDQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFN0QsT0FBTztRQUNMLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztRQUM1Qix3QkFBd0IsRUFBRSxPQUFPLENBQUMsZUFBZTtRQUNqRCx1QkFBdUIsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUM7UUFDcEQsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtRQUNsRCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDO1FBQ2pDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUM7UUFDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQztRQUN2QyxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLFdBQVcsR0FBRyxHQUFHLEVBQUUsRUFBRSxnQkFBZ0I7S0FDbkYsQ0FBQztBQUNKLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkdG9cXGNvdW50ZXIta2V5LmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ291bnRlcktleUR0byB7XG4gIHByb2plY3RJZCE6IG51bWJlcjtcbiAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkITogbnVtYmVyO1xuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG4gIHN1YlR5cGVJZCE6IG51bWJlcjtcbiAgcmZhVHlwZUlkITogbnVtYmVyO1xuICBkaXNjaXBsaW5lSWQhOiBudW1iZXI7XG4gIHJlc2V0U2NvcGUhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvdW50ZXJLZXkoY29udGV4dDoge1xuICBwcm9qZWN0SWQ6IG51bWJlcjtcbiAgb3JpZ2luYXRvck9yZ0lkOiBudW1iZXI7XG4gIHJlY2lwaWVudE9yZ0lkPzogbnVtYmVyO1xuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xuICBzdWJUeXBlSWQ/OiBudW1iZXI7XG4gIHJmYVR5cGVJZD86IG51bWJlcjtcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xuICB5ZWFyPzogbnVtYmVyO1xuICBpc1JGQT86IGJvb2xlYW47XG59KTogQ291bnRlcktleUR0byB7XG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gY29udGV4dC55ZWFyIHx8IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcblxuICByZXR1cm4ge1xuICAgIHByb2plY3RJZDogY29udGV4dC5wcm9qZWN0SWQsXG4gICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjb250ZXh0Lm9yaWdpbmF0b3JPcmdJZCxcbiAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogY29udGV4dC5yZWNpcGllbnRPcmdJZCB8fCAwLFxuICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBjb250ZXh0LmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxuICAgIHN1YlR5cGVJZDogY29udGV4dC5zdWJUeXBlSWQgfHwgMCxcbiAgICByZmFUeXBlSWQ6IGNvbnRleHQucmZhVHlwZUlkIHx8IDAsXG4gICAgZGlzY2lwbGluZUlkOiBjb250ZXh0LmRpc2NpcGxpbmVJZCB8fCAwLFxuICAgIHJlc2V0U2NvcGU6IGNvbnRleHQuaXNSRkEgPyAnTk9ORScgOiBgWUVBUl8ke2N1cnJlbnRZZWFyICsgNTQzfWAsIC8vIEJ1ZGRoaXN0IHllYXJcbiAgfTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a.map new file mode 100644 index 0000000..dd9b542 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/counterkeydto_bfc4f2618a9b3598c1c750dcc590874a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\dto\\counter-key.dto.ts","mappings":";;;AAWA,0CAuBC;AAlCD,MAAa,aAAa;CASzB;AATD,sCASC;AAED,SAAgB,eAAe,CAAC,OAU/B;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE7D,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,wBAAwB,EAAE,OAAO,CAAC,eAAe;QACjD,uBAAuB,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;QACpD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC;QACvC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,WAAW,GAAG,GAAG,EAAE,EAAE,gBAAgB;KACnF,CAAC;AACJ,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\dto\\counter-key.dto.ts"],"sourcesContent":["export class CounterKeyDto {\n projectId!: number;\n originatorOrganizationId!: number;\n recipientOrganizationId!: number;\n correspondenceTypeId!: number;\n subTypeId!: number;\n rfaTypeId!: number;\n disciplineId!: number;\n resetScope!: string;\n}\n\nexport function buildCounterKey(context: {\n projectId: number;\n originatorOrgId: number;\n recipientOrgId?: number;\n correspondenceTypeId: number;\n subTypeId?: number;\n rfaTypeId?: number;\n disciplineId?: number;\n year?: number;\n isRFA?: boolean;\n}): CounterKeyDto {\n const currentYear = context.year || new Date().getFullYear();\n\n return {\n projectId: context.projectId,\n originatorOrganizationId: context.originatorOrgId,\n recipientOrganizationId: context.recipientOrgId || 0,\n correspondenceTypeId: context.correspondenceTypeId,\n subTypeId: context.subTypeId || 0,\n rfaTypeId: context.rfaTypeId || 0,\n disciplineId: context.disciplineId || 0,\n resetScope: context.isRFA ? 'NONE' : `YEAR_${currentYear + 543}`, // Buddhist year\n };\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055 new file mode 100644 index 0000000..2e97de7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055 @@ -0,0 +1,49 @@ +3f341c470ab1902034a3166d90886873 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var NotificationGateway_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NotificationGateway = void 0; +const websockets_1 = require("@nestjs/websockets"); +const socket_io_1 = require("socket.io"); +const common_1 = require("@nestjs/common"); +let NotificationGateway = NotificationGateway_1 = class NotificationGateway { + constructor() { + this.logger = new common_1.Logger(NotificationGateway_1.name); + } + handleConnection(client) { + this.logger.log(`Client connected: ${client.id}`); + } + handleDisconnect(client) { + this.logger.log(`Client disconnected: ${client.id}`); + } + /** + * ส่งแจ้งเตือนไปหา User แบบ Real-time + */ + sendToUser(userId, payload) { + this.server.to(`user_${userId}`).emit('new_notification', payload); + } +}; +exports.NotificationGateway = NotificationGateway; +__decorate([ + (0, websockets_1.WebSocketServer)(), + __metadata("design:type", typeof (_a = typeof socket_io_1.Server !== "undefined" && socket_io_1.Server) === "function" ? _a : Object) +], NotificationGateway.prototype, "server", void 0); +exports.NotificationGateway = NotificationGateway = NotificationGateway_1 = __decorate([ + (0, websockets_1.WebSocketGateway)({ + cors: { + origin: '*', + }, + namespace: 'notifications', + }) +], NotificationGateway); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxub3RpZmljYXRpb24uZ2F0ZXdheS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUs0QjtBQUM1Qix5Q0FBMkM7QUFDM0MsMkNBQXdDO0FBU2pDLElBQU0sbUJBQW1CLDJCQUF6QixNQUFNLG1CQUFtQjtJQUF6QjtRQU1ZLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxxQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQWdCakUsQ0FBQztJQWRDLGdCQUFnQixDQUFDLE1BQWM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQXFCO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGLENBQUE7QUF0Qlksa0RBQW1CO0FBSTlCO0lBREMsSUFBQSw0QkFBZSxHQUFFO2tEQUNULGtCQUFNLG9CQUFOLGtCQUFNO21EQUFDOzhCQUpMLG1CQUFtQjtJQU4vQixJQUFBLDZCQUFnQixFQUFDO1FBQ2hCLElBQUksRUFBRTtZQUNKLE1BQU0sRUFBRSxHQUFHO1NBQ1o7UUFDRCxTQUFTLEVBQUUsZUFBZTtLQUMzQixDQUFDO0dBQ1csbUJBQW1CLENBc0IvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxub3RpZmljYXRpb25cXG5vdGlmaWNhdGlvbi5nYXRld2F5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFdlYlNvY2tldEdhdGV3YXksXG4gIFdlYlNvY2tldFNlcnZlcixcbiAgT25HYXRld2F5Q29ubmVjdGlvbixcbiAgT25HYXRld2F5RGlzY29ubmVjdCxcbn0gZnJvbSAnQG5lc3Rqcy93ZWJzb2NrZXRzJztcbmltcG9ydCB7IFNlcnZlciwgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vZW50aXRpZXMvbm90aWZpY2F0aW9uLmVudGl0eSc7XG5cbkBXZWJTb2NrZXRHYXRld2F5KHtcbiAgY29yczoge1xuICAgIG9yaWdpbjogJyonLFxuICB9LFxuICBuYW1lc3BhY2U6ICdub3RpZmljYXRpb25zJyxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uR2F0ZXdheVxuICBpbXBsZW1lbnRzIE9uR2F0ZXdheUNvbm5lY3Rpb24sIE9uR2F0ZXdheURpc2Nvbm5lY3RcbntcbiAgQFdlYlNvY2tldFNlcnZlcigpXG4gIHNlcnZlciE6IFNlcnZlcjsgLy8g4pyFIEZJWDog4LmA4LiV4Li04LihICEgKERlZmluaXRlIEFzc2lnbm1lbnQgQXNzZXJ0aW9uKVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOb3RpZmljYXRpb25HYXRld2F5Lm5hbWUpO1xuXG4gIGhhbmRsZUNvbm5lY3Rpb24oY2xpZW50OiBTb2NrZXQpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYENsaWVudCBjb25uZWN0ZWQ6ICR7Y2xpZW50LmlkfWApO1xuICB9XG5cbiAgaGFuZGxlRGlzY29ubmVjdChjbGllbnQ6IFNvY2tldCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xpZW50IGRpc2Nvbm5lY3RlZDogJHtjbGllbnQuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICog4Liq4LmI4LiH4LmB4LiI4LmJ4LiH4LmA4LiV4Li34Lit4LiZ4LmE4Lib4Lir4LiyIFVzZXIg4LmB4Lia4LiaIFJlYWwtdGltZVxuICAgKi9cbiAgc2VuZFRvVXNlcih1c2VySWQ6IG51bWJlciwgcGF5bG9hZDogTm90aWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zZXJ2ZXIudG8oYHVzZXJfJHt1c2VySWR9YCkuZW1pdCgnbmV3X25vdGlmaWNhdGlvbicsIHBheWxvYWQpO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055.map new file mode 100644 index 0000000..8cfe875 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/notificationgateway_bf874af174d85f24572ec42a74854055.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.gateway.ts","mappings":";;;;;;;;;;;;;;AAAA,mDAK4B;AAC5B,yCAA2C;AAC3C,2CAAwC;AASjC,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAAzB;QAMY,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAgBjE,CAAC;IAdC,gBAAgB,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAqB;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;CACF,CAAA;AAtBY,kDAAmB;AAI9B;IADC,IAAA,4BAAe,GAAE;kDACT,kBAAM,oBAAN,kBAAM;mDAAC;8BAJL,mBAAmB;IAN/B,IAAA,6BAAgB,EAAC;QAChB,IAAI,EAAE;YACJ,MAAM,EAAE,GAAG;SACZ;QACD,SAAS,EAAE,eAAe;KAC3B,CAAC;GACW,mBAAmB,CAsB/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.gateway.ts"],"sourcesContent":["import {\n WebSocketGateway,\n WebSocketServer,\n OnGatewayConnection,\n OnGatewayDisconnect,\n} from '@nestjs/websockets';\nimport { Server, Socket } from 'socket.io';\nimport { Logger } from '@nestjs/common';\nimport { Notification } from './entities/notification.entity';\n\n@WebSocketGateway({\n cors: {\n origin: '*',\n },\n namespace: 'notifications',\n})\nexport class NotificationGateway\n implements OnGatewayConnection, OnGatewayDisconnect\n{\n @WebSocketServer()\n server!: Server; // ✅ FIX: เติม ! (Definite Assignment Assertion)\n\n private readonly logger = new Logger(NotificationGateway.name);\n\n handleConnection(client: Socket) {\n this.logger.log(`Client connected: ${client.id}`);\n }\n\n handleDisconnect(client: Socket) {\n this.logger.log(`Client disconnected: ${client.id}`);\n }\n\n /**\n * ส่งแจ้งเตือนไปหา User แบบ Real-time\n */\n sendToUser(userId: number, payload: Notification) {\n this.server.to(`user_${userId}`).emit('new_notification', payload);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b new file mode 100644 index 0000000..5cfadb4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b @@ -0,0 +1,319 @@ +61be6db69145c358b9e7a0e99a2198a0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceController = void 0; +const common_1 = require("@nestjs/common"); +const swagger_1 = require("@nestjs/swagger"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_workflow_service_1 = require("./correspondence-workflow.service"); +const create_correspondence_dto_1 = require("./dto/create-correspondence.dto"); +const update_correspondence_dto_1 = require("./dto/update-correspondence.dto"); +const submit_correspondence_dto_1 = require("./dto/submit-correspondence.dto"); +const workflow_action_dto_1 = require("./dto/workflow-action.dto"); +const add_reference_dto_1 = require("./dto/add-reference.dto"); +const search_correspondence_dto_1 = require("./dto/search-correspondence.dto"); +const cancel_correspondence_dto_1 = require("./dto/cancel-correspondence.dto"); +const bulk_cancel_dto_1 = require("./dto/bulk-cancel.dto"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +const require_permission_decorator_1 = require("../../common/decorators/require-permission.decorator"); +const audit_decorator_1 = require("../../common/decorators/audit.decorator"); +const parse_uuid_pipe_1 = require("../../common/pipes/parse-uuid.pipe"); +let CorrespondenceController = class CorrespondenceController { + constructor(correspondenceService, workflowService) { + this.correspondenceService = correspondenceService; + this.workflowService = workflowService; + } + processAction(actionDto, req) { + // Extract roles from user assignments for DSL requirements check + const userRoles = req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || []; + // Use Unified Workflow Engine via CorrespondenceWorkflowService + if (!actionDto.instanceId) { + throw new Error('instanceId is required for workflow action'); + } + return this.workflowService.processAction(actionDto.instanceId, req.user.user_id, { + action: actionDto.action, + comment: actionDto.comment, + payload: { ...actionDto.payload, roles: userRoles }, + }); + } + create(createDto, req) { + return this.correspondenceService.create(createDto, req.user); + } + previewNumber(createDto, req) { + return this.correspondenceService.previewDocumentNumber(createDto, req.user); + } + findAll(searchDto) { + return this.correspondenceService.findAll(searchDto); + } + async submit(uuid, submitDto, req) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + // Extract roles from user assignments + const userRoles = req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || []; + // Use Unified Workflow Engine - pass user roles for DSL requirements check + return this.workflowService.submitWorkflow(corr.id, req.user.user_id, userRoles, submitDto.note); + } + findOne(uuid) { + return this.correspondenceService.findOneByUuid(uuid); + } + async update(uuid, updateDto, req) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.update(corr.id, updateDto, req.user); + } + async getReferences(uuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.getReferences(corr.id); + } + async addReference(uuid, dto) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.addReference(corr.id, dto); + } + async removeReference(uuid, targetUuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + const target = await this.correspondenceService.findOneByUuid(targetUuid); + return this.correspondenceService.removeReference(corr.id, target.id); + } + async getTags(uuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.getTags(corr.id); + } + async addTag(uuid, tagId) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.addTag(corr.id, tagId); + } + async removeTag(uuid, tagId) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.removeTag(corr.id, tagId); + } + async bulkCancel(dto, req) { + return this.correspondenceService.bulkCancel(dto.uuids, dto.reason, req.user); + } + async exportCsv(searchDto, res) { + const csv = await this.correspondenceService.exportCsv(searchDto); + const filename = `correspondences-${new Date().toISOString().split('T')[0]}.csv`; + res.setHeader('Content-Type', 'text/csv; charset=utf-8'); + res.setHeader('Content-Disposition', `attachment; filename="${filename}"`); + res.send('\uFEFF' + csv); + } + async cancel(uuid, cancelDto, req) { + return this.correspondenceService.cancel(uuid, cancelDto.reason, req.user); + } +}; +exports.CorrespondenceController = CorrespondenceController; +__decorate([ + (0, common_1.Post)(':uuid/workflow/action'), + (0, swagger_1.ApiOperation)({ summary: 'Process workflow action (Approve/Reject/Review)' }), + (0, swagger_1.ApiResponse)({ status: 201, description: 'Action processed successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('workflow.action_review'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof workflow_action_dto_1.WorkflowActionDto !== "undefined" && workflow_action_dto_1.WorkflowActionDto) === "function" ? _c : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "processAction", null); +__decorate([ + (0, common_1.Post)(), + (0, swagger_1.ApiOperation)({ summary: 'Create new correspondence' }), + (0, swagger_1.ApiResponse)({ + status: 201, + description: 'Correspondence created successfully.', + type: create_correspondence_dto_1.CreateCorrespondenceDto, + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + (0, audit_decorator_1.Audit)('correspondence.create', 'correspondence'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof create_correspondence_dto_1.CreateCorrespondenceDto !== "undefined" && create_correspondence_dto_1.CreateCorrespondenceDto) === "function" ? _d : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "create", null); +__decorate([ + (0, common_1.Post)('preview-number'), + (0, swagger_1.ApiOperation)({ summary: 'Preview next document number' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Return preview number and status.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_e = typeof create_correspondence_dto_1.CreateCorrespondenceDto !== "undefined" && create_correspondence_dto_1.CreateCorrespondenceDto) === "function" ? _e : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "previewNumber", null); +__decorate([ + (0, common_1.Get)(), + (0, swagger_1.ApiOperation)({ summary: 'Search correspondences' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Return list of correspondences.' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_f = typeof search_correspondence_dto_1.SearchCorrespondenceDto !== "undefined" && search_correspondence_dto_1.SearchCorrespondenceDto) === "function" ? _f : Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "findAll", null); +__decorate([ + (0, common_1.Post)(':uuid/submit'), + (0, swagger_1.ApiOperation)({ summary: 'Submit correspondence to Unified Workflow Engine' }), + (0, swagger_1.ApiResponse)({ + status: 201, + description: 'Correspondence submitted successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + (0, audit_decorator_1.Audit)('correspondence.submit', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_g = typeof submit_correspondence_dto_1.SubmitCorrespondenceDto !== "undefined" && submit_correspondence_dto_1.SubmitCorrespondenceDto) === "function" ? _g : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "submit", null); +__decorate([ + (0, common_1.Get)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Get correspondence by UUID' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Return correspondence details.' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "findOne", null); +__decorate([ + (0, common_1.Put)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Update correspondence (Draft only)' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Correspondence updated successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create') // Assuming create permission is enough for draft update, or add 'correspondence.edit' + , + (0, audit_decorator_1.Audit)('correspondence.update', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_h = typeof update_correspondence_dto_1.UpdateCorrespondenceDto !== "undefined" && update_correspondence_dto_1.UpdateCorrespondenceDto) === "function" ? _h : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "update", null); +__decorate([ + (0, common_1.Get)(':uuid/references'), + (0, swagger_1.ApiOperation)({ summary: 'Get referenced documents' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Return list of referenced documents.', + }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "getReferences", null); +__decorate([ + (0, common_1.Post)(':uuid/references'), + (0, swagger_1.ApiOperation)({ summary: 'Add reference to another document' }), + (0, swagger_1.ApiResponse)({ status: 201, description: 'Reference added successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_j = typeof add_reference_dto_1.AddReferenceDto !== "undefined" && add_reference_dto_1.AddReferenceDto) === "function" ? _j : Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "addReference", null); +__decorate([ + (0, common_1.Delete)(':uuid/references/:targetUuid'), + (0, swagger_1.ApiOperation)({ summary: 'Remove reference' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Reference removed successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('targetUuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "removeReference", null); +__decorate([ + (0, common_1.Get)(':uuid/tags'), + (0, swagger_1.ApiOperation)({ summary: 'Get tags for a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "getTags", null); +__decorate([ + (0, common_1.Post)(':uuid/tags/:tagId'), + (0, swagger_1.ApiOperation)({ summary: 'Add tag to a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('tagId', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "addTag", null); +__decorate([ + (0, common_1.Delete)(':uuid/tags/:tagId'), + (0, swagger_1.ApiOperation)({ summary: 'Remove tag from a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('tagId', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "removeTag", null); +__decorate([ + (0, common_1.Post)('bulk-cancel'), + (0, common_1.HttpCode)(200), + (0, swagger_1.ApiOperation)({ summary: 'Bulk cancel correspondences (Org Admin+)' }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.cancel'), + (0, audit_decorator_1.Audit)('correspondence.bulk_cancel', 'correspondence'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_k = typeof bulk_cancel_dto_1.BulkCancelDto !== "undefined" && bulk_cancel_dto_1.BulkCancelDto) === "function" ? _k : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "bulkCancel", null); +__decorate([ + (0, common_1.Get)('export-csv'), + (0, swagger_1.ApiOperation)({ summary: 'Export correspondence list as CSV' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Query)()), + __param(1, (0, common_1.Res)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_l = typeof search_correspondence_dto_1.SearchCorrespondenceDto !== "undefined" && search_correspondence_dto_1.SearchCorrespondenceDto) === "function" ? _l : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "exportCsv", null); +__decorate([ + (0, common_1.Delete)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Cancel correspondence (Admin only)' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Correspondence cancelled successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.cancel'), + (0, audit_decorator_1.Audit)('correspondence.cancel', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_m = typeof cancel_correspondence_dto_1.CancelCorrespondenceDto !== "undefined" && cancel_correspondence_dto_1.CancelCorrespondenceDto) === "function" ? _m : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "cancel", null); +exports.CorrespondenceController = CorrespondenceController = __decorate([ + (0, swagger_1.ApiTags)('Correspondences'), + (0, common_1.Controller)('correspondences'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, rbac_guard_1.RbacGuard), + (0, swagger_1.ApiBearerAuth)(), + __metadata("design:paramtypes", [typeof (_a = typeof correspondence_service_1.CorrespondenceService !== "undefined" && correspondence_service_1.CorrespondenceService) === "function" ? _a : Object, typeof (_b = typeof correspondence_workflow_service_1.CorrespondenceWorkflowService !== "undefined" && correspondence_workflow_service_1.CorrespondenceWorkflowService) === "function" ? _b : Object]) +], CorrespondenceController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQWN3QjtBQUV4Qiw2Q0FLeUI7QUFDekIscUVBQWlFO0FBQ2pFLHVGQUFrRjtBQUNsRiwrRUFBMEU7QUFDMUUsK0VBQTBFO0FBQzFFLCtFQUEwRTtBQUMxRSxtRUFBOEQ7QUFDOUQsK0RBQTBEO0FBQzFELCtFQUEwRTtBQUMxRSwrRUFBMEU7QUFDMUUsMkRBQXNEO0FBRXRELHVFQUFrRTtBQUNsRSwrREFBMkQ7QUFDM0QsdUdBQXlGO0FBQ3pGLDZFQUFnRTtBQUNoRSx3RUFBbUU7QUFPNUQsSUFBTSx3QkFBd0IsR0FBOUIsTUFBTSx3QkFBd0I7SUFDbkMsWUFDbUIscUJBQTRDLEVBQzVDLGVBQThDO1FBRDlDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsb0JBQWUsR0FBZixlQUFlLENBQStCO0lBQzlELENBQUM7SUFNSixhQUFhLENBQ0gsU0FBNEIsRUFDekIsR0FBb0I7UUFFL0IsaUVBQWlFO1FBQ2pFLE1BQU0sU0FBUyxHQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FDdkMsU0FBUyxDQUFDLFVBQVUsRUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQ2hCO1lBQ0UsTUFBTSxFQUFF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QyxpQkFBaUIsQ0FBQztJQUM3QixJQUFBLGtCQUFTLEVBQUMsNkJBQVksRUFBRSxzQkFBUyxDQUFDO0lBQ2xDLElBQUEsdUJBQWEsR0FBRTt5REFHNEIsOENBQXFCLG9CQUFyQiw4Q0FBcUIsb0RBQzNCLCtEQUE2QixvQkFBN0IsK0RBQTZCO0dBSHRELHdCQUF3QixDQStPcEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb250cm9sbGVyLFxyXG4gIEdldCxcclxuICBQb3N0LFxyXG4gIEJvZHksXHJcbiAgVXNlR3VhcmRzLFxyXG4gIFJlcXVlc3QsXHJcbiAgUGFyYW0sXHJcbiAgUXVlcnksXHJcbiAgRGVsZXRlLFxyXG4gIFB1dCxcclxuICBQYXJzZUludFBpcGUsXHJcbiAgUmVzLFxyXG4gIEh0dHBDb2RlLFxyXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHR5cGUgeyBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xyXG5pbXBvcnQge1xyXG4gIEFwaVRhZ3MsXHJcbiAgQXBpT3BlcmF0aW9uLFxyXG4gIEFwaVJlc3BvbnNlLFxyXG4gIEFwaUJlYXJlckF1dGgsXHJcbn0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBTdWJtaXRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3N1Ym1pdC1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbkR0byB9IGZyb20gJy4vZHRvL3dvcmtmbG93LWFjdGlvbi5kdG8nO1xyXG5pbXBvcnQgeyBBZGRSZWZlcmVuY2VEdG8gfSBmcm9tICcuL2R0by9hZGQtcmVmZXJlbmNlLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IENhbmNlbENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vY2FuY2VsLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IEJ1bGtDYW5jZWxEdG8gfSBmcm9tICcuL2R0by9idWxrLWNhbmNlbC5kdG8nO1xyXG5cclxuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XHJcbmltcG9ydCB7IFJiYWNHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvcmJhYy5ndWFyZCc7XHJcbmltcG9ydCB7IFJlcXVpcmVQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMvcmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEF1ZGl0IH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMvYXVkaXQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgUGFyc2VVdWlkUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9waXBlcy9wYXJzZS11dWlkLnBpcGUnO1xyXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RXaXRoVXNlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9pbnRlcmZhY2VzL3JlcXVlc3Qtd2l0aC11c2VyLmludGVyZmFjZSc7XHJcblxyXG5AQXBpVGFncygnQ29ycmVzcG9uZGVuY2VzJylcclxuQENvbnRyb2xsZXIoJ2NvcnJlc3BvbmRlbmNlcycpXHJcbkBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkLCBSYmFjR3VhcmQpXHJcbkBBcGlCZWFyZXJBdXRoKClcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlQ29udHJvbGxlciB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvcnJlc3BvbmRlbmNlU2VydmljZTogQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3JrZmxvd1NlcnZpY2U6IENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBAUG9zdCgnOnV1aWQvd29ya2Zsb3cvYWN0aW9uJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1Byb2Nlc3Mgd29ya2Zsb3cgYWN0aW9uIChBcHByb3ZlL1JlamVjdC9SZXZpZXcpJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAxLCBkZXNjcmlwdGlvbjogJ0FjdGlvbiBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3dvcmtmbG93LmFjdGlvbl9yZXZpZXcnKVxyXG4gIHByb2Nlc3NBY3Rpb24oXHJcbiAgICBAQm9keSgpIGFjdGlvbkR0bzogV29ya2Zsb3dBY3Rpb25EdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICAvLyBFeHRyYWN0IHJvbGVzIGZyb20gdXNlciBhc3NpZ25tZW50cyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgY29uc3QgdXNlclJvbGVzID1cclxuICAgICAgcmVxLnVzZXIuYXNzaWdubWVudHM/Lm1hcCgoYSkgPT4gYS5yb2xlPy5yb2xlTmFtZSkuZmlsdGVyKEJvb2xlYW4pIHx8IFtdO1xyXG5cclxuICAgIC8vIFVzZSBVbmlmaWVkIFdvcmtmbG93IEVuZ2luZSB2aWEgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2VcclxuICAgIGlmICghYWN0aW9uRHRvLmluc3RhbmNlSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnN0YW5jZUlkIGlzIHJlcXVpcmVkIGZvciB3b3JrZmxvdyBhY3Rpb24nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd1NlcnZpY2UucHJvY2Vzc0FjdGlvbihcclxuICAgICAgYWN0aW9uRHRvLmluc3RhbmNlSWQsXHJcbiAgICAgIHJlcS51c2VyLnVzZXJfaWQsXHJcbiAgICAgIHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbkR0by5hY3Rpb24sXHJcbiAgICAgICAgY29tbWVudDogYWN0aW9uRHRvLmNvbW1lbnQsXHJcbiAgICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb25EdG8ucGF5bG9hZCwgcm9sZXM6IHVzZXJSb2xlcyB9LFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnQ3JlYXRlIG5ldyBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAQXBpUmVzcG9uc2Uoe1xyXG4gICAgc3RhdHVzOiAyMDEsXHJcbiAgICBkZXNjcmlwdGlvbjogJ0NvcnJlc3BvbmRlbmNlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgICB0eXBlOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byxcclxuICB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY3JlYXRlJylcclxuICBAQXVkaXQoJ2NvcnJlc3BvbmRlbmNlLmNyZWF0ZScsICdjb3JyZXNwb25kZW5jZScpXHJcbiAgY3JlYXRlKFxyXG4gICAgQEJvZHkoKSBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgQFJlcXVlc3QoKSByZXE6IFJlcXVlc3RXaXRoVXNlclxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIHJlcS51c2VyKTtcclxuICB9XHJcblxyXG4gIEBQb3N0KCdwcmV2aWV3LW51bWJlcicpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdQcmV2aWV3IG5leHQgZG9jdW1lbnQgbnVtYmVyJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7XHJcbiAgICBzdGF0dXM6IDIwMCxcclxuICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJuIHByZXZpZXcgbnVtYmVyIGFuZCBzdGF0dXMuJyxcclxuICB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY3JlYXRlJylcclxuICBwcmV2aWV3TnVtYmVyKFxyXG4gICAgQEJvZHkoKSBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgQFJlcXVlc3QoKSByZXE6IFJlcXVlc3RXaXRoVXNlclxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnByZXZpZXdEb2N1bWVudE51bWJlcihcclxuICAgICAgY3JlYXRlRHRvLFxyXG4gICAgICByZXEudXNlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnU2VhcmNoIGNvcnJlc3BvbmRlbmNlcycgfSlcclxuICBAQXBpUmVzcG9uc2UoeyBzdGF0dXM6IDIwMCwgZGVzY3JpcHRpb246ICdSZXR1cm4gbGlzdCBvZiBjb3JyZXNwb25kZW5jZXMuJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQudmlldycpXHJcbiAgZmluZEFsbChAUXVlcnkoKSBzZWFyY2hEdG86IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZEFsbChzZWFyY2hEdG8pO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3N1Ym1pdCcpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdTdWJtaXQgY29ycmVzcG9uZGVuY2UgdG8gVW5pZmllZCBXb3JrZmxvdyBFbmdpbmUnIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAxLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2NvcnJlc3BvbmRlbmNlLmNyZWF0ZScpXHJcbiAgQEF1ZGl0KCdjb3JyZXNwb25kZW5jZS5zdWJtaXQnLCAnY29ycmVzcG9uZGVuY2UnKVxyXG4gIGFzeW5jIHN1Ym1pdChcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBCb2R5KCkgc3VibWl0RHRvOiBTdWJtaXRDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXF1ZXN0KCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgLy8gRXh0cmFjdCByb2xlcyBmcm9tIHVzZXIgYXNzaWdubWVudHNcclxuICAgIGNvbnN0IHVzZXJSb2xlcyA9XHJcbiAgICAgIHJlcS51c2VyLmFzc2lnbm1lbnRzPy5tYXAoKGEpID0+IGEucm9sZT8ucm9sZU5hbWUpLmZpbHRlcihCb29sZWFuKSB8fCBbXTtcclxuXHJcbiAgICAvLyBVc2UgVW5pZmllZCBXb3JrZmxvdyBFbmdpbmUgLSBwYXNzIHVzZXIgcm9sZXMgZm9yIERTTCByZXF1aXJlbWVudHMgY2hlY2tcclxuICAgIHJldHVybiB0aGlzLndvcmtmbG93U2VydmljZS5zdWJtaXRXb3JrZmxvdyhcclxuICAgICAgY29yci5pZCxcclxuICAgICAgcmVxLnVzZXIudXNlcl9pZCxcclxuICAgICAgdXNlclJvbGVzLFxyXG4gICAgICBzdWJtaXREdG8ubm90ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBjb3JyZXNwb25kZW5jZSBieSBVVUlEJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAwLCBkZXNjcmlwdGlvbjogJ1JldHVybiBjb3JyZXNwb25kZW5jZSBkZXRhaWxzLicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGZpbmRPbmUoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICB9XHJcblxyXG4gIEBQdXQoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1VwZGF0ZSBjb3JyZXNwb25kZW5jZSAoRHJhZnQgb25seSknIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAwLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nLFxyXG4gIH0pXHJcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdjb3JyZXNwb25kZW5jZS5jcmVhdGUnKSAvLyBBc3N1bWluZyBjcmVhdGUgcGVybWlzc2lvbiBpcyBlbm91Z2ggZm9yIGRyYWZ0IHVwZGF0ZSwgb3IgYWRkICdjb3JyZXNwb25kZW5jZS5lZGl0J1xyXG4gIEBBdWRpdCgnY29ycmVzcG9uZGVuY2UudXBkYXRlJywgJ2NvcnJlc3BvbmRlbmNlJylcclxuICBhc3luYyB1cGRhdGUoXHJcbiAgICBAUGFyYW0oJ3V1aWQnLCBQYXJzZVV1aWRQaXBlKSB1dWlkOiBzdHJpbmcsXHJcbiAgICBAQm9keSgpIHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS51cGRhdGUoY29yci5pZCwgdXBkYXRlRHRvLCByZXEudXNlcik7XHJcbiAgfVxyXG5cclxuICBAR2V0KCc6dXVpZC9yZWZlcmVuY2VzJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCByZWZlcmVuY2VkIGRvY3VtZW50cycgfSlcclxuICBAQXBpUmVzcG9uc2Uoe1xyXG4gICAgc3RhdHVzOiAyMDAsXHJcbiAgICBkZXNjcmlwdGlvbjogJ1JldHVybiBsaXN0IG9mIHJlZmVyZW5jZWQgZG9jdW1lbnRzLicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGFzeW5jIGdldFJlZmVyZW5jZXMoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5nZXRSZWZlcmVuY2VzKGNvcnIuaWQpO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3JlZmVyZW5jZXMnKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnQWRkIHJlZmVyZW5jZSB0byBhbm90aGVyIGRvY3VtZW50JyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAxLCBkZXNjcmlwdGlvbjogJ1JlZmVyZW5jZSBhZGRlZCBzdWNjZXNzZnVsbHkuJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQuZWRpdCcpXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKFxyXG4gICAgQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nLFxyXG4gICAgQEJvZHkoKSBkdG86IEFkZFJlZmVyZW5jZUR0b1xyXG4gICkge1xyXG4gICAgY29uc3QgY29yciA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuYWRkUmVmZXJlbmNlKGNvcnIuaWQsIGR0byk7XHJcbiAgfVxyXG5cclxuICBARGVsZXRlKCc6dXVpZC9yZWZlcmVuY2VzLzp0YXJnZXRVdWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1JlbW92ZSByZWZlcmVuY2UnIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHsgc3RhdHVzOiAyMDAsIGRlc2NyaXB0aW9uOiAnUmVmZXJlbmNlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFyZ2V0VXVpZCcsIFBhcnNlVXVpZFBpcGUpIHRhcmdldFV1aWQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgY29uc3QgY29yciA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHRhcmdldFV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnJlbW92ZVJlZmVyZW5jZShjb3JyLmlkLCB0YXJnZXQuaWQpO1xyXG4gIH1cclxuXHJcbiAgQEdldCgnOnV1aWQvdGFncycpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgdGFncyBmb3IgYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGFzeW5jIGdldFRhZ3MoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5nZXRUYWdzKGNvcnIuaWQpO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3RhZ3MvOnRhZ0lkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0FkZCB0YWcgdG8gYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIGFkZFRhZyhcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFnSWQnLCBQYXJzZUludFBpcGUpIHRhZ0lkOiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmFkZFRhZyhjb3JyLmlkLCB0YWdJZCk7XHJcbiAgfVxyXG5cclxuICBARGVsZXRlKCc6dXVpZC90YWdzLzp0YWdJZCcpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdSZW1vdmUgdGFnIGZyb20gYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIHJlbW92ZVRhZyhcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFnSWQnLCBQYXJzZUludFBpcGUpIHRhZ0lkOiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnJlbW92ZVRhZyhjb3JyLmlkLCB0YWdJZCk7XHJcbiAgfVxyXG5cclxuICBAUG9zdCgnYnVsay1jYW5jZWwnKVxyXG4gIEBIdHRwQ29kZSgyMDApXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdCdWxrIGNhbmNlbCBjb3JyZXNwb25kZW5jZXMgKE9yZyBBZG1pbispJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY2FuY2VsJylcclxuICBAQXVkaXQoJ2NvcnJlc3BvbmRlbmNlLmJ1bGtfY2FuY2VsJywgJ2NvcnJlc3BvbmRlbmNlJylcclxuICBhc3luYyBidWxrQ2FuY2VsKFxyXG4gICAgQEJvZHkoKSBkdG86IEJ1bGtDYW5jZWxEdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuYnVsa0NhbmNlbChcclxuICAgICAgZHRvLnV1aWRzLFxyXG4gICAgICBkdG8ucmVhc29uLFxyXG4gICAgICByZXEudXNlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoJ2V4cG9ydC1jc3YnKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnRXhwb3J0IGNvcnJlc3BvbmRlbmNlIGxpc3QgYXMgQ1NWJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQudmlldycpXHJcbiAgYXN5bmMgZXhwb3J0Q3N2KFxyXG4gICAgQFF1ZXJ5KCkgc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXMoKSByZXM6IFJlc3BvbnNlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjc3YgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5leHBvcnRDc3Yoc2VhcmNoRHRvKTtcclxuICAgIGNvbnN0IGZpbGVuYW1lID0gYGNvcnJlc3BvbmRlbmNlcy0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdfS5jc3ZgO1xyXG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvY3N2OyBjaGFyc2V0PXV0Zi04Jyk7XHJcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgYGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJHtmaWxlbmFtZX1cImApO1xyXG4gICAgcmVzLnNlbmQoJ1xcdUZFRkYnICsgY3N2KTtcclxuICB9XHJcblxyXG4gIEBEZWxldGUoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0NhbmNlbCBjb3JyZXNwb25kZW5jZSAoQWRtaW4gb25seSknIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAwLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpXHJcbiAgQEF1ZGl0KCdjb3JyZXNwb25kZW5jZS5jYW5jZWwnLCAnY29ycmVzcG9uZGVuY2UnKVxyXG4gIGFzeW5jIGNhbmNlbChcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBCb2R5KCkgY2FuY2VsRHRvOiBDYW5jZWxDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXF1ZXN0KCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXJcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5jYW5jZWwodXVpZCwgY2FuY2VsRHRvLnJlYXNvbiwgcmVxLnVzZXIpO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b.map new file mode 100644 index 0000000..03b64b2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/correspondencecontroller_c1cdcbcf8a827ce71917eaa54dea5a6b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.ts"],"sourcesContent":["import {\r\n Controller,\r\n Get,\r\n Post,\r\n Body,\r\n UseGuards,\r\n Request,\r\n Param,\r\n Query,\r\n Delete,\r\n Put,\r\n ParseIntPipe,\r\n Res,\r\n HttpCode,\r\n} from '@nestjs/common';\r\nimport type { Response } from 'express';\r\nimport {\r\n ApiTags,\r\n ApiOperation,\r\n ApiResponse,\r\n ApiBearerAuth,\r\n} from '@nestjs/swagger';\r\nimport { CorrespondenceService } from './correspondence.service';\r\nimport { CorrespondenceWorkflowService } from './correspondence-workflow.service';\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { SubmitCorrespondenceDto } from './dto/submit-correspondence.dto';\r\nimport { WorkflowActionDto } from './dto/workflow-action.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\nimport { CancelCorrespondenceDto } from './dto/cancel-correspondence.dto';\r\nimport { BulkCancelDto } from './dto/bulk-cancel.dto';\r\n\r\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\r\nimport { RbacGuard } from '../../common/guards/rbac.guard';\r\nimport { RequirePermission } from '../../common/decorators/require-permission.decorator';\r\nimport { Audit } from '../../common/decorators/audit.decorator';\r\nimport { ParseUuidPipe } from '../../common/pipes/parse-uuid.pipe';\r\nimport type { RequestWithUser } from '../../common/interfaces/request-with-user.interface';\r\n\r\n@ApiTags('Correspondences')\r\n@Controller('correspondences')\r\n@UseGuards(JwtAuthGuard, RbacGuard)\r\n@ApiBearerAuth()\r\nexport class CorrespondenceController {\r\n constructor(\r\n private readonly correspondenceService: CorrespondenceService,\r\n private readonly workflowService: CorrespondenceWorkflowService\r\n ) {}\r\n\r\n @Post(':uuid/workflow/action')\r\n @ApiOperation({ summary: 'Process workflow action (Approve/Reject/Review)' })\r\n @ApiResponse({ status: 201, description: 'Action processed successfully.' })\r\n @RequirePermission('workflow.action_review')\r\n processAction(\r\n @Body() actionDto: WorkflowActionDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n // Extract roles from user assignments for DSL requirements check\r\n const userRoles =\r\n req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || [];\r\n\r\n // Use Unified Workflow Engine via CorrespondenceWorkflowService\r\n if (!actionDto.instanceId) {\r\n throw new Error('instanceId is required for workflow action');\r\n }\r\n\r\n return this.workflowService.processAction(\r\n actionDto.instanceId,\r\n req.user.user_id,\r\n {\r\n action: actionDto.action,\r\n comment: actionDto.comment,\r\n payload: { ...actionDto.payload, roles: userRoles },\r\n }\r\n );\r\n }\r\n\r\n @Post()\r\n @ApiOperation({ summary: 'Create new correspondence' })\r\n @ApiResponse({\r\n status: 201,\r\n description: 'Correspondence created successfully.',\r\n type: CreateCorrespondenceDto,\r\n })\r\n @RequirePermission('correspondence.create')\r\n @Audit('correspondence.create', 'correspondence')\r\n create(\r\n @Body() createDto: CreateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.create(createDto, req.user);\r\n }\r\n\r\n @Post('preview-number')\r\n @ApiOperation({ summary: 'Preview next document number' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Return preview number and status.',\r\n })\r\n @RequirePermission('correspondence.create')\r\n previewNumber(\r\n @Body() createDto: CreateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.previewDocumentNumber(\r\n createDto,\r\n req.user\r\n );\r\n }\r\n\r\n @Get()\r\n @ApiOperation({ summary: 'Search correspondences' })\r\n @ApiResponse({ status: 200, description: 'Return list of correspondences.' })\r\n @RequirePermission('document.view')\r\n findAll(@Query() searchDto: SearchCorrespondenceDto) {\r\n return this.correspondenceService.findAll(searchDto);\r\n }\r\n\r\n @Post(':uuid/submit')\r\n @ApiOperation({ summary: 'Submit correspondence to Unified Workflow Engine' })\r\n @ApiResponse({\r\n status: 201,\r\n description: 'Correspondence submitted successfully.',\r\n })\r\n @RequirePermission('correspondence.create')\r\n @Audit('correspondence.submit', 'correspondence')\r\n async submit(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() submitDto: SubmitCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n // Extract roles from user assignments\r\n const userRoles =\r\n req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || [];\r\n\r\n // Use Unified Workflow Engine - pass user roles for DSL requirements check\r\n return this.workflowService.submitWorkflow(\r\n corr.id,\r\n req.user.user_id,\r\n userRoles,\r\n submitDto.note\r\n );\r\n }\r\n\r\n @Get(':uuid')\r\n @ApiOperation({ summary: 'Get correspondence by UUID' })\r\n @ApiResponse({ status: 200, description: 'Return correspondence details.' })\r\n @RequirePermission('document.view')\r\n findOne(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n return this.correspondenceService.findOneByUuid(uuid);\r\n }\r\n\r\n @Put(':uuid')\r\n @ApiOperation({ summary: 'Update correspondence (Draft only)' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Correspondence updated successfully.',\r\n })\r\n @RequirePermission('correspondence.create') // Assuming create permission is enough for draft update, or add 'correspondence.edit'\r\n @Audit('correspondence.update', 'correspondence')\r\n async update(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() updateDto: UpdateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.update(corr.id, updateDto, req.user);\r\n }\r\n\r\n @Get(':uuid/references')\r\n @ApiOperation({ summary: 'Get referenced documents' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Return list of referenced documents.',\r\n })\r\n @RequirePermission('document.view')\r\n async getReferences(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.getReferences(corr.id);\r\n }\r\n\r\n @Post(':uuid/references')\r\n @ApiOperation({ summary: 'Add reference to another document' })\r\n @ApiResponse({ status: 201, description: 'Reference added successfully.' })\r\n @RequirePermission('document.edit')\r\n async addReference(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() dto: AddReferenceDto\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.addReference(corr.id, dto);\r\n }\r\n\r\n @Delete(':uuid/references/:targetUuid')\r\n @ApiOperation({ summary: 'Remove reference' })\r\n @ApiResponse({ status: 200, description: 'Reference removed successfully.' })\r\n @RequirePermission('document.edit')\r\n async removeReference(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('targetUuid', ParseUuidPipe) targetUuid: string\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n const target = await this.correspondenceService.findOneByUuid(targetUuid);\r\n return this.correspondenceService.removeReference(corr.id, target.id);\r\n }\r\n\r\n @Get(':uuid/tags')\r\n @ApiOperation({ summary: 'Get tags for a correspondence' })\r\n @RequirePermission('document.view')\r\n async getTags(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.getTags(corr.id);\r\n }\r\n\r\n @Post(':uuid/tags/:tagId')\r\n @ApiOperation({ summary: 'Add tag to a correspondence' })\r\n @RequirePermission('document.edit')\r\n async addTag(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('tagId', ParseIntPipe) tagId: number\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.addTag(corr.id, tagId);\r\n }\r\n\r\n @Delete(':uuid/tags/:tagId')\r\n @ApiOperation({ summary: 'Remove tag from a correspondence' })\r\n @RequirePermission('document.edit')\r\n async removeTag(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('tagId', ParseIntPipe) tagId: number\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.removeTag(corr.id, tagId);\r\n }\r\n\r\n @Post('bulk-cancel')\r\n @HttpCode(200)\r\n @ApiOperation({ summary: 'Bulk cancel correspondences (Org Admin+)' })\r\n @RequirePermission('correspondence.cancel')\r\n @Audit('correspondence.bulk_cancel', 'correspondence')\r\n async bulkCancel(\r\n @Body() dto: BulkCancelDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.bulkCancel(\r\n dto.uuids,\r\n dto.reason,\r\n req.user\r\n );\r\n }\r\n\r\n @Get('export-csv')\r\n @ApiOperation({ summary: 'Export correspondence list as CSV' })\r\n @RequirePermission('document.view')\r\n async exportCsv(\r\n @Query() searchDto: SearchCorrespondenceDto,\r\n @Res() res: Response\r\n ) {\r\n const csv = await this.correspondenceService.exportCsv(searchDto);\r\n const filename = `correspondences-${new Date().toISOString().split('T')[0]}.csv`;\r\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\r\n res.setHeader('Content-Disposition', `attachment; filename=\"${filename}\"`);\r\n res.send('\\uFEFF' + csv);\r\n }\r\n\r\n @Delete(':uuid')\r\n @ApiOperation({ summary: 'Cancel correspondence (Admin only)' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Correspondence cancelled successfully.',\r\n })\r\n @RequirePermission('correspondence.cancel')\r\n @Audit('correspondence.cancel', 'correspondence')\r\n async cancel(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() cancelDto: CancelCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.cancel(uuid, cancelDto.reason, req.user);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e new file mode 100644 index 0000000..477adcd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e @@ -0,0 +1,918 @@ +e6d55fb67e8ce0ddc8e693625d70831b +"use strict"; +// File: src/modules/correspondence/correspondence.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const tag_entity_1 = require("../master/entities/tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_revision_attachment_entity_1 = require("./entities/correspondence-revision-attachment.entity"); +// Services +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +let CorrespondenceService = CorrespondenceService_1 = class CorrespondenceService { + async hasSystemManageAllPermission(userId) { + const permissions = await this.userService.getUserPermissions(userId); + return permissions.includes('system.manage_all'); + } + /** + * Business Rule: Revision Label Strategy + * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...) + * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...) + */ + getInitialRevisionLabel(typeCode) { + const alphabetTypes = ['RFA', 'RFI']; + if (alphabetTypes.includes(typeCode.toUpperCase())) { + return 'A'; // Alphabet for RFA, RFI + } + return undefined; // Numeric (no label for revision 0) + } + constructor(correspondenceRepo, revisionRepo, typeRepo, statusRepo, referenceRepo, tagRepo, numberingService, jsonSchemaService, workflowEngine, userService, dataSource, searchService, fileStorageService, uuidResolver, notificationService, revAttachRepo) { + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.typeRepo = typeRepo; + this.statusRepo = statusRepo; + this.referenceRepo = referenceRepo; + this.tagRepo = tagRepo; + this.numberingService = numberingService; + this.jsonSchemaService = jsonSchemaService; + this.workflowEngine = workflowEngine; + this.userService = userService; + this.dataSource = dataSource; + this.searchService = searchService; + this.fileStorageService = fileStorageService; + this.uuidResolver = uuidResolver; + this.notificationService = notificationService; + this.revAttachRepo = revAttachRepo; + this.logger = new common_1.Logger(CorrespondenceService_1.name); + } + /** + * Business Rule Validation: EC-CORR-003 - Correspondence to Self + * Prevent external correspondence to same organization + */ + async validateCorrespondenceRecipients(createDto, user) { + // Get user's organization + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + if (!userOrgId) { + if (createDto.originatorId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (canManageAll) { + userOrgId = await this.uuidResolver.resolveOrganizationId(createDto.originatorId); + } + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + } + // For impersonation, use the specified originator + const originatorOrgId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : userOrgId; + // Check if it's internal communication + if (createDto.isInternal) { + // Internal communications should use Circulation instead + throw new common_1.BadRequestException('Internal communications should use Circulation Sheet instead of Correspondence'); + } + // Validate recipients + if (!createDto.recipients || createDto.recipients.length === 0) { + throw new common_1.BadRequestException('At least one recipient (TO or CC) is required'); + } + const toRecipients = createDto.recipients.filter((r) => r.type === 'TO'); + const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC'); + if (toRecipients.length === 0 && ccRecipients.length === 0) { + throw new common_1.BadRequestException('At least one TO or CC recipient is required'); + } + // Check for same organization correspondence + for (const recipient of createDto.recipients) { + const recipientOrgId = await this.uuidResolver.resolveOrganizationId(recipient.organizationId); + if (recipientOrgId === originatorOrgId) { + throw new common_1.BadRequestException('Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'); + } + } + } + async create(createDto, user) { + // Business Rule Validation: EC-CORR-003 - Correspondence to Self + await this.validateCorrespondenceRecipients(createDto, user); + // ADR-019: Resolve UUID references to internal INT IDs + const resolvedProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const resolvedOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const resolvedRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + const statusDraft = await this.statusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + if (!statusDraft) { + throw new common_1.InternalServerErrorException('Status DRAFT not found in Master Data'); + } + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + // Impersonation Logic + if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (!canManageAll) { + throw new common_1.ForbiddenException('You do not have permission to create documents on behalf of other organizations.'); + } + userOrgId = resolvedOriginatorId; + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + if (createDto.details) { + try { + await this.jsonSchemaService.validate(type.typeCode, createDto.details); + } + catch (error) { + this.logger.warn(`Schema validation warning for ${type.typeCode}: ${error.message}`); + } + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // [Fix #6] Fetch real ORG Code from Organization entity + const originatorOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: userOrgId }, + }); + const orgCode = originatorOrg?.organizationCode ?? 'UNK'; + // [v1.5.1] Extract recipient organization from recipients array (Primary TO) + const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + const docNumber = await this.numberingService.generateNextNumber({ + projectId: resolvedProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, // [v1.5.1] Pass recipient for document number format + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + const correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: docNumber.number, + correspondenceTypeId: createDto.typeId, + disciplineId: createDto.disciplineId, + projectId: resolvedProjectId, + originatorId: userOrgId, + isInternal: createDto.isInternal || false, + createdBy: user.user_id, + }); + const savedCorr = await queryRunner.manager.save(correspondence); + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: savedCorr.id, + revisionNumber: 0, + revisionLabel: this.getInitialRevisionLabel(type.typeCode), + isCurrent: true, + statusId: statusDraft.id, + subject: createDto.subject, + body: createDto.body, + remarks: createDto.remarks, + dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined, + documentDate: createDto.documentDate + ? new Date(createDto.documentDate) + : undefined, + issuedDate: createDto.issuedDate + ? new Date(createDto.issuedDate) + : undefined, + receivedDate: createDto.receivedDate + ? new Date(createDto.receivedDate) + : undefined, + description: createDto.description, + details: createDto.details, + createdBy: user.user_id, + schemaVersion: 1, + }); + await queryRunner.manager.save(revision); + // Save Recipients (using resolved INT IDs) + if (resolvedRecipients && resolvedRecipients.length > 0) { + const recipients = resolvedRecipients.map((r) => queryRunner.manager.create(correspondence_recipient_entity_1.CorrespondenceRecipient, { + correspondenceId: savedCorr.id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await queryRunner.manager.save(recipients); + } + // Commit attachments from Temp → Permanent (Two-Phase Storage) + if (createDto.attachmentTempIds?.length) { + const issueDate = createDto.issuedDate + ? new Date(createDto.issuedDate) + : createDto.documentDate + ? new Date(createDto.documentDate) + : undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(createDto.attachmentTempIds, { issueDate, documentType: 'Correspondence' }); + if (committed.length > 0) { + const links = committed.map((att, idx) => queryRunner.manager.create(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, { + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: idx === 0, // ไฟล์แรกเป็น main document + })); + await queryRunner.manager.save(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, links); + } + } + await queryRunner.commitTransaction(); + // Start Workflow Instance (non-blocking) + try { + const workflowCode = `CORRESPONDENCE_${type.typeCode}`; + await this.workflowEngine.createInstance(workflowCode, 'correspondence', savedCorr.id.toString(), { + projectId: resolvedProjectId, + originatorId: userOrgId, + disciplineId: createDto.disciplineId, + initiatorId: user.user_id, + }); + } + catch (error) { + this.logger.warn(`Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${error.message}`); + } + // Fire-and-forget search indexing (non-blocking, void intentional) + void this.searchService.indexDocument({ + id: savedCorr.id, + publicId: savedCorr.publicId, + type: 'correspondence', + docNumber: docNumber.number, + title: createDto.subject, + description: createDto.description, + status: 'DRAFT', + projectId: resolvedProjectId, + createdAt: new Date(), + }); + return { + ...savedCorr, + currentRevision: revision, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to create correspondence: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + async findAll(searchDto = {}) { + const { search, typeId, projectId, statusId, status, page = 1, limit = 10, } = searchDto; + const skip = (page - 1) * limit; + // Change: Query from Revision Repo + const query = this.revisionRepo + .createQueryBuilder('rev') + .leftJoinAndSelect('rev.correspondence', 'corr') + .leftJoinAndSelect('corr.type', 'type') + .leftJoinAndSelect('corr.project', 'project') + .leftJoinAndSelect('corr.originator', 'org') + .leftJoinAndSelect('rev.status', 'status'); + // Filter by Revision Status + const revStatus = searchDto.revisionStatus || 'CURRENT'; + if (revStatus === 'CURRENT') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: true }); + } + else if (revStatus === 'OLD') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: false }); + } + // If 'ALL', no filter needed on isCurrent + if (projectId) { + query.andWhere('corr.projectId = :projectId', { projectId }); + } + if (typeId) { + query.andWhere('corr.correspondenceTypeId = :typeId', { typeId }); + } + if (statusId) { + query.andWhere('rev.statusId = :statusId', { statusId }); + } + if (status) { + query.andWhere('status.statusCode = :status', { status }); + } + if (search) { + query.andWhere('(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)', { search: `%${search}%` }); + } + // Default Sort: Latest Created + query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit); + const [items, total] = await query.getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + relations: [ + 'revisions', + 'revisions.status', + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with ID ${id} not found`); + } + return correspondence; + } + async findOneByUuid(publicId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { publicId }, + relations: [ + 'revisions', + 'revisions.status', + 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction + 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with UUID ${publicId} not found`); + } + return correspondence; + } + async addReference(id, dto) { + const source = await this.correspondenceRepo.findOne({ where: { id } }); + // ADR-019: Resolve target publicId → internal INT id + const target = await this.correspondenceRepo.findOne({ + where: { publicId: dto.targetUuid }, + }); + if (!source || !target) { + throw new common_1.NotFoundException('Source or Target correspondence not found'); + } + if (source.id === target.id) { + throw new common_1.BadRequestException('Cannot reference self'); + } + const exists = await this.referenceRepo.findOne({ + where: { + sourceId: id, + targetId: target.id, + }, + }); + if (exists) { + return exists; + } + const ref = this.referenceRepo.create({ + sourceId: id, + targetId: target.id, + }); + return this.referenceRepo.save(ref); + } + async removeReference(id, targetId) { + const result = await this.referenceRepo.delete({ + sourceId: id, + targetId: targetId, + }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Reference not found'); + } + } + async getTags(id) { + const rows = await this.tagRepo.find({ + where: { correspondenceId: id }, + relations: ['tag'], + }); + return rows.map((r) => r.tag).filter(Boolean); + } + async addTag(id, tagId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence ${id} not found`); + } + const tag = await this.dataSource.manager.findOne(tag_entity_1.Tag, { + where: { id: tagId }, + }); + if (!tag) { + throw new common_1.NotFoundException(`Tag ${tagId} not found`); + } + const exists = await this.tagRepo.findOne({ + where: { correspondenceId: id, tagId }, + }); + if (exists) + return exists; + const row = this.tagRepo.create({ correspondenceId: id, tagId }); + return this.tagRepo.save(row); + } + async removeTag(id, tagId) { + const result = await this.tagRepo.delete({ correspondenceId: id, tagId }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Tag assignment not found'); + } + } + async getReferences(id) { + const outgoing = await this.referenceRepo.find({ + where: { sourceId: id }, + relations: ['target', 'target.type'], + }); + const incoming = await this.referenceRepo.find({ + where: { targetId: id }, + relations: ['source', 'source.type'], + }); + return { outgoing, incoming }; + } + async update(id, updateDto, user) { + // 1. Find Current Revision + const revision = await this.revisionRepo.findOne({ + where: { + correspondenceId: id, + isCurrent: true, + }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Current revision for correspondence ${id} not found`); + } + // 2. Check Permission + if (revision.statusId) { + const status = await this.statusRepo.findOne({ + where: { id: revision.statusId }, + }); + if (status && status.statusCode !== 'DRAFT') { + const permissions = await this.userService.getUserPermissions(user.user_id); + const canEditSubmittedOrLater = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canEditSubmittedOrLater) { + throw new common_1.ForbiddenException('Only Org Admin or Superadmin can edit non-draft correspondences'); + } + } + } + // ADR-019: Resolve UUID references in update DTO + const updResolvedProjectId = updateDto.projectId + ? await this.uuidResolver.resolveProjectId(updateDto.projectId) + : undefined; + const updResolvedOriginatorId = updateDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId) + : undefined; + const updResolvedRecipients = updateDto.recipients + ? await Promise.all(updateDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + // 3. Update Correspondence Entity if needed + const correspondenceUpdate = {}; + if (updateDto.disciplineId) + correspondenceUpdate.disciplineId = updateDto.disciplineId; + if (updResolvedProjectId) + correspondenceUpdate.projectId = updResolvedProjectId; + if (updResolvedOriginatorId) + correspondenceUpdate.originatorId = updResolvedOriginatorId; + if (Object.keys(correspondenceUpdate).length > 0) { + await this.correspondenceRepo.update(id, correspondenceUpdate); + } + // 4. Update Revision Entity + const revisionUpdate = {}; + if (updateDto.subject) + revisionUpdate.subject = updateDto.subject; + if (updateDto.body) + revisionUpdate.body = updateDto.body; + if (updateDto.remarks) + revisionUpdate.remarks = updateDto.remarks; + // Format Date correctly if string + if (updateDto.dueDate) + revisionUpdate.dueDate = new Date(updateDto.dueDate); + if (updateDto.documentDate) + revisionUpdate.documentDate = new Date(updateDto.documentDate); + if (updateDto.issuedDate) + revisionUpdate.issuedDate = new Date(updateDto.issuedDate); + if (updateDto.receivedDate) + revisionUpdate.receivedDate = new Date(updateDto.receivedDate); + if (updateDto.description) + revisionUpdate.description = updateDto.description; + if (updateDto.details) + revisionUpdate.details = updateDto.details; + if (Object.keys(revisionUpdate).length > 0) { + await this.revisionRepo.update(revision.id, revisionUpdate); + } + // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage) + if (updateDto.attachmentTempIds?.length) { + const issueDate = updateDto.issuedDate + ? new Date(updateDto.issuedDate) + : updateDto.documentDate + ? new Date(updateDto.documentDate) + : revision.issuedDate || revision.documentDate || undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(updateDto.attachmentTempIds, { + issueDate: issueDate ? new Date(issueDate) : undefined, + documentType: 'Correspondence', + }); + if (committed.length > 0) { + const links = committed.map((att) => this.revAttachRepo.create({ + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main + })); + await this.revAttachRepo.save(links); + } + } + // 5. Update Recipients if provided + if (updResolvedRecipients) { + const recipientRepo = this.dataSource.getRepository(correspondence_recipient_entity_1.CorrespondenceRecipient); + await recipientRepo.delete({ correspondenceId: id }); + const newRecipients = updResolvedRecipients.map((r) => recipientRepo.create({ + correspondenceId: id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await recipientRepo.save(newRecipients); + } + // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project) + // AND it is a DRAFT. + // Fetch fresh data for context and comparison + const currentCorr = await this.correspondenceRepo.findOne({ + where: { id }, + relations: ['type', 'recipients', 'recipients.recipientOrganization'], + }); + if (currentCorr) { + const currentToRecipient = currentCorr.recipients?.find((r) => r.recipientType === 'TO'); + const currentRecipientId = currentToRecipient?.recipientOrganizationId; + // Check for ACTUAL value changes + const isProjectChanged = updResolvedProjectId !== undefined && + updResolvedProjectId !== currentCorr.projectId; + const isOriginatorChanged = updResolvedOriginatorId !== undefined && + updResolvedOriginatorId !== currentCorr.originatorId; + const isDisciplineChanged = updateDto.disciplineId !== undefined && + updateDto.disciplineId !== currentCorr.disciplineId; + const isTypeChanged = updateDto.typeId !== undefined && + updateDto.typeId !== currentCorr.correspondenceTypeId; + let isRecipientChanged = false; + let newRecipientId; + if (updResolvedRecipients) { + const newToRecipient = updResolvedRecipients.find((r) => r.type === 'TO'); + newRecipientId = newToRecipient?.organizationId; + if (newRecipientId !== currentRecipientId) { + isRecipientChanged = true; + } + } + if (isProjectChanged || + isDisciplineChanged || + isTypeChanged || + isRecipientChanged || + isOriginatorChanged) { + const targetRecipientId = isRecipientChanged + ? newRecipientId + : currentRecipientId; + // Resolve Recipient Code for the NEW context + let recipientCode = ''; + if (targetRecipientId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: targetRecipientId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + // [Fix #6] Fetch real ORG Code from originator organization + const originatorOrgForUpdate = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { + id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + }, + }); + const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK'; + // Prepare Contexts + const oldCtx = { + projectId: currentCorr.projectId, + originatorOrganizationId: currentCorr.originatorId ?? 0, + typeId: currentCorr.correspondenceTypeId, + disciplineId: currentCorr.disciplineId, + recipientOrganizationId: currentRecipientId, + year: new Date().getFullYear(), + }; + const newCtx = { + projectId: updResolvedProjectId ?? currentCorr.projectId, + originatorOrganizationId: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId, + disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId, + recipientOrganizationId: targetRecipientId, + year: new Date().getFullYear(), + userId: user.user_id, // Pass User ID for Audit + customTokens: { + TYPE_CODE: currentCorr.type?.typeCode || '', + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }; + // If Type Changed, need NEW Type Code + if (isTypeChanged) { + const newType = await this.typeRepo.findOne({ + where: { id: newCtx.typeId }, + }); + if (newType) + newCtx.customTokens.TYPE_CODE = newType.typeCode; + } + const newDocNumber = await this.numberingService.updateNumberForDraft(currentCorr.correspondenceNumber, oldCtx, newCtx); + await this.correspondenceRepo.update(id, { + correspondenceNumber: newDocNumber, + }); + } + } + const updated = await this.findOne(id); + // Re-index updated document in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: updated.id, + publicId: updated.publicId, + type: 'correspondence', + docNumber: updated.correspondenceNumber, + title: updateDto.subject ?? updated.revisions?.[0]?.subject, + description: updateDto.description ?? updated.revisions?.[0]?.description, + status: 'DRAFT', + projectId: updated.projectId, + createdAt: updated.createdAt, + }); + return updated; + } + async previewDocumentNumber(createDto, user) { + // ADR-019: Resolve UUID references + const previewProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const previewOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const previewRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) + userOrgId = fullUser.primaryOrganizationId; + } + if (previewOriginatorId && previewOriginatorId !== userOrgId) { + // Allow impersonation for preview + userOrgId = previewOriginatorId; + } + // Extract recipient from recipients array + const toRecipient = previewRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + return this.numberingService.previewNumber({ + projectId: previewProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + } + /** + * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation + * Cancel correspondence and handle related circulations + */ + async cancel(publicId, reason, user) { + const correspondence = await this.findOneByUuid(publicId); + // Check if user has permission to cancel (Org Admin or Superadmin only) + const permissions = await this.userService.getUserPermissions(user.user_id); + const canCancel = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canCancel) { + throw new common_1.ForbiddenException('Only administrators can cancel correspondences'); + } + // Check if there are any active circulations + const circulationRepo = this.dataSource.getRepository('Circulation'); + const activeCirculations = await circulationRepo.find({ + where: { + correspondenceId: correspondence.id, + status: 'OPEN', + }, + }); + const warningMessage = activeCirculations.length > 0 + ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.` + : ''; + // Get the current revision to update status + const currentRevision = await this.revisionRepo.findOne({ + where: { + correspondenceId: correspondence.id, + isCurrent: true, + }, + }); + if (!currentRevision) { + throw new common_1.NotFoundException('Current revision not found'); + } + // Get cancelled status + const cancelledStatus = await this.statusRepo.findOne({ + where: { statusCode: 'CANCELLED' }, + }); + if (!cancelledStatus) { + throw new common_1.InternalServerErrorException('CANCELLED status not found'); + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // Update correspondence revision status to CANCELLED + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, currentRevision.id, { + statusId: cancelledStatus.id, + remarks: `Cancelled: ${reason}`, + }); + // Force close all active circulations + if (activeCirculations.length > 0) { + await queryRunner.manager.update('Circulation', { + correspondenceId: correspondence.id, + status: 'OPEN', + }, { + status: 'FORCE_CLOSED', + closedAt: new Date(), + closedBy: user.user_id, + closeReason: `Correspondence cancelled: ${reason}`, + }); + } + await queryRunner.commitTransaction(); + // Re-index cancelled status in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: correspondence.id, + publicId: correspondence.publicId, + type: 'correspondence', + docNumber: correspondence.correspondenceNumber, + title: currentRevision.subject, + status: 'CANCELLED', + projectId: correspondence.projectId, + createdAt: correspondence.createdAt, + }); + // Notify originator's doc-control user about cancellation (fire-and-forget) + if (correspondence.originatorId) { + void this.userService + .findDocControlIdByOrg(correspondence.originatorId) + .then((targetUserId) => { + if (targetUserId) { + void this.notificationService.send({ + userId: targetUserId, + title: 'Correspondence Cancelled', + message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: correspondence.id, + link: `/correspondences/${correspondence.publicId}`, + }); + } + }) + .catch((err) => this.logger.warn(`Cancel notification failed: ${err.message}`)); + } + return { + success: true, + message: warningMessage || 'Correspondence cancelled successfully', + activeCirculationsCount: activeCirculations.length, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to cancel correspondence: ${error.message}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async bulkCancel(publicIds, reason, user) { + const succeeded = []; + const failed = []; + for (const publicId of publicIds) { + try { + await this.cancel(publicId, reason, user); + succeeded.push(publicId); + } + catch { + failed.push(publicId); + } + } + return { succeeded, failed }; + } + async exportCsv(searchDto) { + const { data } = await this.findAll(searchDto); + const header = [ + 'Document No.', + 'Rev', + 'Subject', + 'Type', + 'Status', + 'Project', + 'From', + 'Due Date', + 'Created At', + ]; + const rows = data.map((rev) => { + const corr = rev.correspondence ?? rev; + return [ + this.escapeCsv(corr.correspondenceNumber ?? ''), + this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)), + this.escapeCsv(rev.subject ?? ''), + this.escapeCsv(corr.type?.typeCode ?? ''), + this.escapeCsv(rev.status?.statusCode ?? ''), + this.escapeCsv(corr.project?.projectCode ?? ''), + this.escapeCsv(corr.originator?.organizationCode ?? ''), + rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '', + new Date(rev.createdAt).toISOString().split('T')[0], + ].join(','); + }); + return [header.join(','), ...rows].join('\n'); + } + escapeCsv(value) { + if (value.includes(',') || value.includes('"') || value.includes('\n')) { + return `"${value.replace(/"/g, '""')}"`; + } + return value; + } +}; +exports.CorrespondenceService = CorrespondenceService; +exports.CorrespondenceService = CorrespondenceService = CorrespondenceService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_reference_entity_1.CorrespondenceReference)), + __param(5, (0, typeorm_1.InjectRepository)(correspondence_tag_entity_1.CorrespondenceTag)), + __param(15, (0, typeorm_1.InjectRepository)(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof document_numbering_service_1.DocumentNumberingService !== "undefined" && document_numbering_service_1.DocumentNumberingService) === "function" ? _g : Object, typeof (_h = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _h : Object, typeof (_j = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _j : Object, typeof (_k = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _l : Object, typeof (_m = typeof search_service_1.SearchService !== "undefined" && search_service_1.SearchService) === "function" ? _m : Object, typeof (_o = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _o : Object, typeof (_p = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _p : Object, typeof (_q = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _q : Object, typeof (_r = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _r : Object]) +], CorrespondenceService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDZEQUE2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0QsMkNBT3dCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFFakQsV0FBVztBQUNYLDRFQUFrRTtBQUNsRSw4RkFBbUY7QUFDbkYsc0ZBQTJFO0FBQzNFLDBGQUErRTtBQUMvRSxnR0FBcUY7QUFDckYsZ0dBQXFGO0FBQ3JGLG9GQUF5RTtBQUN6RSw4REFBb0Q7QUFFcEQsc0ZBQTRFO0FBQzVFLG9IQUF3RztBQVF4RyxXQUFXO0FBQ1gsMEdBQXFHO0FBQ3JHLDRFQUF1RTtBQUN2RSx3RkFBbUY7QUFDbkYsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCx5RkFBb0Y7QUFDcEYsdUZBQWtGO0FBQ2xGLCtFQUEyRTtBQVVwRSxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHeEIsS0FBSyxDQUFDLDRCQUE0QixDQUFDLE1BQWM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssdUJBQXVCLENBQUMsUUFBZ0I7UUFDOUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7UUFDdEMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDLENBQUMsb0NBQW9DO0lBQ3hELENBQUM7SUFFRCxZQUVFLGtCQUFzRCxFQUV0RCxZQUF3RCxFQUV4RCxRQUFnRCxFQUVoRCxVQUFvRCxFQUVwRCxhQUEwRCxFQUUxRCxPQUE4QyxFQUN0QyxnQkFBMEMsRUFDMUMsaUJBQW9DLEVBQ3BDLGNBQXFDLEVBQ3JDLFdBQXdCLEVBQ3hCLFVBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLGtCQUFzQyxFQUN0QyxZQUFpQyxFQUNqQyxtQkFBd0MsRUFFaEQsYUFBbUU7UUFyQjNELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBNEI7UUFFOUMsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBRWhELGFBQVEsR0FBUixRQUFRLENBQWdDO1FBRXhDLGVBQVUsR0FBVixVQUFVLENBQWtDO1FBRTVDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUVsRCxZQUFPLEdBQVAsT0FBTyxDQUErQjtRQUN0QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTBCO1FBQzFDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUV4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBOEM7UUEzQ3BELFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx1QkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQTRDOUQsQ0FBQztJQUVKOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDNUMsU0FBa0MsRUFDbEMsSUFBVTtRQUVWLDBCQUEwQjtRQUMxQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixTQUFTLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUMxRCxJQUFJLENBQUMsT0FBTyxDQUNiLENBQUM7Z0JBQ0YsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FDdkQsU0FBUyxDQUFDLFlBQVksQ0FDdkIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksNEJBQW1CLENBQzNCLHlEQUF5RCxDQUMxRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFlBQVk7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCx1Q0FBdUM7UUFDdkMsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekIseURBQXlEO1lBQ3pELE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsZ0ZBQWdGLENBQ2pGLENBQUM7UUFDSixDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsK0NBQStDLENBQ2hELENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDekUsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFekUsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsNkNBQTZDLENBQzlDLENBQUM7UUFDSixDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FDbEUsU0FBUyxDQUFDLGNBQWMsQ0FDekIsQ0FBQztZQUVGLElBQUksY0FBYyxLQUFLLGVBQWUsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLElBQUksNEJBQW1CLENBQzNCLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFrQyxFQUFFLElBQVU7UUFDekQsaUVBQWlFO1FBQ2pFLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCx1REFBdUQ7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQ2hFLFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUM7UUFDRixNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxZQUFZO1lBQ2pELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUN2RSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsVUFBVTtZQUM3QyxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN0QixLQUFLLEVBQUUsQ0FBQyxFQUE4QixFQUFFLENBQUMsQ0FBQztnQkFDeEMsY0FBYyxFQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FDM0QsQ0FBQyxDQUFDLGNBQWMsQ0FDakI7Z0JBQ0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2FBQ2IsQ0FBQyxDQUNILENBQ0Y7WUFDSCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUN2QyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRTtTQUNoQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDaEQsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLHFDQUE0QixDQUNwQyx1Q0FBdUMsQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFFM0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixTQUFTLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksb0JBQW9CLElBQUksb0JBQW9CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQzFELElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLDJCQUFrQixDQUMxQixrRkFBa0YsQ0FDbkYsQ0FBQztZQUNKLENBQUM7WUFDRCxTQUFTLEdBQUcsb0JBQW9CLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IseURBQXlELENBQzFELENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsaUNBQWlDLElBQUksQ0FBQyxRQUFRLEtBQU0sS0FBZSxDQUFDLE9BQU8sRUFBRSxDQUM5RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVyQyxJQUFJLENBQUM7WUFDSCx3REFBd0Q7WUFDeEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3pELGtDQUFZLEVBQ1o7Z0JBQ0UsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTthQUN6QixDQUNGLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsZ0JBQWdCLElBQUksS0FBSyxDQUFDO1lBRXpELDZFQUE2RTtZQUM3RSxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDckUsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLEVBQUUsY0FBYyxDQUFDO1lBRTVELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLHVCQUF1QixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtDQUFZLEVBQUU7b0JBQ2pFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRTtpQkFDdkMsQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTTtvQkFBRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDL0QsU0FBUyxFQUFFLGlCQUFpQjtnQkFDNUIsd0JBQXdCLEVBQUUsU0FBUztnQkFDbkMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUN4QixZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7Z0JBQ3BDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztnQkFDOUIsdUJBQXVCLEVBQUUscURBQXFEO2dCQUM5RSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlCLFlBQVksRUFBRTtvQkFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3hCLFFBQVEsRUFBRSxPQUFPO29CQUNqQixjQUFjLEVBQUUsYUFBYTtvQkFDN0IsUUFBUSxFQUFFLGFBQWE7aUJBQ3hCO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQWMsRUFBRTtnQkFDaEUsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3RDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUN0QyxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7Z0JBQ3BDLFNBQVMsRUFBRSxpQkFBaUI7Z0JBQzVCLFlBQVksRUFBRSxTQUFTO2dCQUN2QixVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN6QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVqRSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyx1REFBc0IsRUFBRTtnQkFDbEUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzlCLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzFELFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRTtnQkFDeEIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMxQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3BCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztnQkFDMUIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDcEUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO29CQUNsQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDbEMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2IsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO29CQUM5QixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2IsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO29CQUNsQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDbEMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2IsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dCQUNsQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87Z0JBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDdkIsYUFBYSxFQUFFLENBQUM7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV6QywyQ0FBMkM7WUFDM0MsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzlDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHlEQUF1QixFQUFFO29CQUNsRCxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsRUFBRTtvQkFDOUIsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLGNBQWM7b0JBQ3pDLGFBQWEsRUFBRSxDQUFDLENBQUMsSUFBSTtpQkFDdEIsQ0FBQyxDQUNILENBQUM7Z0JBQ0YsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUN4QyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsVUFBVTtvQkFDcEMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWTt3QkFDdEIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7d0JBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBRWhCLHNFQUFzRTtnQkFDdEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUNwRCxTQUFTLENBQUMsaUJBQWlCLEVBQzNCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUM5QyxDQUFDO2dCQUVGLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUN2QyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyw0RUFBZ0MsRUFBRTt3QkFDM0Qsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLEVBQUU7d0JBQ3JDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDcEIsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsNEJBQTRCO3FCQUN4RCxDQUFDLENBQ0gsQ0FBQztvQkFDRixNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLDRFQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxRSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFdEMseUNBQXlDO1lBQ3pDLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUN0QyxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQ3ZCO29CQUNFLFNBQVMsRUFBRSxpQkFBaUI7b0JBQzVCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7b0JBQ3BDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztpQkFDQyxDQUM3QixDQUFDO1lBQ0osQ0FBQztZQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLDRCQUE0QixTQUFTLENBQUMsTUFBTSwwQkFBMEIsSUFBSSxDQUFDLFFBQVEsTUFBTyxLQUFlLENBQUMsT0FBTyxFQUFFLENBQ3BILENBQUM7WUFDSixDQUFDO1lBRUQsbUVBQW1FO1lBQ25FLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3BDLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDaEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO2dCQUM1QixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQzNCLEtBQUssRUFBRSxTQUFTLENBQUMsT0FBTztnQkFDeEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dCQUNsQyxNQUFNLEVBQUUsT0FBTztnQkFDZixTQUFTLEVBQUUsaUJBQWlCO2dCQUM1QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxHQUFHLFNBQVM7Z0JBQ1osZUFBZSxFQUFFLFFBQVE7YUFDMUIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixvQ0FBcUMsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUM3RCxDQUFDO1lBQ0YsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBcUMsRUFBRTtRQUNuRCxNQUFNLEVBQ0osTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEdBQUcsQ0FBQyxFQUNSLEtBQUssR0FBRyxFQUFFLEdBQ1gsR0FBRyxTQUFTLENBQUM7UUFDZCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFaEMsbUNBQW1DO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZO2FBQzVCLGtCQUFrQixDQUFDLEtBQUssQ0FBQzthQUN6QixpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7YUFDL0MsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQzthQUN0QyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDO2FBQzVDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQzthQUMzQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFN0MsNEJBQTRCO1FBQzVCLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDO1FBRXhELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCwwQ0FBMEM7UUFFMUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixLQUFLLENBQUMsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLEtBQUssQ0FBQyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDLFFBQVEsQ0FDWixzRUFBc0UsRUFDdEUsRUFBRSxNQUFNLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELCtCQUErQjtRQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlELE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsT0FBTztZQUNMLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFO2dCQUNKLEtBQUs7Z0JBQ0wsSUFBSTtnQkFDSixLQUFLO2dCQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDckM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBVTtRQUN0QixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7WUFDM0QsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFO2dCQUNULFdBQVc7Z0JBQ1gsa0JBQWtCO2dCQUNsQixNQUFNO2dCQUNOLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixZQUFZO2dCQUNaLGtDQUFrQyxFQUFFLCtCQUErQjthQUNwRTtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksMEJBQWlCLENBQUMsMEJBQTBCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWdCO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztZQUMzRCxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUU7WUFDbkIsU0FBUyxFQUFFO2dCQUNULFdBQVc7Z0JBQ1gsa0JBQWtCO2dCQUNsQiwyQkFBMkIsRUFBYyw2QkFBNkI7Z0JBQ3RFLHNDQUFzQyxFQUFHLG9DQUFvQztnQkFDN0UsTUFBTTtnQkFDTixTQUFTO2dCQUNULFlBQVk7Z0JBQ1osWUFBWTtnQkFDWixrQ0FBa0M7YUFDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLDBCQUFpQixDQUN6Qiw0QkFBNEIsUUFBUSxZQUFZLENBQ2pELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBVSxFQUFFLEdBQW9CO1FBQ2pELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxxREFBcUQ7UUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1lBQ25ELEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFO1NBQ3BDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksMEJBQWlCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksNEJBQW1CLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUM5QyxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxRQUFRLEVBQUUsRUFBRTtZQUNaLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQVUsRUFBRSxRQUFnQjtRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzdDLFFBQVEsRUFBRSxFQUFFO1lBQ1osUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFVO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbkMsS0FBSyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFO1lBQy9CLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNuQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVSxFQUFFLEtBQWE7UUFDcEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1lBQzNELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNkLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksMEJBQWlCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFHLEVBQUU7WUFDckQsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksMEJBQWlCLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3hDLEtBQUssRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUU7U0FDdkMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQVUsRUFBRSxLQUFhO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLDBCQUFpQixDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQVU7UUFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUM3QyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUM3QyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFVLEVBQUUsU0FBa0MsRUFBRSxJQUFVO1FBQ3JFLDJCQUEyQjtRQUMzQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQy9DLEtBQUssRUFBRTtnQkFDTCxnQkFBZ0IsRUFBRSxFQUFFO2dCQUNwQixTQUFTLEVBQUUsSUFBSTthQUNoQjtZQUNELFNBQVMsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSwwQkFBaUIsQ0FDekIsdUNBQXVDLEVBQUUsWUFBWSxDQUN0RCxDQUFDO1FBQ0osQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUMzQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRTthQUNqQyxDQUFDLENBQUM7WUFFSCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUM1QyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQzNELElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztnQkFDRixNQUFNLHVCQUF1QixHQUMzQixXQUFXLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO29CQUM3QyxXQUFXLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBRTVDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUM3QixNQUFNLElBQUksMkJBQWtCLENBQzFCLGlFQUFpRSxDQUNsRSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxTQUFTO1lBQzlDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztZQUMvRCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSx1QkFBdUIsR0FBRyxTQUFTLENBQUMsWUFBWTtZQUNwRCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDdkUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0scUJBQXFCLEdBQUcsU0FBUyxDQUFDLFVBQVU7WUFDaEQsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDdEIsS0FBSyxFQUFFLENBQUMsRUFBOEIsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQzNELENBQUMsQ0FBQyxjQUFjLENBQ2pCO2dCQUNELElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTthQUNiLENBQUMsQ0FDSCxDQUNGO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLDRDQUE0QztRQUM1QyxNQUFNLG9CQUFvQixHQUE0QixFQUFFLENBQUM7UUFDekQsSUFBSSxTQUFTLENBQUMsWUFBWTtZQUN4QixvQkFBb0IsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztRQUM3RCxJQUFJLG9CQUFvQjtZQUN0QixvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7UUFDeEQsSUFBSSx1QkFBdUI7WUFDekIsb0JBQW9CLENBQUMsWUFBWSxHQUFHLHVCQUF1QixDQUFDO1FBRTlELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixNQUFNLGNBQWMsR0FBNEIsRUFBRSxDQUFDO1FBQ25ELElBQUksU0FBUyxDQUFDLE9BQU87WUFBRSxjQUFjLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDbEUsSUFBSSxTQUFTLENBQUMsSUFBSTtZQUFFLGNBQWMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUN6RCxJQUFJLFNBQVMsQ0FBQyxPQUFPO1lBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ2xFLGtDQUFrQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxPQUFPO1lBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsSUFBSSxTQUFTLENBQUMsWUFBWTtZQUN4QixjQUFjLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRSxJQUFJLFNBQVMsQ0FBQyxVQUFVO1lBQ3RCLGNBQWMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksU0FBUyxDQUFDLFlBQVk7WUFDeEIsY0FBYyxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsSUFBSSxTQUFTLENBQUMsV0FBVztZQUN2QixjQUFjLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDckQsSUFBSSxTQUFTLENBQUMsT0FBTztZQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUVsRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVO2dCQUNwQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZO29CQUN0QixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDbEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUM7WUFFaEUsc0VBQXNFO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDcEQsU0FBUyxDQUFDLGlCQUFpQixFQUMzQjtnQkFDRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDdEQsWUFBWSxFQUFFLGdCQUFnQjthQUMvQixDQUNGLENBQUM7WUFFRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3JDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDcEIsY0FBYyxFQUFFLEtBQUssRUFBRSxzQ0FBc0M7aUJBQzlELENBQUMsQ0FDSCxDQUFDO2dCQUNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNqRCx5REFBdUIsQ0FDeEIsQ0FBQztZQUNGLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFckQsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDcEQsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDbkIsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLGNBQWM7Z0JBQ3pDLGFBQWEsRUFBRSxDQUFDLENBQUMsSUFBSTthQUN0QixDQUFDLENBQ0gsQ0FBQztZQUNGLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsb0dBQW9HO1FBQ3BHLHFCQUFxQjtRQUVyQiw4Q0FBOEM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1lBQ3hELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNiLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsa0NBQWtDLENBQUM7U0FDdEUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUNyRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQ2hDLENBQUM7WUFDRixNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixFQUFFLHVCQUF1QixDQUFDO1lBRXZFLGlDQUFpQztZQUNqQyxNQUFNLGdCQUFnQixHQUNwQixvQkFBb0IsS0FBSyxTQUFTO2dCQUNsQyxvQkFBb0IsS0FBSyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQ2pELE1BQU0sbUJBQW1CLEdBQ3ZCLHVCQUF1QixLQUFLLFNBQVM7Z0JBQ3JDLHVCQUF1QixLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDdkQsTUFBTSxtQkFBbUIsR0FDdkIsU0FBUyxDQUFDLFlBQVksS0FBSyxTQUFTO2dCQUNwQyxTQUFTLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDdEQsTUFBTSxhQUFhLEdBQ2pCLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUztnQkFDOUIsU0FBUyxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsb0JBQW9CLENBQUM7WUFFeEQsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxjQUFrQyxDQUFDO1lBRXZDLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUMvQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQ3ZCLENBQUM7Z0JBQ0YsY0FBYyxHQUFHLGNBQWMsRUFBRSxjQUFjLENBQUM7Z0JBRWhELElBQUksY0FBYyxLQUFLLGtCQUFrQixFQUFFLENBQUM7b0JBQzFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFDNUIsQ0FBQztZQUNILENBQUM7WUFFRCxJQUNFLGdCQUFnQjtnQkFDaEIsbUJBQW1CO2dCQUNuQixhQUFhO2dCQUNiLGtCQUFrQjtnQkFDbEIsbUJBQW1CLEVBQ25CLENBQUM7Z0JBQ0QsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0I7b0JBQzFDLENBQUMsQ0FBQyxjQUFjO29CQUNoQixDQUFDLENBQUMsa0JBQWtCLENBQUM7Z0JBRXZCLDZDQUE2QztnQkFDN0MsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixJQUFJLGlCQUFpQixFQUFFLENBQUM7b0JBQ3RCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtDQUFZLEVBQUU7d0JBQ2pFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRTtxQkFDakMsQ0FBQyxDQUFDO29CQUNILElBQUksTUFBTTt3QkFBRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUN0RCxDQUFDO2dCQUVELDREQUE0RDtnQkFDNUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDbEUsa0NBQVksRUFDWjtvQkFDRSxLQUFLLEVBQUU7d0JBQ0wsRUFBRSxFQUFFLHVCQUF1QixJQUFJLFdBQVcsQ0FBQyxZQUFZLElBQUksQ0FBQztxQkFDN0Q7aUJBQ0YsQ0FDRixDQUFDO2dCQUNGLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixFQUFFLGdCQUFnQixJQUFJLEtBQUssQ0FBQztnQkFFbEUsbUJBQW1CO2dCQUNuQixNQUFNLE1BQU0sR0FBRztvQkFDYixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2hDLHdCQUF3QixFQUFFLFdBQVcsQ0FBQyxZQUFZLElBQUksQ0FBQztvQkFDdkQsTUFBTSxFQUFFLFdBQVcsQ0FBQyxvQkFBb0I7b0JBQ3hDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWTtvQkFDdEMsdUJBQXVCLEVBQUUsa0JBQWtCO29CQUMzQyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7aUJBQy9CLENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsU0FBUyxFQUFFLG9CQUFvQixJQUFJLFdBQVcsQ0FBQyxTQUFTO29CQUN4RCx3QkFBd0IsRUFDdEIsdUJBQXVCLElBQUksV0FBVyxDQUFDLFlBQVksSUFBSSxDQUFDO29CQUMxRCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsb0JBQW9CO29CQUM1RCxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsWUFBWTtvQkFDaEUsdUJBQXVCLEVBQUUsaUJBQWlCO29CQUMxQyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLHlCQUF5QjtvQkFDL0MsWUFBWSxFQUFFO3dCQUNaLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFO3dCQUMzQyxRQUFRLEVBQUUsT0FBTzt3QkFDakIsY0FBYyxFQUFFLGFBQWE7d0JBQzdCLFFBQVEsRUFBRSxhQUFhO3FCQUN4QjtpQkFDRixDQUFDO2dCQUVGLHNDQUFzQztnQkFDdEMsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQzt3QkFDMUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7cUJBQzdCLENBQUMsQ0FBQztvQkFDSCxJQUFJLE9BQU87d0JBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDaEUsQ0FBQztnQkFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDbkUsV0FBVyxDQUFDLG9CQUFvQixFQUNoQyxNQUFNLEVBQ04sTUFBTSxDQUNQLENBQUM7Z0JBRUYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtvQkFDdkMsb0JBQW9CLEVBQUUsWUFBWTtpQkFDbkMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkMsK0RBQStEO1FBQy9ELEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDcEMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ2QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFDdkMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU87WUFDM0QsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVc7WUFDekUsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1NBQzdCLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBa0MsRUFBRSxJQUFVO1FBQ3hFLG1DQUFtQztRQUNuQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDL0QsU0FBUyxDQUFDLFNBQVMsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLFlBQVk7WUFDaEQsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxVQUFVO1lBQzVDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ3RCLEtBQUssRUFBRSxDQUFDLEVBQThCLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxjQUFjLEVBQUUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUMzRCxDQUFDLENBQUMsY0FBYyxDQUNqQjtnQkFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7YUFDYixDQUFDLENBQ0gsQ0FDRjtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFO1NBQ2hDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLDBCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFbEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlELElBQUksUUFBUTtnQkFBRSxTQUFTLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLG1CQUFtQixJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdELGtDQUFrQztZQUNsQyxTQUFTLEdBQUcsbUJBQW1CLENBQUM7UUFDbEMsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLEVBQUUsY0FBYyxDQUFDO1FBRTVELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0NBQVksRUFBRTtnQkFDakUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFO2FBQ3ZDLENBQUMsQ0FBQztZQUNILElBQUksTUFBTTtnQkFBRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7WUFDekMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQix3QkFBd0IsRUFBRSxTQUFVO1lBQ3BDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7WUFDcEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLHVCQUF1QjtZQUN2QixJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDOUIsWUFBWSxFQUFFO2dCQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDeEIsY0FBYyxFQUFFLGFBQWE7Z0JBQzdCLFFBQVEsRUFBRSxhQUFhO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsSUFBVTtRQUN2RCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUQsd0VBQXdFO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsTUFBTSxTQUFTLEdBQ2IsV0FBVyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztZQUM3QyxXQUFXLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLDJCQUFrQixDQUMxQixnREFBZ0QsQ0FDakQsQ0FBQztRQUNKLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDcEQsS0FBSyxFQUFFO2dCQUNMLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQ2xCLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxhQUFhLGtCQUFrQixDQUFDLE1BQU0sc0dBQXNHO1lBQzlJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCw0Q0FBNEM7UUFDNUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUU7Z0JBQ0wsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxJQUFJO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNwRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUkscUNBQTRCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDO1lBQ0gscURBQXFEO1lBQ3JELE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQzlCLHVEQUFzQixFQUN0QixlQUFlLENBQUMsRUFBRSxFQUNsQjtnQkFDRSxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sRUFBRSxjQUFjLE1BQU0sRUFBRTthQUNoQyxDQUNGLENBQUM7WUFFRixzQ0FBc0M7WUFDdEMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQzlCLGFBQWEsRUFDYjtvQkFDRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsRUFBRTtvQkFDbkMsTUFBTSxFQUFFLE1BQU07aUJBQ2YsRUFDRDtvQkFDRSxNQUFNLEVBQUUsY0FBYztvQkFDdEIsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO29CQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3RCLFdBQVcsRUFBRSw2QkFBNkIsTUFBTSxFQUFFO2lCQUNuRCxDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUV0QywrREFBK0Q7WUFDL0QsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztnQkFDcEMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNyQixRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7Z0JBQ2pDLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLFNBQVMsRUFBRSxjQUFjLENBQUMsb0JBQW9CO2dCQUM5QyxLQUFLLEVBQUUsZUFBZSxDQUFDLE9BQU87Z0JBQzlCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7Z0JBQ25DLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUzthQUNwQyxDQUFDLENBQUM7WUFFSCw0RUFBNEU7WUFDNUUsSUFBSSxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssSUFBSSxDQUFDLFdBQVc7cUJBQ2xCLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7cUJBQ2xELElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUNyQixJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUNqQixLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7NEJBQ2pDLE1BQU0sRUFBRSxZQUFZOzRCQUNwQixLQUFLLEVBQUUsMEJBQTBCOzRCQUNqQyxPQUFPLEVBQUUsR0FBRyxjQUFjLENBQUMsb0JBQW9CLE1BQU0sZUFBZSxDQUFDLE9BQU8sZ0NBQWdDLE1BQU0sRUFBRTs0QkFDcEgsSUFBSSxFQUFFLE9BQU87NEJBQ2IsVUFBVSxFQUFFLGdCQUFnQjs0QkFDNUIsUUFBUSxFQUFFLGNBQWMsQ0FBQyxFQUFFOzRCQUMzQixJQUFJLEVBQUUsb0JBQW9CLGNBQWMsQ0FBQyxRQUFRLEVBQUU7eUJBQ3BELENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQztxQkFDRCxLQUFLLENBQUMsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQy9ELENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSTtnQkFDYixPQUFPLEVBQUUsY0FBYyxJQUFJLHVDQUF1QztnQkFDbEUsdUJBQXVCLEVBQUUsa0JBQWtCLENBQUMsTUFBTTthQUNuRCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLG9DQUFxQyxLQUFlLENBQUMsT0FBTyxFQUFFLENBQy9ELENBQUM7WUFDRixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FDZCxTQUFtQixFQUNuQixNQUFjLEVBQ2QsSUFBVTtRQUVWLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFrQztRQUNoRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHO1lBQ2IsY0FBYztZQUNkLEtBQUs7WUFDTCxTQUFTO1lBQ1QsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsTUFBTTtZQUNOLFVBQVU7WUFDVixZQUFZO1NBQ2IsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsY0FBYyxJQUFLLEdBQWlDLENBQUM7WUFDdEUsT0FBTztnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYTtRQUM3QixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkUsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUE7QUE3bENZLHNEQUFxQjtnQ0FBckIscUJBQXFCO0lBRGpDLElBQUEsbUJBQVUsR0FBRTtJQXVCUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsc0NBQWMsQ0FBQyxDQUFBO0lBRWhDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyx1REFBc0IsQ0FBQyxDQUFBO0lBRXhDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQywrQ0FBa0IsQ0FBQyxDQUFBO0lBRXBDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxtREFBb0IsQ0FBQyxDQUFBO0lBRXRDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyx5REFBdUIsQ0FBQyxDQUFBO0lBRXpDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyw2Q0FBaUIsQ0FBQyxDQUFBO0lBV25DLFlBQUEsSUFBQSwwQkFBZ0IsRUFBQyw0RUFBZ0MsQ0FBQyxDQUFBO3lEQXBCdkIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBRWhCLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVkLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVSLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVQLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVoQixvQkFBVSxvQkFBVixvQkFBVSxvREFDRCxxREFBd0Isb0JBQXhCLHFEQUF3QixvREFDdkIsdUNBQWlCLG9CQUFqQix1Q0FBaUIsb0RBQ3BCLCtDQUFxQixvQkFBckIsK0NBQXFCLG9EQUN4QiwwQkFBVyxvQkFBWCwwQkFBVyxvREFDWixvQkFBVSxvQkFBVixvQkFBVSxvREFDUCw4QkFBYSxvQkFBYiw4QkFBYSxvREFDUix5Q0FBa0Isb0JBQWxCLHlDQUFrQixvREFDeEIsMkNBQW1CLG9CQUFuQiwyQ0FBbUIsb0RBQ1osMENBQW1CLG9CQUFuQiwwQ0FBbUIsb0RBRXpCLG9CQUFVLG9CQUFWLG9CQUFVO0dBNUN4QixxQkFBcUIsQ0E2bENqQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcY29ycmVzcG9uZGVuY2Uuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9jb3JyZXNwb25kZW5jZS9jb3JyZXNwb25kZW5jZS5zZXJ2aWNlLnRzXHJcblxyXG5pbXBvcnQge1xyXG4gIEluamVjdGFibGUsXHJcbiAgTm90Rm91bmRFeGNlcHRpb24sXHJcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcclxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxyXG4gIEZvcmJpZGRlbkV4Y2VwdGlvbixcclxuICBMb2dnZXIsXHJcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xyXG5cclxuLy8gRW50aXRpZXNcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb24gfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJldmlzaW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVHlwZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdHlwZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZWZlcmVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlY2lwaWVudC5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVRhZyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdGFnLmVudGl0eSc7XHJcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uL21hc3Rlci9lbnRpdGllcy90YWcuZW50aXR5JztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50IH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi1hdHRhY2htZW50LmVudGl0eSc7XHJcblxyXG4vLyBEVE9zXHJcbmltcG9ydCB7IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vY3JlYXRlLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vdXBkYXRlLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IEFkZFJlZmVyZW5jZUR0byB9IGZyb20gJy4vZHRvL2FkZC1yZWZlcmVuY2UuZHRvJztcclxuaW1wb3J0IHsgU2VhcmNoQ29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtY29ycmVzcG9uZGVuY2UuZHRvJztcclxuXHJcbi8vIFNlcnZpY2VzXHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyaW5nU2VydmljZSB9IGZyb20gJy4uL2RvY3VtZW50LW51bWJlcmluZy9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEpzb25TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vanNvbi1zY2hlbWEvanNvbi1zY2hlbWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93RW5naW5lU2VydmljZSB9IGZyb20gJy4uL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFV1aWRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvdXVpZC1yZXNvbHZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ29ycmVzcG9uZGVuY2VTZXJ2aWNlIC0gRG9jdW1lbnQgbWFuYWdlbWVudCAoQ1JVRClcclxuICovXHJcbmludGVyZmFjZSBSZXNvbHZlZFJlY2lwaWVudCB7XHJcbiAgb3JnYW5pemF0aW9uSWQ6IG51bWJlcjtcclxuICB0eXBlOiAnVE8nIHwgJ0NDJztcclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihDb3JyZXNwb25kZW5jZVNlcnZpY2UubmFtZSk7XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFzU3lzdGVtTWFuYWdlQWxsUGVybWlzc2lvbih1c2VySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyh1c2VySWQpO1xyXG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmluY2x1ZGVzKCdzeXN0ZW0ubWFuYWdlX2FsbCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzaW5lc3MgUnVsZTogUmV2aXNpb24gTGFiZWwgU3RyYXRlZ3lcclxuICAgKiAtIFJGQSwgUkZJOiBVc2UgYWxwaGFiZXQgc3RhcnRpbmcgd2l0aCAnQScgKEEsIEIsIEMuLi4pXHJcbiAgICogLSBPdGhlciB0eXBlcyAoTEVUVEVSLCBNRU1PLCBldGMuKTogVXNlIG51bWVyaWMgKG51bGwgZm9yIGZpcnN0LCB0aGVuIDEsIDIsIDMuLi4pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbml0aWFsUmV2aXNpb25MYWJlbCh0eXBlQ29kZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGFscGhhYmV0VHlwZXMgPSBbJ1JGQScsICdSRkknXTtcclxuICAgIGlmIChhbHBoYWJldFR5cGVzLmluY2x1ZGVzKHR5cGVDb2RlLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgIHJldHVybiAnQSc7IC8vIEFscGhhYmV0IGZvciBSRkEsIFJGSVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTnVtZXJpYyAobm8gbGFiZWwgZm9yIHJldmlzaW9uIDApXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlKVxyXG4gICAgcHJpdmF0ZSBjb3JyZXNwb25kZW5jZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2U+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbilcclxuICAgIHByaXZhdGUgcmV2aXNpb25SZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgcHJpdmF0ZSB0eXBlUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICBwcml2YXRlIHN0YXR1c1JlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZWZlcmVuY2UpXHJcbiAgICBwcml2YXRlIHJlZmVyZW5jZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZWZlcmVuY2U+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUYWcpXHJcbiAgICBwcml2YXRlIHRhZ1JlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUYWc+LFxyXG4gICAgcHJpdmF0ZSBudW1iZXJpbmdTZXJ2aWNlOiBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGpzb25TY2hlbWFTZXJ2aWNlOiBKc29uU2NoZW1hU2VydmljZSxcclxuICAgIHByaXZhdGUgd29ya2Zsb3dFbmdpbmU6IFdvcmtmbG93RW5naW5lU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRhU291cmNlOiBEYXRhU291cmNlLFxyXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWxlU3RvcmFnZVNlcnZpY2U6IEZpbGVTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgdXVpZFJlc29sdmVyOiBVdWlkUmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQpXHJcbiAgICBwcml2YXRlIHJldkF0dGFjaFJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQ+XHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBCdXNpbmVzcyBSdWxlIFZhbGlkYXRpb246IEVDLUNPUlItMDAzIC0gQ29ycmVzcG9uZGVuY2UgdG8gU2VsZlxyXG4gICAqIFByZXZlbnQgZXh0ZXJuYWwgY29ycmVzcG9uZGVuY2UgdG8gc2FtZSBvcmdhbml6YXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ29ycmVzcG9uZGVuY2VSZWNpcGllbnRzKFxyXG4gICAgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIHVzZXI6IFVzZXJcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEdldCB1c2VyJ3Mgb3JnYW5pemF0aW9uXHJcbiAgICBsZXQgdXNlck9yZ0lkID0gdXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQ7XHJcbiAgICBpZiAoIXVzZXJPcmdJZCkge1xyXG4gICAgICBjb25zdCBmdWxsVXNlciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZE9uZSh1c2VyLnVzZXJfaWQpO1xyXG4gICAgICBpZiAoZnVsbFVzZXIpIHtcclxuICAgICAgICB1c2VyT3JnSWQgPSBmdWxsVXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXVzZXJPcmdJZCkge1xyXG4gICAgICBpZiAoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZCkge1xyXG4gICAgICAgIGNvbnN0IGNhbk1hbmFnZUFsbCA9IGF3YWl0IHRoaXMuaGFzU3lzdGVtTWFuYWdlQWxsUGVybWlzc2lvbihcclxuICAgICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGNhbk1hbmFnZUFsbCkge1xyXG4gICAgICAgICAgdXNlck9yZ0lkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICBjcmVhdGVEdG8ub3JpZ2luYXRvcklkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAgICdVc2VyIG11c3QgYmVsb25nIHRvIGFuIG9yZ2FuaXphdGlvbiB0byBjcmVhdGUgZG9jdW1lbnRzJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgaW1wZXJzb25hdGlvbiwgdXNlIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvclxyXG4gICAgY29uc3Qgb3JpZ2luYXRvck9yZ0lkID0gY3JlYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChjcmVhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVzZXJPcmdJZDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBpdCdzIGludGVybmFsIGNvbW11bmljYXRpb25cclxuICAgIGlmIChjcmVhdGVEdG8uaXNJbnRlcm5hbCkge1xyXG4gICAgICAvLyBJbnRlcm5hbCBjb21tdW5pY2F0aW9ucyBzaG91bGQgdXNlIENpcmN1bGF0aW9uIGluc3RlYWRcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ0ludGVybmFsIGNvbW11bmljYXRpb25zIHNob3VsZCB1c2UgQ2lyY3VsYXRpb24gU2hlZXQgaW5zdGVhZCBvZiBDb3JyZXNwb25kZW5jZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBWYWxpZGF0ZSByZWNpcGllbnRzXHJcbiAgICBpZiAoIWNyZWF0ZUR0by5yZWNpcGllbnRzIHx8IGNyZWF0ZUR0by5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAnQXQgbGVhc3Qgb25lIHJlY2lwaWVudCAoVE8gb3IgQ0MpIGlzIHJlcXVpcmVkJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvUmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzLmZpbHRlcigocikgPT4gci50eXBlID09PSAnVE8nKTtcclxuICAgIGNvbnN0IGNjUmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzLmZpbHRlcigocikgPT4gci50eXBlID09PSAnQ0MnKTtcclxuXHJcbiAgICBpZiAodG9SZWNpcGllbnRzLmxlbmd0aCA9PT0gMCAmJiBjY1JlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICdBdCBsZWFzdCBvbmUgVE8gb3IgQ0MgcmVjaXBpZW50IGlzIHJlcXVpcmVkJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGZvciBzYW1lIG9yZ2FuaXphdGlvbiBjb3JyZXNwb25kZW5jZVxyXG4gICAgZm9yIChjb25zdCByZWNpcGllbnQgb2YgY3JlYXRlRHRvLnJlY2lwaWVudHMpIHtcclxuICAgICAgY29uc3QgcmVjaXBpZW50T3JnSWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgcmVjaXBpZW50Lm9yZ2FuaXphdGlvbklkXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAocmVjaXBpZW50T3JnSWQgPT09IG9yaWdpbmF0b3JPcmdJZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICAgJ0Nhbm5vdCBzZW5kIGNvcnJlc3BvbmRlbmNlIHRvIHlvdXIgb3duIG9yZ2FuaXphdGlvbi4gVXNlIENpcmN1bGF0aW9uIFNoZWV0IGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uLidcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGUoY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0bywgdXNlcjogVXNlcikge1xyXG4gICAgLy8gQnVzaW5lc3MgUnVsZSBWYWxpZGF0aW9uOiBFQy1DT1JSLTAwMyAtIENvcnJlc3BvbmRlbmNlIHRvIFNlbGZcclxuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDb3JyZXNwb25kZW5jZVJlY2lwaWVudHMoY3JlYXRlRHRvLCB1c2VyKTtcclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgVVVJRCByZWZlcmVuY2VzIHRvIGludGVybmFsIElOVCBJRHNcclxuICAgIGNvbnN0IHJlc29sdmVkUHJvamVjdElkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZChcclxuICAgICAgY3JlYXRlRHRvLnByb2plY3RJZFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlc29sdmVkT3JpZ2luYXRvcklkID0gY3JlYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChjcmVhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHJlc29sdmVkUmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICBjcmVhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy50eXBlUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGNyZWF0ZUR0by50eXBlSWQgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0RvY3VtZW50IFR5cGUgbm90IGZvdW5kJyk7XHJcblxyXG4gICAgY29uc3Qgc3RhdHVzRHJhZnQgPSBhd2FpdCB0aGlzLnN0YXR1c1JlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6ICdEUkFGVCcgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdGF0dXNEcmFmdCkge1xyXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihcclxuICAgICAgICAnU3RhdHVzIERSQUZUIG5vdCBmb3VuZCBpbiBNYXN0ZXIgRGF0YSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlck9yZ0lkID0gdXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgY29uc3QgZnVsbFVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRPbmUodXNlci51c2VyX2lkKTtcclxuICAgICAgaWYgKGZ1bGxVc2VyKSB7XHJcbiAgICAgICAgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW1wZXJzb25hdGlvbiBMb2dpY1xyXG4gICAgaWYgKHJlc29sdmVkT3JpZ2luYXRvcklkICYmIHJlc29sdmVkT3JpZ2luYXRvcklkICE9PSB1c2VyT3JnSWQpIHtcclxuICAgICAgY29uc3QgY2FuTWFuYWdlQWxsID0gYXdhaXQgdGhpcy5oYXNTeXN0ZW1NYW5hZ2VBbGxQZXJtaXNzaW9uKFxyXG4gICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoIWNhbk1hbmFnZUFsbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oXHJcbiAgICAgICAgICAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY3JlYXRlIGRvY3VtZW50cyBvbiBiZWhhbGYgb2Ygb3RoZXIgb3JnYW5pemF0aW9ucy4nXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB1c2VyT3JnSWQgPSByZXNvbHZlZE9yaWdpbmF0b3JJZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXVzZXJPcmdJZCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAnVXNlciBtdXN0IGJlbG9uZyB0byBhbiBvcmdhbml6YXRpb24gdG8gY3JlYXRlIGRvY3VtZW50cydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3JlYXRlRHRvLmRldGFpbHMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLnZhbGlkYXRlKHR5cGUudHlwZUNvZGUsIGNyZWF0ZUR0by5kZXRhaWxzKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYFNjaGVtYSB2YWxpZGF0aW9uIHdhcm5pbmcgZm9yICR7dHlwZS50eXBlQ29kZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBbRml4ICM2XSBGZXRjaCByZWFsIE9SRyBDb2RlIGZyb20gT3JnYW5pemF0aW9uIGVudGl0eVxyXG4gICAgICBjb25zdCBvcmlnaW5hdG9yT3JnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShcclxuICAgICAgICBPcmdhbml6YXRpb24sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IHVzZXJPcmdJZCB9LFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgb3JnQ29kZSA9IG9yaWdpbmF0b3JPcmc/Lm9yZ2FuaXphdGlvbkNvZGUgPz8gJ1VOSyc7XHJcblxyXG4gICAgICAvLyBbdjEuNS4xXSBFeHRyYWN0IHJlY2lwaWVudCBvcmdhbml6YXRpb24gZnJvbSByZWNpcGllbnRzIGFycmF5IChQcmltYXJ5IFRPKVxyXG4gICAgICBjb25zdCB0b1JlY2lwaWVudCA9IHJlc29sdmVkUmVjaXBpZW50cz8uZmluZCgocikgPT4gci50eXBlID09PSAnVE8nKTtcclxuICAgICAgY29uc3QgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQgPSB0b1JlY2lwaWVudD8ub3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgICBsZXQgcmVjaXBpZW50Q29kZSA9ICcnO1xyXG4gICAgICBpZiAocmVjaXBpZW50T3JnYW5pemF0aW9uSWQpIHtcclxuICAgICAgICBjb25zdCByZWNPcmcgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKE9yZ2FuaXphdGlvbiwge1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IHJlY2lwaWVudE9yZ2FuaXphdGlvbklkIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHJlY09yZykgcmVjaXBpZW50Q29kZSA9IHJlY09yZy5vcmdhbml6YXRpb25Db2RlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkb2NOdW1iZXIgPSBhd2FpdCB0aGlzLm51bWJlcmluZ1NlcnZpY2UuZ2VuZXJhdGVOZXh0TnVtYmVyKHtcclxuICAgICAgICBwcm9qZWN0SWQ6IHJlc29sdmVkUHJvamVjdElkLFxyXG4gICAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogdXNlck9yZ0lkLFxyXG4gICAgICAgIHR5cGVJZDogY3JlYXRlRHRvLnR5cGVJZCxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IGNyZWF0ZUR0by5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgc3ViVHlwZUlkOiBjcmVhdGVEdG8uc3ViVHlwZUlkLFxyXG4gICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkLCAvLyBbdjEuNS4xXSBQYXNzIHJlY2lwaWVudCBmb3IgZG9jdW1lbnQgbnVtYmVyIGZvcm1hdFxyXG4gICAgICAgIHllYXI6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICAgIFRZUEVfQ09ERTogdHlwZS50eXBlQ29kZSxcclxuICAgICAgICAgIE9SR19DT0RFOiBvcmdDb2RlLFxyXG4gICAgICAgICAgUkVDSVBJRU5UX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgICBSRUNfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoQ29ycmVzcG9uZGVuY2UsIHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogZG9jTnVtYmVyLm51bWJlcixcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3JlYXRlRHRvLnR5cGVJZCxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IGNyZWF0ZUR0by5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgcHJvamVjdElkOiByZXNvbHZlZFByb2plY3RJZCxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6IHVzZXJPcmdJZCxcclxuICAgICAgICBpc0ludGVybmFsOiBjcmVhdGVEdG8uaXNJbnRlcm5hbCB8fCBmYWxzZSxcclxuICAgICAgICBjcmVhdGVkQnk6IHVzZXIudXNlcl9pZCxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHNhdmVkQ29yciA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShjb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICBjb25zdCByZXZpc2lvbiA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlUmV2aXNpb24sIHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBzYXZlZENvcnIuaWQsXHJcbiAgICAgICAgcmV2aXNpb25OdW1iZXI6IDAsXHJcbiAgICAgICAgcmV2aXNpb25MYWJlbDogdGhpcy5nZXRJbml0aWFsUmV2aXNpb25MYWJlbCh0eXBlLnR5cGVDb2RlKSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IHN0YXR1c0RyYWZ0LmlkLFxyXG4gICAgICAgIHN1YmplY3Q6IGNyZWF0ZUR0by5zdWJqZWN0LFxyXG4gICAgICAgIGJvZHk6IGNyZWF0ZUR0by5ib2R5LFxyXG4gICAgICAgIHJlbWFya3M6IGNyZWF0ZUR0by5yZW1hcmtzLFxyXG4gICAgICAgIGR1ZURhdGU6IGNyZWF0ZUR0by5kdWVEYXRlID8gbmV3IERhdGUoY3JlYXRlRHRvLmR1ZURhdGUpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRvY3VtZW50RGF0ZTogY3JlYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgaXNzdWVkRGF0ZTogY3JlYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICByZWNlaXZlZERhdGU6IGNyZWF0ZUR0by5yZWNlaXZlZERhdGVcclxuICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLnJlY2VpdmVkRGF0ZSlcclxuICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjcmVhdGVEdG8uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgZGV0YWlsczogY3JlYXRlRHRvLmRldGFpbHMsXHJcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShyZXZpc2lvbik7XHJcblxyXG4gICAgICAvLyBTYXZlIFJlY2lwaWVudHMgKHVzaW5nIHJlc29sdmVkIElOVCBJRHMpXHJcbiAgICAgIGlmIChyZXNvbHZlZFJlY2lwaWVudHMgJiYgcmVzb2x2ZWRSZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZWNpcGllbnRzID0gcmVzb2x2ZWRSZWNpcGllbnRzLm1hcCgocikgPT5cclxuICAgICAgICAgIHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlUmVjaXBpZW50LCB7XHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IHNhdmVkQ29yci5pZCxcclxuICAgICAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IHIub3JnYW5pemF0aW9uSWQsXHJcbiAgICAgICAgICAgIHJlY2lwaWVudFR5cGU6IHIudHlwZSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUocmVjaXBpZW50cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENvbW1pdCBhdHRhY2htZW50cyBmcm9tIFRlbXAg4oaSIFBlcm1hbmVudCAoVHdvLVBoYXNlIFN0b3JhZ2UpXHJcbiAgICAgIGlmIChjcmVhdGVEdG8uYXR0YWNobWVudFRlbXBJZHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGlzc3VlRGF0ZSA9IGNyZWF0ZUR0by5pc3N1ZWREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgICAgOiBjcmVhdGVEdG8uZG9jdW1lbnREYXRlXHJcbiAgICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIC8vIFtGSVggdjEuOC4xXSBjb21taXQg4LmE4LiU4LmJIEF0dGFjaG1lbnQgcmVjb3JkcyDguIHguKXguLHguJrguKHguLIg4oaSIOC4muC4seC4meC4l+C4tuC4gSBqdW5jdGlvblxyXG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZCA9IGF3YWl0IHRoaXMuZmlsZVN0b3JhZ2VTZXJ2aWNlLmNvbW1pdChcclxuICAgICAgICAgIGNyZWF0ZUR0by5hdHRhY2htZW50VGVtcElkcyxcclxuICAgICAgICAgIHsgaXNzdWVEYXRlLCBkb2N1bWVudFR5cGU6ICdDb3JyZXNwb25kZW5jZScgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChjb21taXR0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgbGlua3MgPSBjb21taXR0ZWQubWFwKChhdHQsIGlkeCkgPT5cclxuICAgICAgICAgICAgcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQsIHtcclxuICAgICAgICAgICAgICBjb3JyZXNwb25kZW5jZVJldmlzaW9uSWQ6IHJldmlzaW9uLmlkLFxyXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRJZDogYXR0LmlkLFxyXG4gICAgICAgICAgICAgIGlzTWFpbkRvY3VtZW50OiBpZHggPT09IDAsIC8vIOC5hOC4n+C4peC5jOC5geC4o+C4geC5gOC4m+C5h+C4mSBtYWluIGRvY3VtZW50XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50LCBsaW5rcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgICAgLy8gU3RhcnQgV29ya2Zsb3cgSW5zdGFuY2UgKG5vbi1ibG9ja2luZylcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB3b3JrZmxvd0NvZGUgPSBgQ09SUkVTUE9OREVOQ0VfJHt0eXBlLnR5cGVDb2RlfWA7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd0VuZ2luZS5jcmVhdGVJbnN0YW5jZShcclxuICAgICAgICAgIHdvcmtmbG93Q29kZSxcclxuICAgICAgICAgICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgICBzYXZlZENvcnIuaWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgcHJvamVjdElkOiByZXNvbHZlZFByb2plY3RJZCxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiB1c2VyT3JnSWQsXHJcbiAgICAgICAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgICAgaW5pdGlhdG9ySWQ6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgICApO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBgV29ya2Zsb3cgbm90IHN0YXJ0ZWQgZm9yICR7ZG9jTnVtYmVyLm51bWJlcn0gKENvZGU6IENPUlJFU1BPTkRFTkNFXyR7dHlwZS50eXBlQ29kZX0pOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlyZS1hbmQtZm9yZ2V0IHNlYXJjaCBpbmRleGluZyAobm9uLWJsb2NraW5nLCB2b2lkIGludGVudGlvbmFsKVxyXG4gICAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgICBpZDogc2F2ZWRDb3JyLmlkLFxyXG4gICAgICAgIHB1YmxpY0lkOiBzYXZlZENvcnIucHVibGljSWQsXHJcbiAgICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICBkb2NOdW1iZXI6IGRvY051bWJlci5udW1iZXIsXHJcbiAgICAgICAgdGl0bGU6IGNyZWF0ZUR0by5zdWJqZWN0LFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjcmVhdGVEdG8uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgc3RhdHVzOiAnRFJBRlQnLFxyXG4gICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uc2F2ZWRDb3JyLFxyXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbjogcmV2aXNpb24sXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBjb3JyZXNwb25kZW5jZTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgKTtcclxuICAgICAgdGhyb3cgZXJyO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEFsbChzZWFyY2hEdG86IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvID0ge30pIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgc2VhcmNoLFxyXG4gICAgICB0eXBlSWQsXHJcbiAgICAgIHByb2plY3RJZCxcclxuICAgICAgc3RhdHVzSWQsXHJcbiAgICAgIHN0YXR1cyxcclxuICAgICAgcGFnZSA9IDEsXHJcbiAgICAgIGxpbWl0ID0gMTAsXHJcbiAgICB9ID0gc2VhcmNoRHRvO1xyXG4gICAgY29uc3Qgc2tpcCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcclxuXHJcbiAgICAvLyBDaGFuZ2U6IFF1ZXJ5IGZyb20gUmV2aXNpb24gUmVwb1xyXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJldmlzaW9uUmVwb1xyXG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCdyZXYnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3Jldi5jb3JyZXNwb25kZW5jZScsICdjb3JyJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdjb3JyLnR5cGUnLCAndHlwZScpXHJcbiAgICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdCgnY29yci5wcm9qZWN0JywgJ3Byb2plY3QnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ2NvcnIub3JpZ2luYXRvcicsICdvcmcnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3Jldi5zdGF0dXMnLCAnc3RhdHVzJyk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGJ5IFJldmlzaW9uIFN0YXR1c1xyXG4gICAgY29uc3QgcmV2U3RhdHVzID0gc2VhcmNoRHRvLnJldmlzaW9uU3RhdHVzIHx8ICdDVVJSRU5UJztcclxuXHJcbiAgICBpZiAocmV2U3RhdHVzID09PSAnQ1VSUkVOVCcpIHtcclxuICAgICAgcXVlcnkud2hlcmUoJ3Jldi5pc0N1cnJlbnQgPSA6aXNDdXJyZW50JywgeyBpc0N1cnJlbnQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHJldlN0YXR1cyA9PT0gJ09MRCcpIHtcclxuICAgICAgcXVlcnkud2hlcmUoJ3Jldi5pc0N1cnJlbnQgPSA6aXNDdXJyZW50JywgeyBpc0N1cnJlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgJ0FMTCcsIG5vIGZpbHRlciBuZWVkZWQgb24gaXNDdXJyZW50XHJcblxyXG4gICAgaWYgKHByb2plY3RJZCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnY29yci5wcm9qZWN0SWQgPSA6cHJvamVjdElkJywgeyBwcm9qZWN0SWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVJZCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnY29yci5jb3JyZXNwb25kZW5jZVR5cGVJZCA9IDp0eXBlSWQnLCB7IHR5cGVJZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdHVzSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3Jldi5zdGF0dXNJZCA9IDpzdGF0dXNJZCcsIHsgc3RhdHVzSWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXR1cykge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgnc3RhdHVzLnN0YXR1c0NvZGUgPSA6c3RhdHVzJywgeyBzdGF0dXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlYXJjaCkge1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZShcclxuICAgICAgICAnKGNvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXIgTElLRSA6c2VhcmNoIE9SIHJldi5zdWJqZWN0IExJS0UgOnNlYXJjaCknLFxyXG4gICAgICAgIHsgc2VhcmNoOiBgJSR7c2VhcmNofSVgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWZhdWx0IFNvcnQ6IExhdGVzdCBDcmVhdGVkXHJcbiAgICBxdWVyeS5vcmRlckJ5KCdyZXYuY3JlYXRlZEF0JywgJ0RFU0MnKS5za2lwKHNraXApLnRha2UobGltaXQpO1xyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgcXVlcnkuZ2V0TWFueUFuZENvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0YTogaXRlbXMsXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICB0b3RhbCxcclxuICAgICAgICBwYWdlLFxyXG4gICAgICAgIGxpbWl0LFxyXG4gICAgICAgIHRvdGFsUGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdyZXZpc2lvbnMnLFxyXG4gICAgICAgICdyZXZpc2lvbnMuc3RhdHVzJyxcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJywgLy8gW3YxLjUuMV0gRml4ZWQgcmVsYXRpb24gbmFtZVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFjb3JyZXNwb25kZW5jZSkge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYENvcnJlc3BvbmRlbmNlIHdpdGggSUQgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29ycmVzcG9uZGVuY2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lQnlVdWlkKHB1YmxpY0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHB1YmxpY0lkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdyZXZpc2lvbnMnLFxyXG4gICAgICAgICdyZXZpc2lvbnMuc3RhdHVzJyxcclxuICAgICAgICAncmV2aXNpb25zLmF0dGFjaG1lbnRMaW5rcycsICAgICAgICAgICAgIC8vIFtGSVggdjEuOC4xXSDguYLguKvguKXguJQganVuY3Rpb25cclxuICAgICAgICAncmV2aXNpb25zLmF0dGFjaG1lbnRMaW5rcy5hdHRhY2htZW50JywgIC8vIFtGSVggdjEuOC4xXSDguYLguKvguKXguJQgYXR0YWNobWVudCDguIjguKPguLTguIdcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJyxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDb3JyZXNwb25kZW5jZSB3aXRoIFVVSUQgJHtwdWJsaWNJZH0gbm90IGZvdW5kYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKGlkOiBudW1iZXIsIGR0bzogQWRkUmVmZXJlbmNlRHRvKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgdGFyZ2V0IHB1YmxpY0lkIOKGkiBpbnRlcm5hbCBJTlQgaWRcclxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogZHRvLnRhcmdldFV1aWQgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdTb3VyY2Ugb3IgVGFyZ2V0IGNvcnJlc3BvbmRlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzb3VyY2UuaWQgPT09IHRhcmdldC5pZCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQ2Fubm90IHJlZmVyZW5jZSBzZWxmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHNvdXJjZUlkOiBpZCxcclxuICAgICAgICB0YXJnZXRJZDogdGFyZ2V0LmlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICByZXR1cm4gZXhpc3RzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZiA9IHRoaXMucmVmZXJlbmNlUmVwby5jcmVhdGUoe1xyXG4gICAgICBzb3VyY2VJZDogaWQsXHJcbiAgICAgIHRhcmdldElkOiB0YXJnZXQuaWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VSZXBvLnNhdmUocmVmKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShpZDogbnVtYmVyLCB0YXJnZXRJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZGVsZXRlKHtcclxuICAgICAgc291cmNlSWQ6IGlkLFxyXG4gICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignUmVmZXJlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGFncyhpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy50YWdSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBjb3JyZXNwb25kZW5jZUlkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsndGFnJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci50YWcpLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFRhZyhpZDogbnVtYmVyLCB0YWdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWNvcnJlc3BvbmRlbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQ29ycmVzcG9uZGVuY2UgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShUYWcsIHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdGFnKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVGFnICR7dGFnSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMudGFnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgY29ycmVzcG9uZGVuY2VJZDogaWQsIHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChleGlzdHMpIHJldHVybiBleGlzdHM7XHJcblxyXG4gICAgY29uc3Qgcm93ID0gdGhpcy50YWdSZXBvLmNyZWF0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkLCB0YWdJZCB9KTtcclxuICAgIHJldHVybiB0aGlzLnRhZ1JlcG8uc2F2ZShyb3cpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlVGFnKGlkOiBudW1iZXIsIHRhZ0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFnUmVwby5kZWxldGUoeyBjb3JyZXNwb25kZW5jZUlkOiBpZCwgdGFnSWQgfSk7XHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignVGFnIGFzc2lnbm1lbnQgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSZWZlcmVuY2VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG91dGdvaW5nID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBzb3VyY2VJZDogaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3RhcmdldCcsICd0YXJnZXQudHlwZSddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5jb21pbmcgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7IHRhcmdldElkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnc291cmNlJywgJ3NvdXJjZS50eXBlJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBvdXRnb2luZywgaW5jb21pbmcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZShpZDogbnVtYmVyLCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyAxLiBGaW5kIEN1cnJlbnQgUmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uID0gYXdhaXQgdGhpcy5yZXZpc2lvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDdXJyZW50IHJldmlzaW9uIGZvciBjb3JyZXNwb25kZW5jZSAke2lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQ2hlY2sgUGVybWlzc2lvblxyXG4gICAgaWYgKHJldmlzaW9uLnN0YXR1c0lkKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgICB3aGVyZTogeyBpZDogcmV2aXNpb24uc3RhdHVzSWQgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5zdGF0dXNDb2RlICE9PSAnRFJBRlQnKSB7XHJcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyhcclxuICAgICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2FuRWRpdFN1Ym1pdHRlZE9yTGF0ZXIgPVxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpIHx8XHJcbiAgICAgICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5FZGl0U3VibWl0dGVkT3JMYXRlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgJ09ubHkgT3JnIEFkbWluIG9yIFN1cGVyYWRtaW4gY2FuIGVkaXQgbm9uLWRyYWZ0IGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXMgaW4gdXBkYXRlIERUT1xyXG4gICAgY29uc3QgdXBkUmVzb2x2ZWRQcm9qZWN0SWQgPSB1cGRhdGVEdG8ucHJvamVjdElkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCh1cGRhdGVEdG8ucHJvamVjdElkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID0gdXBkYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCh1cGRhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkUmVjaXBpZW50cyA9IHVwZGF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICB1cGRhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gMy4gVXBkYXRlIENvcnJlc3BvbmRlbmNlIEVudGl0eSBpZiBuZWVkZWRcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlVXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLmRpc2NpcGxpbmVJZCA9IHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQ7XHJcbiAgICBpZiAodXBkUmVzb2x2ZWRQcm9qZWN0SWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLnByb2plY3RJZCA9IHVwZFJlc29sdmVkUHJvamVjdElkO1xyXG4gICAgaWYgKHVwZFJlc29sdmVkT3JpZ2luYXRvcklkKVxyXG4gICAgICBjb3JyZXNwb25kZW5jZVVwZGF0ZS5vcmlnaW5hdG9ySWQgPSB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29ycmVzcG9uZGVuY2VVcGRhdGUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8udXBkYXRlKGlkLCBjb3JyZXNwb25kZW5jZVVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gVXBkYXRlIFJldmlzaW9uIEVudGl0eVxyXG4gICAgY29uc3QgcmV2aXNpb25VcGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBpZiAodXBkYXRlRHRvLnN1YmplY3QpIHJldmlzaW9uVXBkYXRlLnN1YmplY3QgPSB1cGRhdGVEdG8uc3ViamVjdDtcclxuICAgIGlmICh1cGRhdGVEdG8uYm9keSkgcmV2aXNpb25VcGRhdGUuYm9keSA9IHVwZGF0ZUR0by5ib2R5O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5yZW1hcmtzKSByZXZpc2lvblVwZGF0ZS5yZW1hcmtzID0gdXBkYXRlRHRvLnJlbWFya3M7XHJcbiAgICAvLyBGb3JtYXQgRGF0ZSBjb3JyZWN0bHkgaWYgc3RyaW5nXHJcbiAgICBpZiAodXBkYXRlRHRvLmR1ZURhdGUpIHJldmlzaW9uVXBkYXRlLmR1ZURhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uZHVlRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUuZG9jdW1lbnREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgIHJldmlzaW9uVXBkYXRlLmlzc3VlZERhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uaXNzdWVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUucmVjZWl2ZWREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRlc2NyaXB0aW9uKVxyXG4gICAgICByZXZpc2lvblVwZGF0ZS5kZXNjcmlwdGlvbiA9IHVwZGF0ZUR0by5kZXNjcmlwdGlvbjtcclxuICAgIGlmICh1cGRhdGVEdG8uZGV0YWlscykgcmV2aXNpb25VcGRhdGUuZGV0YWlscyA9IHVwZGF0ZUR0by5kZXRhaWxzO1xyXG5cclxuICAgIGlmIChPYmplY3Qua2V5cyhyZXZpc2lvblVwZGF0ZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby51cGRhdGUocmV2aXNpb24uaWQsIHJldmlzaW9uVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LjUgQ29tbWl0IG5ldyBhdHRhY2htZW50cyBmcm9tIFRlbXAg4oaSIFBlcm1hbmVudCAoVHdvLVBoYXNlIFN0b3JhZ2UpXHJcbiAgICBpZiAodXBkYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgaXNzdWVEYXRlID0gdXBkYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKHVwZGF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgIDogdXBkYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZSh1cGRhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgOiByZXZpc2lvbi5pc3N1ZWREYXRlIHx8IHJldmlzaW9uLmRvY3VtZW50RGF0ZSB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAvLyBbRklYIHYxLjguMV0gY29tbWl0IOC5hOC4lOC5iSBBdHRhY2htZW50IHJlY29yZHMg4LiB4Lil4Lix4Lia4Lih4LiyIOKGkiDguJrguLHguJnguJfguLbguIEganVuY3Rpb25cclxuICAgICAgY29uc3QgY29tbWl0dGVkID0gYXdhaXQgdGhpcy5maWxlU3RvcmFnZVNlcnZpY2UuY29tbWl0KFxyXG4gICAgICAgIHVwZGF0ZUR0by5hdHRhY2htZW50VGVtcElkcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpc3N1ZURhdGU6IGlzc3VlRGF0ZSA/IG5ldyBEYXRlKGlzc3VlRGF0ZSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBkb2N1bWVudFR5cGU6ICdDb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGNvbW1pdHRlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBjb21taXR0ZWQubWFwKChhdHQpID0+XHJcbiAgICAgICAgICB0aGlzLnJldkF0dGFjaFJlcG8uY3JlYXRlKHtcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkOiByZXZpc2lvbi5pZCxcclxuICAgICAgICAgICAgYXR0YWNobWVudElkOiBhdHQuaWQsXHJcbiAgICAgICAgICAgIGlzTWFpbkRvY3VtZW50OiBmYWxzZSwgLy8g4LmE4Lif4Lil4LmM4LiX4Li14LmIIHVwbG9hZCDguYDguJ7guLTguYjguKHguYDguJXguLTguKHguYTguKHguYjguYPguIrguYggbWFpblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmV2QXR0YWNoUmVwby5zYXZlKGxpbmtzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIFVwZGF0ZSBSZWNpcGllbnRzIGlmIHByb3ZpZGVkXHJcbiAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudFJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJlY2lwaWVudFxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLmRlbGV0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3UmVjaXBpZW50cyA9IHVwZFJlc29sdmVkUmVjaXBpZW50cy5tYXAoKHIpID0+XHJcbiAgICAgICAgcmVjaXBpZW50UmVwby5jcmVhdGUoe1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogci5vcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgIHJlY2lwaWVudFR5cGU6IHIudHlwZSxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLnNhdmUobmV3UmVjaXBpZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNi4gUmVnZW5lcmF0ZSBEb2N1bWVudCBOdW1iZXIgaWYgc3RydWN0dXJhbCBmaWVsZHMgY2hhbmdlZCAoUmVjaXBpZW50LCBEaXNjaXBsaW5lLCBUeXBlLCBQcm9qZWN0KVxyXG4gICAgLy8gQU5EIGl0IGlzIGEgRFJBRlQuXHJcblxyXG4gICAgLy8gRmV0Y2ggZnJlc2ggZGF0YSBmb3IgY29udGV4dCBhbmQgY29tcGFyaXNvblxyXG4gICAgY29uc3QgY3VycmVudENvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3R5cGUnLCAncmVjaXBpZW50cycsICdyZWNpcGllbnRzLnJlY2lwaWVudE9yZ2FuaXphdGlvbiddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRDb3JyKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUb1JlY2lwaWVudCA9IGN1cnJlbnRDb3JyLnJlY2lwaWVudHM/LmZpbmQoXHJcbiAgICAgICAgKHIpID0+IHIucmVjaXBpZW50VHlwZSA9PT0gJ1RPJ1xyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjdXJyZW50UmVjaXBpZW50SWQgPSBjdXJyZW50VG9SZWNpcGllbnQ/LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgZm9yIEFDVFVBTCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgIGNvbnN0IGlzUHJvamVjdENoYW5nZWQgPVxyXG4gICAgICAgIHVwZFJlc29sdmVkUHJvamVjdElkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRSZXNvbHZlZFByb2plY3RJZCAhPT0gY3VycmVudENvcnIucHJvamVjdElkO1xyXG4gICAgICBjb25zdCBpc09yaWdpbmF0b3JDaGFuZ2VkID1cclxuICAgICAgICB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgIT09IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZDtcclxuICAgICAgY29uc3QgaXNEaXNjaXBsaW5lQ2hhbmdlZCA9XHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gY3VycmVudENvcnIuZGlzY2lwbGluZUlkO1xyXG4gICAgICBjb25zdCBpc1R5cGVDaGFuZ2VkID1cclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZVR5cGVJZDtcclxuXHJcbiAgICAgIGxldCBpc1JlY2lwaWVudENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgbGV0IG5ld1JlY2lwaWVudElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VG9SZWNpcGllbnQgPSB1cGRSZXNvbHZlZFJlY2lwaWVudHMuZmluZChcclxuICAgICAgICAgIChyKSA9PiByLnR5cGUgPT09ICdUTydcclxuICAgICAgICApO1xyXG4gICAgICAgIG5ld1JlY2lwaWVudElkID0gbmV3VG9SZWNpcGllbnQ/Lm9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgICBpZiAobmV3UmVjaXBpZW50SWQgIT09IGN1cnJlbnRSZWNpcGllbnRJZCkge1xyXG4gICAgICAgICAgaXNSZWNpcGllbnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc1Byb2plY3RDaGFuZ2VkIHx8XHJcbiAgICAgICAgaXNEaXNjaXBsaW5lQ2hhbmdlZCB8fFxyXG4gICAgICAgIGlzVHlwZUNoYW5nZWQgfHxcclxuICAgICAgICBpc1JlY2lwaWVudENoYW5nZWQgfHxcclxuICAgICAgICBpc09yaWdpbmF0b3JDaGFuZ2VkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFJlY2lwaWVudElkID0gaXNSZWNpcGllbnRDaGFuZ2VkXHJcbiAgICAgICAgICA/IG5ld1JlY2lwaWVudElkXHJcbiAgICAgICAgICA6IGN1cnJlbnRSZWNpcGllbnRJZDtcclxuXHJcbiAgICAgICAgLy8gUmVzb2x2ZSBSZWNpcGllbnQgQ29kZSBmb3IgdGhlIE5FVyBjb250ZXh0XHJcbiAgICAgICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgICAgICBpZiAodGFyZ2V0UmVjaXBpZW50SWQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlY09yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoT3JnYW5pemF0aW9uLCB7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiB0YXJnZXRSZWNpcGllbnRJZCB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAocmVjT3JnKSByZWNpcGllbnRDb2RlID0gcmVjT3JnLm9yZ2FuaXphdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBbRml4ICM2XSBGZXRjaCByZWFsIE9SRyBDb2RlIGZyb20gb3JpZ2luYXRvciBvcmdhbml6YXRpb25cclxuICAgICAgICBjb25zdCBvcmlnaW5hdG9yT3JnRm9yVXBkYXRlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShcclxuICAgICAgICAgIE9yZ2FuaXphdGlvbixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgICAgICBpZDogdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgPz8gY3VycmVudENvcnIub3JpZ2luYXRvcklkID8/IDAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBvcmdDb2RlID0gb3JpZ2luYXRvck9yZ0ZvclVwZGF0ZT8ub3JnYW5pemF0aW9uQ29kZSA/PyAnVU5LJztcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSBDb250ZXh0c1xyXG4gICAgICAgIGNvbnN0IG9sZEN0eCA9IHtcclxuICAgICAgICAgIHByb2plY3RJZDogY3VycmVudENvcnIucHJvamVjdElkLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdXJyZW50Q29yci5vcmlnaW5hdG9ySWQgPz8gMCxcclxuICAgICAgICAgIHR5cGVJZDogY3VycmVudENvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjdXJyZW50UmVjaXBpZW50SWQsXHJcbiAgICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xyXG4gICAgICAgICAgcHJvamVjdElkOiB1cGRSZXNvbHZlZFByb2plY3RJZCA/PyBjdXJyZW50Q29yci5wcm9qZWN0SWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6XHJcbiAgICAgICAgICAgIHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID8/IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZCA/PyAwLFxyXG4gICAgICAgICAgdHlwZUlkOiB1cGRhdGVEdG8udHlwZUlkID8/IGN1cnJlbnRDb3JyLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiB1cGRhdGVEdG8uZGlzY2lwbGluZUlkID8/IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiB0YXJnZXRSZWNpcGllbnRJZCxcclxuICAgICAgICAgIHllYXI6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyX2lkLCAvLyBQYXNzIFVzZXIgSUQgZm9yIEF1ZGl0XHJcbiAgICAgICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICAgICAgVFlQRV9DT0RFOiBjdXJyZW50Q29yci50eXBlPy50eXBlQ29kZSB8fCAnJyxcclxuICAgICAgICAgICAgT1JHX0NPREU6IG9yZ0NvZGUsXHJcbiAgICAgICAgICAgIFJFQ0lQSUVOVF9DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgICBSRUNfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gSWYgVHlwZSBDaGFuZ2VkLCBuZWVkIE5FVyBUeXBlIENvZGVcclxuICAgICAgICBpZiAoaXNUeXBlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiBuZXdDdHgudHlwZUlkIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChuZXdUeXBlKSBuZXdDdHguY3VzdG9tVG9rZW5zLlRZUEVfQ09ERSA9IG5ld1R5cGUudHlwZUNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdEb2NOdW1iZXIgPSBhd2FpdCB0aGlzLm51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQoXHJcbiAgICAgICAgICBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICAgIG9sZEN0eCxcclxuICAgICAgICAgIG5ld0N0eFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLnVwZGF0ZShpZCwge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IG5ld0RvY051bWJlcixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmZpbmRPbmUoaWQpO1xyXG5cclxuICAgIC8vIFJlLWluZGV4IHVwZGF0ZWQgZG9jdW1lbnQgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgdm9pZCB0aGlzLnNlYXJjaFNlcnZpY2UuaW5kZXhEb2N1bWVudCh7XHJcbiAgICAgIGlkOiB1cGRhdGVkLmlkLFxyXG4gICAgICBwdWJsaWNJZDogdXBkYXRlZC5wdWJsaWNJZCxcclxuICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgZG9jTnVtYmVyOiB1cGRhdGVkLmNvcnJlc3BvbmRlbmNlTnVtYmVyLFxyXG4gICAgICB0aXRsZTogdXBkYXRlRHRvLnN1YmplY3QgPz8gdXBkYXRlZC5yZXZpc2lvbnM/LlswXT8uc3ViamVjdCxcclxuICAgICAgZGVzY3JpcHRpb246IHVwZGF0ZUR0by5kZXNjcmlwdGlvbiA/PyB1cGRhdGVkLnJldmlzaW9ucz8uWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgc3RhdHVzOiAnRFJBRlQnLFxyXG4gICAgICBwcm9qZWN0SWQ6IHVwZGF0ZWQucHJvamVjdElkLFxyXG4gICAgICBjcmVhdGVkQXQ6IHVwZGF0ZWQuY3JlYXRlZEF0LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcmV2aWV3RG9jdW1lbnROdW1iZXIoY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0bywgdXNlcjogVXNlcikge1xyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXNcclxuICAgIGNvbnN0IHByZXZpZXdQcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKFxyXG4gICAgICBjcmVhdGVEdG8ucHJvamVjdElkXHJcbiAgICApO1xyXG4gICAgY29uc3QgcHJldmlld09yaWdpbmF0b3JJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwcmV2aWV3UmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICBjcmVhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkOiBjcmVhdGVEdG8udHlwZUlkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdEb2N1bWVudCBUeXBlIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGxldCB1c2VyT3JnSWQgPSB1c2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmV2aWV3T3JpZ2luYXRvcklkICYmIHByZXZpZXdPcmlnaW5hdG9ySWQgIT09IHVzZXJPcmdJZCkge1xyXG4gICAgICAvLyBBbGxvdyBpbXBlcnNvbmF0aW9uIGZvciBwcmV2aWV3XHJcbiAgICAgIHVzZXJPcmdJZCA9IHByZXZpZXdPcmlnaW5hdG9ySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCByZWNpcGllbnQgZnJvbSByZWNpcGllbnRzIGFycmF5XHJcbiAgICBjb25zdCB0b1JlY2lwaWVudCA9IHByZXZpZXdSZWNpcGllbnRzPy5maW5kKChyKSA9PiByLnR5cGUgPT09ICdUTycpO1xyXG4gICAgY29uc3QgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQgPSB0b1JlY2lwaWVudD8ub3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgIGlmIChyZWNpcGllbnRPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICBjb25zdCByZWNPcmcgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKE9yZ2FuaXphdGlvbiwge1xyXG4gICAgICAgIHdoZXJlOiB7IGlkOiByZWNpcGllbnRPcmdhbml6YXRpb25JZCB9LFxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHJlY09yZykgcmVjaXBpZW50Q29kZSA9IHJlY09yZy5vcmdhbml6YXRpb25Db2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1NlcnZpY2UucHJldmlld051bWJlcih7XHJcbiAgICAgIHByb2plY3RJZDogcHJldmlld1Byb2plY3RJZCxcclxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiB1c2VyT3JnSWQhLFxyXG4gICAgICB0eXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjcmVhdGVEdG8uc3ViVHlwZUlkLFxyXG4gICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICBUWVBFX0NPREU6IHR5cGUudHlwZUNvZGUsXHJcbiAgICAgICAgUkVDSVBJRU5UX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgUkVDX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGUgSW1wbGVtZW50YXRpb246IEVDLUNPUlItMDAxIC0gQ2FuY2VsIENvcnJlc3BvbmRlbmNlIHdpdGggRG93bnN0cmVhbSBDaXJjdWxhdGlvblxyXG4gICAqIENhbmNlbCBjb3JyZXNwb25kZW5jZSBhbmQgaGFuZGxlIHJlbGF0ZWQgY2lyY3VsYXRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY2FuY2VsKHB1YmxpY0lkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCB1c2VyOiBVc2VyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuZmluZE9uZUJ5VXVpZChwdWJsaWNJZCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjYW5jZWwgKE9yZyBBZG1pbiBvciBTdXBlcmFkbWluIG9ubHkpXHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKHVzZXIudXNlcl9pZCk7XHJcbiAgICBjb25zdCBjYW5DYW5jZWwgPVxyXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnY29ycmVzcG9uZGVuY2UuY2FuY2VsJykgfHxcclxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3N5c3RlbS5tYW5hZ2VfYWxsJyk7XHJcblxyXG4gICAgaWYgKCFjYW5DYW5jZWwpIHtcclxuICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAnT25seSBhZG1pbmlzdHJhdG9ycyBjYW4gY2FuY2VsIGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgIGNvbnN0IGNpcmN1bGF0aW9uUmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KCdDaXJjdWxhdGlvbicpO1xyXG4gICAgY29uc3QgYWN0aXZlQ2lyY3VsYXRpb25zID0gYXdhaXQgY2lyY3VsYXRpb25SZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgIHN0YXR1czogJ09QRU4nLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPVxyXG4gICAgICBhY3RpdmVDaXJjdWxhdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgICAgID8gYFRoZXJlIGFyZSAke2FjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGh9IGFjdGl2ZSBjaXJjdWxhdGlvbihzKSBmb3IgdGhpcyBjb3JyZXNwb25kZW5jZS4gQ2FuY2VsaW5nIHdpbGwgZm9yY2UgY2xvc2UgYWxsIHJlbGF0ZWQgY2lyY3VsYXRpb25zLmBcclxuICAgICAgICA6ICcnO1xyXG5cclxuICAgIC8vIEdldCB0aGUgY3VycmVudCByZXZpc2lvbiB0byB1cGRhdGUgc3RhdHVzXHJcbiAgICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWN1cnJlbnRSZXZpc2lvbikge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0N1cnJlbnQgcmV2aXNpb24gbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGNhbmNlbGxlZCBzdGF0dXNcclxuICAgIGNvbnN0IGNhbmNlbGxlZFN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgc3RhdHVzQ29kZTogJ0NBTkNFTExFRCcgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY2FuY2VsbGVkU3RhdHVzKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCdDQU5DRUxMRUQgc3RhdHVzIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVXBkYXRlIGNvcnJlc3BvbmRlbmNlIHJldmlzaW9uIHN0YXR1cyB0byBDQU5DRUxMRURcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBjdXJyZW50UmV2aXNpb24uaWQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc3RhdHVzSWQ6IGNhbmNlbGxlZFN0YXR1cy5pZCxcclxuICAgICAgICAgIHJlbWFya3M6IGBDYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gRm9yY2UgY2xvc2UgYWxsIGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgICAgaWYgKGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgICAnQ2lyY3VsYXRpb24nLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiAnT1BFTicsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzdGF0dXM6ICdGT1JDRV9DTE9TRUQnLFxyXG4gICAgICAgICAgICBjbG9zZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgY2xvc2VkQnk6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICAgICAgY2xvc2VSZWFzb246IGBDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIFJlLWluZGV4IGNhbmNlbGxlZCBzdGF0dXMgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgICBpZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcHVibGljSWQ6IGNvcnJlc3BvbmRlbmNlLnB1YmxpY0lkLFxyXG4gICAgICAgIHR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgZG9jTnVtYmVyOiBjb3JyZXNwb25kZW5jZS5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICB0aXRsZTogY3VycmVudFJldmlzaW9uLnN1YmplY3QsXHJcbiAgICAgICAgc3RhdHVzOiAnQ0FOQ0VMTEVEJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IGNvcnJlc3BvbmRlbmNlLnByb2plY3RJZCxcclxuICAgICAgICBjcmVhdGVkQXQ6IGNvcnJlc3BvbmRlbmNlLmNyZWF0ZWRBdCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBOb3RpZnkgb3JpZ2luYXRvcidzIGRvYy1jb250cm9sIHVzZXIgYWJvdXQgY2FuY2VsbGF0aW9uIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIGlmIChjb3JyZXNwb25kZW5jZS5vcmlnaW5hdG9ySWQpIHtcclxuICAgICAgICB2b2lkIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgIC5maW5kRG9jQ29udHJvbElkQnlPcmcoY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcklkKVxyXG4gICAgICAgICAgLnRoZW4oKHRhcmdldFVzZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0VXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29ycmVzcG9uZGVuY2UgQ2FuY2VsbGVkJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke2NvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlTnVtYmVyfSDigJQgJHtjdXJyZW50UmV2aXNpb24uc3ViamVjdH0gaGFzIGJlZW4gY2FuY2VsbGVkLiBSZWFzb246ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnRU1BSUwnLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgICAgIGxpbms6IGAvY29ycmVzcG9uZGVuY2VzLyR7Y29ycmVzcG9uZGVuY2UucHVibGljSWR9YCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT5cclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgQ2FuY2VsIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBtZXNzYWdlOiB3YXJuaW5nTWVzc2FnZSB8fCAnQ29ycmVzcG9uZGVuY2UgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgICAgICAgYWN0aXZlQ2lyY3VsYXRpb25zQ291bnQ6IGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gY2FuY2VsIGNvcnJlc3BvbmRlbmNlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYnVsa0NhbmNlbChcclxuICAgIHB1YmxpY0lkczogc3RyaW5nW10sXHJcbiAgICByZWFzb246IHN0cmluZyxcclxuICAgIHVzZXI6IFVzZXJcclxuICApOiBQcm9taXNlPHsgc3VjY2VlZGVkOiBzdHJpbmdbXTsgZmFpbGVkOiBzdHJpbmdbXSB9PiB7XHJcbiAgICBjb25zdCBzdWNjZWVkZWQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBmYWlsZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBwdWJsaWNJZCBvZiBwdWJsaWNJZHMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbChwdWJsaWNJZCwgcmVhc29uLCB1c2VyKTtcclxuICAgICAgICBzdWNjZWVkZWQucHVzaChwdWJsaWNJZCk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGZhaWxlZC5wdXNoKHB1YmxpY0lkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHN1Y2NlZWRlZCwgZmFpbGVkIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBleHBvcnRDc3Yoc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZmluZEFsbChzZWFyY2hEdG8pO1xyXG5cclxuICAgIGNvbnN0IGhlYWRlciA9IFtcclxuICAgICAgJ0RvY3VtZW50IE5vLicsXHJcbiAgICAgICdSZXYnLFxyXG4gICAgICAnU3ViamVjdCcsXHJcbiAgICAgICdUeXBlJyxcclxuICAgICAgJ1N0YXR1cycsXHJcbiAgICAgICdQcm9qZWN0JyxcclxuICAgICAgJ0Zyb20nLFxyXG4gICAgICAnRHVlIERhdGUnLFxyXG4gICAgICAnQ3JlYXRlZCBBdCcsXHJcbiAgICBdO1xyXG4gICAgY29uc3Qgcm93cyA9IGRhdGEubWFwKChyZXYpID0+IHtcclxuICAgICAgY29uc3QgY29yciA9IHJldi5jb3JyZXNwb25kZW5jZSA/PyAocmV2IGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXIgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5yZXZpc2lvbkxhYmVsID8/IFN0cmluZyhyZXYucmV2aXNpb25OdW1iZXIgPz8gMCkpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5zdWJqZWN0ID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnR5cGU/LnR5cGVDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihyZXYuc3RhdHVzPy5zdGF0dXNDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnByb2plY3Q/LnByb2plY3RDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLm9yaWdpbmF0b3I/Lm9yZ2FuaXphdGlvbkNvZGUgPz8gJycpLFxyXG4gICAgICAgIHJldi5kdWVEYXRlID8gbmV3IERhdGUocmV2LmR1ZURhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSA6ICcnLFxyXG4gICAgICAgIG5ldyBEYXRlKHJldi5jcmVhdGVkQXQpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSxcclxuICAgICAgXS5qb2luKCcsJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gW2hlYWRlci5qb2luKCcsJyksIC4uLnJvd3NdLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVDc3YodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSB8fCB2YWx1ZS5pbmNsdWRlcygnXCInKSB8fCB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcclxuICAgICAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e.map new file mode 100644 index 0000000..f4fef1e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/correspondenceservice_c352f059c6548dcde16c17585f69c20e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts","mappings":";AAAA,6DAA6D;;;;;;;;;;;;;;;;;AAE7D,2CAOwB;AACxB,6CAAmD;AACnD,qCAAiD;AAEjD,WAAW;AACX,4EAAkE;AAClE,8FAAmF;AACnF,sFAA2E;AAC3E,0FAA+E;AAC/E,gGAAqF;AACrF,gGAAqF;AACrF,oFAAyE;AACzE,8DAAoD;AAEpD,sFAA4E;AAC5E,oHAAwG;AAQxG,WAAW;AACX,0GAAqG;AACrG,4EAAuE;AACvE,wFAAmF;AACnF,uDAAmD;AACnD,6DAAyD;AACzD,yFAAoF;AACpF,uFAAkF;AAClF,+EAA2E;AAUpE,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAGxB,KAAK,CAAC,4BAA4B,CAAC,MAAc;QACvD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACK,uBAAuB,CAAC,QAAgB;QAC9C,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACnD,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACtC,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,oCAAoC;IACxD,CAAC;IAED,YAEE,kBAAsD,EAEtD,YAAwD,EAExD,QAAgD,EAEhD,UAAoD,EAEpD,aAA0D,EAE1D,OAA8C,EACtC,gBAA0C,EAC1C,iBAAoC,EACpC,cAAqC,EACrC,WAAwB,EACxB,UAAsB,EACtB,aAA4B,EAC5B,kBAAsC,EACtC,YAAiC,EACjC,mBAAwC,EAEhD,aAAmE;QArB3D,uBAAkB,GAAlB,kBAAkB,CAA4B;QAE9C,iBAAY,GAAZ,YAAY,CAAoC;QAEhD,aAAQ,GAAR,QAAQ,CAAgC;QAExC,eAAU,GAAV,UAAU,CAAkC;QAE5C,kBAAa,GAAb,aAAa,CAAqC;QAElD,YAAO,GAAP,OAAO,CAA+B;QACtC,qBAAgB,GAAhB,gBAAgB,CAA0B;QAC1C,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,mBAAc,GAAd,cAAc,CAAuB;QACrC,gBAAW,GAAX,WAAW,CAAa;QACxB,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,iBAAY,GAAZ,YAAY,CAAqB;QACjC,wBAAmB,GAAnB,mBAAmB,CAAqB;QAExC,kBAAa,GAAb,aAAa,CAA8C;QA3CpD,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IA4C9D,CAAC;IAEJ;;;OAGG;IACK,KAAK,CAAC,gCAAgC,CAC5C,SAAkC,EAClC,IAAU;QAEV,0BAA0B;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,GAAG,QAAQ,CAAC,qBAAqB,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAC1D,IAAI,CAAC,OAAO,CACb,CAAC;gBACF,IAAI,YAAY,EAAE,CAAC;oBACjB,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CACvD,SAAS,CAAC,YAAY,CACvB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,4BAAmB,CAC3B,yDAAyD,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY;YAC5C,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QAEd,uCAAuC;QACvC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,yDAAyD;YACzD,MAAM,IAAI,4BAAmB,CAC3B,gFAAgF,CACjF,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,4BAAmB,CAC3B,+CAA+C,CAChD,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEzE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,4BAAmB,CAC3B,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAClE,SAAS,CAAC,cAAc,CACzB,CAAC;YAEF,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;gBACvC,MAAM,IAAI,4BAAmB,CAC3B,wGAAwG,CACzG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkC,EAAE,IAAU;QACzD,iEAAiE;QACjE,MAAM,IAAI,CAAC,gCAAgC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7D,uDAAuD;QACvD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAChE,SAAS,CAAC,SAAS,CACpB,CAAC;QACF,MAAM,oBAAoB,GAAG,SAAS,CAAC,YAAY;YACjD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,kBAAkB,GAAG,SAAS,CAAC,UAAU;YAC7C,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,UAAU,CAAC,GAAG,CACtB,KAAK,EAAE,CAAC,EAA8B,EAAE,CAAC,CAAC;gBACxC,cAAc,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAC3D,CAAC,CAAC,cAAc,CACjB;gBACD,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CACH,CACF;YACH,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvC,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAChD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,qCAA4B,CACpC,uCAAuC,CACxC,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAE3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,GAAG,QAAQ,CAAC,qBAAqB,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,IAAI,oBAAoB,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAC1D,IAAI,CAAC,OAAO,CACb,CAAC;YACF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,2BAAkB,CAC1B,kFAAkF,CACnF,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,oBAAoB,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,4BAAmB,CAC3B,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,iCAAiC,IAAI,CAAC,QAAQ,KAAM,KAAe,CAAC,OAAO,EAAE,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACxD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,wDAAwD;YACxD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CACzD,kCAAY,EACZ;gBACE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;aACzB,CACF,CAAC;YACF,MAAM,OAAO,GAAG,aAAa,EAAE,gBAAgB,IAAI,KAAK,CAAC;YAEzD,6EAA6E;YAC7E,MAAM,WAAW,GAAG,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACrE,MAAM,uBAAuB,GAAG,WAAW,EAAE,cAAc,CAAC;YAE5D,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAY,EAAE;oBACjE,KAAK,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE;iBACvC,CAAC,CAAC;gBACH,IAAI,MAAM;oBAAE,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACtD,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;gBAC/D,SAAS,EAAE,iBAAiB;gBAC5B,wBAAwB,EAAE,SAAS;gBACnC,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,uBAAuB,EAAE,qDAAqD;gBAC9E,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC9B,YAAY,EAAE;oBACZ,SAAS,EAAE,IAAI,CAAC,QAAQ;oBACxB,QAAQ,EAAE,OAAO;oBACjB,cAAc,EAAE,aAAa;oBAC7B,QAAQ,EAAE,aAAa;iBACxB;aACF,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,sCAAc,EAAE;gBAChE,oBAAoB,EAAE,SAAS,CAAC,MAAM;gBACtC,oBAAoB,EAAE,SAAS,CAAC,MAAM;gBACtC,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,SAAS,EAAE,iBAAiB;gBAC5B,YAAY,EAAE,SAAS;gBACvB,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,KAAK;gBACzC,SAAS,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,uDAAsB,EAAE;gBAClE,gBAAgB,EAAE,SAAS,CAAC,EAAE;gBAC9B,cAAc,EAAE,CAAC;gBACjB,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC1D,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,WAAW,CAAC,EAAE;gBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,YAAY,EAAE,SAAS,CAAC,YAAY;oBAClC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBAClC,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,SAAS,CAAC,UAAU;oBAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;oBAChC,CAAC,CAAC,SAAS;gBACb,YAAY,EAAE,SAAS,CAAC,YAAY;oBAClC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBAClC,CAAC,CAAC,SAAS;gBACb,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,aAAa,EAAE,CAAC;aACjB,CAAC,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEzC,2CAA2C;YAC3C,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9C,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,yDAAuB,EAAE;oBAClD,gBAAgB,EAAE,SAAS,CAAC,EAAE;oBAC9B,uBAAuB,EAAE,CAAC,CAAC,cAAc;oBACzC,aAAa,EAAE,CAAC,CAAC,IAAI;iBACtB,CAAC,CACH,CAAC;gBACF,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;YAED,+DAA+D;YAC/D,IAAI,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU;oBACpC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;oBAChC,CAAC,CAAC,SAAS,CAAC,YAAY;wBACtB,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;wBAClC,CAAC,CAAC,SAAS,CAAC;gBAEhB,sEAAsE;gBACtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACpD,SAAS,CAAC,iBAAiB,EAC3B,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAC9C,CAAC;gBAEF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,4EAAgC,EAAE;wBAC3D,wBAAwB,EAAE,QAAQ,CAAC,EAAE;wBACrC,YAAY,EAAE,GAAG,CAAC,EAAE;wBACpB,cAAc,EAAE,GAAG,KAAK,CAAC,EAAE,4BAA4B;qBACxD,CAAC,CACH,CAAC;oBACF,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,4EAAgC,EAAE,KAAK,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAED,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEtC,yCAAyC;YACzC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CACtC,YAAY,EACZ,gBAAgB,EAChB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,EACvB;oBACE,SAAS,EAAE,iBAAiB;oBAC5B,YAAY,EAAE,SAAS;oBACvB,YAAY,EAAE,SAAS,CAAC,YAAY;oBACpC,WAAW,EAAE,IAAI,CAAC,OAAO;iBACC,CAC7B,CAAC;YACJ,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,4BAA4B,SAAS,CAAC,MAAM,0BAA0B,IAAI,CAAC,QAAQ,MAAO,KAAe,CAAC,OAAO,EAAE,CACpH,CAAC;YACJ,CAAC;YAED,mEAAmE;YACnE,KAAK,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;gBACpC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,KAAK,EAAE,SAAS,CAAC,OAAO;gBACxB,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,iBAAiB;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,SAAS;gBACZ,eAAe,EAAE,QAAQ;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oCAAqC,GAAa,CAAC,OAAO,EAAE,CAC7D,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAqC,EAAE;QACnD,MAAM,EACJ,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,IAAI,GAAG,CAAC,EACR,KAAK,GAAG,EAAE,GACX,GAAG,SAAS,CAAC;QACd,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAEhC,mCAAmC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY;aAC5B,kBAAkB,CAAC,KAAK,CAAC;aACzB,iBAAiB,CAAC,oBAAoB,EAAE,MAAM,CAAC;aAC/C,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC;aACtC,iBAAiB,CAAC,cAAc,EAAE,SAAS,CAAC;aAC5C,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,CAAC;aAC3C,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE7C,4BAA4B;QAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC;QAExD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,0CAA0C;QAE1C,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,QAAQ,CAAC,qCAAqC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,QAAQ,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,QAAQ,CACZ,sEAAsE,EACtE,EAAE,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;QAErD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE;gBACJ,KAAK;gBACL,IAAI;gBACJ,KAAK;gBACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;aACrC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC3D,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,SAAS,EAAE;gBACT,WAAW;gBACX,kBAAkB;gBAClB,MAAM;gBACN,SAAS;gBACT,YAAY;gBACZ,YAAY;gBACZ,kCAAkC,EAAE,+BAA+B;aACpE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,0BAAiB,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC3D,KAAK,EAAE,EAAE,QAAQ,EAAE;YACnB,SAAS,EAAE;gBACT,WAAW;gBACX,kBAAkB;gBAClB,2BAA2B,EAAc,6BAA6B;gBACtE,sCAAsC,EAAG,oCAAoC;gBAC7E,MAAM;gBACN,SAAS;gBACT,YAAY;gBACZ,YAAY;gBACZ,kCAAkC;aACnC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,0BAAiB,CACzB,4BAA4B,QAAQ,YAAY,CACjD,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,GAAoB;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACnD,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,0BAAiB,CAAC,2CAA2C,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,4BAAmB,CAAC,uBAAuB,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC9C,KAAK,EAAE;gBACL,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,MAAM,CAAC,EAAE;aACpB;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,MAAM,CAAC,EAAE;SACpB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,QAAgB;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAC7C,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,0BAAiB,CAAC,qBAAqB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;YAC/B,SAAS,EAAE,CAAC,KAAK,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAAa;QACpC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC3D,KAAK,EAAE,EAAE,EAAE,EAAE;SACd,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,0BAAiB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAG,EAAE;YACrD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,0BAAiB,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE;SACvC,CAAC,CAAC;QACH,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,KAAa;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,0BAAiB,CAAC,0BAA0B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC7C,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC7C,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;SACrC,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,SAAkC,EAAE,IAAU;QACrE,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC/C,KAAK,EAAE;gBACL,gBAAgB,EAAE,EAAE;gBACpB,SAAS,EAAE,IAAI;aAChB;YACD,SAAS,EAAE,CAAC,gBAAgB,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,0BAAiB,CACzB,uCAAuC,EAAE,YAAY,CACtD,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC3C,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;gBAC5C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAC3D,IAAI,CAAC,OAAO,CACb,CAAC;gBACF,MAAM,uBAAuB,GAC3B,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC;oBAC7C,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAE5C,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC7B,MAAM,IAAI,2BAAkB,CAC1B,iEAAiE,CAClE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,oBAAoB,GAAG,SAAS,CAAC,SAAS;YAC9C,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC;YAC/D,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,uBAAuB,GAAG,SAAS,CAAC,YAAY;YACpD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,qBAAqB,GAAG,SAAS,CAAC,UAAU;YAChD,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,UAAU,CAAC,GAAG,CACtB,KAAK,EAAE,CAAC,EAA8B,EAAE,CAAC,CAAC;gBACxC,cAAc,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAC3D,CAAC,CAAC,cAAc,CACjB;gBACD,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CACH,CACF;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,4CAA4C;QAC5C,MAAM,oBAAoB,GAA4B,EAAE,CAAC;QACzD,IAAI,SAAS,CAAC,YAAY;YACxB,oBAAoB,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;QAC7D,IAAI,oBAAoB;YACtB,oBAAoB,CAAC,SAAS,GAAG,oBAAoB,CAAC;QACxD,IAAI,uBAAuB;YACzB,oBAAoB,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAE9D,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACjE,CAAC;QAED,4BAA4B;QAC5B,MAAM,cAAc,GAA4B,EAAE,CAAC;QACnD,IAAI,SAAS,CAAC,OAAO;YAAE,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAClE,IAAI,SAAS,CAAC,IAAI;YAAE,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QACzD,IAAI,SAAS,CAAC,OAAO;YAAE,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAClE,kCAAkC;QAClC,IAAI,SAAS,CAAC,OAAO;YAAE,cAAc,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,SAAS,CAAC,YAAY;YACxB,cAAc,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,UAAU;YACtB,cAAc,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,YAAY;YACxB,cAAc,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,WAAW;YACvB,cAAc,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;QACrD,IAAI,SAAS,CAAC,OAAO;YAAE,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAElE,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC9D,CAAC;QAED,uEAAuE;QACvE,IAAI,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU;gBACpC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAChC,CAAC,CAAC,SAAS,CAAC,YAAY;oBACtB,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBAClC,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC;YAEhE,sEAAsE;YACtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACpD,SAAS,CAAC,iBAAiB,EAC3B;gBACE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtD,YAAY,EAAE,gBAAgB;aAC/B,CACF,CAAC;YAEF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;oBACxB,wBAAwB,EAAE,QAAQ,CAAC,EAAE;oBACrC,YAAY,EAAE,GAAG,CAAC,EAAE;oBACpB,cAAc,EAAE,KAAK,EAAE,sCAAsC;iBAC9D,CAAC,CACH,CAAC;gBACF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CACjD,yDAAuB,CACxB,CAAC;YACF,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,aAAa,CAAC,MAAM,CAAC;gBACnB,gBAAgB,EAAE,EAAE;gBACpB,uBAAuB,EAAE,CAAC,CAAC,cAAc;gBACzC,aAAa,EAAE,CAAC,CAAC,IAAI;aACtB,CAAC,CACH,CAAC;YACF,MAAM,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,oGAAoG;QACpG,qBAAqB;QAErB,8CAA8C;QAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACxD,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,kCAAkC,CAAC;SACtE,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,kBAAkB,GAAG,WAAW,CAAC,UAAU,EAAE,IAAI,CACrD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAChC,CAAC;YACF,MAAM,kBAAkB,GAAG,kBAAkB,EAAE,uBAAuB,CAAC;YAEvE,iCAAiC;YACjC,MAAM,gBAAgB,GACpB,oBAAoB,KAAK,SAAS;gBAClC,oBAAoB,KAAK,WAAW,CAAC,SAAS,CAAC;YACjD,MAAM,mBAAmB,GACvB,uBAAuB,KAAK,SAAS;gBACrC,uBAAuB,KAAK,WAAW,CAAC,YAAY,CAAC;YACvD,MAAM,mBAAmB,GACvB,SAAS,CAAC,YAAY,KAAK,SAAS;gBACpC,SAAS,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAAC;YACtD,MAAM,aAAa,GACjB,SAAS,CAAC,MAAM,KAAK,SAAS;gBAC9B,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,oBAAoB,CAAC;YAExD,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,IAAI,cAAkC,CAAC;YAEvC,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CACvB,CAAC;gBACF,cAAc,GAAG,cAAc,EAAE,cAAc,CAAC;gBAEhD,IAAI,cAAc,KAAK,kBAAkB,EAAE,CAAC;oBAC1C,kBAAkB,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IACE,gBAAgB;gBAChB,mBAAmB;gBACnB,aAAa;gBACb,kBAAkB;gBAClB,mBAAmB,EACnB,CAAC;gBACD,MAAM,iBAAiB,GAAG,kBAAkB;oBAC1C,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,kBAAkB,CAAC;gBAEvB,6CAA6C;gBAC7C,IAAI,aAAa,GAAG,EAAE,CAAC;gBACvB,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAY,EAAE;wBACjE,KAAK,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE;qBACjC,CAAC,CAAC;oBACH,IAAI,MAAM;wBAAE,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBACtD,CAAC;gBAED,4DAA4D;gBAC5D,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAClE,kCAAY,EACZ;oBACE,KAAK,EAAE;wBACL,EAAE,EAAE,uBAAuB,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC;qBAC7D;iBACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG,sBAAsB,EAAE,gBAAgB,IAAI,KAAK,CAAC;gBAElE,mBAAmB;gBACnB,MAAM,MAAM,GAAG;oBACb,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,wBAAwB,EAAE,WAAW,CAAC,YAAY,IAAI,CAAC;oBACvD,MAAM,EAAE,WAAW,CAAC,oBAAoB;oBACxC,YAAY,EAAE,WAAW,CAAC,YAAY;oBACtC,uBAAuB,EAAE,kBAAkB;oBAC3C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC/B,CAAC;gBAEF,MAAM,MAAM,GAAG;oBACb,SAAS,EAAE,oBAAoB,IAAI,WAAW,CAAC,SAAS;oBACxD,wBAAwB,EACtB,uBAAuB,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC;oBAC1D,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,WAAW,CAAC,oBAAoB;oBAC5D,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,WAAW,CAAC,YAAY;oBAChE,uBAAuB,EAAE,iBAAiB;oBAC1C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBAC9B,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,yBAAyB;oBAC/C,YAAY,EAAE;wBACZ,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE;wBAC3C,QAAQ,EAAE,OAAO;wBACjB,cAAc,EAAE,aAAa;wBAC7B,QAAQ,EAAE,aAAa;qBACxB;iBACF,CAAC;gBAEF,sCAAsC;gBACtC,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAC1C,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;qBAC7B,CAAC,CAAC;oBACH,IAAI,OAAO;wBAAE,MAAM,CAAC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAChE,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CACnE,WAAW,CAAC,oBAAoB,EAChC,MAAM,EACN,MAAM,CACP,CAAC;gBAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE;oBACvC,oBAAoB,EAAE,YAAY;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEvC,+DAA+D;QAC/D,KAAK,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;YACpC,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,OAAO,CAAC,oBAAoB;YACvC,KAAK,EAAE,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO;YAC3D,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW;YACzE,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,SAAkC,EAAE,IAAU;QACxE,mCAAmC;QACnC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAC/D,SAAS,CAAC,SAAS,CACpB,CAAC;QACF,MAAM,mBAAmB,GAAG,SAAS,CAAC,YAAY;YAChD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,iBAAiB,GAAG,SAAS,CAAC,UAAU;YAC5C,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,UAAU,CAAC,GAAG,CACtB,KAAK,EAAE,CAAC,EAA8B,EAAE,CAAC,CAAC;gBACxC,cAAc,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAC3D,CAAC,CAAC,cAAc,CACjB;gBACD,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CACH,CACF;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvC,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,0BAAiB,CAAC,yBAAyB,CAAC,CAAC;QAElE,IAAI,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,QAAQ;gBAAE,SAAS,GAAG,QAAQ,CAAC,qBAAqB,CAAC;QAC3D,CAAC;QAED,IAAI,mBAAmB,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAC7D,kCAAkC;YAClC,SAAS,GAAG,mBAAmB,CAAC;QAClC,CAAC;QAED,0CAA0C;QAC1C,MAAM,WAAW,GAAG,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpE,MAAM,uBAAuB,GAAG,WAAW,EAAE,cAAc,CAAC;QAE5D,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAY,EAAE;gBACjE,KAAK,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE;aACvC,CAAC,CAAC;YACH,IAAI,MAAM;gBAAE,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;YACzC,SAAS,EAAE,gBAAgB;YAC3B,wBAAwB,EAAE,SAAU;YACpC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,uBAAuB;YACvB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,cAAc,EAAE,aAAa;gBAC7B,QAAQ,EAAE,aAAa;aACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAE,IAAU;QACvD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE1D,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,SAAS,GACb,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC7C,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,2BAAkB,CAC1B,gDAAgD,CACjD,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,kBAAkB,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC;YACpD,KAAK,EAAE;gBACL,gBAAgB,EAAE,cAAc,CAAC,EAAE;gBACnC,MAAM,EAAE,MAAM;aACf;SACF,CAAC,CAAC;QAEH,MAAM,cAAc,GAClB,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,CAAC,aAAa,kBAAkB,CAAC,MAAM,sGAAsG;YAC9I,CAAC,CAAC,EAAE,CAAC;QAET,4CAA4C;QAC5C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE;gBACL,gBAAgB,EAAE,cAAc,CAAC,EAAE;gBACnC,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,0BAAiB,CAAC,4BAA4B,CAAC,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACpD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,qCAA4B,CAAC,4BAA4B,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACxD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAC9B,uDAAsB,EACtB,eAAe,CAAC,EAAE,EAClB;gBACE,QAAQ,EAAE,eAAe,CAAC,EAAE;gBAC5B,OAAO,EAAE,cAAc,MAAM,EAAE;aAChC,CACF,CAAC;YAEF,sCAAsC;YACtC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAC9B,aAAa,EACb;oBACE,gBAAgB,EAAE,cAAc,CAAC,EAAE;oBACnC,MAAM,EAAE,MAAM;iBACf,EACD;oBACE,MAAM,EAAE,cAAc;oBACtB,QAAQ,EAAE,IAAI,IAAI,EAAE;oBACpB,QAAQ,EAAE,IAAI,CAAC,OAAO;oBACtB,WAAW,EAAE,6BAA6B,MAAM,EAAE;iBACnD,CACF,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEtC,+DAA+D;YAC/D,KAAK,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;gBACpC,EAAE,EAAE,cAAc,CAAC,EAAE;gBACrB,QAAQ,EAAE,cAAc,CAAC,QAAQ;gBACjC,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,cAAc,CAAC,oBAAoB;gBAC9C,KAAK,EAAE,eAAe,CAAC,OAAO;gBAC9B,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,SAAS,EAAE,cAAc,CAAC,SAAS;aACpC,CAAC,CAAC;YAEH,4EAA4E;YAC5E,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;gBAChC,KAAK,IAAI,CAAC,WAAW;qBAClB,qBAAqB,CAAC,cAAc,CAAC,YAAY,CAAC;qBAClD,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;oBACrB,IAAI,YAAY,EAAE,CAAC;wBACjB,KAAK,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;4BACjC,MAAM,EAAE,YAAY;4BACpB,KAAK,EAAE,0BAA0B;4BACjC,OAAO,EAAE,GAAG,cAAc,CAAC,oBAAoB,MAAM,eAAe,CAAC,OAAO,gCAAgC,MAAM,EAAE;4BACpH,IAAI,EAAE,OAAO;4BACb,UAAU,EAAE,gBAAgB;4BAC5B,QAAQ,EAAE,cAAc,CAAC,EAAE;4BAC3B,IAAI,EAAE,oBAAoB,cAAc,CAAC,QAAQ,EAAE;yBACpD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAC/D,CAAC;YACN,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,cAAc,IAAI,uCAAuC;gBAClE,uBAAuB,EAAE,kBAAkB,CAAC,MAAM;aACnD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oCAAqC,KAAe,CAAC,OAAO,EAAE,CAC/D,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CACd,SAAmB,EACnB,MAAc,EACd,IAAU;QAEV,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAkC;QAChD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG;YACb,cAAc;YACd,KAAK;YACL,SAAS;YACT,MAAM;YACN,QAAQ;YACR,SAAS;YACT,MAAM;YACN,UAAU;YACV,YAAY;SACb,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,IAAK,GAAiC,CAAC;YACtE,OAAO;gBACL,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;gBACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;gBAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,IAAI,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACpD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAEO,SAAS,CAAC,KAAa;QAC7B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA7lCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;IAuBR,WAAA,IAAA,0BAAgB,EAAC,sCAAc,CAAC,CAAA;IAEhC,WAAA,IAAA,0BAAgB,EAAC,uDAAsB,CAAC,CAAA;IAExC,WAAA,IAAA,0BAAgB,EAAC,+CAAkB,CAAC,CAAA;IAEpC,WAAA,IAAA,0BAAgB,EAAC,mDAAoB,CAAC,CAAA;IAEtC,WAAA,IAAA,0BAAgB,EAAC,yDAAuB,CAAC,CAAA;IAEzC,WAAA,IAAA,0BAAgB,EAAC,6CAAiB,CAAC,CAAA;IAWnC,YAAA,IAAA,0BAAgB,EAAC,4EAAgC,CAAC,CAAA;yDApBvB,oBAAU,oBAAV,oBAAU,oDAEhB,oBAAU,oBAAV,oBAAU,oDAEd,oBAAU,oBAAV,oBAAU,oDAER,oBAAU,oBAAV,oBAAU,oDAEP,oBAAU,oBAAV,oBAAU,oDAEhB,oBAAU,oBAAV,oBAAU,oDACD,qDAAwB,oBAAxB,qDAAwB,oDACvB,uCAAiB,oBAAjB,uCAAiB,oDACpB,+CAAqB,oBAArB,+CAAqB,oDACxB,0BAAW,oBAAX,0BAAW,oDACZ,oBAAU,oBAAV,oBAAU,oDACP,8BAAa,oBAAb,8BAAa,oDACR,yCAAkB,oBAAlB,yCAAkB,oDACxB,2CAAmB,oBAAnB,2CAAmB,oDACZ,0CAAmB,oBAAnB,0CAAmB,oDAEzB,oBAAU,oBAAV,oBAAU;GA5CxB,qBAAqB,CA6lCjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence.service.ts\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n ForbiddenException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\n\r\n// Entities\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Tag } from '../master/entities/tag.entity';\r\nimport { User } from '../user/entities/user.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity';\r\n\r\n// DTOs\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\n\r\n// Services\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\n\r\n/**\r\n * CorrespondenceService - Document management (CRUD)\r\n */\r\ninterface ResolvedRecipient {\r\n organizationId: number;\r\n type: 'TO' | 'CC';\r\n}\r\n@Injectable()\r\nexport class CorrespondenceService {\r\n private readonly logger = new Logger(CorrespondenceService.name);\r\n\r\n private async hasSystemManageAllPermission(userId: number): Promise {\r\n const permissions = await this.userService.getUserPermissions(userId);\r\n return permissions.includes('system.manage_all');\r\n }\r\n\r\n /**\r\n * Business Rule: Revision Label Strategy\r\n * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...)\r\n * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...)\r\n */\r\n private getInitialRevisionLabel(typeCode: string): string | undefined {\r\n const alphabetTypes = ['RFA', 'RFI'];\r\n if (alphabetTypes.includes(typeCode.toUpperCase())) {\r\n return 'A'; // Alphabet for RFA, RFI\r\n }\r\n return undefined; // Numeric (no label for revision 0)\r\n }\r\n\r\n constructor(\r\n @InjectRepository(Correspondence)\r\n private correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private statusRepo: Repository,\r\n @InjectRepository(CorrespondenceReference)\r\n private referenceRepo: Repository,\r\n @InjectRepository(CorrespondenceTag)\r\n private tagRepo: Repository,\r\n private numberingService: DocumentNumberingService,\r\n private jsonSchemaService: JsonSchemaService,\r\n private workflowEngine: WorkflowEngineService,\r\n private userService: UserService,\r\n private dataSource: DataSource,\r\n private searchService: SearchService,\r\n private fileStorageService: FileStorageService,\r\n private uuidResolver: UuidResolverService,\r\n private notificationService: NotificationService,\r\n @InjectRepository(CorrespondenceRevisionAttachment)\r\n private revAttachRepo: Repository\r\n ) {}\r\n\r\n /**\r\n * Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n * Prevent external correspondence to same organization\r\n */\r\n private async validateCorrespondenceRecipients(\r\n createDto: CreateCorrespondenceDto,\r\n user: User\r\n ): Promise {\r\n // Get user's organization\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n if (createDto.originatorId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (canManageAll) {\r\n userOrgId = await this.uuidResolver.resolveOrganizationId(\r\n createDto.originatorId\r\n );\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n }\r\n\r\n // For impersonation, use the specified originator\r\n const originatorOrgId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : userOrgId;\r\n\r\n // Check if it's internal communication\r\n if (createDto.isInternal) {\r\n // Internal communications should use Circulation instead\r\n throw new BadRequestException(\r\n 'Internal communications should use Circulation Sheet instead of Correspondence'\r\n );\r\n }\r\n\r\n // Validate recipients\r\n if (!createDto.recipients || createDto.recipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one recipient (TO or CC) is required'\r\n );\r\n }\r\n\r\n const toRecipients = createDto.recipients.filter((r) => r.type === 'TO');\r\n const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC');\r\n\r\n if (toRecipients.length === 0 && ccRecipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one TO or CC recipient is required'\r\n );\r\n }\r\n\r\n // Check for same organization correspondence\r\n for (const recipient of createDto.recipients) {\r\n const recipientOrgId = await this.uuidResolver.resolveOrganizationId(\r\n recipient.organizationId\r\n );\r\n\r\n if (recipientOrgId === originatorOrgId) {\r\n throw new BadRequestException(\r\n 'Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'\r\n );\r\n }\r\n }\r\n }\r\n\r\n async create(createDto: CreateCorrespondenceDto, user: User) {\r\n // Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n await this.validateCorrespondenceRecipients(createDto, user);\r\n // ADR-019: Resolve UUID references to internal INT IDs\r\n const resolvedProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const resolvedOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const resolvedRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n const statusDraft = await this.statusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n if (!statusDraft) {\r\n throw new InternalServerErrorException(\r\n 'Status DRAFT not found in Master Data'\r\n );\r\n }\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n // Impersonation Logic\r\n if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (!canManageAll) {\r\n throw new ForbiddenException(\r\n 'You do not have permission to create documents on behalf of other organizations.'\r\n );\r\n }\r\n userOrgId = resolvedOriginatorId;\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n\r\n if (createDto.details) {\r\n try {\r\n await this.jsonSchemaService.validate(type.typeCode, createDto.details);\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Schema validation warning for ${type.typeCode}: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // [Fix #6] Fetch real ORG Code from Organization entity\r\n const originatorOrg = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: { id: userOrgId },\r\n }\r\n );\r\n const orgCode = originatorOrg?.organizationCode ?? 'UNK';\r\n\r\n // [v1.5.1] Extract recipient organization from recipients array (Primary TO)\r\n const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n const docNumber = await this.numberingService.generateNextNumber({\r\n projectId: resolvedProjectId,\r\n originatorOrganizationId: userOrgId,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId, // [v1.5.1] Pass recipient for document number format\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n\r\n const correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: docNumber.number,\r\n correspondenceTypeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n isInternal: createDto.isInternal || false,\r\n createdBy: user.user_id,\r\n });\r\n const savedCorr = await queryRunner.manager.save(correspondence);\r\n\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: savedCorr.id,\r\n revisionNumber: 0,\r\n revisionLabel: this.getInitialRevisionLabel(type.typeCode),\r\n isCurrent: true,\r\n statusId: statusDraft.id,\r\n subject: createDto.subject,\r\n body: createDto.body,\r\n remarks: createDto.remarks,\r\n dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined,\r\n documentDate: createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined,\r\n issuedDate: createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : undefined,\r\n receivedDate: createDto.receivedDate\r\n ? new Date(createDto.receivedDate)\r\n : undefined,\r\n description: createDto.description,\r\n details: createDto.details,\r\n createdBy: user.user_id,\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(revision);\r\n\r\n // Save Recipients (using resolved INT IDs)\r\n if (resolvedRecipients && resolvedRecipients.length > 0) {\r\n const recipients = resolvedRecipients.map((r) =>\r\n queryRunner.manager.create(CorrespondenceRecipient, {\r\n correspondenceId: savedCorr.id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await queryRunner.manager.save(recipients);\r\n }\r\n\r\n // Commit attachments from Temp → Permanent (Two-Phase Storage)\r\n if (createDto.attachmentTempIds?.length) {\r\n const issueDate = createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n createDto.attachmentTempIds,\r\n { issueDate, documentType: 'Correspondence' }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att, idx) =>\r\n queryRunner.manager.create(CorrespondenceRevisionAttachment, {\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: idx === 0, // ไฟล์แรกเป็น main document\r\n })\r\n );\r\n await queryRunner.manager.save(CorrespondenceRevisionAttachment, links);\r\n }\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Start Workflow Instance (non-blocking)\r\n try {\r\n const workflowCode = `CORRESPONDENCE_${type.typeCode}`;\r\n await this.workflowEngine.createInstance(\r\n workflowCode,\r\n 'correspondence',\r\n savedCorr.id.toString(),\r\n {\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n disciplineId: createDto.disciplineId,\r\n initiatorId: user.user_id,\r\n } as Record\r\n );\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${(error as Error).message}`\r\n );\r\n }\r\n\r\n // Fire-and-forget search indexing (non-blocking, void intentional)\r\n void this.searchService.indexDocument({\r\n id: savedCorr.id,\r\n publicId: savedCorr.publicId,\r\n type: 'correspondence',\r\n docNumber: docNumber.number,\r\n title: createDto.subject,\r\n description: createDto.description,\r\n status: 'DRAFT',\r\n projectId: resolvedProjectId,\r\n createdAt: new Date(),\r\n });\r\n\r\n return {\r\n ...savedCorr,\r\n currentRevision: revision,\r\n };\r\n } catch (err) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to create correspondence: ${(err as Error).message}`\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async findAll(searchDto: SearchCorrespondenceDto = {}) {\r\n const {\r\n search,\r\n typeId,\r\n projectId,\r\n statusId,\r\n status,\r\n page = 1,\r\n limit = 10,\r\n } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n // Change: Query from Revision Repo\r\n const query = this.revisionRepo\r\n .createQueryBuilder('rev')\r\n .leftJoinAndSelect('rev.correspondence', 'corr')\r\n .leftJoinAndSelect('corr.type', 'type')\r\n .leftJoinAndSelect('corr.project', 'project')\r\n .leftJoinAndSelect('corr.originator', 'org')\r\n .leftJoinAndSelect('rev.status', 'status');\r\n\r\n // Filter by Revision Status\r\n const revStatus = searchDto.revisionStatus || 'CURRENT';\r\n\r\n if (revStatus === 'CURRENT') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: true });\r\n } else if (revStatus === 'OLD') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: false });\r\n }\r\n // If 'ALL', no filter needed on isCurrent\r\n\r\n if (projectId) {\r\n query.andWhere('corr.projectId = :projectId', { projectId });\r\n }\r\n\r\n if (typeId) {\r\n query.andWhere('corr.correspondenceTypeId = :typeId', { typeId });\r\n }\r\n\r\n if (statusId) {\r\n query.andWhere('rev.statusId = :statusId', { statusId });\r\n }\r\n\r\n if (status) {\r\n query.andWhere('status.statusCode = :status', { status });\r\n }\r\n\r\n if (search) {\r\n query.andWhere(\r\n '(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n // Default Sort: Latest Created\r\n query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit);\r\n\r\n const [items, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence with ID ${id} not found`);\r\n }\r\n return correspondence;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction\r\n 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization',\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(\r\n `Correspondence with UUID ${publicId} not found`\r\n );\r\n }\r\n return correspondence;\r\n }\r\n\r\n async addReference(id: number, dto: AddReferenceDto) {\r\n const source = await this.correspondenceRepo.findOne({ where: { id } });\r\n // ADR-019: Resolve target publicId → internal INT id\r\n const target = await this.correspondenceRepo.findOne({\r\n where: { publicId: dto.targetUuid },\r\n });\r\n\r\n if (!source || !target) {\r\n throw new NotFoundException('Source or Target correspondence not found');\r\n }\r\n\r\n if (source.id === target.id) {\r\n throw new BadRequestException('Cannot reference self');\r\n }\r\n\r\n const exists = await this.referenceRepo.findOne({\r\n where: {\r\n sourceId: id,\r\n targetId: target.id,\r\n },\r\n });\r\n\r\n if (exists) {\r\n return exists;\r\n }\r\n\r\n const ref = this.referenceRepo.create({\r\n sourceId: id,\r\n targetId: target.id,\r\n });\r\n\r\n return this.referenceRepo.save(ref);\r\n }\r\n\r\n async removeReference(id: number, targetId: number) {\r\n const result = await this.referenceRepo.delete({\r\n sourceId: id,\r\n targetId: targetId,\r\n });\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Reference not found');\r\n }\r\n }\r\n\r\n async getTags(id: number) {\r\n const rows = await this.tagRepo.find({\r\n where: { correspondenceId: id },\r\n relations: ['tag'],\r\n });\r\n return rows.map((r) => r.tag).filter(Boolean);\r\n }\r\n\r\n async addTag(id: number, tagId: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n });\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence ${id} not found`);\r\n }\r\n\r\n const tag = await this.dataSource.manager.findOne(Tag, {\r\n where: { id: tagId },\r\n });\r\n if (!tag) {\r\n throw new NotFoundException(`Tag ${tagId} not found`);\r\n }\r\n\r\n const exists = await this.tagRepo.findOne({\r\n where: { correspondenceId: id, tagId },\r\n });\r\n if (exists) return exists;\r\n\r\n const row = this.tagRepo.create({ correspondenceId: id, tagId });\r\n return this.tagRepo.save(row);\r\n }\r\n\r\n async removeTag(id: number, tagId: number) {\r\n const result = await this.tagRepo.delete({ correspondenceId: id, tagId });\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Tag assignment not found');\r\n }\r\n }\r\n\r\n async getReferences(id: number) {\r\n const outgoing = await this.referenceRepo.find({\r\n where: { sourceId: id },\r\n relations: ['target', 'target.type'],\r\n });\r\n\r\n const incoming = await this.referenceRepo.find({\r\n where: { targetId: id },\r\n relations: ['source', 'source.type'],\r\n });\r\n\r\n return { outgoing, incoming };\r\n }\r\n\r\n async update(id: number, updateDto: UpdateCorrespondenceDto, user: User) {\r\n // 1. Find Current Revision\r\n const revision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: id,\r\n isCurrent: true,\r\n },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Current revision for correspondence ${id} not found`\r\n );\r\n }\r\n\r\n // 2. Check Permission\r\n if (revision.statusId) {\r\n const status = await this.statusRepo.findOne({\r\n where: { id: revision.statusId },\r\n });\r\n\r\n if (status && status.statusCode !== 'DRAFT') {\r\n const permissions = await this.userService.getUserPermissions(\r\n user.user_id\r\n );\r\n const canEditSubmittedOrLater =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canEditSubmittedOrLater) {\r\n throw new ForbiddenException(\r\n 'Only Org Admin or Superadmin can edit non-draft correspondences'\r\n );\r\n }\r\n }\r\n }\r\n\r\n // ADR-019: Resolve UUID references in update DTO\r\n const updResolvedProjectId = updateDto.projectId\r\n ? await this.uuidResolver.resolveProjectId(updateDto.projectId)\r\n : undefined;\r\n const updResolvedOriginatorId = updateDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId)\r\n : undefined;\r\n const updResolvedRecipients = updateDto.recipients\r\n ? await Promise.all(\r\n updateDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n // 3. Update Correspondence Entity if needed\r\n const correspondenceUpdate: Record = {};\r\n if (updateDto.disciplineId)\r\n correspondenceUpdate.disciplineId = updateDto.disciplineId;\r\n if (updResolvedProjectId)\r\n correspondenceUpdate.projectId = updResolvedProjectId;\r\n if (updResolvedOriginatorId)\r\n correspondenceUpdate.originatorId = updResolvedOriginatorId;\r\n\r\n if (Object.keys(correspondenceUpdate).length > 0) {\r\n await this.correspondenceRepo.update(id, correspondenceUpdate);\r\n }\r\n\r\n // 4. Update Revision Entity\r\n const revisionUpdate: Record = {};\r\n if (updateDto.subject) revisionUpdate.subject = updateDto.subject;\r\n if (updateDto.body) revisionUpdate.body = updateDto.body;\r\n if (updateDto.remarks) revisionUpdate.remarks = updateDto.remarks;\r\n // Format Date correctly if string\r\n if (updateDto.dueDate) revisionUpdate.dueDate = new Date(updateDto.dueDate);\r\n if (updateDto.documentDate)\r\n revisionUpdate.documentDate = new Date(updateDto.documentDate);\r\n if (updateDto.issuedDate)\r\n revisionUpdate.issuedDate = new Date(updateDto.issuedDate);\r\n if (updateDto.receivedDate)\r\n revisionUpdate.receivedDate = new Date(updateDto.receivedDate);\r\n if (updateDto.description)\r\n revisionUpdate.description = updateDto.description;\r\n if (updateDto.details) revisionUpdate.details = updateDto.details;\r\n\r\n if (Object.keys(revisionUpdate).length > 0) {\r\n await this.revisionRepo.update(revision.id, revisionUpdate);\r\n }\r\n\r\n // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage)\r\n if (updateDto.attachmentTempIds?.length) {\r\n const issueDate = updateDto.issuedDate\r\n ? new Date(updateDto.issuedDate)\r\n : updateDto.documentDate\r\n ? new Date(updateDto.documentDate)\r\n : revision.issuedDate || revision.documentDate || undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n updateDto.attachmentTempIds,\r\n {\r\n issueDate: issueDate ? new Date(issueDate) : undefined,\r\n documentType: 'Correspondence',\r\n }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att) =>\r\n this.revAttachRepo.create({\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main\r\n })\r\n );\r\n await this.revAttachRepo.save(links);\r\n }\r\n }\r\n\r\n // 5. Update Recipients if provided\r\n if (updResolvedRecipients) {\r\n const recipientRepo = this.dataSource.getRepository(\r\n CorrespondenceRecipient\r\n );\r\n await recipientRepo.delete({ correspondenceId: id });\r\n\r\n const newRecipients = updResolvedRecipients.map((r) =>\r\n recipientRepo.create({\r\n correspondenceId: id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await recipientRepo.save(newRecipients);\r\n }\r\n\r\n // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project)\r\n // AND it is a DRAFT.\r\n\r\n // Fetch fresh data for context and comparison\r\n const currentCorr = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: ['type', 'recipients', 'recipients.recipientOrganization'],\r\n });\r\n\r\n if (currentCorr) {\r\n const currentToRecipient = currentCorr.recipients?.find(\r\n (r) => r.recipientType === 'TO'\r\n );\r\n const currentRecipientId = currentToRecipient?.recipientOrganizationId;\r\n\r\n // Check for ACTUAL value changes\r\n const isProjectChanged =\r\n updResolvedProjectId !== undefined &&\r\n updResolvedProjectId !== currentCorr.projectId;\r\n const isOriginatorChanged =\r\n updResolvedOriginatorId !== undefined &&\r\n updResolvedOriginatorId !== currentCorr.originatorId;\r\n const isDisciplineChanged =\r\n updateDto.disciplineId !== undefined &&\r\n updateDto.disciplineId !== currentCorr.disciplineId;\r\n const isTypeChanged =\r\n updateDto.typeId !== undefined &&\r\n updateDto.typeId !== currentCorr.correspondenceTypeId;\r\n\r\n let isRecipientChanged = false;\r\n let newRecipientId: number | undefined;\r\n\r\n if (updResolvedRecipients) {\r\n const newToRecipient = updResolvedRecipients.find(\r\n (r) => r.type === 'TO'\r\n );\r\n newRecipientId = newToRecipient?.organizationId;\r\n\r\n if (newRecipientId !== currentRecipientId) {\r\n isRecipientChanged = true;\r\n }\r\n }\r\n\r\n if (\r\n isProjectChanged ||\r\n isDisciplineChanged ||\r\n isTypeChanged ||\r\n isRecipientChanged ||\r\n isOriginatorChanged\r\n ) {\r\n const targetRecipientId = isRecipientChanged\r\n ? newRecipientId\r\n : currentRecipientId;\r\n\r\n // Resolve Recipient Code for the NEW context\r\n let recipientCode = '';\r\n if (targetRecipientId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: targetRecipientId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n // [Fix #6] Fetch real ORG Code from originator organization\r\n const originatorOrgForUpdate = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: {\r\n id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n },\r\n }\r\n );\r\n const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK';\r\n\r\n // Prepare Contexts\r\n const oldCtx = {\r\n projectId: currentCorr.projectId,\r\n originatorOrganizationId: currentCorr.originatorId ?? 0,\r\n typeId: currentCorr.correspondenceTypeId,\r\n disciplineId: currentCorr.disciplineId,\r\n recipientOrganizationId: currentRecipientId,\r\n year: new Date().getFullYear(),\r\n };\r\n\r\n const newCtx = {\r\n projectId: updResolvedProjectId ?? currentCorr.projectId,\r\n originatorOrganizationId:\r\n updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId,\r\n disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId,\r\n recipientOrganizationId: targetRecipientId,\r\n year: new Date().getFullYear(),\r\n userId: user.user_id, // Pass User ID for Audit\r\n customTokens: {\r\n TYPE_CODE: currentCorr.type?.typeCode || '',\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n };\r\n\r\n // If Type Changed, need NEW Type Code\r\n if (isTypeChanged) {\r\n const newType = await this.typeRepo.findOne({\r\n where: { id: newCtx.typeId },\r\n });\r\n if (newType) newCtx.customTokens.TYPE_CODE = newType.typeCode;\r\n }\r\n\r\n const newDocNumber = await this.numberingService.updateNumberForDraft(\r\n currentCorr.correspondenceNumber,\r\n oldCtx,\r\n newCtx\r\n );\r\n\r\n await this.correspondenceRepo.update(id, {\r\n correspondenceNumber: newDocNumber,\r\n });\r\n }\r\n }\r\n\r\n const updated = await this.findOne(id);\r\n\r\n // Re-index updated document in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: updated.id,\r\n publicId: updated.publicId,\r\n type: 'correspondence',\r\n docNumber: updated.correspondenceNumber,\r\n title: updateDto.subject ?? updated.revisions?.[0]?.subject,\r\n description: updateDto.description ?? updated.revisions?.[0]?.description,\r\n status: 'DRAFT',\r\n projectId: updated.projectId,\r\n createdAt: updated.createdAt,\r\n });\r\n\r\n return updated;\r\n }\r\n\r\n async previewDocumentNumber(createDto: CreateCorrespondenceDto, user: User) {\r\n // ADR-019: Resolve UUID references\r\n const previewProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const previewOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const previewRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n\r\n if (previewOriginatorId && previewOriginatorId !== userOrgId) {\r\n // Allow impersonation for preview\r\n userOrgId = previewOriginatorId;\r\n }\r\n\r\n // Extract recipient from recipients array\r\n const toRecipient = previewRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n return this.numberingService.previewNumber({\r\n projectId: previewProjectId,\r\n originatorOrganizationId: userOrgId!,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId,\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation\r\n * Cancel correspondence and handle related circulations\r\n */\r\n async cancel(publicId: string, reason: string, user: User) {\r\n const correspondence = await this.findOneByUuid(publicId);\r\n\r\n // Check if user has permission to cancel (Org Admin or Superadmin only)\r\n const permissions = await this.userService.getUserPermissions(user.user_id);\r\n const canCancel =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canCancel) {\r\n throw new ForbiddenException(\r\n 'Only administrators can cancel correspondences'\r\n );\r\n }\r\n\r\n // Check if there are any active circulations\r\n const circulationRepo = this.dataSource.getRepository('Circulation');\r\n const activeCirculations = await circulationRepo.find({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n });\r\n\r\n const warningMessage =\r\n activeCirculations.length > 0\r\n ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.`\r\n : '';\r\n\r\n // Get the current revision to update status\r\n const currentRevision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n isCurrent: true,\r\n },\r\n });\r\n\r\n if (!currentRevision) {\r\n throw new NotFoundException('Current revision not found');\r\n }\r\n\r\n // Get cancelled status\r\n const cancelledStatus = await this.statusRepo.findOne({\r\n where: { statusCode: 'CANCELLED' },\r\n });\r\n\r\n if (!cancelledStatus) {\r\n throw new InternalServerErrorException('CANCELLED status not found');\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // Update correspondence revision status to CANCELLED\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n currentRevision.id,\r\n {\r\n statusId: cancelledStatus.id,\r\n remarks: `Cancelled: ${reason}`,\r\n }\r\n );\r\n\r\n // Force close all active circulations\r\n if (activeCirculations.length > 0) {\r\n await queryRunner.manager.update(\r\n 'Circulation',\r\n {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n {\r\n status: 'FORCE_CLOSED',\r\n closedAt: new Date(),\r\n closedBy: user.user_id,\r\n closeReason: `Correspondence cancelled: ${reason}`,\r\n }\r\n );\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Re-index cancelled status in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: correspondence.id,\r\n publicId: correspondence.publicId,\r\n type: 'correspondence',\r\n docNumber: correspondence.correspondenceNumber,\r\n title: currentRevision.subject,\r\n status: 'CANCELLED',\r\n projectId: correspondence.projectId,\r\n createdAt: correspondence.createdAt,\r\n });\r\n\r\n // Notify originator's doc-control user about cancellation (fire-and-forget)\r\n if (correspondence.originatorId) {\r\n void this.userService\r\n .findDocControlIdByOrg(correspondence.originatorId)\r\n .then((targetUserId) => {\r\n if (targetUserId) {\r\n void this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Correspondence Cancelled',\r\n message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: correspondence.id,\r\n link: `/correspondences/${correspondence.publicId}`,\r\n });\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Cancel notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: warningMessage || 'Correspondence cancelled successfully',\r\n activeCirculationsCount: activeCirculations.length,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to cancel correspondence: ${(error as Error).message}`\r\n );\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async bulkCancel(\r\n publicIds: string[],\r\n reason: string,\r\n user: User\r\n ): Promise<{ succeeded: string[]; failed: string[] }> {\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const publicId of publicIds) {\r\n try {\r\n await this.cancel(publicId, reason, user);\r\n succeeded.push(publicId);\r\n } catch {\r\n failed.push(publicId);\r\n }\r\n }\r\n\r\n return { succeeded, failed };\r\n }\r\n\r\n async exportCsv(searchDto: SearchCorrespondenceDto): Promise {\r\n const { data } = await this.findAll(searchDto);\r\n\r\n const header = [\r\n 'Document No.',\r\n 'Rev',\r\n 'Subject',\r\n 'Type',\r\n 'Status',\r\n 'Project',\r\n 'From',\r\n 'Due Date',\r\n 'Created At',\r\n ];\r\n const rows = data.map((rev) => {\r\n const corr = rev.correspondence ?? (rev as unknown as Correspondence);\r\n return [\r\n this.escapeCsv(corr.correspondenceNumber ?? ''),\r\n this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)),\r\n this.escapeCsv(rev.subject ?? ''),\r\n this.escapeCsv(corr.type?.typeCode ?? ''),\r\n this.escapeCsv(rev.status?.statusCode ?? ''),\r\n this.escapeCsv(corr.project?.projectCode ?? ''),\r\n this.escapeCsv(corr.originator?.organizationCode ?? ''),\r\n rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '',\r\n new Date(rev.createdAt).toISOString().split('T')[0],\r\n ].join(',');\r\n });\r\n\r\n return [header.join(','), ...rows].join('\\n');\r\n }\r\n\r\n private escapeCsv(value: string): string {\r\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728 new file mode 100644 index 0000000..9829a67 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728 @@ -0,0 +1,82 @@ +1b6c53bd048a853e3011788c1eb23859 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const swagger_1 = require("@nestjs/swagger"); +class SearchCorrespondenceDto { +} +exports.SearchCorrespondenceDto = SearchCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Search term (Title or Document Number)', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "search", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Document Type ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "typeId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Project ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Status ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "statusId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Filter by Status code (e.g. DRAFT, IN_REVIEW, APPROVED, CANCELLED)', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "status", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Revision Filter: CURRENT (default), ALL, OLD', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "revisionStatus", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Page number (default 1)', default: 1 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "page", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Items per page (default 10)', + default: 10, + }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "limit", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBOEQ7QUFDOUQseURBQXlDO0FBQ3pDLDZDQUFzRDtBQUV0RCxNQUFhLHVCQUF1QjtDQXVEbkM7QUF2REQsMERBdURDO0FBakRDO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsd0NBQXdDO0tBQ3RELENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7O3VEQUNLO0FBTWhCO0lBSkMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRSxDQUFDO0lBQ2xFLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOzt1REFDUTtBQU1oQjtJQUpDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztJQUM1RCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLHdCQUFJLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2xCLElBQUEsdUJBQUssR0FBRTs7MERBQ1c7QUFNbkI7SUFKQyxJQUFBLDZCQUFtQixFQUFDLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDM0QsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7O3lEQUNVO0FBUWxCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQ1Qsb0VBQW9FO0tBQ3ZFLENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7O3VEQUNLO0FBT2hCO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsOENBQThDO0tBQzVELENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7OytEQUNnQztBQU0zQztJQUpDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzNFLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOztxREFDTTtBQVNkO0lBUEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsNkJBQTZCO1FBQzFDLE9BQU8sRUFBRSxFQUFFO0tBQ1osQ0FBQztJQUNELElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOztzREFDTyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxzZWFyY2gtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzT3B0aW9uYWwsIElzU3RyaW5nLCBJc0ludCB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XHJcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmltcG9ydCB7IEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIHtcclxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XHJcbiAgICBkZXNjcmlwdGlvbjogJ1NlYXJjaCB0ZXJtIChUaXRsZSBvciBEb2N1bWVudCBOdW1iZXIpJyxcclxuICB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNTdHJpbmcoKVxyXG4gIHNlYXJjaD86IHN0cmluZztcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZXNjcmlwdGlvbjogJ0ZpbHRlciBieSBEb2N1bWVudCBUeXBlIElEJyB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXHJcbiAgQElzSW50KClcclxuICB0eXBlSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdGaWx0ZXIgYnkgUHJvamVjdCBJRCcgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgcHJvamVjdElkPzogbnVtYmVyO1xyXG5cclxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlc2NyaXB0aW9uOiAnRmlsdGVyIGJ5IFN0YXR1cyBJRCcgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgc3RhdHVzSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcclxuICAgIGRlc2NyaXB0aW9uOlxyXG4gICAgICAnRmlsdGVyIGJ5IFN0YXR1cyBjb2RlIChlLmcuIERSQUZULCBJTl9SRVZJRVcsIEFQUFJPVkVELCBDQU5DRUxMRUQpJyxcclxuICB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNTdHJpbmcoKVxyXG4gIHN0YXR1cz86IHN0cmluZztcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xyXG4gICAgZGVzY3JpcHRpb246ICdSZXZpc2lvbiBGaWx0ZXI6IENVUlJFTlQgKGRlZmF1bHQpLCBBTEwsIE9MRCcsXHJcbiAgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQElzU3RyaW5nKClcclxuICByZXZpc2lvblN0YXR1cz86ICdDVVJSRU5UJyB8ICdBTEwnIHwgJ09MRCc7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdQYWdlIG51bWJlciAoZGVmYXVsdCAxKScsIGRlZmF1bHQ6IDEgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgcGFnZT86IG51bWJlcjtcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xyXG4gICAgZGVzY3JpcHRpb246ICdJdGVtcyBwZXIgcGFnZSAoZGVmYXVsdCAxMCknLFxyXG4gICAgZGVmYXVsdDogMTAsXHJcbiAgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgbGltaXQ/OiBudW1iZXI7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728.map new file mode 100644 index 0000000..eaac74d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/searchcorrespondencedto_c4e2a7406d51e6f2bb8a9c2005bff728.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\search-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAA8D;AAC9D,yDAAyC;AACzC,6CAAsD;AAEtD,MAAa,uBAAuB;CAuDnC;AAvDD,0DAuDC;AAjDC;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,wCAAwC;KACtD,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;uDACK;AAMhB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IAClE,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;uDACQ;AAMhB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC5D,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;0DACW;AAMnB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC3D,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;yDACU;AAQlB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EACT,oEAAoE;KACvE,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;uDACK;AAOhB;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,8CAA8C;KAC5D,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;+DACgC;AAM3C;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC3E,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;qDACM;AASd;IAPC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;sDACO","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\search-correspondence.dto.ts"],"sourcesContent":["import { IsOptional, IsString, IsInt } from 'class-validator';\r\nimport { Type } from 'class-transformer';\r\nimport { ApiPropertyOptional } from '@nestjs/swagger';\r\n\r\nexport class SearchCorrespondenceDto {\r\n @ApiPropertyOptional({\r\n description: 'Search term (Title or Document Number)',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n search?: string;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Document Type ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n typeId?: number;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Project ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n projectId?: number;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Status ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n statusId?: number;\r\n\r\n @ApiPropertyOptional({\r\n description:\r\n 'Filter by Status code (e.g. DRAFT, IN_REVIEW, APPROVED, CANCELLED)',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n status?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Revision Filter: CURRENT (default), ALL, OLD',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n revisionStatus?: 'CURRENT' | 'ALL' | 'OLD';\r\n\r\n @ApiPropertyOptional({ description: 'Page number (default 1)', default: 1 })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n page?: number;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Items per page (default 10)',\r\n default: 10,\r\n })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n limit?: number;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44 new file mode 100644 index 0000000..62ac01f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44 @@ -0,0 +1,89 @@ +d1b8bb1a0174d2a6556d41bd0e00f175 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const correspondence_controller_1 = require("./correspondence.controller"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_workflow_service_1 = require("./correspondence-workflow.service"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +describe('CorrespondenceController', () => { + let controller; + let mockCorrespondenceService; + let mockWorkflowService; + beforeEach(async () => { + mockCorrespondenceService = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + getReferences: jest.fn(), + addReference: jest.fn(), + removeReference: jest.fn(), + findOneByUuid: jest.fn(), + }; + mockWorkflowService = { + submitWorkflow: jest.fn(), + processAction: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + controllers: [correspondence_controller_1.CorrespondenceController], + providers: [ + { + provide: correspondence_service_1.CorrespondenceService, + useValue: mockCorrespondenceService, + }, + { + provide: correspondence_workflow_service_1.CorrespondenceWorkflowService, + useValue: mockWorkflowService, + }, + ], + }) + .overrideGuard(jwt_auth_guard_1.JwtAuthGuard) + .useValue({ canActivate: () => true }) + .overrideGuard(rbac_guard_1.RbacGuard) + .useValue({ canActivate: () => true }) + .compile(); + controller = module.get(correspondence_controller_1.CorrespondenceController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + describe('findAll', () => { + it('should return correspondences', async () => { + const mockResult = [{ id: 1 }]; + mockCorrespondenceService.findAll.mockResolvedValue(mockResult); + const result = await controller.findAll({}); + expect(mockCorrespondenceService.findAll).toHaveBeenCalled(); + expect(result).toEqual(mockResult); + }); + }); + describe('create', () => { + it('should create a correspondence', async () => { + const mockCorr = { id: 1, correspondenceNumber: 'TEST-001' }; + mockCorrespondenceService.create.mockResolvedValue(mockCorr); + const mockReq = { user: { user_id: 1 } }; + const createDto = { + projectId: 1, + typeId: 1, + subject: 'Test Subject', + }; + const _result = await controller.create(createDto, mockReq); + expect(mockCorrespondenceService.create).toHaveBeenCalledWith(createDto, mockReq.user); + }); + }); + describe('submit', () => { + it('should submit a correspondence to workflow', async () => { + const mockResult = { instanceId: 'inst-1', currentState: 'IN_REVIEW' }; + mockWorkflowService.submitWorkflow.mockResolvedValue(mockResult); + const mockReq = { user: { user_id: 1, roles: [] } }; + mockCorrespondenceService.findOneByUuid.mockResolvedValue({ + id: 1, + uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', + }); + const result = await controller.submit('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', { note: 'Test note' }, mockReq); + expect(mockWorkflowService.submitWorkflow).toHaveBeenCalledWith(1, 1, [], 'Test note'); + expect(result).toEqual(mockResult); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCwyRUFBdUU7QUFDdkUscUVBQWlFO0FBQ2pFLHVGQUFrRjtBQUNsRix1RUFBa0U7QUFDbEUsK0RBQTJEO0FBRTNELFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsSUFBSSxVQUFvQyxDQUFDO0lBQ3pDLElBQUkseUJBQXlELENBQUM7SUFDOUQsSUFBSSxtQkFBMkQsQ0FBQztJQUVoRSxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIseUJBQXlCLEdBQUc7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEIsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDeEIsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDdkIsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDMUIsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7U0FDekIsQ0FBQztRQUVGLG1CQUFtQixHQUFHO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3pCLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1NBQ3pCLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBa0IsTUFBTSxjQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDM0QsV0FBVyxFQUFFLENBQUMsb0RBQXdCLENBQUM7WUFDdkMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSw4Q0FBcUI7b0JBQzlCLFFBQVEsRUFBRSx5QkFBeUI7aUJBQ3BDO2dCQUNEO29CQUNFLE9BQU8sRUFBRSwrREFBNkI7b0JB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QyxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUNwQyxzQ0FBc0MsRUFDdEMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQ3JCLE9BQWtELENBQ25ELENBQUM7WUFFRixNQUFNLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUMsb0JBQW9CLENBQzdELENBQUMsRUFDRCxDQUFDLEVBQ0QsRUFBRSxFQUNGLFdBQVcsQ0FDWixDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlQ29udHJvbGxlciB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UuY29udHJvbGxlcic7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVNlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XG5pbXBvcnQgeyBSYmFjR3VhcmQgfSBmcm9tICcuLi8uLi9jb21tb24vZ3VhcmRzL3JiYWMuZ3VhcmQnO1xuXG5kZXNjcmliZSgnQ29ycmVzcG9uZGVuY2VDb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgY29udHJvbGxlcjogQ29ycmVzcG9uZGVuY2VDb250cm9sbGVyO1xuICBsZXQgbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZTogUGFydGlhbDxDb3JyZXNwb25kZW5jZVNlcnZpY2U+O1xuICBsZXQgbW9ja1dvcmtmbG93U2VydmljZTogUGFydGlhbDxDb3JyZXNwb25kZW5jZVdvcmtmbG93U2VydmljZT47XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZSA9IHtcbiAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxuICAgICAgZmluZEFsbDogamVzdC5mbigpLFxuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgICAgZ2V0UmVmZXJlbmNlczogamVzdC5mbigpLFxuICAgICAgYWRkUmVmZXJlbmNlOiBqZXN0LmZuKCksXG4gICAgICByZW1vdmVSZWZlcmVuY2U6IGplc3QuZm4oKSxcbiAgICAgIGZpbmRPbmVCeVV1aWQ6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgbW9ja1dvcmtmbG93U2VydmljZSA9IHtcbiAgICAgIHN1Ym1pdFdvcmtmbG93OiBqZXN0LmZuKCksXG4gICAgICBwcm9jZXNzQWN0aW9uOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW0NvcnJlc3BvbmRlbmNlQ29udHJvbGxlcl0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IENvcnJlc3BvbmRlbmNlU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrV29ya2Zsb3dTZXJ2aWNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgICAgLm92ZXJyaWRlR3VhcmQoSnd0QXV0aEd1YXJkKVxuICAgICAgLnVzZVZhbHVlKHsgY2FuQWN0aXZhdGU6ICgpID0+IHRydWUgfSlcbiAgICAgIC5vdmVycmlkZUd1YXJkKFJiYWNHdWFyZClcbiAgICAgIC51c2VWYWx1ZSh7IGNhbkFjdGl2YXRlOiAoKSA9PiB0cnVlIH0pXG4gICAgICAuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8Q29ycmVzcG9uZGVuY2VDb250cm9sbGVyPihDb3JyZXNwb25kZW5jZUNvbnRyb2xsZXIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnRyb2xsZXIpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5kQWxsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlc3BvbmRlbmNlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tSZXN1bHQgPSBbeyBpZDogMSB9XTtcbiAgICAgIChtb2NrQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRBbGwgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShcbiAgICAgICAgbW9ja1Jlc3VsdFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5maW5kQWxsKHt9KTtcblxuICAgICAgZXhwZWN0KG1vY2tDb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZEFsbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrUmVzdWx0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIGNvcnJlc3BvbmRlbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7IGlkOiAxLCBjb3JyZXNwb25kZW5jZU51bWJlcjogJ1RFU1QtMDAxJyB9O1xuICAgICAgKG1vY2tDb3JyZXNwb25kZW5jZVNlcnZpY2UuY3JlYXRlIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoXG4gICAgICAgIG1vY2tDb3JyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtb2NrUmVxID0geyB1c2VyOiB7IHVzZXJfaWQ6IDEgfSB9O1xuICAgICAgY29uc3QgY3JlYXRlRHRvID0ge1xuICAgICAgICBwcm9qZWN0SWQ6IDEsXG4gICAgICAgIHR5cGVJZDogMSxcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBfcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5jcmVhdGUoXG4gICAgICAgIGNyZWF0ZUR0byBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBjb250cm9sbGVyLmNyZWF0ZT5bMF0sXG4gICAgICAgIG1vY2tSZXEgYXMgUGFyYW1ldGVyczx0eXBlb2YgY29udHJvbGxlci5jcmVhdGU+WzFdXG4gICAgICApO1xuXG4gICAgICBleHBlY3QobW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZS5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBjcmVhdGVEdG8sXG4gICAgICAgIG1vY2tSZXEudXNlclxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N1Ym1pdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1Ym1pdCBhIGNvcnJlc3BvbmRlbmNlIHRvIHdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Jlc3VsdCA9IHsgaW5zdGFuY2VJZDogJ2luc3QtMScsIGN1cnJlbnRTdGF0ZTogJ0lOX1JFVklFVycgfTtcbiAgICAgIChtb2NrV29ya2Zsb3dTZXJ2aWNlLnN1Ym1pdFdvcmtmbG93IGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoXG4gICAgICAgIG1vY2tSZXN1bHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG1vY2tSZXEgPSB7IHVzZXI6IHsgdXNlcl9pZDogMSwgcm9sZXM6IFtdIH0gfTtcbiAgICAgIChtb2NrQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGlkOiAxLFxuICAgICAgICB1dWlkOiAnYTBlZWJjOTktOWMwYi00ZWY4LWJiNmQtNmJiOWJkMzgwYTExJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5zdWJtaXQoXG4gICAgICAgICdhMGVlYmM5OS05YzBiLTRlZjgtYmI2ZC02YmI5YmQzODBhMTEnLFxuICAgICAgICB7IG5vdGU6ICdUZXN0IG5vdGUnIH0sXG4gICAgICAgIG1vY2tSZXEgYXMgUGFyYW1ldGVyczx0eXBlb2YgY29udHJvbGxlci5zdWJtaXQ+WzJdXG4gICAgICApO1xuXG4gICAgICBleHBlY3QobW9ja1dvcmtmbG93U2VydmljZS5zdWJtaXRXb3JrZmxvdykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIDEsXG4gICAgICAgIDEsXG4gICAgICAgIFtdLFxuICAgICAgICAnVGVzdCBub3RlJ1xuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1Jlc3VsdCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44.map new file mode 100644 index 0000000..c02028c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/correspondencecontrollerspec_c5f9fd6ae9e36729f949dfdfe469ff44.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { CorrespondenceController } from './correspondence.controller';\nimport { CorrespondenceService } from './correspondence.service';\nimport { CorrespondenceWorkflowService } from './correspondence-workflow.service';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\n\ndescribe('CorrespondenceController', () => {\n let controller: CorrespondenceController;\n let mockCorrespondenceService: Partial;\n let mockWorkflowService: Partial;\n\n beforeEach(async () => {\n mockCorrespondenceService = {\n create: jest.fn(),\n findAll: jest.fn(),\n findOne: jest.fn(),\n getReferences: jest.fn(),\n addReference: jest.fn(),\n removeReference: jest.fn(),\n findOneByUuid: jest.fn(),\n };\n\n mockWorkflowService = {\n submitWorkflow: jest.fn(),\n processAction: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n controllers: [CorrespondenceController],\n providers: [\n {\n provide: CorrespondenceService,\n useValue: mockCorrespondenceService,\n },\n {\n provide: CorrespondenceWorkflowService,\n useValue: mockWorkflowService,\n },\n ],\n })\n .overrideGuard(JwtAuthGuard)\n .useValue({ canActivate: () => true })\n .overrideGuard(RbacGuard)\n .useValue({ canActivate: () => true })\n .compile();\n\n controller = module.get(CorrespondenceController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n describe('findAll', () => {\n it('should return correspondences', async () => {\n const mockResult = [{ id: 1 }];\n (mockCorrespondenceService.findAll as jest.Mock).mockResolvedValue(\n mockResult\n );\n\n const result = await controller.findAll({});\n\n expect(mockCorrespondenceService.findAll).toHaveBeenCalled();\n expect(result).toEqual(mockResult);\n });\n });\n\n describe('create', () => {\n it('should create a correspondence', async () => {\n const mockCorr = { id: 1, correspondenceNumber: 'TEST-001' };\n (mockCorrespondenceService.create as jest.Mock).mockResolvedValue(\n mockCorr\n );\n\n const mockReq = { user: { user_id: 1 } };\n const createDto = {\n projectId: 1,\n typeId: 1,\n subject: 'Test Subject',\n };\n\n const _result = await controller.create(\n createDto as Parameters[0],\n mockReq as Parameters[1]\n );\n\n expect(mockCorrespondenceService.create).toHaveBeenCalledWith(\n createDto,\n mockReq.user\n );\n });\n });\n\n describe('submit', () => {\n it('should submit a correspondence to workflow', async () => {\n const mockResult = { instanceId: 'inst-1', currentState: 'IN_REVIEW' };\n (mockWorkflowService.submitWorkflow as jest.Mock).mockResolvedValue(\n mockResult\n );\n\n const mockReq = { user: { user_id: 1, roles: [] } };\n (mockCorrespondenceService.findOneByUuid as jest.Mock).mockResolvedValue({\n id: 1,\n uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n });\n const result = await controller.submit(\n 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n { note: 'Test note' },\n mockReq as Parameters[2]\n );\n\n expect(mockWorkflowService.submitWorkflow).toHaveBeenCalledWith(\n 1,\n 1,\n [],\n 'Test note'\n );\n expect(result).toEqual(mockResult);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841 new file mode 100644 index 0000000..8f9fe44 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841 @@ -0,0 +1,15 @@ +c32f9030fe21a500c9139d8bd66a7907 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } + else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + return (0, crypto_1.createHash)('md5').update(bytes).digest(); +} +exports.default = md5; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWQ1LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxTQUFTLEdBQUcsQ0FBQyxLQUFLO0lBQ2QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztTQUNJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXG1kNS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNyeXB0b18xID0gcmVxdWlyZShcImNyeXB0b1wiKTtcbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzLCAndXRmOCcpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGNyeXB0b18xLmNyZWF0ZUhhc2gpKCdtZDUnKS51cGRhdGUoYnl0ZXMpLmRpZ2VzdCgpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbWQ1O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841.map new file mode 100644 index 0000000..4638b88 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/md5_c7142fbd71a8ecaa5364f4d76e8e2841.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\md5.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,SAAS,GAAG,CAAC,KAAK;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AAClE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\md5.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return (0, crypto_1.createHash)('md5').update(bytes).digest();\n}\nexports.default = md5;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0 new file mode 100644 index 0000000..c616dbc --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0 @@ -0,0 +1,15 @@ +9f889dd92690586b4e12f8881b89854e +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } + else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + return (0, crypto_1.createHash)('sha1').update(bytes).digest(); +} +exports.default = sha1; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcc2hhMS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFDYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkMsU0FBUyxJQUFJLENBQUMsS0FBSztJQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7U0FDSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ25FLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxzaGExLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzLCAndXRmOCcpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGNyeXB0b18xLmNyZWF0ZUhhc2gpKCdzaGExJykudXBkYXRlKGJ5dGVzKS5kaWdlc3QoKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHNoYTE7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0.map new file mode 100644 index 0000000..bd7b281 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c8/sha1_c882b159cea7007e924fc360f120c6d0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\sha1.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,SAAS,IAAI,CAAC,KAAK;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AACnE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\sha1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return (0, crypto_1.createHash)('sha1').update(bytes).digest();\n}\nexports.default = sha1;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58 new file mode 100644 index 0000000..1b2b3b5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58 @@ -0,0 +1,62 @@ +a3a93dffad359b8bf75f9440d291fa1c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Discipline = void 0; +// File: src/modules/master/entities/discipline.entity.ts +const typeorm_1 = require("typeorm"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); // ปรับ path ตามจริง +let Discipline = class Discipline { +}; +exports.Discipline = Discipline; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], Discipline.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id' }), + __metadata("design:type", Number) +], Discipline.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_code', length: 10 }), + __metadata("design:type", String) +], Discipline.prototype, "disciplineCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'code_name_th', nullable: true }), + __metadata("design:type", String) +], Discipline.prototype, "codeNameTh", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'code_name_en', nullable: true }), + __metadata("design:type", String) +], Discipline.prototype, "codeNameEn", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Discipline.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Discipline.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Discipline.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_c = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _c : Object) +], Discipline.prototype, "contract", void 0); +exports.Discipline = Discipline = __decorate([ + (0, typeorm_1.Entity)('disciplines'), + (0, typeorm_1.Unique)(['contractId', 'disciplineCode']) // ป้องกันรหัสซ้ำในสัญญาเดียวกัน +], Discipline); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcZGlzY2lwbGluZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCxxQ0FTaUI7QUFDakIsNkVBQW1FLENBQUMsb0JBQW9CO0FBSWpGLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7Q0E2QnRCLENBQUE7QUE3QlksZ0NBQVU7QUFFckI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztzQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOzs4Q0FDWjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O2tEQUN4QjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4Q0FDN0I7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7OENBQzdCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxDQUFDO0lBQ3pCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7NENBQUM7cUJBNUJULFVBQVU7SUFGdEIsSUFBQSxnQkFBTSxFQUFDLGFBQWEsQ0FBQztJQUNyQixJQUFBLGdCQUFNLEVBQUMsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztHQUM3RCxVQUFVLENBNkJ0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtYXN0ZXJcXGVudGl0aWVzXFxkaXNjaXBsaW5lLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9tYXN0ZXIvZW50aXRpZXMvZGlzY2lwbGluZS5lbnRpdHkudHNcbmltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIFVuaXF1ZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBDb250cmFjdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0L2VudGl0aWVzL2NvbnRyYWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBwYXRoIOC4leC4suC4oeC4iOC4o+C4tOC4h1xuXG5ARW50aXR5KCdkaXNjaXBsaW5lcycpXG5AVW5pcXVlKFsnY29udHJhY3RJZCcsICdkaXNjaXBsaW5lQ29kZSddKSAvLyDguJvguYnguK3guIfguIHguLHguJnguKPguKvguLHguKrguIvguYnguLPguYPguJnguKrguLHguI3guI3guLLguYDguJTguLXguKLguKfguIHguLHguJlcbmV4cG9ydCBjbGFzcyBEaXNjaXBsaW5lIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X2lkJyB9KVxuICBjb250cmFjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9jb2RlJywgbGVuZ3RoOiAxMCB9KVxuICBkaXNjaXBsaW5lQ29kZSE6IHN0cmluZzsgLy8g4LmA4LiK4LmI4LiZIEdFTiwgU1RSLCBBUkNcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvZGVfbmFtZV90aCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNvZGVOYW1lVGg/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb2RlX25hbWVfZW4nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb2RlTmFtZUVuPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb250cmFjdF9pZCcgfSlcbiAgY29udHJhY3Q/OiBDb250cmFjdDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58.map new file mode 100644 index 0000000..f08dcbb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/disciplineentity_c9e1f009e60f6c576c68cb9d7e742f58.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\discipline.entity.ts","mappings":";;;;;;;;;;;;;AAAA,yDAAyD;AACzD,qCASiB;AACjB,6EAAmE,CAAC,oBAAoB;AAIjF,IAAM,UAAU,GAAhB,MAAM,UAAU;CA6BtB,CAAA;AA7BY,gCAAU;AAErB;IADC,IAAA,gCAAsB,GAAE;;sCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;8CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;kDACxB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC7B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC7B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;IACzB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;4CAAC;qBA5BT,UAAU;IAFtB,IAAA,gBAAM,EAAC,aAAa,CAAC;IACrB,IAAA,gBAAM,EAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,gCAAgC;GAC7D,UAAU,CA6BtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\discipline.entity.ts"],"sourcesContent":["// File: src/modules/master/entities/discipline.entity.ts\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n UpdateDateColumn,\n Unique,\n} from 'typeorm';\nimport { Contract } from '../../contract/entities/contract.entity'; // ปรับ path ตามจริง\n\n@Entity('disciplines')\n@Unique(['contractId', 'disciplineCode']) // ป้องกันรหัสซ้ำในสัญญาเดียวกัน\nexport class Discipline {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'contract_id' })\n contractId!: number;\n\n @Column({ name: 'discipline_code', length: 10 })\n disciplineCode!: string; // เช่น GEN, STR, ARC\n\n @Column({ name: 'code_name_th', nullable: true })\n codeNameTh?: string;\n\n @Column({ name: 'code_name_en', nullable: true })\n codeNameEn?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => Contract)\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a new file mode 100644 index 0000000..3a4a5cd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a @@ -0,0 +1,15 @@ +c986d37c0a9fa0d03986777b9073c586 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function v6ToV1(uuid) { + const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid; + const v1Bytes = _v6ToV1(v6Bytes); + return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes; +} +exports.default = v6ToV1; +function _v6ToV1(v6Bytes) { + return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjZUb1YxLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLE1BQU0sQ0FBQyxJQUFJO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3RixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDekIsU0FBUyxPQUFPLENBQUMsT0FBTztJQUNwQixPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN2YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2NlRvVjEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHY2VG9WMSh1dWlkKSB7XG4gICAgY29uc3QgdjZCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBwYXJzZV9qc18xLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgICBjb25zdCB2MUJ5dGVzID0gX3Y2VG9WMSh2NkJ5dGVzKTtcbiAgICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkodjFCeXRlcykgOiB2MUJ5dGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjZUb1YxO1xuZnVuY3Rpb24gX3Y2VG9WMSh2NkJ5dGVzKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKCh2NkJ5dGVzWzNdICYgMHgwZikgPDwgNCkgfCAoKHY2Qnl0ZXNbNF0gPj4gNCkgJiAweDBmKSwgKCh2NkJ5dGVzWzRdICYgMHgwZikgPDwgNCkgfCAoKHY2Qnl0ZXNbNV0gJiAweGYwKSA+PiA0KSwgKCh2NkJ5dGVzWzVdICYgMHgwZikgPDwgNCkgfCAodjZCeXRlc1s2XSAmIDB4MGYpLCB2NkJ5dGVzWzddLCAoKHY2Qnl0ZXNbMV0gJiAweDBmKSA8PCA0KSB8ICgodjZCeXRlc1syXSAmIDB4ZjApID4+IDQpLCAoKHY2Qnl0ZXNbMl0gJiAweDBmKSA8PCA0KSB8ICgodjZCeXRlc1szXSAmIDB4ZjApID4+IDQpLCAweDEwIHwgKCh2NkJ5dGVzWzBdICYgMHhmMCkgPj4gNCksICgodjZCeXRlc1swXSAmIDB4MGYpIDw8IDQpIHwgKCh2NkJ5dGVzWzFdICYgMHhmMCkgPj4gNCksIHY2Qnl0ZXNbOF0sIHY2Qnl0ZXNbOV0sIHY2Qnl0ZXNbMTBdLCB2NkJ5dGVzWzExXSwgdjZCeXRlc1sxMl0sIHY2Qnl0ZXNbMTNdLCB2NkJ5dGVzWzE0XSwgdjZCeXRlc1sxNV0pO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a.map new file mode 100644 index 0000000..f50d9e8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/cf/v6ToV1_cffac5e0420b92001be8493a56a8f68a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6ToV1.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,MAAM,CAAC,IAAI;IAChB,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7F,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;AACzB,SAAS,OAAO,CAAC,OAAO;IACpB,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7f,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6ToV1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v6ToV1(uuid) {\n const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n const v1Bytes = _v6ToV1(v6Bytes);\n return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes;\n}\nexports.default = v6ToV1;\nfunction _v6ToV1(v6Bytes) {\n return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]);\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f new file mode 100644 index 0000000..a410b88 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f @@ -0,0 +1,316 @@ +265535a3f6e998fd28150f9f452422c0 +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var FileStorageService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileStorageService = void 0; +// File: src/common/file-storage/file-storage.service.ts +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const config_1 = require("@nestjs/config"); +const fs = __importStar(require("fs-extra")); +const path = __importStar(require("path")); +const crypto = __importStar(require("crypto")); +const uuid_1 = require("uuid"); +const attachment_entity_1 = require("./entities/attachment.entity"); +const common_2 = require("@nestjs/common"); // ✅ Import เพิ่ม +let FileStorageService = FileStorageService_1 = class FileStorageService { + constructor(attachmentRepository, configService) { + this.attachmentRepository = attachmentRepository; + this.configService = configService; + this.logger = new common_1.Logger(FileStorageService_1.name); + // ใช้ env vars จาก docker-compose สำหรับ Production + // ถ้าไม่ได้กำหนดจะ fallback เป็น ./uploads/temp และ ./uploads/permanent + this.tempDir = + this.configService.get('UPLOAD_TEMP_DIR') || + path.join(process.cwd(), 'uploads', 'temp'); + this.permanentDir = + this.configService.get('UPLOAD_PERMANENT_DIR') || + path.join(process.cwd(), 'uploads', 'permanent'); + // สร้างโฟลเดอร์ temp และ permanent รอไว้เลยถ้ายังไม่มี + fs.ensureDirSync(this.tempDir); + fs.ensureDirSync(this.permanentDir); + } + /** + * Phase 1: Upload (บันทึกไฟล์ลง Temp) + */ + async upload(file, userId) { + const tempId = (0, uuid_1.v4)(); + // Fix: แปลงชื่อไฟล์จาก Latin1 → UTF-8 (Multer/busboy decodes as Latin1 by default) + const originalFilename = this.fixMulterFilename(file.originalname); + const fileExt = path.extname(originalFilename); + const storedFilename = `${(0, uuid_1.v4)()}${fileExt}`; + const tempPath = path.join(this.tempDir, storedFilename); + // 1. คำนวณ Checksum (SHA-256) เพื่อความปลอดภัยและความถูกต้องของไฟล์ + const checksum = this.calculateChecksum(file.buffer); + // 2. บันทึกไฟล์ลง Disk (Temp Folder) + try { + await fs.writeFile(tempPath, file.buffer); + } + catch (error) { + this.logger.error(`Failed to write file: ${tempPath}`, error); + throw new common_1.BadRequestException('File upload failed'); + } + // 3. สร้าง Record ใน Database + const attachment = this.attachmentRepository.create({ + originalFilename, + storedFilename: storedFilename, + filePath: tempPath, // เก็บ path ปัจจุบันไปก่อน + mimeType: file.mimetype, + fileSize: file.size, + isTemporary: true, + tempId: tempId, + expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // หมดอายุใน 24 ชม. + checksum: checksum, + uploadedByUserId: userId, + }); + return this.attachmentRepository.save(attachment); + } + /** + * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent) + * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save + */ + /** + * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent) + * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save + * Updated [Phase 2]: Support issueDate and documentType for organized storage + */ + async commit(tempIds, options) { + if (!tempIds || tempIds.length === 0) { + return []; + } + const attachments = await this.attachmentRepository.find({ + where: { tempId: (0, typeorm_2.In)(tempIds), isTemporary: true }, + }); + if (attachments.length !== tempIds.length) { + // แจ้งเตือนแต่อาจจะไม่ throw ถ้าต้องการให้ process ต่อไปได้บางส่วน (ขึ้นอยู่กับ business logic) + // แต่เพื่อความปลอดภัยควรแจ้งว่าไฟล์ไม่ครบ + this.logger.warn(`Expected ${tempIds.length} files to commit, but found ${attachments.length}`); + throw new common_1.NotFoundException('Some files not found or already committed'); + } + const committedAttachments = []; + // Use issueDate if provided, otherwise default to current date + const refDate = options?.issueDate + ? new Date(options.issueDate) + : new Date(); + // Validate Date (in case invalid string passed) + const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate; + const year = effectiveDate.getFullYear().toString(); + const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0'); + // Construct Path: permanent/{DocumentType}/{YYYY}/{MM}/filename + const docTypeFolder = options?.documentType || 'General'; + // โฟลเดอร์ถาวรแยกตาม Type/ปี/เดือน + const permanentDir = path.join(this.permanentDir, docTypeFolder, year, month); + await fs.ensureDir(permanentDir); + for (const att of attachments) { + const oldPath = att.filePath; + const newPath = path.join(permanentDir, att.storedFilename); + try { + // ย้ายไฟล์ + if (await fs.pathExists(oldPath)) { + await fs.move(oldPath, newPath, { overwrite: true }); + // อัปเดตข้อมูลใน DB + att.filePath = newPath; + att.isTemporary = false; + att.tempId = undefined; // เคลียร์ tempId + att.expiresAt = undefined; // เคลียร์วันหมดอายุ + att.referenceDate = effectiveDate; // Save reference date + committedAttachments.push(await this.attachmentRepository.save(att)); + } + else { + this.logger.error(`File missing during commit: ${oldPath}`); + throw new common_1.NotFoundException(`File not found on disk: ${att.originalFilename}`); + } + } + catch (error) { + this.logger.error(`Failed to move file from ${oldPath} to ${newPath}`, error); + throw new common_1.BadRequestException(`Failed to commit file: ${att.originalFilename}`); + } + } + return committedAttachments; + } + /** + * Download File + * ดึงไฟล์มาเป็น Stream เพื่อส่งกลับไปให้ Controller + */ + async download(id) { + // 1. ค้นหาข้อมูลไฟล์จาก DB + const attachment = await this.attachmentRepository.findOne({ + where: { id }, + }); + if (!attachment) { + throw new common_1.NotFoundException(`Attachment #${id} not found`); + } + // 2. ตรวจสอบว่าไฟล์มีอยู่จริงบน Disk หรือไม่ + const filePath = attachment.filePath; + if (!fs.existsSync(filePath)) { + this.logger.error(`File missing on disk: ${filePath}`); + throw new common_1.NotFoundException('File not found on server storage'); + } + // 3. สร้าง Read Stream (มีประสิทธิภาพกว่าการโหลดทั้งไฟล์เข้า Memory) + const stream = fs.createReadStream(filePath); + return { stream, attachment }; + } + /** + * แก้ปัญหา Multer/busboy ถอดรหัสชื่อไฟล์เป็น Latin1 แทน UTF-8 + * ทำให้ภาษาไทยกลายเป็น mojibake (เช่น ผรม → 脿赂聹脿赂拢脿赂隆) + * วิธีแก้: แปลง latin1 bytes กลับเป็น UTF-8 + */ + fixMulterFilename(originalname) { + try { + const decoded = Buffer.from(originalname, 'latin1').toString('utf8'); + // ตรวจสอบว่า decoded string มี valid UTF-8 characters + // ถ้า originalname เป็น ASCII อยู่แล้ว ผลลัพธ์จะเหมือนเดิม + return decoded; + } + catch { + return originalname; + } + } + calculateChecksum(buffer) { + return crypto.createHash('sha256').update(buffer).digest('hex'); + } + /** + * ✅ NEW: Import Staging File (For Legacy Migration) + * ย้ายไฟล์จาก staging_ai ไปยัง permanent storage โดยตรง + */ + async importStagingFile(sourceFilePath, userId, options) { + if (!(await fs.pathExists(sourceFilePath))) { + this.logger.error(`Staging file not found: ${sourceFilePath}`); + throw new common_1.NotFoundException(`Source file not found: ${sourceFilePath}`); + } + // 1. Get file stats & checksum + const stats = await fs.stat(sourceFilePath); + const fileExt = path.extname(sourceFilePath); + const originalFilename = path.basename(sourceFilePath); + const storedFilename = `${(0, uuid_1.v4)()}${fileExt}`; + // Determine mime type basic + let mimeType = 'application/octet-stream'; + if (fileExt.toLowerCase() === '.pdf') + mimeType = 'application/pdf'; + else if (fileExt.toLowerCase() === '.xlsx') + mimeType = + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + const fileBuffer = await fs.readFile(sourceFilePath); + const checksum = this.calculateChecksum(fileBuffer); + // 2. Generate Permanent Path + const refDate = options?.issueDate || new Date(); + const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate; + const year = effectiveDate.getFullYear().toString(); + const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0'); + const docTypeFolder = options?.documentType || 'General'; + const permanentDir = path.join(this.permanentDir, docTypeFolder, year, month); + await fs.ensureDir(permanentDir); + const newPath = path.join(permanentDir, storedFilename); + // 3. Move File + try { + await fs.move(sourceFilePath, newPath, { overwrite: true }); + } + catch (error) { + this.logger.error(`Failed to move staging file to ${newPath}`, error); + throw new common_1.BadRequestException('Failed to process staging file'); + } + // 4. Create Database Record + const attachment = this.attachmentRepository.create({ + originalFilename, + storedFilename, + filePath: newPath, + mimeType, + fileSize: stats.size, + isTemporary: false, + referenceDate: effectiveDate, + checksum, + uploadedByUserId: userId, + }); + return this.attachmentRepository.save(attachment); + } + /** + * ✅ NEW: Delete File + * ลบไฟล์ออกจาก Disk และ Database + */ + async delete(id, userId) { + // 1. ค้นหาไฟล์ + const attachment = await this.attachmentRepository.findOne({ + where: { id }, + }); + if (!attachment) { + throw new common_1.NotFoundException(`Attachment #${id} not found`); + } + // 2. ตรวจสอบความเป็นเจ้าของ (Security Check) + // อนุญาตให้ลบถ้าเป็นคนอัปโหลดเอง + // (ในอนาคตอาจเพิ่มเงื่อนไข OR User เป็น Admin/Document Control) + if (attachment.uploadedByUserId !== userId) { + this.logger.warn(`User ${userId} tried to delete file ${id} owned by ${attachment.uploadedByUserId}`); + throw new common_2.ForbiddenException('You are not allowed to delete this file'); + } + // 3. ลบไฟล์ออกจาก Disk + try { + if (await fs.pathExists(attachment.filePath)) { + await fs.remove(attachment.filePath); + } + else { + this.logger.warn(`File not found on disk during deletion: ${attachment.filePath}`); + } + } + catch (error) { + this.logger.error(`Failed to delete file from disk: ${attachment.filePath}`, error); + throw new common_1.BadRequestException('Failed to delete file from storage'); + } + // 4. ลบ Record ออกจาก Database + await this.attachmentRepository.remove(attachment); + this.logger.log(`File deleted: ${id} by user ${userId}`); + } +}; +exports.FileStorageService = FileStorageService; +exports.FileStorageService = FileStorageService = FileStorageService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(attachment_entity_1.Attachment)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _b : Object]) +], FileStorageService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXlDO0FBQ3pDLDJDQUErQztBQUMvQyw2Q0FBK0I7QUFDL0IsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQywrQkFBb0M7QUFDcEMsb0VBQTBEO0FBQzFELDJDQUFvRCxDQUFDLGlCQUFpQjtBQUcvRCxJQUFNLGtCQUFrQiwwQkFBeEIsTUFBTSxrQkFBa0I7SUFLN0IsWUFFRSxvQkFBb0QsRUFDNUMsYUFBNEI7UUFENUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF3QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQVByQixXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsb0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFTNUQsb0RBQW9EO1FBQ3BELHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsT0FBTztZQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFTLGlCQUFpQixDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVk7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBUyxzQkFBc0IsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELHVEQUF1RDtRQUN2RCxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsYUFBYSxDQUFDLElBQUks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QUFNLENBQUMsSUFBSSxDQUNkLDJDQUEyQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQ2pFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixvQ0FBb0MsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUN6RCxLQUFLLENBQ04sQ0FBQztZQUNGLE1BQU0sSUFBSSw0QkFBbUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFlBQVksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQTtBQWhVWSxnREFBa0I7NkJBQWxCLGtCQUFrQjtJQUQ5QixJQUFBLG1CQUFVLEdBQUU7SUFPUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsOEJBQVUsQ0FBQyxDQUFBO3lEQUNDLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUNqQixzQkFBYSxvQkFBYixzQkFBYTtHQVIzQixrQkFBa0IsQ0FnVTlCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZmlsZS1zdG9yYWdlXFxmaWxlLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZS50c1xuaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIExvZ2dlcixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5LCBJbiB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgRm9yYmlkZGVuRXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nOyAvLyDinIUgSW1wb3J0IOC5gOC4nuC4tOC5iOC4oVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVN0b3JhZ2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEZpbGVTdG9yYWdlU2VydmljZS5uYW1lKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWFuZW50RGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQXR0YWNobWVudClcbiAgICBwcml2YXRlIGF0dGFjaG1lbnRSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEF0dGFjaG1lbnQ+LFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxuICApIHtcbiAgICAvLyDguYPguIrguYkgZW52IHZhcnMg4LiI4Liy4LiBIGRvY2tlci1jb21wb3NlIOC4quC4s+C4q+C4o+C4seC4miBQcm9kdWN0aW9uXG4gICAgLy8g4LiW4LmJ4Liy4LmE4Lih4LmI4LmE4LiU4LmJ4LiB4Liz4Lir4LiZ4LiU4LiI4LiwIGZhbGxiYWNrIOC5gOC4m+C5h+C4mSAuL3VwbG9hZHMvdGVtcCDguYHguKXguLAgLi91cGxvYWRzL3Blcm1hbmVudFxuICAgIHRoaXMudGVtcERpciA9XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0PHN0cmluZz4oJ1VQTE9BRF9URU1QX0RJUicpIHx8XG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3VwbG9hZHMnLCAndGVtcCcpO1xuICAgIHRoaXMucGVybWFuZW50RGlyID1cbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5nZXQ8c3RyaW5nPignVVBMT0FEX1BFUk1BTkVOVF9ESVInKSB8fFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd1cGxvYWRzJywgJ3Blcm1hbmVudCcpO1xuXG4gICAgLy8g4Liq4Lij4LmJ4Liy4LiH4LmC4Lif4Lil4LmA4LiU4Lit4Lij4LmMIHRlbXAg4LmB4Lil4LiwIHBlcm1hbmVudCDguKPguK3guYTguKfguYnguYDguKXguKLguJbguYnguLLguKLguLHguIfguYTguKHguYjguKHguLVcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHRoaXMudGVtcERpcik7XG4gICAgZnMuZW5zdXJlRGlyU3luYyh0aGlzLnBlcm1hbmVudERpcik7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMTogVXBsb2FkICjguJrguLHguJnguJfguLbguIHguYTguJ/guKXguYzguKXguIcgVGVtcClcbiAgICovXG4gIGFzeW5jIHVwbG9hZChmaWxlOiBFeHByZXNzLk11bHRlci5GaWxlLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8QXR0YWNobWVudD4ge1xuICAgIGNvbnN0IHRlbXBJZCA9IHV1aWR2NCgpO1xuICAgIC8vIEZpeDog4LmB4Lib4Lil4LiH4LiK4Li34LmI4Lit4LmE4Lif4Lil4LmM4LiI4Liy4LiBIExhdGluMSDihpIgVVRGLTggKE11bHRlci9idXNib3kgZGVjb2RlcyBhcyBMYXRpbjEgYnkgZGVmYXVsdClcbiAgICBjb25zdCBvcmlnaW5hbEZpbGVuYW1lID0gdGhpcy5maXhNdWx0ZXJGaWxlbmFtZShmaWxlLm9yaWdpbmFsbmFtZSk7XG4gICAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShvcmlnaW5hbEZpbGVuYW1lKTtcbiAgICBjb25zdCBzdG9yZWRGaWxlbmFtZSA9IGAke3V1aWR2NCgpfSR7ZmlsZUV4dH1gO1xuICAgIGNvbnN0IHRlbXBQYXRoID0gcGF0aC5qb2luKHRoaXMudGVtcERpciwgc3RvcmVkRmlsZW5hbWUpO1xuXG4gICAgLy8gMS4g4LiE4Liz4LiZ4Lin4LiTIENoZWNrc3VtIChTSEEtMjU2KSDguYDguJ7guLfguYjguK3guITguKfguLLguKHguJvguKXguK3guJTguKDguLHguKLguYHguKXguLDguITguKfguLLguKHguJbguLnguIHguJXguYnguK3guIfguILguK3guIfguYTguJ/guKXguYxcbiAgICBjb25zdCBjaGVja3N1bSA9IHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZS5idWZmZXIpO1xuXG4gICAgLy8gMi4g4Lia4Lix4LiZ4LiX4Li24LiB4LmE4Lif4Lil4LmM4Lil4LiHIERpc2sgKFRlbXAgRm9sZGVyKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGZpbGUuYnVmZmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB3cml0ZSBmaWxlOiAke3RlbXBQYXRofWAsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdGaWxlIHVwbG9hZCBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKrguKPguYnguLLguIcgUmVjb3JkIOC5g+C4mSBEYXRhYmFzZVxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICBvcmlnaW5hbEZpbGVuYW1lLFxuICAgICAgc3RvcmVkRmlsZW5hbWU6IHN0b3JlZEZpbGVuYW1lLFxuICAgICAgZmlsZVBhdGg6IHRlbXBQYXRoLCAvLyDguYDguIHguYfguJogcGF0aCDguJvguLHguIjguIjguLjguJrguLHguJnguYTguJvguIHguYjguK3guJlcbiAgICAgIG1pbWVUeXBlOiBmaWxlLm1pbWV0eXBlLFxuICAgICAgZmlsZVNpemU6IGZpbGUuc2l6ZSxcbiAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgdGVtcElkOiB0ZW1wSWQsXG4gICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKERhdGUubm93KCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKSwgLy8g4Lir4Lih4LiU4Lit4Liy4Lii4Li44LmD4LiZIDI0IOC4iuC4oS5cbiAgICAgIGNoZWNrc3VtOiBjaGVja3N1bSxcbiAgICAgIHVwbG9hZGVkQnlVc2VySWQ6IHVzZXJJZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LnNhdmUoYXR0YWNobWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMjogQ29tbWl0ICjguKLguYnguLLguKLguYTguJ/guKXguYzguIjguLLguIEgVGVtcCAtPiBQZXJtYW5lbnQpXG4gICAqIOC5gOC4oeC4mOC4reC4lOC4meC4teC5ieC4iOC4sOC4luC4ueC4geC5gOC4o+C4teC4ouC4geC5guC4lOC4oiBTZXJ2aWNlIOC4reC4t+C5iOC4mSAo4LmA4LiK4LmI4LiZIENvcnJlc3BvbmRlbmNlU2VydmljZSkg4LmA4Lih4Li34LmI4Lit4LiB4LiUIFNhdmVcbiAgICovXG4gIC8qKlxuICAgKiBQaGFzZSAyOiBDb21taXQgKOC4ouC5ieC4suC4ouC5hOC4n+C4peC5jOC4iOC4suC4gSBUZW1wIC0+IFBlcm1hbmVudClcbiAgICog4LmA4Lih4LiY4Lit4LiU4LiZ4Li14LmJ4LiI4Liw4LiW4Li54LiB4LmA4Lij4Li14Lii4LiB4LmC4LiU4LiiIFNlcnZpY2Ug4Lit4Li34LmI4LiZICjguYDguIrguYjguJkgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlKSDguYDguKHguLfguYjguK3guIHguJQgU2F2ZVxuICAgKiBVcGRhdGVkIFtQaGFzZSAyXTogU3VwcG9ydCBpc3N1ZURhdGUgYW5kIGRvY3VtZW50VHlwZSBmb3Igb3JnYW5pemVkIHN0b3JhZ2VcbiAgICovXG4gIGFzeW5jIGNvbW1pdChcbiAgICB0ZW1wSWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogeyBpc3N1ZURhdGU/OiBEYXRlOyBkb2N1bWVudFR5cGU/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPEF0dGFjaG1lbnRbXT4ge1xuICAgIGlmICghdGVtcElkcyB8fCB0ZW1wSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7IHRlbXBJZDogSW4odGVtcElkcyksIGlzVGVtcG9yYXJ5OiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoICE9PSB0ZW1wSWRzLmxlbmd0aCkge1xuICAgICAgLy8g4LmB4LiI4LmJ4LiH4LmA4LiV4Li34Lit4LiZ4LmB4LiV4LmI4Lit4Liy4LiI4LiI4Liw4LmE4Lih4LmIIHRocm93IOC4luC5ieC4suC4leC5ieC4reC4h+C4geC4suC4o+C5g+C4q+C5iSBwcm9jZXNzIOC4leC5iOC4reC5hOC4m+C5hOC4lOC5ieC4muC4suC4h+C4quC5iOC4p+C4mSAo4LiC4Li24LmJ4LiZ4Lit4Lii4Li54LmI4LiB4Lix4LiaIGJ1c2luZXNzIGxvZ2ljKVxuICAgICAgLy8g4LmB4LiV4LmI4LmA4Lie4Li34LmI4Lit4LiE4Lin4Liy4Lih4Lib4Lil4Lit4LiU4Lig4Lix4Lii4LiE4Lin4Lij4LmB4LiI4LmJ4LiH4Lin4LmI4Liy4LmE4Lif4Lil4LmM4LmE4Lih4LmI4LiE4Lij4LiaXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgRXhwZWN0ZWQgJHt0ZW1wSWRzLmxlbmd0aH0gZmlsZXMgdG8gY29tbWl0LCBidXQgZm91bmQgJHthdHRhY2htZW50cy5sZW5ndGh9YFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignU29tZSBmaWxlcyBub3QgZm91bmQgb3IgYWxyZWFkeSBjb21taXR0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21taXR0ZWRBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG4gICAgLy8gVXNlIGlzc3VlRGF0ZSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gY3VycmVudCBkYXRlXG4gICAgY29uc3QgcmVmRGF0ZSA9IG9wdGlvbnM/Lmlzc3VlRGF0ZVxuICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLmlzc3VlRGF0ZSlcbiAgICAgIDogbmV3IERhdGUoKTtcblxuICAgIC8vIFZhbGlkYXRlIERhdGUgKGluIGNhc2UgaW52YWxpZCBzdHJpbmcgcGFzc2VkKVxuICAgIGNvbnN0IGVmZmVjdGl2ZURhdGUgPSBpc05hTihyZWZEYXRlLmdldFRpbWUoKSkgPyBuZXcgRGF0ZSgpIDogcmVmRGF0ZTtcblxuICAgIGNvbnN0IHllYXIgPSBlZmZlY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtb250aCA9IChlZmZlY3RpdmVEYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgUGF0aDogcGVybWFuZW50L3tEb2N1bWVudFR5cGV9L3tZWVlZfS97TU19L2ZpbGVuYW1lXG4gICAgY29uc3QgZG9jVHlwZUZvbGRlciA9IG9wdGlvbnM/LmRvY3VtZW50VHlwZSB8fCAnR2VuZXJhbCc7XG5cbiAgICAvLyDguYLguJ/guKXguYDguJTguK3guKPguYzguJbguLLguKfguKPguYHguKLguIHguJXguLLguKEgVHlwZS/guJvguLUv4LmA4LiU4Li34Lit4LiZXG4gICAgY29uc3QgcGVybWFuZW50RGlyID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5wZXJtYW5lbnREaXIsXG4gICAgICBkb2NUeXBlRm9sZGVyLFxuICAgICAgeWVhcixcbiAgICAgIG1vbnRoXG4gICAgKTtcbiAgICBhd2FpdCBmcy5lbnN1cmVEaXIocGVybWFuZW50RGlyKTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIGF0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gYXR0LmZpbGVQYXRoO1xuICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihwZXJtYW5lbnREaXIsIGF0dC5zdG9yZWRGaWxlbmFtZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIOC4ouC5ieC4suC4ouC5hOC4n+C4peC5jFxuICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhvbGRQYXRoKSkge1xuICAgICAgICAgIGF3YWl0IGZzLm1vdmUob2xkUGF0aCwgbmV3UGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG5cbiAgICAgICAgICAvLyDguK3guLHguJvguYDguJTguJXguILguYnguK3guKHguLnguKXguYPguJkgREJcbiAgICAgICAgICBhdHQuZmlsZVBhdGggPSBuZXdQYXRoO1xuICAgICAgICAgIGF0dC5pc1RlbXBvcmFyeSA9IGZhbHNlO1xuICAgICAgICAgIGF0dC50ZW1wSWQgPSB1bmRlZmluZWQ7IC8vIOC5gOC4hOC4peC4teC4ouC4o+C5jCB0ZW1wSWRcbiAgICAgICAgICBhdHQuZXhwaXJlc0F0ID0gdW5kZWZpbmVkOyAvLyDguYDguITguKXguLXguKLguKPguYzguKfguLHguJnguKvguKHguJTguK3guLLguKLguLhcbiAgICAgICAgICBhdHQucmVmZXJlbmNlRGF0ZSA9IGVmZmVjdGl2ZURhdGU7IC8vIFNhdmUgcmVmZXJlbmNlIGRhdGVcblxuICAgICAgICAgIGNvbW1pdHRlZEF0dGFjaG1lbnRzLnB1c2goYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5zYXZlKGF0dCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGaWxlIG1pc3NpbmcgZHVyaW5nIGNvbW1pdDogJHtvbGRQYXRofWApO1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICAgIGBGaWxlIG5vdCBmb3VuZCBvbiBkaXNrOiAke2F0dC5vcmlnaW5hbEZpbGVuYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIG1vdmUgZmlsZSBmcm9tICR7b2xkUGF0aH0gdG8gJHtuZXdQYXRofWAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEZhaWxlZCB0byBjb21taXQgZmlsZTogJHthdHQub3JpZ2luYWxGaWxlbmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1pdHRlZEF0dGFjaG1lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIEZpbGVcbiAgICog4LiU4Li24LiH4LmE4Lif4Lil4LmM4Lih4Liy4LmA4Lib4LmH4LiZIFN0cmVhbSDguYDguJ7guLfguYjguK3guKrguYjguIfguIHguKXguLHguJrguYTguJvguYPguKvguYkgQ29udHJvbGxlclxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgaWQ6IG51bWJlclxuICApOiBQcm9taXNlPHsgc3RyZWFtOiBmcy5SZWFkU3RyZWFtOyBhdHRhY2htZW50OiBBdHRhY2htZW50IH0+IHtcbiAgICAvLyAxLiDguITguYnguJnguKvguLLguILguYnguK3guKHguLnguKXguYTguJ/guKXguYzguIjguLLguIEgREJcbiAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IGlkIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXR0YWNobWVudCAjJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgLy8gMi4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4Liy4LmE4Lif4Lil4LmM4Lih4Li14Lit4Lii4Li54LmI4LiI4Lij4Li04LiH4Lia4LiZIERpc2sg4Lir4Lij4Li34Lit4LmE4Lih4LmIXG4gICAgY29uc3QgZmlsZVBhdGggPSBhdHRhY2htZW50LmZpbGVQYXRoO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGaWxlIG1pc3Npbmcgb24gZGlzazogJHtmaWxlUGF0aH1gKTtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignRmlsZSBub3QgZm91bmQgb24gc2VydmVyIHN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKrguKPguYnguLLguIcgUmVhZCBTdHJlYW0gKOC4oeC4teC4m+C4o+C4sOC4quC4tOC4l+C4mOC4tOC4oOC4suC4nuC4geC4p+C5iOC4suC4geC4suC4o+C5guC4q+C4peC4lOC4l+C4seC5ieC4h+C5hOC4n+C4peC5jOC5gOC4guC5ieC4siBNZW1vcnkpXG4gICAgY29uc3Qgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG5cbiAgICByZXR1cm4geyBzdHJlYW0sIGF0dGFjaG1lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguYHguIHguYnguJvguLHguI3guKvguLIgTXVsdGVyL2J1c2JveSDguJbguK3guJTguKPguKvguLHguKrguIrguLfguYjguK3guYTguJ/guKXguYzguYDguJvguYfguJkgTGF0aW4xIOC5geC4l+C4mSBVVEYtOFxuICAgKiDguJfguLPguYPguKvguYnguKDguLLguKnguLLguYTguJfguKLguIHguKXguLLguKLguYDguJvguYfguJkgbW9qaWJha2UgKOC5gOC4iuC5iOC4mSDguJzguKPguKEg4oaSIOiEv+i1guiBueiEv+i1guaLouiEv+i1gumahilcbiAgICog4Lin4Li04LiY4Li14LmB4LiB4LmJOiDguYHguJvguKXguIcgbGF0aW4xIGJ5dGVzIOC4geC4peC4seC4muC5gOC4m+C5h+C4mSBVVEYtOFxuICAgKi9cbiAgcHJpdmF0ZSBmaXhNdWx0ZXJGaWxlbmFtZShvcmlnaW5hbG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShvcmlnaW5hbG5hbWUsICdsYXRpbjEnKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIGRlY29kZWQgc3RyaW5nIOC4oeC4tSB2YWxpZCBVVEYtOCBjaGFyYWN0ZXJzXG4gICAgICAvLyDguJbguYnguLIgb3JpZ2luYWxuYW1lIOC5gOC4m+C5h+C4mSBBU0NJSSDguK3guKLguLnguYjguYHguKXguYnguKcg4Lic4Lil4Lil4Lix4Lie4LiY4LmM4LiI4Liw4LmA4Lir4Lih4Li34Lit4LiZ4LmA4LiU4Li04LihXG4gICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbG5hbWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDaGVja3N1bShidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIOKchSBORVc6IEltcG9ydCBTdGFnaW5nIEZpbGUgKEZvciBMZWdhY3kgTWlncmF0aW9uKVxuICAgKiDguKLguYnguLLguKLguYTguJ/guKXguYzguIjguLLguIEgc3RhZ2luZ19haSDguYTguJvguKLguLHguIcgcGVybWFuZW50IHN0b3JhZ2Ug4LmC4LiU4Lii4LiV4Lij4LiHXG4gICAqL1xuICBhc3luYyBpbXBvcnRTdGFnaW5nRmlsZShcbiAgICBzb3VyY2VGaWxlUGF0aDogc3RyaW5nLFxuICAgIHVzZXJJZDogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiB7IGlzc3VlRGF0ZT86IERhdGU7IGRvY3VtZW50VHlwZT86IHN0cmluZyB9XG4gICk6IFByb21pc2U8QXR0YWNobWVudD4ge1xuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMoc291cmNlRmlsZVBhdGgpKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFN0YWdpbmcgZmlsZSBub3QgZm91bmQ6ICR7c291cmNlRmlsZVBhdGh9YCk7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNvdXJjZSBmaWxlIG5vdCBmb3VuZDogJHtzb3VyY2VGaWxlUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyAxLiBHZXQgZmlsZSBzdGF0cyAmIGNoZWNrc3VtXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBmaWxlRXh0ID0gcGF0aC5leHRuYW1lKHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBvcmlnaW5hbEZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShzb3VyY2VGaWxlUGF0aCk7XG4gICAgY29uc3Qgc3RvcmVkRmlsZW5hbWUgPSBgJHt1dWlkdjQoKX0ke2ZpbGVFeHR9YDtcblxuICAgIC8vIERldGVybWluZSBtaW1lIHR5cGUgYmFzaWNcbiAgICBsZXQgbWltZVR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICBpZiAoZmlsZUV4dC50b0xvd2VyQ2FzZSgpID09PSAnLnBkZicpIG1pbWVUeXBlID0gJ2FwcGxpY2F0aW9uL3BkZic7XG4gICAgZWxzZSBpZiAoZmlsZUV4dC50b0xvd2VyQ2FzZSgpID09PSAnLnhsc3gnKVxuICAgICAgbWltZVR5cGUgPVxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnO1xuXG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBjaGVja3N1bSA9IHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZUJ1ZmZlcik7XG5cbiAgICAvLyAyLiBHZW5lcmF0ZSBQZXJtYW5lbnQgUGF0aFxuICAgIGNvbnN0IHJlZkRhdGUgPSBvcHRpb25zPy5pc3N1ZURhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVEYXRlID0gaXNOYU4ocmVmRGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IHJlZkRhdGU7XG4gICAgY29uc3QgeWVhciA9IGVmZmVjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoID0gKGVmZmVjdGl2ZURhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkb2NUeXBlRm9sZGVyID0gb3B0aW9ucz8uZG9jdW1lbnRUeXBlIHx8ICdHZW5lcmFsJztcblxuICAgIGNvbnN0IHBlcm1hbmVudERpciA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucGVybWFuZW50RGlyLFxuICAgICAgZG9jVHlwZUZvbGRlcixcbiAgICAgIHllYXIsXG4gICAgICBtb250aFxuICAgICk7XG4gICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBlcm1hbmVudERpcik7XG5cbiAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKHBlcm1hbmVudERpciwgc3RvcmVkRmlsZW5hbWUpO1xuXG4gICAgLy8gMy4gTW92ZSBGaWxlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1vdmUoc291cmNlRmlsZVBhdGgsIG5ld1BhdGgsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIG1vdmUgc3RhZ2luZyBmaWxlIHRvICR7bmV3UGF0aH1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmFpbGVkIHRvIHByb2Nlc3Mgc3RhZ2luZyBmaWxlJyk7XG4gICAgfVxuXG4gICAgLy8gNC4gQ3JlYXRlIERhdGFiYXNlIFJlY29yZFxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICBvcmlnaW5hbEZpbGVuYW1lLFxuICAgICAgc3RvcmVkRmlsZW5hbWUsXG4gICAgICBmaWxlUGF0aDogbmV3UGF0aCxcbiAgICAgIG1pbWVUeXBlLFxuICAgICAgZmlsZVNpemU6IHN0YXRzLnNpemUsXG4gICAgICBpc1RlbXBvcmFyeTogZmFsc2UsXG4gICAgICByZWZlcmVuY2VEYXRlOiBlZmZlY3RpdmVEYXRlLFxuICAgICAgY2hlY2tzdW0sXG4gICAgICB1cGxvYWRlZEJ5VXNlcklkOiB1c2VySWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5zYXZlKGF0dGFjaG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOKchSBORVc6IERlbGV0ZSBGaWxlXG4gICAqIOC4peC4muC5hOC4n+C4peC5jOC4reC4reC4geC4iOC4suC4gSBEaXNrIOC5geC4peC4sCBEYXRhYmFzZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBudW1iZXIsIHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4g4LiE4LmJ4LiZ4Lir4Liy4LmE4Lif4Lil4LmMXG4gICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IHRoaXMuYXR0YWNobWVudFJlcG9zaXRvcnkuZmluZE9uZSh7XG4gICAgICB3aGVyZTogeyBpZCB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFhdHRhY2htZW50KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYEF0dGFjaG1lbnQgIyR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4leC4o+C4p+C4iOC4quC4reC4muC4hOC4p+C4suC4oeC5gOC4m+C5h+C4meC5gOC4iOC5ieC4suC4guC4reC4hyAoU2VjdXJpdHkgQ2hlY2spXG4gICAgLy8g4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4Lil4Lia4LiW4LmJ4Liy4LmA4Lib4LmH4LiZ4LiE4LiZ4Lit4Lix4Lib4LmC4Lir4Lil4LiU4LmA4Lit4LiHXG4gICAgLy8gKOC5g+C4meC4reC4meC4suC4hOC4leC4reC4suC4iOC5gOC4nuC4tOC5iOC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4giBPUiBVc2VyIOC5gOC4m+C5h+C4mSBBZG1pbi9Eb2N1bWVudCBDb250cm9sKVxuICAgIGlmIChhdHRhY2htZW50LnVwbG9hZGVkQnlVc2VySWQgIT09IHVzZXJJZCkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYFVzZXIgJHt1c2VySWR9IHRyaWVkIHRvIGRlbGV0ZSBmaWxlICR7aWR9IG93bmVkIGJ5ICR7YXR0YWNobWVudC51cGxvYWRlZEJ5VXNlcklkfWBcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKCdZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGRlbGV0ZSB0aGlzIGZpbGUnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKXguJrguYTguJ/guKXguYzguK3guK3guIHguIjguLLguIEgRGlza1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhhdHRhY2htZW50LmZpbGVQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5yZW1vdmUoYXR0YWNobWVudC5maWxlUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWxlIG5vdCBmb3VuZCBvbiBkaXNrIGR1cmluZyBkZWxldGlvbjogJHthdHRhY2htZW50LmZpbGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlIGZpbGUgZnJvbSBkaXNrOiAke2F0dGFjaG1lbnQuZmlsZVBhdGh9YCxcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmFpbGVkIHRvIGRlbGV0ZSBmaWxlIGZyb20gc3RvcmFnZScpO1xuICAgIH1cblxuICAgIC8vIDQuIOC4peC4miBSZWNvcmQg4Lit4Lit4LiB4LiI4Liy4LiBIERhdGFiYXNlXG4gICAgYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5yZW1vdmUoYXR0YWNobWVudCk7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coYEZpbGUgZGVsZXRlZDogJHtpZH0gYnkgdXNlciAke3VzZXJJZH1gKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f.map new file mode 100644 index 0000000..b450924 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d1/filestorageservice_d1de7c3db6a6360fcaa4b58bb9eaf86f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.ts"],"sourcesContent":["// File: src/common/file-storage/file-storage.service.ts\nimport {\n Injectable,\n NotFoundException,\n BadRequestException,\n Logger,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository, In } from 'typeorm';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Attachment } from './entities/attachment.entity';\nimport { ForbiddenException } from '@nestjs/common'; // ✅ Import เพิ่ม\n\n@Injectable()\nexport class FileStorageService {\n private readonly logger = new Logger(FileStorageService.name);\n private readonly tempDir: string;\n private readonly permanentDir: string;\n\n constructor(\n @InjectRepository(Attachment)\n private attachmentRepository: Repository,\n private configService: ConfigService\n ) {\n // ใช้ env vars จาก docker-compose สำหรับ Production\n // ถ้าไม่ได้กำหนดจะ fallback เป็น ./uploads/temp และ ./uploads/permanent\n this.tempDir =\n this.configService.get('UPLOAD_TEMP_DIR') ||\n path.join(process.cwd(), 'uploads', 'temp');\n this.permanentDir =\n this.configService.get('UPLOAD_PERMANENT_DIR') ||\n path.join(process.cwd(), 'uploads', 'permanent');\n\n // สร้างโฟลเดอร์ temp และ permanent รอไว้เลยถ้ายังไม่มี\n fs.ensureDirSync(this.tempDir);\n fs.ensureDirSync(this.permanentDir);\n }\n\n /**\n * Phase 1: Upload (บันทึกไฟล์ลง Temp)\n */\n async upload(file: Express.Multer.File, userId: number): Promise {\n const tempId = uuidv4();\n // Fix: แปลงชื่อไฟล์จาก Latin1 → UTF-8 (Multer/busboy decodes as Latin1 by default)\n const originalFilename = this.fixMulterFilename(file.originalname);\n const fileExt = path.extname(originalFilename);\n const storedFilename = `${uuidv4()}${fileExt}`;\n const tempPath = path.join(this.tempDir, storedFilename);\n\n // 1. คำนวณ Checksum (SHA-256) เพื่อความปลอดภัยและความถูกต้องของไฟล์\n const checksum = this.calculateChecksum(file.buffer);\n\n // 2. บันทึกไฟล์ลง Disk (Temp Folder)\n try {\n await fs.writeFile(tempPath, file.buffer);\n } catch (error) {\n this.logger.error(`Failed to write file: ${tempPath}`, error);\n throw new BadRequestException('File upload failed');\n }\n\n // 3. สร้าง Record ใน Database\n const attachment = this.attachmentRepository.create({\n originalFilename,\n storedFilename: storedFilename,\n filePath: tempPath, // เก็บ path ปัจจุบันไปก่อน\n mimeType: file.mimetype,\n fileSize: file.size,\n isTemporary: true,\n tempId: tempId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // หมดอายุใน 24 ชม.\n checksum: checksum,\n uploadedByUserId: userId,\n });\n\n return this.attachmentRepository.save(attachment);\n }\n\n /**\n * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent)\n * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save\n */\n /**\n * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent)\n * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save\n * Updated [Phase 2]: Support issueDate and documentType for organized storage\n */\n async commit(\n tempIds: string[],\n options?: { issueDate?: Date; documentType?: string }\n ): Promise {\n if (!tempIds || tempIds.length === 0) {\n return [];\n }\n\n const attachments = await this.attachmentRepository.find({\n where: { tempId: In(tempIds), isTemporary: true },\n });\n\n if (attachments.length !== tempIds.length) {\n // แจ้งเตือนแต่อาจจะไม่ throw ถ้าต้องการให้ process ต่อไปได้บางส่วน (ขึ้นอยู่กับ business logic)\n // แต่เพื่อความปลอดภัยควรแจ้งว่าไฟล์ไม่ครบ\n this.logger.warn(\n `Expected ${tempIds.length} files to commit, but found ${attachments.length}`\n );\n throw new NotFoundException('Some files not found or already committed');\n }\n\n const committedAttachments: Attachment[] = [];\n // Use issueDate if provided, otherwise default to current date\n const refDate = options?.issueDate\n ? new Date(options.issueDate)\n : new Date();\n\n // Validate Date (in case invalid string passed)\n const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate;\n\n const year = effectiveDate.getFullYear().toString();\n const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0');\n\n // Construct Path: permanent/{DocumentType}/{YYYY}/{MM}/filename\n const docTypeFolder = options?.documentType || 'General';\n\n // โฟลเดอร์ถาวรแยกตาม Type/ปี/เดือน\n const permanentDir = path.join(\n this.permanentDir,\n docTypeFolder,\n year,\n month\n );\n await fs.ensureDir(permanentDir);\n\n for (const att of attachments) {\n const oldPath = att.filePath;\n const newPath = path.join(permanentDir, att.storedFilename);\n\n try {\n // ย้ายไฟล์\n if (await fs.pathExists(oldPath)) {\n await fs.move(oldPath, newPath, { overwrite: true });\n\n // อัปเดตข้อมูลใน DB\n att.filePath = newPath;\n att.isTemporary = false;\n att.tempId = undefined; // เคลียร์ tempId\n att.expiresAt = undefined; // เคลียร์วันหมดอายุ\n att.referenceDate = effectiveDate; // Save reference date\n\n committedAttachments.push(await this.attachmentRepository.save(att));\n } else {\n this.logger.error(`File missing during commit: ${oldPath}`);\n throw new NotFoundException(\n `File not found on disk: ${att.originalFilename}`\n );\n }\n } catch (error) {\n this.logger.error(\n `Failed to move file from ${oldPath} to ${newPath}`,\n error\n );\n throw new BadRequestException(\n `Failed to commit file: ${att.originalFilename}`\n );\n }\n }\n\n return committedAttachments;\n }\n\n /**\n * Download File\n * ดึงไฟล์มาเป็น Stream เพื่อส่งกลับไปให้ Controller\n */\n async download(\n id: number\n ): Promise<{ stream: fs.ReadStream; attachment: Attachment }> {\n // 1. ค้นหาข้อมูลไฟล์จาก DB\n const attachment = await this.attachmentRepository.findOne({\n where: { id },\n });\n\n if (!attachment) {\n throw new NotFoundException(`Attachment #${id} not found`);\n }\n\n // 2. ตรวจสอบว่าไฟล์มีอยู่จริงบน Disk หรือไม่\n const filePath = attachment.filePath;\n if (!fs.existsSync(filePath)) {\n this.logger.error(`File missing on disk: ${filePath}`);\n throw new NotFoundException('File not found on server storage');\n }\n\n // 3. สร้าง Read Stream (มีประสิทธิภาพกว่าการโหลดทั้งไฟล์เข้า Memory)\n const stream = fs.createReadStream(filePath);\n\n return { stream, attachment };\n }\n\n /**\n * แก้ปัญหา Multer/busboy ถอดรหัสชื่อไฟล์เป็น Latin1 แทน UTF-8\n * ทำให้ภาษาไทยกลายเป็น mojibake (เช่น ผรม → 脿赂聹脿赂拢脿赂隆)\n * วิธีแก้: แปลง latin1 bytes กลับเป็น UTF-8\n */\n private fixMulterFilename(originalname: string): string {\n try {\n const decoded = Buffer.from(originalname, 'latin1').toString('utf8');\n // ตรวจสอบว่า decoded string มี valid UTF-8 characters\n // ถ้า originalname เป็น ASCII อยู่แล้ว ผลลัพธ์จะเหมือนเดิม\n return decoded;\n } catch {\n return originalname;\n }\n }\n\n private calculateChecksum(buffer: Buffer): string {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n }\n\n /**\n * ✅ NEW: Import Staging File (For Legacy Migration)\n * ย้ายไฟล์จาก staging_ai ไปยัง permanent storage โดยตรง\n */\n async importStagingFile(\n sourceFilePath: string,\n userId: number,\n options?: { issueDate?: Date; documentType?: string }\n ): Promise {\n if (!(await fs.pathExists(sourceFilePath))) {\n this.logger.error(`Staging file not found: ${sourceFilePath}`);\n throw new NotFoundException(`Source file not found: ${sourceFilePath}`);\n }\n\n // 1. Get file stats & checksum\n const stats = await fs.stat(sourceFilePath);\n const fileExt = path.extname(sourceFilePath);\n const originalFilename = path.basename(sourceFilePath);\n const storedFilename = `${uuidv4()}${fileExt}`;\n\n // Determine mime type basic\n let mimeType = 'application/octet-stream';\n if (fileExt.toLowerCase() === '.pdf') mimeType = 'application/pdf';\n else if (fileExt.toLowerCase() === '.xlsx')\n mimeType =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\n const fileBuffer = await fs.readFile(sourceFilePath);\n const checksum = this.calculateChecksum(fileBuffer);\n\n // 2. Generate Permanent Path\n const refDate = options?.issueDate || new Date();\n const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate;\n const year = effectiveDate.getFullYear().toString();\n const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0');\n const docTypeFolder = options?.documentType || 'General';\n\n const permanentDir = path.join(\n this.permanentDir,\n docTypeFolder,\n year,\n month\n );\n await fs.ensureDir(permanentDir);\n\n const newPath = path.join(permanentDir, storedFilename);\n\n // 3. Move File\n try {\n await fs.move(sourceFilePath, newPath, { overwrite: true });\n } catch (error) {\n this.logger.error(`Failed to move staging file to ${newPath}`, error);\n throw new BadRequestException('Failed to process staging file');\n }\n\n // 4. Create Database Record\n const attachment = this.attachmentRepository.create({\n originalFilename,\n storedFilename,\n filePath: newPath,\n mimeType,\n fileSize: stats.size,\n isTemporary: false,\n referenceDate: effectiveDate,\n checksum,\n uploadedByUserId: userId,\n });\n\n return this.attachmentRepository.save(attachment);\n }\n\n /**\n * ✅ NEW: Delete File\n * ลบไฟล์ออกจาก Disk และ Database\n */\n async delete(id: number, userId: number): Promise {\n // 1. ค้นหาไฟล์\n const attachment = await this.attachmentRepository.findOne({\n where: { id },\n });\n\n if (!attachment) {\n throw new NotFoundException(`Attachment #${id} not found`);\n }\n\n // 2. ตรวจสอบความเป็นเจ้าของ (Security Check)\n // อนุญาตให้ลบถ้าเป็นคนอัปโหลดเอง\n // (ในอนาคตอาจเพิ่มเงื่อนไข OR User เป็น Admin/Document Control)\n if (attachment.uploadedByUserId !== userId) {\n this.logger.warn(\n `User ${userId} tried to delete file ${id} owned by ${attachment.uploadedByUserId}`\n );\n throw new ForbiddenException('You are not allowed to delete this file');\n }\n\n // 3. ลบไฟล์ออกจาก Disk\n try {\n if (await fs.pathExists(attachment.filePath)) {\n await fs.remove(attachment.filePath);\n } else {\n this.logger.warn(\n `File not found on disk during deletion: ${attachment.filePath}`\n );\n }\n } catch (error) {\n this.logger.error(\n `Failed to delete file from disk: ${attachment.filePath}`,\n error\n );\n throw new BadRequestException('Failed to delete file from storage');\n }\n\n // 4. ลบ Record ออกจาก Database\n await this.attachmentRepository.remove(attachment);\n\n this.logger.log(`File deleted: ${id} by user ${userId}`);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231 new file mode 100644 index 0000000..03b36d6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231 @@ -0,0 +1,99 @@ +eb049d6b2b75268756008ed3d78c8b12 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflow = void 0; +// File: src/modules/rfa/entities/rfa-workflow.entity.ts +const typeorm_1 = require("typeorm"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const rfa_revision_entity_1 = require("./rfa-revision.entity"); +const rfa_workflow_template_step_entity_1 = require("./rfa-workflow-template-step.entity"); // ✅ Import Enum +let RfaWorkflow = class RfaWorkflow { +}; +exports.RfaWorkflow = RfaWorkflow; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_revision_id' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "rfaRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'step_number' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "stepNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'assigned_to', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "assignedTo", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_type', + type: 'enum', + enum: rfa_workflow_template_step_entity_1.RfaActionType, // ✅ Use Shared Enum + nullable: true, + }), + __metadata("design:type", typeof (_a = typeof rfa_workflow_template_step_entity_1.RfaActionType !== "undefined" && rfa_workflow_template_step_entity_1.RfaActionType) === "function" ? _a : Object) +], RfaWorkflow.prototype, "actionType", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'REJECTED'], + nullable: true, + }), + __metadata("design:type", String) +], RfaWorkflow.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaWorkflow.prototype, "comments", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'completed_at', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaWorkflow.prototype, "completedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", typeof (_c = typeof Record !== "undefined" && Record) === "function" ? _c : Object) +], RfaWorkflow.prototype, "stateContext", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], RfaWorkflow.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], RfaWorkflow.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_revision_entity_1.RfaRevision, (rev) => rev.workflows, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'rfa_revision_id' }), + __metadata("design:type", typeof (_f = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _f : Object) +], RfaWorkflow.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_g = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _g : Object) +], RfaWorkflow.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'assigned_to' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], RfaWorkflow.prototype, "assignee", void 0); +exports.RfaWorkflow = RfaWorkflow = __decorate([ + (0, typeorm_1.Entity)('rfa_workflows') +], RfaWorkflow); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELHFDQVFpQjtBQUNqQix5RkFBK0U7QUFDL0UsaUVBQXVEO0FBQ3ZELCtEQUFvRDtBQUNwRCwyRkFBb0UsQ0FBQyxnQkFBZ0I7QUFHOUUsSUFBTSxXQUFXLEdBQWpCLE1BQU0sV0FBVztDQTBEdkIsQ0FBQTtBQTFEWSxrQ0FBVztBQUV0QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7O3VDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7a0RBQ2I7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7OytDQUNaO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7O21EQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUM1QjtBQVFwQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGlEQUFhLEVBQUUsb0JBQW9CO1FBQ3pDLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztrREFDVyxpREFBYSxvQkFBYixpREFBYTsrQ0FBQztBQU8zQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQ3pELFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7MkNBQ2M7QUFHaEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkNBQ3ZCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDckQsSUFBSSxvQkFBSixJQUFJO2dEQUFDO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQzFCLE1BQU0sb0JBQU4sTUFBTTtpREFBa0I7QUFHdkM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7OENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7OENBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUM3RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIsaUNBQVcsb0JBQVgsaUNBQVc7Z0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0NBQVksQ0FBQztJQUM3QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7aURBQUM7QUFJNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOzZDQUFDO3NCQXpETCxXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBMER2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtd29ya2Zsb3cuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3JmYS9lbnRpdGllcy9yZmEtd29ya2Zsb3cuZW50aXR5LnRzXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uLy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IFJmYVJldmlzaW9uIH0gZnJvbSAnLi9yZmEtcmV2aXNpb24uZW50aXR5JztcbmltcG9ydCB7IFJmYUFjdGlvblR5cGUgfSBmcm9tICcuL3JmYS13b3JrZmxvdy10ZW1wbGF0ZS1zdGVwLmVudGl0eSc7IC8vIOKchSBJbXBvcnQgRW51bVxuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dzJylcbmV4cG9ydCBjbGFzcyBSZmFXb3JrZmxvdyB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZmFfcmV2aXNpb25faWQnIH0pXG4gIHJmYVJldmlzaW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGVwX251bWJlcicgfSlcbiAgc3RlcE51bWJlciE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ29yZ2FuaXphdGlvbl9pZCcgfSlcbiAgb3JnYW5pemF0aW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF90bycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFzc2lnbmVkVG8/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2FjdGlvbl90eXBlJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogUmZhQWN0aW9uVHlwZSwgLy8g4pyFIFVzZSBTaGFyZWQgRW51bVxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICBhY3Rpb25UeXBlPzogUmZhQWN0aW9uVHlwZTtcblxuICBAQ29sdW1uKHtcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogWydQRU5ESU5HJywgJ0lOX1BST0dSRVNTJywgJ0NPTVBMRVRFRCcsICdSRUpFQ1RFRCddLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICBzdGF0dXM/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgY29tbWVudHM/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb21wbGV0ZWRfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb21wbGV0ZWRBdD86IERhdGU7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgc3RhdGVDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVJldmlzaW9uLCAocmV2KSA9PiByZXYud29ya2Zsb3dzLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncmZhX3JldmlzaW9uX2lkJyB9KVxuICByZmFSZXZpc2lvbiE6IFJmYVJldmlzaW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnIH0pXG4gIG9yZ2FuaXphdGlvbiE6IE9yZ2FuaXphdGlvbjtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2Fzc2lnbmVkX3RvJyB9KVxuICBhc3NpZ25lZT86IFVzZXI7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231.map new file mode 100644 index 0000000..1e5f867 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/rfaworkflowentity_d3501038ce52cd5dc294a06a69f62231.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow.entity.ts","mappings":";;;;;;;;;;;;;AAAA,wDAAwD;AACxD,qCAQiB;AACjB,yFAA+E;AAC/E,iEAAuD;AACvD,+DAAoD;AACpD,2FAAoE,CAAC,gBAAgB;AAG9E,IAAM,WAAW,GAAjB,MAAM,WAAW;CA0DvB,CAAA;AA1DY,kCAAW;AAEtB;IADC,IAAA,gCAAsB,GAAE;;uCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;kDACb;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;+CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;mDACZ;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAC5B;AAQpB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,iDAAa,EAAE,oBAAoB;QACzC,QAAQ,EAAE,IAAI;KACf,CAAC;kDACW,iDAAa,oBAAb,iDAAa;+CAAC;AAO3B;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC;QACzD,QAAQ,EAAE,IAAI;KACf,CAAC;;2CACc;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACvB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;gDAAC;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDAC1B,MAAM,oBAAN,MAAM;iDAAkB;AAGvC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7E,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,iCAAW,oBAAX,iCAAW;gDAAC;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;iDAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;6CAAC;sBAzDL,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CA0DvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow.entity.ts"],"sourcesContent":["// File: src/modules/rfa/entities/rfa-workflow.entity.ts\nimport {\n Column,\n CreateDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { RfaRevision } from './rfa-revision.entity';\nimport { RfaActionType } from './rfa-workflow-template-step.entity'; // ✅ Import Enum\n\n@Entity('rfa_workflows')\nexport class RfaWorkflow {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'rfa_revision_id' })\n rfaRevisionId!: number;\n\n @Column({ name: 'step_number' })\n stepNumber!: number;\n\n @Column({ name: 'organization_id' })\n organizationId!: number;\n\n @Column({ name: 'assigned_to', nullable: true })\n assignedTo?: number;\n\n @Column({\n name: 'action_type',\n type: 'enum',\n enum: RfaActionType, // ✅ Use Shared Enum\n nullable: true,\n })\n actionType?: RfaActionType;\n\n @Column({\n type: 'enum',\n enum: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'REJECTED'],\n nullable: true,\n })\n status?: string;\n\n @Column({ type: 'text', nullable: true })\n comments?: string;\n\n @Column({ name: 'completed_at', type: 'datetime', nullable: true })\n completedAt?: Date;\n\n @Column({ type: 'json', nullable: true })\n stateContext?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => RfaRevision, (rev) => rev.workflows, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'rfa_revision_id' })\n rfaRevision!: RfaRevision;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'organization_id' })\n organization!: Organization;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'assigned_to' })\n assignee?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1 new file mode 100644 index 0000000..7b45a1a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1 @@ -0,0 +1,171 @@ +acf3bdafe93d39c72fa04f7887ca17bc +"use strict"; +// File: src/modules/workflow-engine/workflow-dsl.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var WorkflowDslService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowDslService = void 0; +const common_1 = require("@nestjs/common"); +let WorkflowDslService = WorkflowDslService_1 = class WorkflowDslService { + constructor() { + this.logger = new common_1.Logger(WorkflowDslService_1.name); + } + /** + * [Compile Time] + * แปลง Raw DSL เป็น Compiled Structure พร้อม Validation + */ + compile(dsl) { + this.validateSchemaStructure(dsl); + const compiled = { + workflow: dsl.workflow, + version: dsl.version || 1, + initialState: '', + states: {}, + }; + const definedStates = new Set(dsl.states.map((s) => s.name)); + let initialFound = false; + // 1. Process States + for (const rawState of dsl.states) { + if (rawState.initial) { + if (initialFound) { + throw new common_1.BadRequestException(`DSL Error: Multiple initial states found (at "${rawState.name}").`); + } + compiled.initialState = rawState.name; + initialFound = true; + } + const compiledState = { + terminal: !!rawState.terminal, + transitions: {}, + }; + // 2. Process Transitions + if (rawState.on) { + for (const [action, rule] of Object.entries(rawState.on)) { + // Validation: Target state must exist + if (!definedStates.has(rule.to)) { + throw new common_1.BadRequestException(`DSL Error: State "${rawState.name}" transitions via "${action}" to unknown state "${rule.to}".`); + } + compiledState.transitions[action] = { + to: rule.to, + requirements: { + roles: rule.require?.role + ? Array.isArray(rule.require.role) + ? rule.require.role + : [rule.require.role] + : [], + userId: rule.require?.user, + }, + condition: rule.condition, + events: rule.events || [], + }; + } + } + else if (!rawState.terminal) { + this.logger.warn(`State "${rawState.name}" is not terminal but has no transitions.`); + } + compiled.states[rawState.name] = compiledState; + } + if (!initialFound) { + throw new common_1.BadRequestException('DSL Error: No initial state defined.'); + } + return compiled; + } + /** + * [Runtime] + * ประมวลผล Action และคืนค่า State ถัดไป + */ + evaluate(compiled, currentState, action, context = {}) { + const stateConfig = compiled.states[currentState]; + // 1. Validate State Existence + if (!stateConfig) { + throw new common_1.BadRequestException(`Runtime Error: Current state "${currentState}" is invalid.`); + } + // 2. Check if terminal + if (stateConfig.terminal) { + throw new common_1.BadRequestException(`Runtime Error: Cannot transition from terminal state "${currentState}".`); + } + // 3. Find Transition + const transition = stateConfig.transitions[action]; + if (!transition) { + const allowed = Object.keys(stateConfig.transitions).join(', '); + throw new common_1.BadRequestException(`Invalid Action: "${action}" is not allowed from "${currentState}". Allowed: [${allowed}]`); + } + // 4. Validate Requirements (RBAC) + this.checkRequirements(transition.requirements, context); + // 5. Evaluate Condition (Dynamic Logic) + if (transition.condition) { + const isMet = this.evaluateCondition(transition.condition, context); + if (!isMet) { + throw new common_1.BadRequestException('Condition Failed: The criteria for this transition are not met.'); + } + } + return { + nextState: transition.to, + events: transition.events, + }; + } + // -------------------------------------------------------- + // Private Helpers + // -------------------------------------------------------- + validateSchemaStructure(dsl) { + if (!dsl || typeof dsl !== 'object') { + throw new common_1.BadRequestException('DSL must be a JSON object.'); + } + const d = dsl; + if (!d.workflow || !d.states || !Array.isArray(d.states)) { + throw new common_1.BadRequestException('DSL Error: Missing required fields (workflow, states).'); + } + } + checkRequirements(req, context) { + // [FIX] Early return if no requirements defined + if (!req) { + return; + } + const userRoles = context.roles || []; + const userId = context.userId; + // Check Roles (OR logic inside array) - with null-safety + const requiredRoles = req.roles || []; + if (requiredRoles.length > 0) { + const hasRole = requiredRoles.some((r) => userRoles.includes(r)); + if (!hasRole) { + throw new common_1.BadRequestException(`Access Denied: Required roles [${requiredRoles.join(', ')}]`); + } + } + // Check Specific User + if (req.userId && String(req.userId) !== String(userId)) { + throw new common_1.BadRequestException('Access Denied: User mismatch.'); + } + } + /** + * Evaluate simple JS expression securely + * NOTE: In production, use a safe parser like 'json-logic-js' or vm2 + * For this phase, we use a simple Function constructor with restricted scope. + */ + evaluateCondition(expression, context) { + try { + // Simple guard against malicious code (basic) + if (expression.includes('process') || expression.includes('require')) { + throw new Error('Unsafe expression detected'); + } + // Create a function that returns the expression result + // "context" is available inside the expression + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const func = new Function('context', `return ${expression};`); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + return !!func(context); + } + catch (error) { + this.logger.error(`Condition Error: "${expression}" -> ${error instanceof Error ? error.message : String(error)}`); + return false; // Fail safe + } + } +}; +exports.WorkflowDslService = WorkflowDslService; +exports.WorkflowDslService = WorkflowDslService = WorkflowDslService_1 = __decorate([ + (0, common_1.Injectable)() +], WorkflowDslService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1kc2wuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEsNERBQTREOzs7Ozs7Ozs7O0FBRTVELDJDQUF5RTtBQThEbEUsSUFBTSxrQkFBa0IsMEJBQXhCLE1BQU0sa0JBQWtCO0lBQXhCO1FBQ1ksV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBMk1oRSxDQUFDO0lBek1DOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxHQUFtQjtRQUN6QixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsTUFBTSxRQUFRLEdBQXFCO1lBQ2pDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQ3pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFekIsb0JBQW9CO1FBQ3BCLEtBQUssTUFBTSxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLFlBQVksRUFBRSxDQUFDO29CQUNqQixNQUFNLElBQUksNEJBQW1CLENBQzNCLGlEQUFpRCxRQUFRLENBQUMsSUFBSSxLQUFLLENBQ3BFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLFlBQVksR0FBRyxJQUFJ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K0NBQStDO1lBQy9DLDhEQUE4RDtZQUM5RCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQzlELDZEQUE2RDtZQUM3RCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YscUJBQXFCLFVBQVUsUUFBUSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDaEcsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWTtRQUM1QixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUE1TVksZ0RBQWtCOzZCQUFsQixrQkFBa0I7SUFEOUIsSUFBQSxtQkFBVSxHQUFFO0dBQ0Esa0JBQWtCLENBNE05QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXHdvcmtmbG93LWRzbC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1kc2wuc2VydmljZS50c1xuXG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gMS4gSW50ZXJmYWNlcyBmb3IgUkFXIERTTCAoSW5wdXQgZnJvbSBVc2VyKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIFJhd1dvcmtmbG93RFNMIHtcbiAgd29ya2Zsb3c6IHN0cmluZztcbiAgdmVyc2lvbj86IG51bWJlcjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHN0YXRlczogUmF3U3RhdGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXdTdGF0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5pdGlhbD86IGJvb2xlYW47XG4gIHRlcm1pbmFsPzogYm9vbGVhbjtcbiAgb24/OiBSZWNvcmQ8c3RyaW5nLCBSYXdUcmFuc2l0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFuc2l0aW9uIHtcbiAgdG86IHN0cmluZztcbiAgcmVxdWlyZT86IHtcbiAgICByb2xlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgdXNlcj86IHN0cmluZztcbiAgfTtcbiAgY29uZGl0aW9uPzogc3RyaW5nOyAvLyBKYXZhU2NyaXB0IEV4cHJlc3Npb24gc3RyaW5nXG4gIGV2ZW50cz86IFJhd0V2ZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3RXZlbnQge1xuICB0eXBlOiAnbm90aWZ5JyB8ICd3ZWJob29rJyB8ICdhc3NpZ24nIHwgJ2F1dG9fYWN0aW9uJztcbiAgdGFyZ2V0Pzogc3RyaW5nO1xuICB0ZW1wbGF0ZT86IHN0cmluZztcbiAgcGF5bG9hZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIDIuIEludGVyZmFjZXMgZm9yIENPTVBJTEVEIFNjaGVtYSAoT3B0aW1pemVkIGZvciBSdW50aW1lKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkV29ya2Zsb3cge1xuICB3b3JrZmxvdzogc3RyaW5nO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGluaXRpYWxTdGF0ZTogc3RyaW5nOyAvLyBPcHRpbWl6ZTog4LmA4LiB4LmH4Lia4LiK4Li34LmI4LitIEluaXRpYWwgU3RhdGUg4LmE4Lin4LmJ4LmA4Lil4LiiIOC5hOC4oeC5iOC4leC5ieC4reC4hyBsb29wIOC4q+C4slxuICBzdGF0ZXM6IFJlY29yZDxzdHJpbmcsIENvbXBpbGVkU3RhdGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkU3RhdGUge1xuICB0ZXJtaW5hbDogYm9vbGVhbjtcbiAgdHJhbnNpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbXBpbGVkVHJhbnNpdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUcmFuc2l0aW9uIHtcbiAgdG86IHN0cmluZztcbiAgcmVxdWlyZW1lbnRzOiB7XG4gICAgcm9sZXM6IHN0cmluZ1tdO1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgfTtcbiAgY29uZGl0aW9uPzogc3RyaW5nO1xuICBldmVudHM6IFJhd0V2ZW50W107XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0RzbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoV29ya2Zsb3dEc2xTZXJ2aWNlLm5hbWUpO1xuXG4gIC8qKlxuICAgKiBbQ29tcGlsZSBUaW1lXVxuICAgKiDguYHguJvguKXguIcgUmF3IERTTCDguYDguJvguYfguJkgQ29tcGlsZWQgU3RydWN0dXJlIOC4nuC4o+C5ieC4reC4oSBWYWxpZGF0aW9uXG4gICAqL1xuICBjb21waWxlKGRzbDogUmF3V29ya2Zsb3dEU0wpOiBDb21waWxlZFdvcmtmbG93IHtcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hU3RydWN0dXJlKGRzbCk7XG5cbiAgICBjb25zdCBjb21waWxlZDogQ29tcGlsZWRXb3JrZmxvdyA9IHtcbiAgICAgIHdvcmtmbG93OiBkc2wud29ya2Zsb3csXG4gICAgICB2ZXJzaW9uOiBkc2wudmVyc2lvbiB8fCAxLFxuICAgICAgaW5pdGlhbFN0YXRlOiAnJyxcbiAgICAgIHN0YXRlczoge30sXG4gICAgfTtcblxuICAgIGNvbnN0IGRlZmluZWRTdGF0ZXMgPSBuZXcgU2V0PHN0cmluZz4oZHNsLnN0YXRlcy5tYXAoKHMpID0+IHMubmFtZSkpO1xuICAgIGxldCBpbml0aWFsRm91bmQgPSBmYWxzZTtcblxuICAgIC8vIDEuIFByb2Nlc3MgU3RhdGVzXG4gICAgZm9yIChjb25zdCByYXdTdGF0ZSBvZiBkc2wuc3RhdGVzKSB7XG4gICAgICBpZiAocmF3U3RhdGUuaW5pdGlhbCkge1xuICAgICAgICBpZiAoaW5pdGlhbEZvdW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgICBgRFNMIEVycm9yOiBNdWx0aXBsZSBpbml0aWFsIHN0YXRlcyBmb3VuZCAoYXQgXCIke3Jhd1N0YXRlLm5hbWV9XCIpLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkLmluaXRpYWxTdGF0ZSA9IHJhd1N0YXRlLm5hbWU7XG4gICAgICAgIGluaXRpYWxGb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBpbGVkU3RhdGU6IENvbXBpbGVkU3RhdGUgPSB7XG4gICAgICAgIHRlcm1pbmFsOiAhIXJhd1N0YXRlLnRlcm1pbmFsLFxuICAgICAgICB0cmFuc2l0aW9uczoge30sXG4gICAgICB9O1xuXG4gICAgICAvLyAyLiBQcm9jZXNzIFRyYW5zaXRpb25zXG4gICAgICBpZiAocmF3U3RhdGUub24pIHtcbiAgICAgICAgZm9yIChjb25zdCBbYWN0aW9uLCBydWxlXSBvZiBPYmplY3QuZW50cmllcyhyYXdTdGF0ZS5vbikpIHtcbiAgICAgICAgICAvLyBWYWxpZGF0aW9uOiBUYXJnZXQgc3RhdGUgbXVzdCBleGlzdFxuICAgICAgICAgIGlmICghZGVmaW5lZFN0YXRlcy5oYXMocnVsZS50bykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgICAgICBgRFNMIEVycm9yOiBTdGF0ZSBcIiR7cmF3U3RhdGUubmFtZX1cIiB0cmFuc2l0aW9ucyB2aWEgXCIke2FjdGlvbn1cIiB0byB1bmtub3duIHN0YXRlIFwiJHtydWxlLnRvfVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29tcGlsZWRTdGF0ZS50cmFuc2l0aW9uc1thY3Rpb25dID0ge1xuICAgICAgICAgICAgdG86IHJ1bGUudG8sXG4gICAgICAgICAgICByZXF1aXJlbWVudHM6IHtcbiAgICAgICAgICAgICAgcm9sZXM6IHJ1bGUucmVxdWlyZT8ucm9sZVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShydWxlLnJlcXVpcmUucm9sZSlcbiAgICAgICAgICAgICAgICAgID8gcnVsZS5yZXF1aXJlLnJvbGVcbiAgICAgICAgICAgICAgICAgIDogW3J1bGUucmVxdWlyZS5yb2xlXVxuICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgIHVzZXJJZDogcnVsZS5yZXF1aXJlPy51c2VyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogcnVsZS5jb25kaXRpb24sXG4gICAgICAgICAgICBldmVudHM6IHJ1bGUuZXZlbnRzIHx8IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXJhd1N0YXRlLnRlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFN0YXRlIFwiJHtyYXdTdGF0ZS5uYW1lfVwiIGlzIG5vdCB0ZXJtaW5hbCBidXQgaGFzIG5vIHRyYW5zaXRpb25zLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29tcGlsZWQuc3RhdGVzW3Jhd1N0YXRlLm5hbWVdID0gY29tcGlsZWRTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIWluaXRpYWxGb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0RTTCBFcnJvcjogTm8gaW5pdGlhbCBzdGF0ZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21waWxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVudGltZV1cbiAgICog4Lib4Lij4Liw4Lih4Lin4Lil4Lic4LilIEFjdGlvbiDguYHguKXguLDguITguLfguJnguITguYjguLIgU3RhdGUg4LiW4Lix4LiU4LmE4LibXG4gICAqL1xuICBldmFsdWF0ZShcbiAgICBjb21waWxlZDogQ29tcGlsZWRXb3JrZmxvdyxcbiAgICBjdXJyZW50U3RhdGU6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICk6IHsgbmV4dFN0YXRlOiBzdHJpbmc7IGV2ZW50czogUmF3RXZlbnRbXSB9IHtcbiAgICBjb25zdCBzdGF0ZUNvbmZpZyA9IGNvbXBpbGVkLnN0YXRlc1tjdXJyZW50U3RhdGVdO1xuXG4gICAgLy8gMS4gVmFsaWRhdGUgU3RhdGUgRXhpc3RlbmNlXG4gICAgaWYgKCFzdGF0ZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBSdW50aW1lIEVycm9yOiBDdXJyZW50IHN0YXRlIFwiJHtjdXJyZW50U3RhdGV9XCIgaXMgaW52YWxpZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIENoZWNrIGlmIHRlcm1pbmFsXG4gICAgaWYgKHN0YXRlQ29uZmlnLnRlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYFJ1bnRpbWUgRXJyb3I6IENhbm5vdCB0cmFuc2l0aW9uIGZyb20gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRTdGF0ZX1cIi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEZpbmQgVHJhbnNpdGlvblxuICAgIGNvbnN0IHRyYW5zaXRpb24gPSBzdGF0ZUNvbmZpZy50cmFuc2l0aW9uc1thY3Rpb25dO1xuICAgIGlmICghdHJhbnNpdGlvbikge1xuICAgICAgY29uc3QgYWxsb3dlZCA9IE9iamVjdC5rZXlzKHN0YXRlQ29uZmlnLnRyYW5zaXRpb25zKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBJbnZhbGlkIEFjdGlvbjogXCIke2FjdGlvbn1cIiBpcyBub3QgYWxsb3dlZCBmcm9tIFwiJHtjdXJyZW50U3RhdGV9XCIuIEFsbG93ZWQ6IFske2FsbG93ZWR9XWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gVmFsaWRhdGUgUmVxdWlyZW1lbnRzIChSQkFDKVxuICAgIHRoaXMuY2hlY2tSZXF1aXJlbWVudHModHJhbnNpdGlvbi5yZXF1aXJlbWVudHMsIGNvbnRleHQpO1xuXG4gICAgLy8gNS4gRXZhbHVhdGUgQ29uZGl0aW9uIChEeW5hbWljIExvZ2ljKVxuICAgIGlmICh0cmFuc2l0aW9uLmNvbmRpdGlvbikge1xuICAgICAgY29uc3QgaXNNZXQgPSB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKHRyYW5zaXRpb24uY29uZGl0aW9uLCBjb250ZXh0KTtcbiAgICAgIGlmICghaXNNZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvbmRpdGlvbiBGYWlsZWQ6IFRoZSBjcml0ZXJpYSBmb3IgdGhpcyB0cmFuc2l0aW9uIGFyZSBub3QgbWV0LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dFN0YXRlOiB0cmFuc2l0aW9uLnRvLFxuICAgICAgZXZlbnRzOiB0cmFuc2l0aW9uLmV2ZW50cyxcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNjaGVtYVN0cnVjdHVyZShkc2w6IHVua25vd24pIHtcbiAgICBpZiAoIWRzbCB8fCB0eXBlb2YgZHNsICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0RTTCBtdXN0IGJlIGEgSlNPTiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGQgPSBkc2wgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKCFkLndvcmtmbG93IHx8ICFkLnN0YXRlcyB8fCAhQXJyYXkuaXNBcnJheShkLnN0YXRlcykpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAnRFNMIEVycm9yOiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcyAod29ya2Zsb3csIHN0YXRlcykuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVxdWlyZW1lbnRzKFxuICAgIHJlcTogQ29tcGlsZWRUcmFuc2l0aW9uWydyZXF1aXJlbWVudHMnXSxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICAvLyBbRklYXSBFYXJseSByZXR1cm4gaWYgbm8gcmVxdWlyZW1lbnRzIGRlZmluZWRcbiAgICBpZiAoIXJlcSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSb2xlczogc3RyaW5nW10gPSAoY29udGV4dC5yb2xlcyBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgY29uc3QgdXNlcklkOiBzdHJpbmcgfCBudW1iZXIgPSBjb250ZXh0LnVzZXJJZCBhcyBzdHJpbmcgfCBudW1iZXI7XG5cbiAgICAvLyBDaGVjayBSb2xlcyAoT1IgbG9naWMgaW5zaWRlIGFycmF5KSAtIHdpdGggbnVsbC1zYWZldHlcbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gcmVxLnJvbGVzIHx8IFtdO1xuICAgIGlmIChyZXF1aXJlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGhhc1JvbGUgPSByZXF1aXJlZFJvbGVzLnNvbWUoKHIpID0+IHVzZXJSb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICBpZiAoIWhhc1JvbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEFjY2VzcyBEZW5pZWQ6IFJlcXVpcmVkIHJvbGVzIFske3JlcXVpcmVkUm9sZXMuam9pbignLCAnKX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIFNwZWNpZmljIFVzZXJcbiAgICBpZiAocmVxLnVzZXJJZCAmJiBTdHJpbmcocmVxLnVzZXJJZCkgIT09IFN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQWNjZXNzIERlbmllZDogVXNlciBtaXNtYXRjaC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgc2ltcGxlIEpTIGV4cHJlc3Npb24gc2VjdXJlbHlcbiAgICogTk9URTogSW4gcHJvZHVjdGlvbiwgdXNlIGEgc2FmZSBwYXJzZXIgbGlrZSAnanNvbi1sb2dpYy1qcycgb3Igdm0yXG4gICAqIEZvciB0aGlzIHBoYXNlLCB3ZSB1c2UgYSBzaW1wbGUgRnVuY3Rpb24gY29uc3RydWN0b3Igd2l0aCByZXN0cmljdGVkIHNjb3BlLlxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbmRpdGlvbihcbiAgICBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNpbXBsZSBndWFyZCBhZ2FpbnN0IG1hbGljaW91cyBjb2RlIChiYXNpYylcbiAgICAgIGlmIChleHByZXNzaW9uLmluY2x1ZGVzKCdwcm9jZXNzJykgfHwgZXhwcmVzc2lvbi5pbmNsdWRlcygncmVxdWlyZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zYWZlIGV4cHJlc3Npb24gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBleHByZXNzaW9uIHJlc3VsdFxuICAgICAgLy8gXCJjb250ZXh0XCIgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgZXhwcmVzc2lvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcbiAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCBgcmV0dXJuICR7ZXhwcmVzc2lvbn07YCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICByZXR1cm4gISFmdW5jKGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYENvbmRpdGlvbiBFcnJvcjogXCIke2V4cHJlc3Npb259XCIgLT4gJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gRmFpbCBzYWZlXG4gICAgfVxuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1.map new file mode 100644 index 0000000..c659d1d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/workflowdslservice_d36787ba9683b86dbb8191618e6388d1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-dsl.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-dsl.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-dsl.service.ts\n\nimport { BadRequestException, Injectable, Logger } from '@nestjs/common';\n\n// ==========================================\n// 1. Interfaces for RAW DSL (Input from User)\n// ==========================================\nexport interface RawWorkflowDSL {\n workflow: string;\n version?: number;\n description?: string;\n states: RawState[];\n}\n\nexport interface RawState {\n name: string;\n initial?: boolean;\n terminal?: boolean;\n on?: Record;\n}\n\nexport interface RawTransition {\n to: string;\n require?: {\n role?: string | string[];\n user?: string;\n };\n condition?: string; // JavaScript Expression string\n events?: RawEvent[];\n}\n\nexport interface RawEvent {\n type: 'notify' | 'webhook' | 'assign' | 'auto_action';\n target?: string;\n template?: string;\n payload?: Record;\n}\n\n// ==========================================\n// 2. Interfaces for COMPILED Schema (Optimized for Runtime)\n// ==========================================\nexport interface CompiledWorkflow {\n workflow: string;\n version: number;\n initialState: string; // Optimize: เก็บชื่อ Initial State ไว้เลย ไม่ต้อง loop หา\n states: Record;\n}\n\nexport interface CompiledState {\n terminal: boolean;\n transitions: Record;\n}\n\nexport interface CompiledTransition {\n to: string;\n requirements: {\n roles: string[];\n userId?: string;\n };\n condition?: string;\n events: RawEvent[];\n}\n\n@Injectable()\nexport class WorkflowDslService {\n private readonly logger = new Logger(WorkflowDslService.name);\n\n /**\n * [Compile Time]\n * แปลง Raw DSL เป็น Compiled Structure พร้อม Validation\n */\n compile(dsl: RawWorkflowDSL): CompiledWorkflow {\n this.validateSchemaStructure(dsl);\n\n const compiled: CompiledWorkflow = {\n workflow: dsl.workflow,\n version: dsl.version || 1,\n initialState: '',\n states: {},\n };\n\n const definedStates = new Set(dsl.states.map((s) => s.name));\n let initialFound = false;\n\n // 1. Process States\n for (const rawState of dsl.states) {\n if (rawState.initial) {\n if (initialFound) {\n throw new BadRequestException(\n `DSL Error: Multiple initial states found (at \"${rawState.name}\").`\n );\n }\n compiled.initialState = rawState.name;\n initialFound = true;\n }\n\n const compiledState: CompiledState = {\n terminal: !!rawState.terminal,\n transitions: {},\n };\n\n // 2. Process Transitions\n if (rawState.on) {\n for (const [action, rule] of Object.entries(rawState.on)) {\n // Validation: Target state must exist\n if (!definedStates.has(rule.to)) {\n throw new BadRequestException(\n `DSL Error: State \"${rawState.name}\" transitions via \"${action}\" to unknown state \"${rule.to}\".`\n );\n }\n\n compiledState.transitions[action] = {\n to: rule.to,\n requirements: {\n roles: rule.require?.role\n ? Array.isArray(rule.require.role)\n ? rule.require.role\n : [rule.require.role]\n : [],\n userId: rule.require?.user,\n },\n condition: rule.condition,\n events: rule.events || [],\n };\n }\n } else if (!rawState.terminal) {\n this.logger.warn(\n `State \"${rawState.name}\" is not terminal but has no transitions.`\n );\n }\n\n compiled.states[rawState.name] = compiledState;\n }\n\n if (!initialFound) {\n throw new BadRequestException('DSL Error: No initial state defined.');\n }\n\n return compiled;\n }\n\n /**\n * [Runtime]\n * ประมวลผล Action และคืนค่า State ถัดไป\n */\n evaluate(\n compiled: CompiledWorkflow,\n currentState: string,\n action: string,\n context: Record = {}\n ): { nextState: string; events: RawEvent[] } {\n const stateConfig = compiled.states[currentState];\n\n // 1. Validate State Existence\n if (!stateConfig) {\n throw new BadRequestException(\n `Runtime Error: Current state \"${currentState}\" is invalid.`\n );\n }\n\n // 2. Check if terminal\n if (stateConfig.terminal) {\n throw new BadRequestException(\n `Runtime Error: Cannot transition from terminal state \"${currentState}\".`\n );\n }\n\n // 3. Find Transition\n const transition = stateConfig.transitions[action];\n if (!transition) {\n const allowed = Object.keys(stateConfig.transitions).join(', ');\n throw new BadRequestException(\n `Invalid Action: \"${action}\" is not allowed from \"${currentState}\". Allowed: [${allowed}]`\n );\n }\n\n // 4. Validate Requirements (RBAC)\n this.checkRequirements(transition.requirements, context);\n\n // 5. Evaluate Condition (Dynamic Logic)\n if (transition.condition) {\n const isMet = this.evaluateCondition(transition.condition, context);\n if (!isMet) {\n throw new BadRequestException(\n 'Condition Failed: The criteria for this transition are not met.'\n );\n }\n }\n\n return {\n nextState: transition.to,\n events: transition.events,\n };\n }\n\n // --------------------------------------------------------\n // Private Helpers\n // --------------------------------------------------------\n\n private validateSchemaStructure(dsl: unknown) {\n if (!dsl || typeof dsl !== 'object') {\n throw new BadRequestException('DSL must be a JSON object.');\n }\n const d = dsl as Record;\n if (!d.workflow || !d.states || !Array.isArray(d.states)) {\n throw new BadRequestException(\n 'DSL Error: Missing required fields (workflow, states).'\n );\n }\n }\n\n private checkRequirements(\n req: CompiledTransition['requirements'],\n context: Record\n ) {\n // [FIX] Early return if no requirements defined\n if (!req) {\n return;\n }\n\n const userRoles: string[] = (context.roles as string[]) || [];\n const userId: string | number = context.userId as string | number;\n\n // Check Roles (OR logic inside array) - with null-safety\n const requiredRoles = req.roles || [];\n if (requiredRoles.length > 0) {\n const hasRole = requiredRoles.some((r) => userRoles.includes(r));\n if (!hasRole) {\n throw new BadRequestException(\n `Access Denied: Required roles [${requiredRoles.join(', ')}]`\n );\n }\n }\n\n // Check Specific User\n if (req.userId && String(req.userId) !== String(userId)) {\n throw new BadRequestException('Access Denied: User mismatch.');\n }\n }\n\n /**\n * Evaluate simple JS expression securely\n * NOTE: In production, use a safe parser like 'json-logic-js' or vm2\n * For this phase, we use a simple Function constructor with restricted scope.\n */\n private evaluateCondition(\n expression: string,\n context: Record\n ): boolean {\n try {\n // Simple guard against malicious code (basic)\n if (expression.includes('process') || expression.includes('require')) {\n throw new Error('Unsafe expression detected');\n }\n\n // Create a function that returns the expression result\n // \"context\" is available inside the expression\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const func = new Function('context', `return ${expression};`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return !!func(context);\n } catch (error: unknown) {\n this.logger.error(\n `Condition Error: \"${expression}\" -> ${error instanceof Error ? error.message : String(error)}`\n );\n return false; // Fail safe\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a new file mode 100644 index 0000000..f67f6d8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a @@ -0,0 +1,159 @@ +31c5a48b378af366e14698210e75a5d7 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CounterService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CounterService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_counter_entity_1 = require("../entities/document-number-counter.entity"); +let CounterService = CounterService_1 = class CounterService { + constructor(counterRepo, dataSource) { + this.counterRepo = counterRepo; + this.dataSource = dataSource; + this.logger = new common_1.Logger(CounterService_1.name); + } + /** + * Increment counter and return next number + * Uses optimistic locking to prevent race conditions + */ + async incrementCounter(counterKey) { + const MAX_RETRIES = 3; + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + return await this.dataSource.transaction(async (manager) => { + // Find or create counter + let counter = await manager.findOne(document_number_counter_entity_1.DocumentNumberCounter, { + where: this.buildWhereClause(counterKey), + }); + if (!counter) { + counter = manager.create(document_number_counter_entity_1.DocumentNumberCounter, { + projectId: counterKey.projectId, + originatorId: counterKey.originatorOrganizationId, + recipientOrganizationId: counterKey.recipientOrganizationId, + correspondenceTypeId: counterKey.correspondenceTypeId, + subTypeId: counterKey.subTypeId, + rfaTypeId: counterKey.rfaTypeId, + disciplineId: counterKey.disciplineId, + resetScope: counterKey.resetScope, + lastNumber: 1, + version: 0, + }); + await manager.save(counter); + return 1; + } + // Increment with optimistic lock + const currentVersion = counter.version; + const nextNumber = counter.lastNumber + 1; + const result = await manager + .createQueryBuilder() + .update(document_number_counter_entity_1.DocumentNumberCounter) + .set({ + lastNumber: nextNumber, + version: () => 'version + 1', + }) + .where(this.buildWhereClause(counterKey)) + .andWhere('version = :version', { version: currentVersion }) + .execute(); + if (result.affected === 0) { + throw new common_1.ConflictException('Counter version conflict'); + } + return nextNumber; + }); + } + catch (error) { + if (error instanceof common_1.ConflictException && attempt < MAX_RETRIES - 1) { + this.logger.warn(`Version conflict on attempt ${attempt + 1}/${MAX_RETRIES}, retrying...`); + // Exponential backoff + await this.sleep(100 * Math.pow(2, attempt)); + continue; + } + throw error; + } + } + throw new common_1.ConflictException('เลขที่เอกสารถูกเปลี่ยน กรุณาลองใหม่'); + } + /** + * Get current counter value without incrementing + */ + async getCurrentCounter(counterKey) { + const counter = await this.counterRepo.findOne({ + where: this.buildWhereClause(counterKey), + }); + return counter?.lastNumber || 0; + } + buildWhereClause(key) { + return { + projectId: key.projectId, + originatorId: key.originatorOrganizationId, + recipientOrganizationId: key.recipientOrganizationId, + correspondenceTypeId: key.correspondenceTypeId, + subTypeId: key.subTypeId, + rfaTypeId: key.rfaTypeId, + disciplineId: key.disciplineId, + resetScope: key.resetScope, + }; + } + /** + * Force update counter value (Admin Override) + * WARNING: This bypasses optimistic locking checks slightly, but still increments version + */ + async forceUpdateCounter(counterKey, newValue) { + await this.dataSource.transaction(async (manager) => { + let counter = await manager.findOne(document_number_counter_entity_1.DocumentNumberCounter, { + where: this.buildWhereClause(counterKey), + }); + if (!counter) { + counter = manager.create(document_number_counter_entity_1.DocumentNumberCounter, { + projectId: counterKey.projectId, + originatorId: counterKey.originatorOrganizationId, + recipientOrganizationId: counterKey.recipientOrganizationId, + correspondenceTypeId: counterKey.correspondenceTypeId, + subTypeId: counterKey.subTypeId, + rfaTypeId: counterKey.rfaTypeId, + disciplineId: counterKey.disciplineId, + resetScope: counterKey.resetScope, + lastNumber: newValue, + version: 1, + }); + await manager.save(counter); + } + else { + // Force update regardless of version, but increment version + await manager + .createQueryBuilder() + .update(document_number_counter_entity_1.DocumentNumberCounter) + .set({ + lastNumber: newValue, + version: () => 'version + 1', + }) + .where(this.buildWhereClause(counterKey)) + .execute(); + } + }); + this.logger.log(`Counter force updated to ${newValue} for key: ${JSON.stringify(counterKey)}`); + } + sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } +}; +exports.CounterService = CounterService; +exports.CounterService = CounterService = CounterService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_counter_entity_1.DocumentNumberCounter)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _b : Object]) +], CounterService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcY291bnRlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXVFO0FBQ3ZFLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFDakQsK0ZBQW1GO0FBSTVFLElBQU0sY0FBYyxzQkFBcEIsTUFBTSxjQUFjO0lBR3pCLFlBRUUsV0FBc0QsRUFDOUMsVUFBc0I7UUFEdEIsZ0JBQVcsR0FBWCxXQUFXLENBQW1DO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFMZixXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQU12RCxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQXlCO1FBQzlDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztRQUV0QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7b0JBQ3pELHlCQUF5QjtvQkFDekIsSUFBSSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLHNEQUFxQixFQUFFO3dCQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztxQkFDekMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzREFBcUIsRUFBRTs0QkFDOUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixZQUFZLEVBQUUsVUFBVSxDQUFDLHdCQUF3Qjs0QkFDakQsdUJBQXVC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QztxQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN4QyxPQUFPLEVBQUUsQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLDRCQUE0QixRQUFRLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FDN0QsVUFBVSxDQUNYLEVBQUUsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxFQUFVO1FBQ3RCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQTtBQXhKWSx3Q0FBYzt5QkFBZCxjQUFjO0lBRDFCLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxzREFBcUIsQ0FBQyxDQUFBO3lEQUNuQixvQkFBVSxvQkFBVixvQkFBVSxvREFDWCxvQkFBVSxvQkFBVixvQkFBVTtHQU5yQixjQUFjLENBd0oxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXHNlcnZpY2VzXFxjb3VudGVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgQ29uZmxpY3RFeGNlcHRpb24sIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJDb3VudGVyIH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWNvdW50ZXIuZW50aXR5JztcbmltcG9ydCB7IENvdW50ZXJLZXlEdG8gfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvdW50ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENvdW50ZXJTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyQ291bnRlcilcbiAgICBwcml2YXRlIGNvdW50ZXJSZXBvOiBSZXBvc2l0b3J5PERvY3VtZW50TnVtYmVyQ291bnRlcj4sXG4gICAgcHJpdmF0ZSBkYXRhU291cmNlOiBEYXRhU291cmNlXG4gICkge31cblxuICAvKipcbiAgICogSW5jcmVtZW50IGNvdW50ZXIgYW5kIHJldHVybiBuZXh0IG51bWJlclxuICAgKiBVc2VzIG9wdGltaXN0aWMgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKi9cbiAgYXN5bmMgaW5jcmVtZW50Q291bnRlcihjb3VudGVyS2V5OiBDb3VudGVyS2V5RHRvKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBNQVhfUkVUUklFUyA9IDM7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IE1BWF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRhdGFTb3VyY2UudHJhbnNhY3Rpb24oYXN5bmMgKG1hbmFnZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSBjb3VudGVyXG4gICAgICAgICAgbGV0IGNvdW50ZXIgPSBhd2FpdCBtYW5hZ2VyLmZpbmRPbmUoRG9jdW1lbnROdW1iZXJDb3VudGVyLCB7XG4gICAgICAgICAgICB3aGVyZTogdGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAgICAgICBjb3VudGVyID0gbWFuYWdlci5jcmVhdGUoRG9jdW1lbnROdW1iZXJDb3VudGVyLCB7XG4gICAgICAgICAgICAgIHByb2plY3RJZDogY291bnRlcktleS5wcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogY291bnRlcktleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQsXG4gICAgICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjb3VudGVyS2V5LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY291bnRlcktleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgICAgICAgICAgc3ViVHlwZUlkOiBjb3VudGVyS2V5LnN1YlR5cGVJZCxcbiAgICAgICAgICAgICAgcmZhVHlwZUlkOiBjb3VudGVyS2V5LnJmYVR5cGVJZCxcbiAgICAgICAgICAgICAgZGlzY2lwbGluZUlkOiBjb3VudGVyS2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgICAgICAgICAgcmVzZXRTY29wZTogY291bnRlcktleS5yZXNldFNjb3BlLFxuICAgICAgICAgICAgICBsYXN0TnVtYmVyOiAxLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBtYW5hZ2VyLnNhdmUoY291bnRlcik7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbmNyZW1lbnQgd2l0aCBvcHRpbWlzdGljIGxvY2tcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IGNvdW50ZXIudmVyc2lvbjtcbiAgICAgICAgICBjb25zdCBuZXh0TnVtYmVyID0gY291bnRlci5sYXN0TnVtYmVyICsgMTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1hbmFnZXJcbiAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgLnVwZGF0ZShEb2N1bWVudE51bWJlckNvdW50ZXIpXG4gICAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgICAgbGFzdE51bWJlcjogbmV4dE51bWJlcixcbiAgICAgICAgICAgICAgdmVyc2lvbjogKCkgPT4gJ3ZlcnNpb24gKyAxJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2hlcmUodGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpKVxuICAgICAgICAgICAgLmFuZFdoZXJlKCd2ZXJzaW9uID0gOnZlcnNpb24nLCB7IHZlcnNpb246IGN1cnJlbnRWZXJzaW9uIH0pXG4gICAgICAgICAgICAuZXhlY3V0ZSgpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5hZmZlY3RlZCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXhjZXB0aW9uKCdDb3VudGVyIHZlcnNpb24gY29uZmxpY3QnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dE51bWJlcjtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25mbGljdEV4Y2VwdGlvbiAmJiBhdHRlbXB0IDwgTUFYX1JFVFJJRVMgLSAxKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBWZXJzaW9uIGNvbmZsaWN0IG9uIGF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtNQVhfUkVUUklFU30sIHJldHJ5aW5nLi4uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoMTAwICogTWF0aC5wb3coMiwgYXR0ZW1wdCkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbign4LmA4Lil4LiC4LiX4Li14LmI4LmA4Lit4LiB4Liq4Liy4Lij4LiW4Li54LiB4LmA4Lib4Lil4Li14LmI4Lii4LiZIOC4geC4o+C4uOC4k+C4suC4peC4reC4h+C5g+C4q+C4oeC5iCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNvdW50ZXIgdmFsdWUgd2l0aG91dCBpbmNyZW1lbnRpbmdcbiAgICovXG4gIGFzeW5jIGdldEN1cnJlbnRDb3VudGVyKGNvdW50ZXJLZXk6IENvdW50ZXJLZXlEdG8pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBhd2FpdCB0aGlzLmNvdW50ZXJSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHRoaXMuYnVpbGRXaGVyZUNsYXVzZShjb3VudGVyS2V5KSxcbiAgICB9KTtcbiAgICByZXR1cm4gY291bnRlcj8ubGFzdE51bWJlciB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdoZXJlQ2xhdXNlKGtleTogQ291bnRlcktleUR0bykge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9qZWN0SWQ6IGtleS5wcm9qZWN0SWQsXG4gICAgICBvcmlnaW5hdG9ySWQ6IGtleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQsXG4gICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDoga2V5LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkLFxuICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IGtleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgIHN1YlR5cGVJZDoga2V5LnN1YlR5cGVJZCxcbiAgICAgIHJmYVR5cGVJZDoga2V5LnJmYVR5cGVJZCxcbiAgICAgIGRpc2NpcGxpbmVJZDoga2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgIHJlc2V0U2NvcGU6IGtleS5yZXNldFNjb3BlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdXBkYXRlIGNvdW50ZXIgdmFsdWUgKEFkbWluIE92ZXJyaWRlKVxuICAgKiBXQVJOSU5HOiBUaGlzIGJ5cGFzc2VzIG9wdGltaXN0aWMgbG9ja2luZyBjaGVja3Mgc2xpZ2h0bHksIGJ1dCBzdGlsbCBpbmNyZW1lbnRzIHZlcnNpb25cbiAgICovXG4gIGFzeW5jIGZvcmNlVXBkYXRlQ291bnRlcihcbiAgICBjb3VudGVyS2V5OiBDb3VudGVyS2V5RHRvLFxuICAgIG5ld1ZhbHVlOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnRyYW5zYWN0aW9uKGFzeW5jIChtYW5hZ2VyKSA9PiB7XG4gICAgICBsZXQgY291bnRlciA9IGF3YWl0IG1hbmFnZXIuZmluZE9uZShEb2N1bWVudE51bWJlckNvdW50ZXIsIHtcbiAgICAgICAgd2hlcmU6IHRoaXMuYnVpbGRXaGVyZUNsYXVzZShjb3VudGVyS2V5KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgICAgY291bnRlciA9IG1hbmFnZXIuY3JlYXRlKERvY3VtZW50TnVtYmVyQ291bnRlciwge1xuICAgICAgICAgIHByb2plY3RJZDogY291bnRlcktleS5wcm9qZWN0SWQsXG4gICAgICAgICAgb3JpZ2luYXRvcklkOiBjb3VudGVyS2V5Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogY291bnRlcktleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY291bnRlcktleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgICAgICBzdWJUeXBlSWQ6IGNvdW50ZXJLZXkuc3ViVHlwZUlkLFxuICAgICAgICAgIHJmYVR5cGVJZDogY291bnRlcktleS5yZmFUeXBlSWQsXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiBjb3VudGVyS2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgICAgICByZXNldFNjb3BlOiBjb3VudGVyS2V5LnJlc2V0U2NvcGUsXG4gICAgICAgICAgbGFzdE51bWJlcjogbmV3VmFsdWUsXG4gICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShjb3VudGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvcmNlIHVwZGF0ZSByZWdhcmRsZXNzIG9mIHZlcnNpb24sIGJ1dCBpbmNyZW1lbnQgdmVyc2lvblxuICAgICAgICBhd2FpdCBtYW5hZ2VyXG4gICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgLnVwZGF0ZShEb2N1bWVudE51bWJlckNvdW50ZXIpXG4gICAgICAgICAgLnNldCh7XG4gICAgICAgICAgICBsYXN0TnVtYmVyOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgIHZlcnNpb246ICgpID0+ICd2ZXJzaW9uICsgMScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2hlcmUodGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpKVxuICAgICAgICAgIC5leGVjdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgQ291bnRlciBmb3JjZSB1cGRhdGVkIHRvICR7bmV3VmFsdWV9IGZvciBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGNvdW50ZXJLZXlcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a.map new file mode 100644 index 0000000..bd8fb2c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/counterservice_d427bfc64fffab26d17b944e9694d91a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\counter.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\counter.service.ts"],"sourcesContent":["import { Injectable, ConflictException, Logger } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository, DataSource } from 'typeorm';\nimport { DocumentNumberCounter } from '../entities/document-number-counter.entity';\nimport { CounterKeyDto } from '../dto/counter-key.dto';\n\n@Injectable()\nexport class CounterService {\n private readonly logger = new Logger(CounterService.name);\n\n constructor(\n @InjectRepository(DocumentNumberCounter)\n private counterRepo: Repository,\n private dataSource: DataSource\n ) {}\n\n /**\n * Increment counter and return next number\n * Uses optimistic locking to prevent race conditions\n */\n async incrementCounter(counterKey: CounterKeyDto): Promise {\n const MAX_RETRIES = 3;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n return await this.dataSource.transaction(async (manager) => {\n // Find or create counter\n let counter = await manager.findOne(DocumentNumberCounter, {\n where: this.buildWhereClause(counterKey),\n });\n\n if (!counter) {\n counter = manager.create(DocumentNumberCounter, {\n projectId: counterKey.projectId,\n originatorId: counterKey.originatorOrganizationId,\n recipientOrganizationId: counterKey.recipientOrganizationId,\n correspondenceTypeId: counterKey.correspondenceTypeId,\n subTypeId: counterKey.subTypeId,\n rfaTypeId: counterKey.rfaTypeId,\n disciplineId: counterKey.disciplineId,\n resetScope: counterKey.resetScope,\n lastNumber: 1,\n version: 0,\n });\n await manager.save(counter);\n return 1;\n }\n\n // Increment with optimistic lock\n const currentVersion = counter.version;\n const nextNumber = counter.lastNumber + 1;\n\n const result = await manager\n .createQueryBuilder()\n .update(DocumentNumberCounter)\n .set({\n lastNumber: nextNumber,\n version: () => 'version + 1',\n })\n .where(this.buildWhereClause(counterKey))\n .andWhere('version = :version', { version: currentVersion })\n .execute();\n\n if (result.affected === 0) {\n throw new ConflictException('Counter version conflict');\n }\n\n return nextNumber;\n });\n } catch (error) {\n if (error instanceof ConflictException && attempt < MAX_RETRIES - 1) {\n this.logger.warn(\n `Version conflict on attempt ${attempt + 1}/${MAX_RETRIES}, retrying...`\n );\n // Exponential backoff\n await this.sleep(100 * Math.pow(2, attempt));\n continue;\n }\n throw error;\n }\n }\n\n throw new ConflictException('เลขที่เอกสารถูกเปลี่ยน กรุณาลองใหม่');\n }\n\n /**\n * Get current counter value without incrementing\n */\n async getCurrentCounter(counterKey: CounterKeyDto): Promise {\n const counter = await this.counterRepo.findOne({\n where: this.buildWhereClause(counterKey),\n });\n return counter?.lastNumber || 0;\n }\n\n private buildWhereClause(key: CounterKeyDto) {\n return {\n projectId: key.projectId,\n originatorId: key.originatorOrganizationId,\n recipientOrganizationId: key.recipientOrganizationId,\n correspondenceTypeId: key.correspondenceTypeId,\n subTypeId: key.subTypeId,\n rfaTypeId: key.rfaTypeId,\n disciplineId: key.disciplineId,\n resetScope: key.resetScope,\n };\n }\n\n /**\n * Force update counter value (Admin Override)\n * WARNING: This bypasses optimistic locking checks slightly, but still increments version\n */\n async forceUpdateCounter(\n counterKey: CounterKeyDto,\n newValue: number\n ): Promise {\n await this.dataSource.transaction(async (manager) => {\n let counter = await manager.findOne(DocumentNumberCounter, {\n where: this.buildWhereClause(counterKey),\n });\n\n if (!counter) {\n counter = manager.create(DocumentNumberCounter, {\n projectId: counterKey.projectId,\n originatorId: counterKey.originatorOrganizationId,\n recipientOrganizationId: counterKey.recipientOrganizationId,\n correspondenceTypeId: counterKey.correspondenceTypeId,\n subTypeId: counterKey.subTypeId,\n rfaTypeId: counterKey.rfaTypeId,\n disciplineId: counterKey.disciplineId,\n resetScope: counterKey.resetScope,\n lastNumber: newValue,\n version: 1,\n });\n await manager.save(counter);\n } else {\n // Force update regardless of version, but increment version\n await manager\n .createQueryBuilder()\n .update(DocumentNumberCounter)\n .set({\n lastNumber: newValue,\n version: () => 'version + 1',\n })\n .where(this.buildWhereClause(counterKey))\n .execute();\n }\n });\n\n this.logger.log(\n `Counter force updated to ${newValue} for key: ${JSON.stringify(\n counterKey\n )}`\n );\n }\n\n private sleep(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0 new file mode 100644 index 0000000..07c410c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0 @@ -0,0 +1,48 @@ +fece14f86c7396787cf0fce0ba85c5a7 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRecipient = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +let CorrespondenceRecipient = class CorrespondenceRecipient { +}; +exports.CorrespondenceRecipient = CorrespondenceRecipient; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRecipient.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", Number) +], CorrespondenceRecipient.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_type', type: 'enum', enum: ['TO', 'CC'] }), + __metadata("design:type", String) +], CorrespondenceRecipient.prototype, "recipientType", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.recipients, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceRecipient.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", typeof (_b = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _b : Object) +], CorrespondenceRecipient.prototype, "recipientOrganization", void 0); +exports.CorrespondenceRecipient = CorrespondenceRecipient = __decorate([ + (0, typeorm_1.Entity)('correspondence_recipients') +], CorrespondenceRecipient); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZWNpcGllbnQuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBQ3pELHlGQUErRTtBQUd4RSxJQUFNLHVCQUF1QixHQUE3QixNQUFNLHVCQUF1QjtDQW9CbkMsQ0FBQTtBQXBCWSwwREFBdUI7QUFFbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQzs7aUVBQ25CO0FBRzFCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUM7O3dFQUNwQjtBQUdqQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzs4REFDaEQ7QUFPNUI7SUFKQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsc0NBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUMxRCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLENBQUM7a0RBQ3pCLHNDQUFjLG9CQUFkLHNDQUFjOytEQUFDO0FBSWhDO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtDQUFZLENBQUM7SUFDN0IsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUM7a0RBQzFCLGtDQUFZLG9CQUFaLGtDQUFZO3NFQUFDO2tDQW5CMUIsdUJBQXVCO0lBRG5DLElBQUEsZ0JBQU0sRUFBQywyQkFBMkIsQ0FBQztHQUN2Qix1QkFBdUIsQ0FvQm5DIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFByaW1hcnlDb2x1bW4sIE1hbnlUb09uZSwgSm9pbkNvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xyXG5cclxuQEVudGl0eSgnY29ycmVzcG9uZGVuY2VfcmVjaXBpZW50cycpXHJcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB7XHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfaWQnIH0pXHJcbiAgY29ycmVzcG9uZGVuY2VJZCE6IG51bWJlcjtcclxuXHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAncmVjaXBpZW50X29yZ2FuaXphdGlvbl9pZCcgfSlcclxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcclxuXHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAncmVjaXBpZW50X3R5cGUnLCB0eXBlOiAnZW51bScsIGVudW06IFsnVE8nLCAnQ0MnXSB9KVxyXG4gIHJlY2lwaWVudFR5cGUhOiAnVE8nIHwgJ0NDJztcclxuXHJcbiAgLy8gUmVsYXRpb25zXHJcbiAgQE1hbnlUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZSwgKGNvcnIpID0+IGNvcnIucmVjaXBpZW50cywge1xyXG4gICAgb25EZWxldGU6ICdDQVNDQURFJyxcclxuICB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxyXG4gIGNvcnJlc3BvbmRlbmNlITogQ29ycmVzcG9uZGVuY2U7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnIH0pXHJcbiAgcmVjaXBpZW50T3JnYW5pemF0aW9uITogT3JnYW5pemF0aW9uO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0.map new file mode 100644 index 0000000..773077e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/correspondencerecipiententity_d782a1e91f757d9e1ad189bad12c6ed0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-recipient.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AACzD,yFAA+E;AAGxE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAoBnC,CAAA;AApBY,0DAAuB;AAElC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;iEACnB;AAG1B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;;wEACpB;AAGjC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;;8DAChD;AAO5B;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;QAC1D,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;kDACzB,sCAAc,oBAAd,sCAAc;+DAAC;AAIhC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;kDAC1B,kCAAY,oBAAZ,kCAAY;sEAAC;kCAnB1B,uBAAuB;IADnC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,uBAAuB,CAoBnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-recipient.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\r\nimport { Correspondence } from './correspondence.entity';\r\nimport { Organization } from '../../organization/entities/organization.entity';\r\n\r\n@Entity('correspondence_recipients')\r\nexport class CorrespondenceRecipient {\r\n @PrimaryColumn({ name: 'correspondence_id' })\r\n correspondenceId!: number;\r\n\r\n @PrimaryColumn({ name: 'recipient_organization_id' })\r\n recipientOrganizationId!: number;\r\n\r\n @PrimaryColumn({ name: 'recipient_type', type: 'enum', enum: ['TO', 'CC'] })\r\n recipientType!: 'TO' | 'CC';\r\n\r\n // Relations\r\n @ManyToOne(() => Correspondence, (corr) => corr.recipients, {\r\n onDelete: 'CASCADE',\r\n })\r\n @JoinColumn({ name: 'correspondence_id' })\r\n correspondence!: Correspondence;\r\n\r\n @ManyToOne(() => Organization)\r\n @JoinColumn({ name: 'recipient_organization_id' })\r\n recipientOrganization!: Organization;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5 new file mode 100644 index 0000000..f87dfe0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5 @@ -0,0 +1,345 @@ +a41beca36d6541e647704c23de5a95db +"use strict"; +// File: src/modules/workflow-engine/workflow-engine.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var WorkflowEngineService_1; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowEngineService = exports.WorkflowAction = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const workflow_definition_entity_1 = require("./entities/workflow-definition.entity"); +const workflow_history_entity_1 = require("./entities/workflow-history.entity"); +const workflow_instance_entity_1 = require("./entities/workflow-instance.entity"); +const workflow_dsl_service_1 = require("./workflow-dsl.service"); +const workflow_event_service_1 = require("./workflow-event.service"); // [NEW] Import Event Service +// Legacy Interface (Backward Compatibility) +var WorkflowAction; +(function (WorkflowAction) { + WorkflowAction["APPROVE"] = "APPROVE"; + WorkflowAction["REJECT"] = "REJECT"; + WorkflowAction["RETURN"] = "RETURN"; + WorkflowAction["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {})); +let WorkflowEngineService = WorkflowEngineService_1 = class WorkflowEngineService { + constructor(workflowDefRepo, instanceRepo, historyRepo, dslService, eventService, // [NEW] Inject Service + dataSource // ใช้สำหรับ Transaction + ) { + this.workflowDefRepo = workflowDefRepo; + this.instanceRepo = instanceRepo; + this.historyRepo = historyRepo; + this.dslService = dslService; + this.eventService = eventService; + this.dataSource = dataSource; + this.logger = new common_1.Logger(WorkflowEngineService_1.name); + } + // ================================================================= + // [PART 1] Definition Management (Phase 6A) + // ================================================================= + /** + * สร้างหรืออัปเดต Workflow Definition ใหม่ (Auto Versioning) + */ + async createDefinition(dto) { + // 1. Compile & Validate DSL + const compiled = this.dslService.compile(dto.dsl); + // 2. Check latest version + const latest = await this.workflowDefRepo.findOne({ + where: { workflow_code: dto.workflow_code }, + order: { version: 'DESC' }, + }); + const nextVersion = latest ? latest.version + 1 : 1; + // 3. Save new version + const entity = this.workflowDefRepo.create({ + workflow_code: dto.workflow_code, + version: nextVersion, + dsl: dto.dsl, + compiled: compiled, + is_active: dto.is_active ?? true, + }); + const saved = await this.workflowDefRepo.save(entity); + this.logger.log(`Created Workflow Definition: ${saved.workflow_code} v${saved.version}`); + return saved; + } + /** + * อัปเดต Definition (Re-compile DSL) + */ + async update(id, dto) { + const definition = await this.workflowDefRepo.findOne({ where: { id } }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow Definition with ID "${id}" not found`); + } + if (dto.dsl) { + try { + const compiled = this.dslService.compile(dto.dsl); + definition.dsl = dto.dsl; + definition.compiled = compiled; + } + catch (error) { + throw new common_1.BadRequestException(`Invalid DSL: ${error instanceof Error ? error.message : String(error)}`); + } + } + if (dto.is_active !== undefined) + definition.is_active = dto.is_active; + if (dto.workflow_code) + definition.workflow_code = dto.workflow_code; + return this.workflowDefRepo.save(definition); + } + /** + * ดึง Workflow Definition ทั้งหมด (เฉพาะ Version ล่าสุดของแต่ละ Workflow Code) + */ + async getDefinitions() { + // หา version ล่าสุดของแต่ละ workflow_code + // ใช้ query builder เพื่อ group by และหา max version + const latestDefinitions = await this.workflowDefRepo + .createQueryBuilder('def') + .where('def.version = (SELECT MAX(sub.version) FROM workflow_definitions sub WHERE sub.workflow_code = def.workflow_code)') + .getMany(); + return latestDefinitions; + } + /** + * ดึง Workflow Definition ตาม ID หรือ Code + */ + async getDefinitionById(id) { + const definition = await this.workflowDefRepo.findOne({ where: { id } }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow Definition with ID "${id}" not found`); + } + return definition; + } + /** + * ดึง Action ที่ทำได้ ณ State ปัจจุบัน + */ + async getAvailableActions(workflowCode, currentState) { + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: workflowCode, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) + return []; + const compiled = definition.compiled; + const stateConfig = compiled.states[currentState]; + if (!stateConfig || !stateConfig.transitions) + return []; + return Object.keys(stateConfig.transitions); + } + // ================================================================= + // [PART 2] Runtime Engine (Phase 3.1) + // ================================================================= + /** + * เริ่มต้น Workflow Instance ใหม่สำหรับเอกสาร + */ + async createInstance(workflowCode, entityType, entityId, initialContext = {}) { + // 1. หา Definition ล่าสุด + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: workflowCode, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow "${workflowCode}" not found or inactive.`); + } + // 2. หา Initial State จาก Compiled Structure + const compiled = definition.compiled; + // [FIX] ใช้ initialState จาก Root Property โดยตรง (ตามที่ Optimize ใน DSL Service) + // เพราะ CompiledState ใน states map ไม่มี property 'initial' แล้ว + const initialState = compiled.initialState; + if (!initialState) { + throw new common_1.BadRequestException(`Workflow "${workflowCode}" has no initial state defined.`); + } + // 3. สร้าง Instance + const instance = this.instanceRepo.create({ + definition, + entityType, + entityId, + currentState: initialState, + status: workflow_instance_entity_1.WorkflowStatus.ACTIVE, + context: initialContext, + }); + const savedInstance = await this.instanceRepo.save(instance); + this.logger.log(`Started Workflow Instance: ${workflowCode} for ${entityType}:${entityId}`); + return savedInstance; + } + /** + * ดึงข้อมูล Workflow Instance ตาม ID + * ใช้สำหรับการตรวจสอบสถานะหรือซิงค์ข้อมูลกลับไปยัง Module หลัก + */ + async getInstanceById(instanceId) { + const instance = await this.instanceRepo.findOne({ + where: { id: instanceId }, + relations: ['definition'], + }); + if (!instance) { + throw new common_1.NotFoundException(`Workflow Instance "${instanceId}" not found`); + } + return instance; + } + /** + * ดำเนินการเปลี่ยนสถานะ (Transition) ของ Instance จริงแบบ Transactional + */ + async processTransition(instanceId, action, userId, comment, payload = {}) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + let eventsToDispatch = []; + let updatedContext = {}; + try { + // 1. Lock Instance เพื่อป้องกัน Race Condition (Pessimistic Write Lock) + const instance = await queryRunner.manager.findOne(workflow_instance_entity_1.WorkflowInstance, { + where: { id: instanceId }, + relations: ['definition'], + lock: { mode: 'pessimistic_write' }, + }); + if (!instance) { + throw new common_1.NotFoundException(`Workflow Instance "${instanceId}" not found.`); + } + if (instance.status !== workflow_instance_entity_1.WorkflowStatus.ACTIVE) { + throw new common_1.BadRequestException(`Workflow is not active (Status: ${instance.status}).`); + } + // 2. Evaluate Logic ผ่าน DSL Service + const compiled = instance.definition + .compiled; + const context = { ...instance.context, userId, ...payload }; // Merge Context + // * DSL Service จะ throw error ถ้า action ไม่ถูกต้อง หรือสิทธิ์ไม่พอ + const evaluation = this.dslService.evaluate(compiled, instance.currentState, action, context); + const fromState = instance.currentState; + const toState = evaluation.nextState; + // 3. อัปเดต Instance + instance.currentState = toState; + instance.context = context; // อัปเดต Context ด้วย + // เช็คว่าเป็น Terminal State หรือไม่? + if (compiled.states[toState].terminal) { + instance.status = workflow_instance_entity_1.WorkflowStatus.COMPLETED; + } + await queryRunner.manager.save(instance); + // 4. บันทึก History (Audit Trail) + const history = this.historyRepo.create({ + instanceId: instance.id, + fromState, + toState, + action, + actionByUserId: userId, + comment, + metadata: { + events: evaluation.events, + payload, + }, + }); + await queryRunner.manager.save(history); + await queryRunner.commitTransaction(); + // [NEW] เก็บค่าไว้ Dispatch หลัง Commit + eventsToDispatch = evaluation.events; + updatedContext = context; + this.logger.log(`Transition: ${instanceId} [${fromState}] --${action}--> [${toState}] by User:${userId}`); + // [NEW] Dispatch Events (Async) ผ่าน WorkflowEventService + if (eventsToDispatch && eventsToDispatch.length > 0) { + void this.eventService.dispatchEvents(instance.id, eventsToDispatch, updatedContext); + } + return { + success: true, + nextState: toState, + events: eventsToDispatch, + isCompleted: instance.status === workflow_instance_entity_1.WorkflowStatus.COMPLETED, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Transition Failed for ${instanceId}: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + /** + * (Utility) Evaluate แบบไม่บันทึกผล (Dry Run) สำหรับ Test หรือ Preview + */ + async evaluate(dto) { + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: dto.workflow_code, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow "${dto.workflow_code}" not found`); + } + return this.dslService.evaluate(definition.compiled, dto.current_state, dto.action, dto.context || {}); + } + // ================================================================= + // [PART 3] Legacy Support (Backward Compatibility) + // รักษา Logic เดิมไว้เพื่อให้ Module อื่น (Correspondence/RFA) ทำงานต่อได้ + // ================================================================= + /** + * คำนวณสถานะถัดไปแบบ Linear Sequence (Logic เดิม) + * @deprecated แนะนำให้เปลี่ยนไปใช้ processTransition แทนเมื่อ Refactor เสร็จ + */ + processAction(currentSequence, totalSteps, action, returnToSequence) { + const act = action.toUpperCase(); + switch (act) { + case 'APPROVE': + case 'ACKNOWLEDGE': + if (currentSequence >= totalSteps) { + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'COMPLETED', + }; + } + return { + nextStepSequence: currentSequence + 1, + shouldUpdateStatus: false, + }; + case 'REJECT': + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'REJECTED', + }; + case 'RETURN': { + const targetStep = returnToSequence || currentSequence - 1; + if (targetStep < 1) { + throw new common_1.BadRequestException('Cannot return beyond the first step'); + } + return { + nextStepSequence: targetStep, + shouldUpdateStatus: true, + documentStatus: 'REVISE_REQUIRED', + }; + } + default: + this.logger.warn(`Unknown legacy action: ${action}, treating as next step.`); + if (currentSequence >= totalSteps) { + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'COMPLETED', + }; + } + return { + nextStepSequence: currentSequence + 1, + shouldUpdateStatus: false, + }; + } + } +}; +exports.WorkflowEngineService = WorkflowEngineService; +exports.WorkflowEngineService = WorkflowEngineService = WorkflowEngineService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(workflow_definition_entity_1.WorkflowDefinition)), + __param(1, (0, typeorm_1.InjectRepository)(workflow_instance_entity_1.WorkflowInstance)), + __param(2, (0, typeorm_1.InjectRepository)(workflow_history_entity_1.WorkflowHistory)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof workflow_dsl_service_1.WorkflowDslService !== "undefined" && workflow_dsl_service_1.WorkflowDslService) === "function" ? _d : Object, typeof (_e = typeof workflow_event_service_1.WorkflowEventService !== "undefined" && workflow_event_service_1.WorkflowEventService) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.DataSource // ใช้สำหรับ Transaction + !== "undefined" && typeorm_2.DataSource // ใช้สำหรับ Transaction + ) === "function" ? _f : Object]) +], WorkflowEngineService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1lbmdpbmUuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQStEOzs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRCwyQ0FLd0I7QUFDeEIsNkNBQW1EO0FBQ25ELHFDQUFpRDtBQUVqRCxXQUFXO0FBQ1gsc0ZBQTJFO0FBQzNFLGdGQUFxRTtBQUNyRSxrRkFHNkM7QUFNN0MsaUVBSWdDO0FBQ2hDLHFFQUFnRSxDQUFDLDZCQUE2QjtBQUU5Riw0Q0FBNEM7QUFDNUMsSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLHFDQUFtQixDQUFBO0lBQ25CLG1DQUFpQixDQUFBO0lBQ2pCLG1DQUFpQixDQUFBO0lBQ2pCLDZDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFMVyxjQUFjLDhCQUFkLGNBQWMsUUFLekI7QUFTTSxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHaEMsWUFFRSxlQUFnRSxFQUVoRSxZQUEyRCxFQUUzRCxXQUF5RCxFQUN4QyxVQUE4QixFQUM5QixZQUFrQyxFQUFFLHVCQUF1QjtJQUMzRCxVQUFzQixDQUFDLHdCQUF3Qjs7UUFQL0Msb0JBQWUsR0FBZixlQUFlLENBQWdDO1FBRS9DLGlCQUFZLEdBQVosWUFBWSxDQUE4QjtRQUUxQyxnQkFBVyxHQUFYLFdBQVcsQ0FBNkI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFYeEIsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLHVCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBWTlELENBQUM7SUFFSixvRUFBb0U7SUFDcEUsNENBQTRDO0lBQzVDLG9FQUFvRTtJQUVwRTs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBZ0M7UUFFaEMsNEJBQTRCO1FBQzVCLE1BQU0sUUFB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QixFQUFDLCtDQUFrQixDQUFDLENBQUE7SUFFcEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLDJDQUFnQixDQUFDLENBQUE7SUFFbEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLHlDQUFlLENBQUMsQ0FBQTt5REFIQSxvQkFBVSxvQkFBVixvQkFBVSxvREFFYixvQkFBVSxvQkFBVixvQkFBVSxvREFFWCxvQkFBVSxvQkFBVixvQkFBVSxvREFDWCx5Q0FBa0Isb0JBQWxCLHlDQUFrQixvREFDaEIsNkNBQW9CLG9CQUFwQiw2Q0FBb0Isb0RBQ3RCLG9CQUFVLENBQUMsd0JBQXdCOzRCQUFuQyxvQkFBVSxDQUFDLHdCQUF3Qjs7R0FadkQscUJBQXFCLENBMFpqQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXHdvcmtmbG93LWVuZ2luZS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1lbmdpbmUuc2VydmljZS50c1xuXG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBMb2dnZXIsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcblxuLy8gRW50aXRpZXNcbmltcG9ydCB7IFdvcmtmbG93RGVmaW5pdGlvbiB9IGZyb20gJy4vZW50aXRpZXMvd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHknO1xuaW1wb3J0IHsgV29ya2Zsb3dIaXN0b3J5IH0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1oaXN0b3J5LmVudGl0eSc7XG5pbXBvcnQge1xuICBXb3JrZmxvd0luc3RhbmNlLFxuICBXb3JrZmxvd1N0YXR1cyxcbn0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHknO1xuXG4vLyBTZXJ2aWNlcyAmIEludGVyZmFjZXNcbmltcG9ydCB7IENyZWF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS13b3JrZmxvdy1kZWZpbml0aW9uLmR0byc7XG5pbXBvcnQgeyBFdmFsdWF0ZVdvcmtmbG93RHRvIH0gZnJvbSAnLi9kdG8vZXZhbHVhdGUtd29ya2Zsb3cuZHRvJztcbmltcG9ydCB7IFVwZGF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS13b3JrZmxvdy1kZWZpbml0aW9uLmR0byc7XG5pbXBvcnQge1xuICBDb21waWxlZFdvcmtmbG93LFxuICBSYXdFdmVudCxcbiAgV29ya2Zsb3dEc2xTZXJ2aWNlLFxufSBmcm9tICcuL3dvcmtmbG93LWRzbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93RXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1ldmVudC5zZXJ2aWNlJzsgLy8gW05FV10gSW1wb3J0IEV2ZW50IFNlcnZpY2VcblxuLy8gTGVnYWN5IEludGVyZmFjZSAoQmFja3dhcmQgQ29tcGF0aWJpbGl0eSlcbmV4cG9ydCBlbnVtIFdvcmtmbG93QWN0aW9uIHtcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJyxcbiAgUkVKRUNUID0gJ1JFSkVDVCcsXG4gIFJFVFVSTiA9ICdSRVRVUk4nLFxuICBBQ0tOT1dMRURHRSA9ICdBQ0tOT1dMRURHRScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpdGlvblJlc3VsdCB7XG4gIG5leHRTdGVwU2VxdWVuY2U6IG51bWJlciB8IG51bGw7XG4gIHNob3VsZFVwZGF0ZVN0YXR1czogYm9vbGVhbjtcbiAgZG9jdW1lbnRTdGF0dXM/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0VuZ2luZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFdvcmtmbG93RGVmaW5pdGlvbilcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtmbG93RGVmUmVwbzogUmVwb3NpdG9yeTxXb3JrZmxvd0RlZmluaXRpb24+LFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFdvcmtmbG93SW5zdGFuY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZVJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dJbnN0YW5jZT4sXG4gICAgQEluamVjdFJlcG9zaXRvcnkoV29ya2Zsb3dIaXN0b3J5KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeVJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dIaXN0b3J5PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRzbFNlcnZpY2U6IFdvcmtmbG93RHNsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2VydmljZTogV29ya2Zsb3dFdmVudFNlcnZpY2UsIC8vIFtORVddIEluamVjdCBTZXJ2aWNlXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlIC8vIOC5g+C4iuC5ieC4quC4s+C4q+C4o+C4seC4miBUcmFuc2FjdGlvblxuICApIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gW1BBUlQgMV0gRGVmaW5pdGlvbiBNYW5hZ2VtZW50IChQaGFzZSA2QSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICog4Liq4Lij4LmJ4Liy4LiH4Lir4Lij4Li34Lit4Lit4Lix4Lib4LmA4LiU4LiVIFdvcmtmbG93IERlZmluaXRpb24g4LmD4Lir4Lih4LmIIChBdXRvIFZlcnNpb25pbmcpXG4gICAqL1xuICBhc3luYyBjcmVhdGVEZWZpbml0aW9uKFxuICAgIGR0bzogQ3JlYXRlV29ya2Zsb3dEZWZpbml0aW9uRHRvXG4gICk6IFByb21pc2U8V29ya2Zsb3dEZWZpbml0aW9uPiB7XG4gICAgLy8gMS4gQ29tcGlsZSAmIFZhbGlkYXRlIERTTFxuICAgIGNvbnN0IGNvbXBpbGVkID0gdGhpcy5kc2xTZXJ2aWNlLmNvbXBpbGUoZHRvLmRzbCk7XG5cbiAgICAvLyAyLiBDaGVjayBsYXRlc3QgdmVyc2lvblxuICAgIGNvbnN0IGxhdGVzdCA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogZHRvLndvcmtmbG93X2NvZGUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgbmV4dFZlcnNpb24gPSBsYXRlc3QgPyBsYXRlc3QudmVyc2lvbiArIDEgOiAxO1xuXG4gICAgLy8gMy4gU2F2ZSBuZXcgdmVyc2lvblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMud29ya2Zsb3dEZWZSZXBvLmNyZWF0ZSh7XG4gICAgICB3b3JrZmxvd19jb2RlOiBkdG8ud29ya2Zsb3dfY29kZSxcbiAgICAgIHZlcnNpb246IG5leHRWZXJzaW9uLFxuICAgICAgZHNsOiBkdG8uZHNsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBjb21waWxlZDogY29tcGlsZWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIGlzX2FjdGl2ZTogZHRvLmlzX2FjdGl2ZSA/PyB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5zYXZlKGVudGl0eSk7XG4gICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgYENyZWF0ZWQgV29ya2Zsb3cgRGVmaW5pdGlvbjogJHtzYXZlZC53b3JrZmxvd19jb2RlfSB2JHtzYXZlZC52ZXJzaW9ufWBcbiAgICApO1xuICAgIHJldHVybiBzYXZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDguK3guLHguJvguYDguJTguJUgRGVmaW5pdGlvbiAoUmUtY29tcGlsZSBEU0wpXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkdG86IFVwZGF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0b1xuICApOiBQcm9taXNlPFdvcmtmbG93RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYFdvcmtmbG93IERlZmluaXRpb24gd2l0aCBJRCBcIiR7aWR9XCIgbm90IGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZHRvLmRzbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLmRzbFNlcnZpY2UuY29tcGlsZShkdG8uZHNsKTtcbiAgICAgICAgZGVmaW5pdGlvbi5kc2wgPSBkdG8uZHNsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGRlZmluaXRpb24uY29tcGlsZWQgPSBjb21waWxlZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEludmFsaWQgRFNMOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGR0by5pc19hY3RpdmUgIT09IHVuZGVmaW5lZCkgZGVmaW5pdGlvbi5pc19hY3RpdmUgPSBkdG8uaXNfYWN0aXZlO1xuICAgIGlmIChkdG8ud29ya2Zsb3dfY29kZSkgZGVmaW5pdGlvbi53b3JrZmxvd19jb2RlID0gZHRvLndvcmtmbG93X2NvZGU7XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd0RlZlJlcG8uc2F2ZShkZWZpbml0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguJTguLbguIcgV29ya2Zsb3cgRGVmaW5pdGlvbiDguJfguLHguYnguIfguKvguKHguJQgKOC5gOC4ieC4nuC4suC4sCBWZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC4guC4reC4h+C5geC4leC5iOC4peC4sCBXb3JrZmxvdyBDb2RlKVxuICAgKi9cbiAgYXN5bmMgZ2V0RGVmaW5pdGlvbnMoKTogUHJvbWlzZTxXb3JrZmxvd0RlZmluaXRpb25bXT4ge1xuICAgIC8vIOC4q+C4siB2ZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC4guC4reC4h+C5geC4leC5iOC4peC4sCB3b3JrZmxvd19jb2RlXG4gICAgLy8g4LmD4LiK4LmJIHF1ZXJ5IGJ1aWxkZXIg4LmA4Lie4Li34LmI4LitIGdyb3VwIGJ5IOC5geC4peC4sOC4q+C4siBtYXggdmVyc2lvblxuICAgIGNvbnN0IGxhdGVzdERlZmluaXRpb25zID0gYXdhaXQgdGhpcy53b3JrZmxvd0RlZlJlcG9cbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ2RlZicpXG4gICAgICAud2hlcmUoXG4gICAgICAgICdkZWYudmVyc2lvbiA9IChTRUxFQ1QgTUFYKHN1Yi52ZXJzaW9uKSBGUk9NIHdvcmtmbG93X2RlZmluaXRpb25zIHN1YiBXSEVSRSBzdWIud29ya2Zsb3dfY29kZSA9IGRlZi53b3JrZmxvd19jb2RlKSdcbiAgICAgIClcbiAgICAgIC5nZXRNYW55KCk7XG5cbiAgICByZXR1cm4gbGF0ZXN0RGVmaW5pdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICog4LiU4Li24LiHIFdvcmtmbG93IERlZmluaXRpb24g4LiV4Liy4LihIElEIOC4q+C4o+C4t+C4rSBDb2RlXG4gICAqL1xuICBhc3luYyBnZXREZWZpbml0aW9uQnlJZChpZDogc3RyaW5nKTogUHJvbWlzZTxXb3JrZmxvd0RlZmluaXRpb24+IHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gYXdhaXQgdGhpcy53b3JrZmxvd0RlZlJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXG4gICAgICAgIGBXb3JrZmxvdyBEZWZpbml0aW9uIHdpdGggSUQgXCIke2lkfVwiIG5vdCBmb3VuZGBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4hyBBY3Rpb24g4LiX4Li14LmI4LiX4Liz4LmE4LiU4LmJIOC4kyBTdGF0ZSDguJvguLHguIjguIjguLjguJrguLHguJlcbiAgICovXG4gIGFzeW5jIGdldEF2YWlsYWJsZUFjdGlvbnMoXG4gICAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gICAgY3VycmVudFN0YXRlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IHdvcmtmbG93X2NvZGU6IHdvcmtmbG93Q29kZSwgaXNfYWN0aXZlOiB0cnVlIH0sXG4gICAgICBvcmRlcjogeyB2ZXJzaW9uOiAnREVTQycgfSxcbiAgICB9KTtcblxuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgY29tcGlsZWQgPSBkZWZpbml0aW9uLmNvbXBpbGVkIGFzIHVua25vd24gYXMgQ29tcGlsZWRXb3JrZmxvdztcbiAgICBjb25zdCBzdGF0ZUNvbmZpZyA9IGNvbXBpbGVkLnN0YXRlc1tjdXJyZW50U3RhdGVdO1xuICAgIGlmICghc3RhdGVDb25maWcgfHwgIXN0YXRlQ29uZmlnLnRyYW5zaXRpb25zKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RhdGVDb25maWcudHJhbnNpdGlvbnMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gW1BBUlQgMl0gUnVudGltZSBFbmdpbmUgKFBoYXNlIDMuMSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICog4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZIFdvcmtmbG93IEluc3RhbmNlIOC5g+C4q+C4oeC5iOC4quC4s+C4q+C4o+C4seC4muC5gOC4reC4geC4quC4suC4o1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5zdGFuY2UoXG4gICAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gICAgZW50aXR5VHlwZTogc3RyaW5nLFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgaW5pdGlhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKTogUHJvbWlzZTxXb3JrZmxvd0luc3RhbmNlPiB7XG4gICAgLy8gMS4g4Lir4LiyIERlZmluaXRpb24g4Lil4LmI4Liy4Liq4Li44LiUXG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogd29ya2Zsb3dDb2RlLCBpc19hY3RpdmU6IHRydWUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXG4gICAgICAgIGBXb3JrZmxvdyBcIiR7d29ya2Zsb3dDb2RlfVwiIG5vdCBmb3VuZCBvciBpbmFjdGl2ZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4q+C4siBJbml0aWFsIFN0YXRlIOC4iOC4suC4gSBDb21waWxlZCBTdHJ1Y3R1cmVcbiAgICBjb25zdCBjb21waWxlZCA9IGRlZmluaXRpb24uY29tcGlsZWQgYXMgdW5rbm93biBhcyBDb21waWxlZFdvcmtmbG93O1xuICAgIC8vIFtGSVhdIOC5g+C4iuC5iSBpbml0aWFsU3RhdGUg4LiI4Liy4LiBIFJvb3QgUHJvcGVydHkg4LmC4LiU4Lii4LiV4Lij4LiHICjguJXguLLguKHguJfguLXguYggT3B0aW1pemUg4LmD4LiZIERTTCBTZXJ2aWNlKVxuICAgIC8vIOC5gOC4nuC4o+C4suC4sCBDb21waWxlZFN0YXRlIOC5g+C4mSBzdGF0ZXMgbWFwIOC5hOC4oeC5iOC4oeC4tSBwcm9wZXJ0eSAnaW5pdGlhbCcg4LmB4Lil4LmJ4LinXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gY29tcGlsZWQuaW5pdGlhbFN0YXRlO1xuXG4gICAgaWYgKCFpbml0aWFsU3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgV29ya2Zsb3cgXCIke3dvcmtmbG93Q29kZX1cIiBoYXMgbm8gaW5pdGlhbCBzdGF0ZSBkZWZpbmVkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4g4Liq4Lij4LmJ4Liy4LiHIEluc3RhbmNlXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlUmVwby5jcmVhdGUoe1xuICAgICAgZGVmaW5pdGlvbixcbiAgICAgIGVudGl0eVR5cGUsXG4gICAgICBlbnRpdHlJZCxcbiAgICAgIGN1cnJlbnRTdGF0ZTogaW5pdGlhbFN0YXRlLFxuICAgICAgc3RhdHVzOiBXb3JrZmxvd1N0YXR1cy5BQ1RJVkUsXG4gICAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNhdmVkSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmluc3RhbmNlUmVwby5zYXZlKGluc3RhbmNlKTtcbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgU3RhcnRlZCBXb3JrZmxvdyBJbnN0YW5jZTogJHt3b3JrZmxvd0NvZGV9IGZvciAke2VudGl0eVR5cGV9OiR7ZW50aXR5SWR9YFxuICAgICk7XG4gICAgcmV0dXJuIHNhdmVkSW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICog4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54LilIFdvcmtmbG93IEluc3RhbmNlIOC4leC4suC4oSBJRFxuICAgKiDguYPguIrguYnguKrguLPguKvguKPguLHguJrguIHguLLguKPguJXguKPguKfguIjguKrguK3guJrguKrguJbguLLguJnguLDguKvguKPguLfguK3guIvguLTguIfguITguYzguILguYnguK3guKHguLnguKXguIHguKXguLHguJrguYTguJvguKLguLHguIcgTW9kdWxlIOC4q+C4peC4seC4gVxuICAgKi9cbiAgYXN5bmMgZ2V0SW5zdGFuY2VCeUlkKGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8V29ya2Zsb3dJbnN0YW5jZT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5pbnN0YW5jZVJlcG8uZmluZE9uZSh7XG4gICAgICB3aGVyZTogeyBpZDogaW5zdGFuY2VJZCB9LFxuICAgICAgcmVsYXRpb25zOiBbJ2RlZmluaXRpb24nXSxcbiAgICB9KTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYFdvcmtmbG93IEluc3RhbmNlIFwiJHtpbnN0YW5jZUlkfVwiIG5vdCBmb3VuZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4s+C5gOC4meC4tOC4meC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC4quC4luC4suC4meC4sCAoVHJhbnNpdGlvbikg4LiC4Lit4LiHIEluc3RhbmNlIOC4iOC4o+C4tOC4h+C5geC4muC4miBUcmFuc2FjdGlvbmFsXG4gICAqL1xuICBhc3luYyBwcm9jZXNzVHJhbnNpdGlvbihcbiAgICBpbnN0YW5jZUlkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBzdHJpbmcsXG4gICAgdXNlcklkOiBudW1iZXIsXG4gICAgY29tbWVudD86IHN0cmluZyxcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICkge1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcblxuICAgIGxldCBldmVudHNUb0Rpc3BhdGNoOiBSYXdFdmVudFtdID0gW107XG4gICAgbGV0IHVwZGF0ZWRDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIExvY2sgSW5zdGFuY2Ug4LmA4Lie4Li34LmI4Lit4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFJhY2UgQ29uZGl0aW9uIChQZXNzaW1pc3RpYyBXcml0ZSBMb2NrKVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmZpbmRPbmUoV29ya2Zsb3dJbnN0YW5jZSwge1xuICAgICAgICB3aGVyZTogeyBpZDogaW5zdGFuY2VJZCB9LFxuICAgICAgICByZWxhdGlvbnM6IFsnZGVmaW5pdGlvbiddLFxuICAgICAgICBsb2NrOiB7IG1vZGU6ICdwZXNzaW1pc3RpY193cml0ZScgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICBgV29ya2Zsb3cgSW5zdGFuY2UgXCIke2luc3RhbmNlSWR9XCIgbm90IGZvdW5kLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbmNlLnN0YXR1cyAhPT0gV29ya2Zsb3dTdGF0dXMuQUNUSVZFKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBXb3JrZmxvdyBpcyBub3QgYWN0aXZlIChTdGF0dXM6ICR7aW5zdGFuY2Uuc3RhdHVzfSkuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBFdmFsdWF0ZSBMb2dpYyDguJzguYjguLLguJkgRFNMIFNlcnZpY2VcbiAgICAgIGNvbnN0IGNvbXBpbGVkID0gaW5zdGFuY2UuZGVmaW5pdGlvblxuICAgICAgICAuY29tcGlsZWQgYXMgdW5rbm93biBhcyBDb21waWxlZFdvcmtmbG93O1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgLi4uaW5zdGFuY2UuY29udGV4dCwgdXNlcklkLCAuLi5wYXlsb2FkIH07IC8vIE1lcmdlIENvbnRleHRcblxuICAgICAgLy8gKiBEU0wgU2VydmljZSDguIjguLAgdGhyb3cgZXJyb3Ig4LiW4LmJ4LiyIGFjdGlvbiDguYTguKHguYjguJbguLnguIHguJXguYnguK3guIcg4Lir4Lij4Li34Lit4Liq4Li04LiX4LiY4Li04LmM4LmE4Lih4LmI4Lie4LitXG4gICAgICBjb25zdCBldmFsdWF0aW9uID0gdGhpcy5kc2xTZXJ2aWNlLmV2YWx1YXRlKFxuICAgICAgICBjb21waWxlZCxcbiAgICAgICAgaW5zdGFuY2UuY3VycmVudFN0YXRlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGZyb21TdGF0ZSA9IGluc3RhbmNlLmN1cnJlbnRTdGF0ZTtcbiAgICAgIGNvbnN0IHRvU3RhdGUgPSBldmFsdWF0aW9uLm5leHRTdGF0ZTtcblxuICAgICAgLy8gMy4g4Lit4Lix4Lib4LmA4LiU4LiVIEluc3RhbmNlXG4gICAgICBpbnN0YW5jZS5jdXJyZW50U3RhdGUgPSB0b1N0YXRlO1xuICAgICAgaW5zdGFuY2UuY29udGV4dCA9IGNvbnRleHQ7IC8vIOC4reC4seC4m+C5gOC4lOC4lSBDb250ZXh0IOC4lOC5ieC4p+C4olxuXG4gICAgICAvLyDguYDguIrguYfguITguKfguYjguLLguYDguJvguYfguJkgVGVybWluYWwgU3RhdGUg4Lir4Lij4Li34Lit4LmE4Lih4LmIP1xuICAgICAgaWYgKGNvbXBpbGVkLnN0YXRlc1t0b1N0YXRlXS50ZXJtaW5hbCkge1xuICAgICAgICBpbnN0YW5jZS5zdGF0dXMgPSBXb3JrZmxvd1N0YXR1cy5DT01QTEVURUQ7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShpbnN0YW5jZSk7XG5cbiAgICAgIC8vIDQuIOC4muC4seC4meC4l+C4tuC4gSBIaXN0b3J5IChBdWRpdCBUcmFpbClcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSB0aGlzLmhpc3RvcnlSZXBvLmNyZWF0ZSh7XG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmlkLFxuICAgICAgICBmcm9tU3RhdGUsXG4gICAgICAgIHRvU3RhdGUsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgYWN0aW9uQnlVc2VySWQ6IHVzZXJJZCxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBldmVudHM6IGV2YWx1YXRpb24uZXZlbnRzLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShoaXN0b3J5KTtcblxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgLy8gW05FV10g4LmA4LiB4LmH4Lia4LiE4LmI4Liy4LmE4Lin4LmJIERpc3BhdGNoIOC4q+C4peC4seC4hyBDb21taXRcbiAgICAgIGV2ZW50c1RvRGlzcGF0Y2ggPSBldmFsdWF0aW9uLmV2ZW50cztcbiAgICAgIHVwZGF0ZWRDb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgICBgVHJhbnNpdGlvbjogJHtpbnN0YW5jZUlkfSBbJHtmcm9tU3RhdGV9XSAtLSR7YWN0aW9ufS0tPiBbJHt0b1N0YXRlfV0gYnkgVXNlcjoke3VzZXJJZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBbTkVXXSBEaXNwYXRjaCBFdmVudHMgKEFzeW5jKSDguJzguYjguLLguJkgV29ya2Zsb3dFdmVudFNlcnZpY2VcbiAgICAgIGlmIChldmVudHNUb0Rpc3BhdGNoICYmIGV2ZW50c1RvRGlzcGF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2lkIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnRzKFxuICAgICAgICAgIGluc3RhbmNlLmlkLFxuICAgICAgICAgIGV2ZW50c1RvRGlzcGF0Y2gsXG4gICAgICAgICAgdXBkYXRlZENvbnRleHRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbmV4dFN0YXRlOiB0b1N0YXRlLFxuICAgICAgICBldmVudHM6IGV2ZW50c1RvRGlzcGF0Y2gsXG4gICAgICAgIGlzQ29tcGxldGVkOiBpbnN0YW5jZS5zdGF0dXMgPT09IFdvcmtmbG93U3RhdHVzLkNPTVBMRVRFRCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFRyYW5zaXRpb24gRmFpbGVkIGZvciAke2luc3RhbmNlSWR9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAoVXRpbGl0eSkgRXZhbHVhdGUg4LmB4Lia4Lia4LmE4Lih4LmI4Lia4Lix4LiZ4LiX4Li24LiB4Lic4LilIChEcnkgUnVuKSDguKrguLPguKvguKPguLHguJogVGVzdCDguKvguKPguLfguK0gUHJldmlld1xuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGUoZHRvOiBFdmFsdWF0ZVdvcmtmbG93RHRvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogZHRvLndvcmtmbG93X2NvZGUsIGlzX2FjdGl2ZTogdHJ1ZSB9LFxuICAgICAgb3JkZXI6IHsgdmVyc2lvbjogJ0RFU0MnIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgV29ya2Zsb3cgXCIke2R0by53b3JrZmxvd19jb2RlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRzbFNlcnZpY2UuZXZhbHVhdGUoXG4gICAgICBkZWZpbml0aW9uLmNvbXBpbGVkIGFzIHVua25vd24gYXMgQ29tcGlsZWRXb3JrZmxvdyxcbiAgICAgIGR0by5jdXJyZW50X3N0YXRlLFxuICAgICAgZHRvLmFjdGlvbixcbiAgICAgIGR0by5jb250ZXh0IHx8IHt9XG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFtQQVJUIDNdIExlZ2FjeSBTdXBwb3J0IChCYWNrd2FyZCBDb21wYXRpYmlsaXR5KVxuICAvLyDguKPguLHguIHguKnguLIgTG9naWMg4LmA4LiU4Li04Lih4LmE4Lin4LmJ4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJIE1vZHVsZSDguK3guLfguYjguJkgKENvcnJlc3BvbmRlbmNlL1JGQSkg4LiX4Liz4LiH4Liy4LiZ4LiV4LmI4Lit4LmE4LiU4LmJXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIOC4hOC4s+C4meC4p+C4k+C4quC4luC4suC4meC4sOC4luC4seC4lOC5hOC4m+C5geC4muC4miBMaW5lYXIgU2VxdWVuY2UgKExvZ2ljIOC5gOC4lOC4tOC4oSlcbiAgICogQGRlcHJlY2F0ZWQg4LmB4LiZ4Liw4LiZ4Liz4LmD4Lir4LmJ4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LmE4Lib4LmD4LiK4LmJIHByb2Nlc3NUcmFuc2l0aW9uIOC5geC4l+C4meC5gOC4oeC4t+C5iOC4rSBSZWZhY3RvciDguYDguKrguKPguYfguIhcbiAgICovXG4gIHByb2Nlc3NBY3Rpb24oXG4gICAgY3VycmVudFNlcXVlbmNlOiBudW1iZXIsXG4gICAgdG90YWxTdGVwczogbnVtYmVyLFxuICAgIGFjdGlvbjogc3RyaW5nLFxuICAgIHJldHVyblRvU2VxdWVuY2U/OiBudW1iZXJcbiAgKTogVHJhbnNpdGlvblJlc3VsdCB7XG4gICAgY29uc3QgYWN0ID0gYWN0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAgc3dpdGNoIChhY3QpIHtcbiAgICAgIGNhc2UgJ0FQUFJPVkUnOlxuICAgICAgY2FzZSAnQUNLTk9XTEVER0UnOlxuICAgICAgICBpZiAoY3VycmVudFNlcXVlbmNlID49IHRvdGFsU3RlcHMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogbnVsbCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZVN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgIGRvY3VtZW50U3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogY3VycmVudFNlcXVlbmNlICsgMSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdSRUpFQ1QnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlU3RhdHVzOiB0cnVlLFxuICAgICAgICAgIGRvY3VtZW50U3RhdHVzOiAnUkVKRUNURUQnLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdSRVRVUk4nOiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFN0ZXAgPSByZXR1cm5Ub1NlcXVlbmNlIHx8IGN1cnJlbnRTZXF1ZW5jZSAtIDE7XG4gICAgICAgIGlmICh0YXJnZXRTdGVwIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdDYW5ub3QgcmV0dXJuIGJleW9uZCB0aGUgZmlyc3Qgc3RlcCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogdGFyZ2V0U3RlcCxcbiAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IHRydWUsXG4gICAgICAgICAgZG9jdW1lbnRTdGF0dXM6ICdSRVZJU0VfUkVRVUlSRUQnLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmtub3duIGxlZ2FjeSBhY3Rpb246ICR7YWN0aW9ufSwgdHJlYXRpbmcgYXMgbmV4dCBzdGVwLmBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTZXF1ZW5jZSA+PSB0b3RhbFN0ZXBzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IHRydWUsXG4gICAgICAgICAgICBkb2N1bWVudFN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IGN1cnJlbnRTZXF1ZW5jZSArIDEsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlU3RhdHVzOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5.map new file mode 100644 index 0000000..2eec2b1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/workflowengineservice_d77fe0bd7e66a5bcb877421ed49eead5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-engine.service.ts\n\nimport {\n BadRequestException,\n Injectable,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { DataSource, Repository } from 'typeorm';\n\n// Entities\nimport { WorkflowDefinition } from './entities/workflow-definition.entity';\nimport { WorkflowHistory } from './entities/workflow-history.entity';\nimport {\n WorkflowInstance,\n WorkflowStatus,\n} from './entities/workflow-instance.entity';\n\n// Services & Interfaces\nimport { CreateWorkflowDefinitionDto } from './dto/create-workflow-definition.dto';\nimport { EvaluateWorkflowDto } from './dto/evaluate-workflow.dto';\nimport { UpdateWorkflowDefinitionDto } from './dto/update-workflow-definition.dto';\nimport {\n CompiledWorkflow,\n RawEvent,\n WorkflowDslService,\n} from './workflow-dsl.service';\nimport { WorkflowEventService } from './workflow-event.service'; // [NEW] Import Event Service\n\n// Legacy Interface (Backward Compatibility)\nexport enum WorkflowAction {\n APPROVE = 'APPROVE',\n REJECT = 'REJECT',\n RETURN = 'RETURN',\n ACKNOWLEDGE = 'ACKNOWLEDGE',\n}\n\nexport interface TransitionResult {\n nextStepSequence: number | null;\n shouldUpdateStatus: boolean;\n documentStatus?: string;\n}\n\n@Injectable()\nexport class WorkflowEngineService {\n private readonly logger = new Logger(WorkflowEngineService.name);\n\n constructor(\n @InjectRepository(WorkflowDefinition)\n private readonly workflowDefRepo: Repository,\n @InjectRepository(WorkflowInstance)\n private readonly instanceRepo: Repository,\n @InjectRepository(WorkflowHistory)\n private readonly historyRepo: Repository,\n private readonly dslService: WorkflowDslService,\n private readonly eventService: WorkflowEventService, // [NEW] Inject Service\n private readonly dataSource: DataSource // ใช้สำหรับ Transaction\n ) {}\n\n // =================================================================\n // [PART 1] Definition Management (Phase 6A)\n // =================================================================\n\n /**\n * สร้างหรืออัปเดต Workflow Definition ใหม่ (Auto Versioning)\n */\n async createDefinition(\n dto: CreateWorkflowDefinitionDto\n ): Promise {\n // 1. Compile & Validate DSL\n const compiled = this.dslService.compile(dto.dsl);\n\n // 2. Check latest version\n const latest = await this.workflowDefRepo.findOne({\n where: { workflow_code: dto.workflow_code },\n order: { version: 'DESC' },\n });\n\n const nextVersion = latest ? latest.version + 1 : 1;\n\n // 3. Save new version\n const entity = this.workflowDefRepo.create({\n workflow_code: dto.workflow_code,\n version: nextVersion,\n dsl: dto.dsl as unknown as Record,\n compiled: compiled as unknown as Record,\n is_active: dto.is_active ?? true,\n });\n\n const saved = await this.workflowDefRepo.save(entity);\n this.logger.log(\n `Created Workflow Definition: ${saved.workflow_code} v${saved.version}`\n );\n return saved;\n }\n\n /**\n * อัปเดต Definition (Re-compile DSL)\n */\n async update(\n id: string,\n dto: UpdateWorkflowDefinitionDto\n ): Promise {\n const definition = await this.workflowDefRepo.findOne({ where: { id } });\n if (!definition) {\n throw new NotFoundException(\n `Workflow Definition with ID \"${id}\" not found`\n );\n }\n\n if (dto.dsl) {\n try {\n const compiled = this.dslService.compile(dto.dsl);\n definition.dsl = dto.dsl as unknown as Record;\n definition.compiled = compiled as unknown as Record;\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid DSL: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (dto.is_active !== undefined) definition.is_active = dto.is_active;\n if (dto.workflow_code) definition.workflow_code = dto.workflow_code;\n\n return this.workflowDefRepo.save(definition);\n }\n\n /**\n * ดึง Workflow Definition ทั้งหมด (เฉพาะ Version ล่าสุดของแต่ละ Workflow Code)\n */\n async getDefinitions(): Promise {\n // หา version ล่าสุดของแต่ละ workflow_code\n // ใช้ query builder เพื่อ group by และหา max version\n const latestDefinitions = await this.workflowDefRepo\n .createQueryBuilder('def')\n .where(\n 'def.version = (SELECT MAX(sub.version) FROM workflow_definitions sub WHERE sub.workflow_code = def.workflow_code)'\n )\n .getMany();\n\n return latestDefinitions;\n }\n\n /**\n * ดึง Workflow Definition ตาม ID หรือ Code\n */\n async getDefinitionById(id: string): Promise {\n const definition = await this.workflowDefRepo.findOne({ where: { id } });\n if (!definition) {\n throw new NotFoundException(\n `Workflow Definition with ID \"${id}\" not found`\n );\n }\n return definition;\n }\n\n /**\n * ดึง Action ที่ทำได้ ณ State ปัจจุบัน\n */\n async getAvailableActions(\n workflowCode: string,\n currentState: string\n ): Promise {\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: workflowCode, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) return [];\n\n const compiled = definition.compiled as unknown as CompiledWorkflow;\n const stateConfig = compiled.states[currentState];\n if (!stateConfig || !stateConfig.transitions) return [];\n\n return Object.keys(stateConfig.transitions);\n }\n\n // =================================================================\n // [PART 2] Runtime Engine (Phase 3.1)\n // =================================================================\n\n /**\n * เริ่มต้น Workflow Instance ใหม่สำหรับเอกสาร\n */\n async createInstance(\n workflowCode: string,\n entityType: string,\n entityId: string,\n initialContext: Record = {}\n ): Promise {\n // 1. หา Definition ล่าสุด\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: workflowCode, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) {\n throw new NotFoundException(\n `Workflow \"${workflowCode}\" not found or inactive.`\n );\n }\n\n // 2. หา Initial State จาก Compiled Structure\n const compiled = definition.compiled as unknown as CompiledWorkflow;\n // [FIX] ใช้ initialState จาก Root Property โดยตรง (ตามที่ Optimize ใน DSL Service)\n // เพราะ CompiledState ใน states map ไม่มี property 'initial' แล้ว\n const initialState = compiled.initialState;\n\n if (!initialState) {\n throw new BadRequestException(\n `Workflow \"${workflowCode}\" has no initial state defined.`\n );\n }\n\n // 3. สร้าง Instance\n const instance = this.instanceRepo.create({\n definition,\n entityType,\n entityId,\n currentState: initialState,\n status: WorkflowStatus.ACTIVE,\n context: initialContext,\n });\n\n const savedInstance = await this.instanceRepo.save(instance);\n this.logger.log(\n `Started Workflow Instance: ${workflowCode} for ${entityType}:${entityId}`\n );\n return savedInstance;\n }\n\n /**\n * ดึงข้อมูล Workflow Instance ตาม ID\n * ใช้สำหรับการตรวจสอบสถานะหรือซิงค์ข้อมูลกลับไปยัง Module หลัก\n */\n async getInstanceById(instanceId: string): Promise {\n const instance = await this.instanceRepo.findOne({\n where: { id: instanceId },\n relations: ['definition'],\n });\n\n if (!instance) {\n throw new NotFoundException(\n `Workflow Instance \"${instanceId}\" not found`\n );\n }\n\n return instance;\n }\n\n /**\n * ดำเนินการเปลี่ยนสถานะ (Transition) ของ Instance จริงแบบ Transactional\n */\n async processTransition(\n instanceId: string,\n action: string,\n userId: number,\n comment?: string,\n payload: Record = {}\n ) {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n await queryRunner.startTransaction();\n\n let eventsToDispatch: RawEvent[] = [];\n let updatedContext: Record = {};\n\n try {\n // 1. Lock Instance เพื่อป้องกัน Race Condition (Pessimistic Write Lock)\n const instance = await queryRunner.manager.findOne(WorkflowInstance, {\n where: { id: instanceId },\n relations: ['definition'],\n lock: { mode: 'pessimistic_write' },\n });\n\n if (!instance) {\n throw new NotFoundException(\n `Workflow Instance \"${instanceId}\" not found.`\n );\n }\n\n if (instance.status !== WorkflowStatus.ACTIVE) {\n throw new BadRequestException(\n `Workflow is not active (Status: ${instance.status}).`\n );\n }\n\n // 2. Evaluate Logic ผ่าน DSL Service\n const compiled = instance.definition\n .compiled as unknown as CompiledWorkflow;\n const context = { ...instance.context, userId, ...payload }; // Merge Context\n\n // * DSL Service จะ throw error ถ้า action ไม่ถูกต้อง หรือสิทธิ์ไม่พอ\n const evaluation = this.dslService.evaluate(\n compiled,\n instance.currentState,\n action,\n context\n );\n\n const fromState = instance.currentState;\n const toState = evaluation.nextState;\n\n // 3. อัปเดต Instance\n instance.currentState = toState;\n instance.context = context; // อัปเดต Context ด้วย\n\n // เช็คว่าเป็น Terminal State หรือไม่?\n if (compiled.states[toState].terminal) {\n instance.status = WorkflowStatus.COMPLETED;\n }\n\n await queryRunner.manager.save(instance);\n\n // 4. บันทึก History (Audit Trail)\n const history = this.historyRepo.create({\n instanceId: instance.id,\n fromState,\n toState,\n action,\n actionByUserId: userId,\n comment,\n metadata: {\n events: evaluation.events,\n payload,\n },\n });\n await queryRunner.manager.save(history);\n\n await queryRunner.commitTransaction();\n\n // [NEW] เก็บค่าไว้ Dispatch หลัง Commit\n eventsToDispatch = evaluation.events;\n updatedContext = context;\n\n this.logger.log(\n `Transition: ${instanceId} [${fromState}] --${action}--> [${toState}] by User:${userId}`\n );\n\n // [NEW] Dispatch Events (Async) ผ่าน WorkflowEventService\n if (eventsToDispatch && eventsToDispatch.length > 0) {\n void this.eventService.dispatchEvents(\n instance.id,\n eventsToDispatch,\n updatedContext\n );\n }\n\n return {\n success: true,\n nextState: toState,\n events: eventsToDispatch,\n isCompleted: instance.status === WorkflowStatus.COMPLETED,\n };\n } catch (err) {\n await queryRunner.rollbackTransaction();\n this.logger.error(\n `Transition Failed for ${instanceId}: ${(err as Error).message}`\n );\n throw err;\n } finally {\n await queryRunner.release();\n }\n }\n\n /**\n * (Utility) Evaluate แบบไม่บันทึกผล (Dry Run) สำหรับ Test หรือ Preview\n */\n async evaluate(dto: EvaluateWorkflowDto): Promise {\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: dto.workflow_code, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) {\n throw new NotFoundException(`Workflow \"${dto.workflow_code}\" not found`);\n }\n\n return this.dslService.evaluate(\n definition.compiled as unknown as CompiledWorkflow,\n dto.current_state,\n dto.action,\n dto.context || {}\n );\n }\n\n // =================================================================\n // [PART 3] Legacy Support (Backward Compatibility)\n // รักษา Logic เดิมไว้เพื่อให้ Module อื่น (Correspondence/RFA) ทำงานต่อได้\n // =================================================================\n\n /**\n * คำนวณสถานะถัดไปแบบ Linear Sequence (Logic เดิม)\n * @deprecated แนะนำให้เปลี่ยนไปใช้ processTransition แทนเมื่อ Refactor เสร็จ\n */\n processAction(\n currentSequence: number,\n totalSteps: number,\n action: string,\n returnToSequence?: number\n ): TransitionResult {\n const act = action.toUpperCase();\n switch (act) {\n case 'APPROVE':\n case 'ACKNOWLEDGE':\n if (currentSequence >= totalSteps) {\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'COMPLETED',\n };\n }\n return {\n nextStepSequence: currentSequence + 1,\n shouldUpdateStatus: false,\n };\n\n case 'REJECT':\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'REJECTED',\n };\n\n case 'RETURN': {\n const targetStep = returnToSequence || currentSequence - 1;\n if (targetStep < 1) {\n throw new BadRequestException('Cannot return beyond the first step');\n }\n return {\n nextStepSequence: targetStep,\n shouldUpdateStatus: true,\n documentStatus: 'REVISE_REQUIRED',\n };\n }\n\n default:\n this.logger.warn(\n `Unknown legacy action: ${action}, treating as next step.`\n );\n if (currentSequence >= totalSteps) {\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'COMPLETED',\n };\n }\n return {\n nextStepSequence: currentSequence + 1,\n shouldUpdateStatus: false,\n };\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37 new file mode 100644 index 0000000..54bc251 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37 @@ -0,0 +1,76 @@ +efefbb2cfce547506292a65a0ff6c4ae +"use strict"; +// backend/src/modules/document-numbering/entities/document-number-format.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberFormat = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const correspondence_type_entity_1 = require("../../correspondence/entities/correspondence-type.entity"); +let DocumentNumberFormat = class DocumentNumberFormat { +}; +exports.DocumentNumberFormat = DocumentNumberFormat; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_id', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'format_string', length: 100 }), + __metadata("design:type", String) +], DocumentNumberFormat.prototype, "formatTemplate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', nullable: true }), + __metadata("design:type", String) +], DocumentNumberFormat.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reset_annually', default: true }), + __metadata("design:type", Boolean) +], DocumentNumberFormat.prototype, "resetSequenceYearly", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: 1 }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberFormat.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberFormat.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], DocumentNumberFormat.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_type_entity_1.CorrespondenceType), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", typeof (_d = typeof correspondence_type_entity_1.CorrespondenceType !== "undefined" && correspondence_type_entity_1.CorrespondenceType) === "function" ? _d : Object) +], DocumentNumberFormat.prototype, "correspondenceType", void 0); +exports.DocumentNumberFormat = DocumentNumberFormat = __decorate([ + (0, typeorm_1.Entity)('document_number_formats'), + (0, typeorm_1.Unique)(['projectId', 'correspondenceTypeId', 'disciplineId']) +], DocumentNumberFormat); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLG1GQUFtRjs7Ozs7Ozs7Ozs7OztBQUVuRixxQ0FTaUI7QUFDakIsMEVBQWdFO0FBQ2hFLHlHQUE4RjtBQUl2RixJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFvQjtDQXdDaEMsQ0FBQTtBQXhDWSxvREFBb0I7QUFFL0I7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztnREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt1REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tFQUM3QjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzswREFDeEI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7NERBQ3ZCO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUMzQjtBQUlyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lFQUNwQjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztzREFDeEI7QUFHbEI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7dURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7dURBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO3FEQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLCtDQUFrQixDQUFDO0lBQ25DLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDO2tEQUMxQiwrQ0FBa0Isb0JBQWxCLCtDQUFrQjtnRUFBQzsrQkF2QzdCLG9CQUFvQjtJQUZoQyxJQUFBLGdCQUFNLEVBQUMseUJBQXlCLENBQUM7SUFDakMsSUFBQSxnQkFBTSxFQUFDLENBQUMsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0dBQ2pELG9CQUFvQixDQXdDaEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYmFja2VuZC9zcmMvbW9kdWxlcy9kb2N1bWVudC1udW1iZXJpbmcvZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHNcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgVW5pcXVlLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVHlwZSB9IGZyb20gJy4uLy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2Zvcm1hdHMnKVxuQFVuaXF1ZShbJ3Byb2plY3RJZCcsICdjb3JyZXNwb25kZW5jZVR5cGVJZCcsICdkaXNjaXBsaW5lSWQnXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckZvcm1hdCB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkaXNjaXBsaW5lX2lkJywgZGVmYXVsdDogMCB9KVxuICBkaXNjaXBsaW5lSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmb3JtYXRfc3RyaW5nJywgbGVuZ3RoOiAxMDAgfSlcbiAgZm9ybWF0VGVtcGxhdGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZXNjcmlwdGlvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vIFtORVddIENvbnRyb2wgeWVhcmx5IHJlc2V0IGJlaGF2aW9yXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVzZXRfYW5udWFsbHknLCBkZWZhdWx0OiB0cnVlIH0pXG4gIHJlc2V0U2VxdWVuY2VZZWFybHkhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogMSB9KVxuICBpc0FjdGl2ZSE6IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZVR5cGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3R5cGVfaWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlVHlwZT86IENvcnJlc3BvbmRlbmNlVHlwZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37.map new file mode 100644 index 0000000..8f46ad8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/documentnumberformatentity_da22f67609371e510a896a8a74de1f37.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-format.entity.ts","mappings":";AAAA,mFAAmF;;;;;;;;;;;;;AAEnF,qCASiB;AACjB,0EAAgE;AAChE,yGAA8F;AAIvF,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAwChC,CAAA;AAxCY,oDAAoB;AAE/B;IADC,IAAA,gCAAsB,GAAE;;gDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;uDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEAC7B;AAG9B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4DACvB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC3B;AAIrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;iEACpB;AAG9B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;sDACxB;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uDAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;qDAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+CAAkB,CAAC;IACnC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;kDAC1B,+CAAkB,oBAAlB,+CAAkB;gEAAC;+BAvC7B,oBAAoB;IAFhC,IAAA,gBAAM,EAAC,yBAAyB,CAAC;IACjC,IAAA,gBAAM,EAAC,CAAC,WAAW,EAAE,sBAAsB,EAAE,cAAc,CAAC,CAAC;GACjD,oBAAoB,CAwChC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-format.entity.ts"],"sourcesContent":["// backend/src/modules/document-numbering/entities/document-number-format.entity.ts\n\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n Unique,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { CorrespondenceType } from '../../correspondence/entities/correspondence-type.entity';\n\n@Entity('document_number_formats')\n@Unique(['projectId', 'correspondenceTypeId', 'disciplineId'])\nexport class DocumentNumberFormat {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'correspondence_type_id', nullable: true })\n correspondenceTypeId?: number;\n\n @Column({ name: 'discipline_id', default: 0 })\n disciplineId!: number;\n\n @Column({ name: 'format_string', length: 100 })\n formatTemplate!: string;\n\n @Column({ name: 'description', nullable: true })\n description?: string;\n\n // [NEW] Control yearly reset behavior\n @Column({ name: 'reset_annually', default: true })\n resetSequenceYearly!: boolean;\n\n @Column({ name: 'is_active', default: 1 })\n isActive!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n\n @ManyToOne(() => CorrespondenceType)\n @JoinColumn({ name: 'correspondence_type_id' })\n correspondenceType?: CorrespondenceType;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2 new file mode 100644 index 0000000..c7678a4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2 @@ -0,0 +1,110 @@ +a0f2e0837ba334bb61318f5ef094c823 +"use strict"; +// File: src/modules/user/entities/user.entity.ts +// บันทึกการแก้ไข: เพิ่ม Relations กับ UserAssignment และ UserPreference (T1.3) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.User = void 0; +const typeorm_1 = require("typeorm"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); // Adjust path as needed +const user_assignment_entity_1 = require("./user-assignment.entity"); +const user_preference_entity_1 = require("./user-preference.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let User = class User extends uuid_base_entity_1.UuidBaseEntity { + // ADR-019: Expose UUID instead of INT ID + get primaryOrganizationPublicId() { + return this.organization?.publicId; + } +}; +exports.User = User; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'user_id' }), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], User.prototype, "user_id", void 0); +__decorate([ + (0, typeorm_1.Column)({ unique: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "username", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'password_hash', select: false }) // ไม่ Select Password โดย Default + , + __metadata("design:type", String) +], User.prototype, "password", void 0); +__decorate([ + (0, typeorm_1.Column)({ unique: true, length: 100 }), + __metadata("design:type", String) +], User.prototype, "email", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'first_name', nullable: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "firstName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_name', nullable: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "lastName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], User.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'failed_attempts', default: 0 }), + __metadata("design:type", Number) +], User.prototype, "failedAttempts", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'locked_until', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], User.prototype, "lockedUntil", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_login_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], User.prototype, "lastLoginAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'line_id', nullable: true, length: 100 }), + __metadata("design:type", String) +], User.prototype, "lineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'primary_organization_id', nullable: true }), + (0, class_transformer_1.Exclude)() // INT ID - never expose, use primaryOrganizationPublicId instead (ADR-019) + , + __metadata("design:type", Number) +], User.prototype, "primaryOrganizationId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization, { nullable: true, onDelete: 'SET NULL' }), + (0, typeorm_1.JoinColumn)({ name: 'primary_organization_id' }), + __metadata("design:type", typeof (_c = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _c : Object) +], User.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => user_assignment_entity_1.UserAssignment, (assignment) => assignment.user), + __metadata("design:type", Array) +], User.prototype, "assignments", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => user_preference_entity_1.UserPreference, (pref) => pref.user, { cascade: true }), + __metadata("design:type", typeof (_d = typeof user_preference_entity_1.UserPreference !== "undefined" && user_preference_entity_1.UserPreference) === "function" ? _d : Object) +], User.prototype, "preference", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], User.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_f = typeof Date !== "undefined" && Date) === "function" ? _f : Object) +], User.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_g = typeof Date !== "undefined" && Date) === "function" ? _g : Object) +], User.prototype, "deletedAt", void 0); +exports.User = User = __decorate([ + (0, typeorm_1.Entity)('users') +], User); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXIuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7QUFBQSxpREFBaUQ7QUFDakQsK0VBQStFOzs7Ozs7Ozs7Ozs7O0FBRS9FLHFDQVdpQjtBQUNqQix5RkFBK0UsQ0FBQyx3QkFBd0I7QUFDeEcscUVBQTBEO0FBQzFELHFFQUEwRDtBQUMxRCxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sSUFBSSxHQUFWLE1BQU0sSUFBSyxTQUFRLGlDQUFjO0lBNEN0Qyx5Q0FBeUM7SUFDekMsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztJQUNyQyxDQUFDO0NBbUJGLENBQUE7QUFsRVksb0JBQUk7QUFHZjtJQUZDLElBQUEsZ0NBQXNCLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDM0MsSUFBQSwyQkFBTyxHQUFFOztxQ0FDTztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztzQ0FDbkI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQzs7O3NDQUNsRTtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzttQ0FDdkI7QUFHZjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3VDQUN4QztBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3NDQUN4QztBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztzQ0FDMUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzs0Q0FDeEI7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNyRCxJQUFJLG9CQUFKLElBQUk7eUNBQUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUN2RCxJQUFJLG9CQUFKLElBQUk7eUNBQUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztvQ0FDekM7QUFLaEI7SUFGQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELElBQUEsMkJBQU8sR0FBRSxDQUFDLDJFQUEyRTs7O21EQUN2RDtBQUkvQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDdkUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUM7a0RBQ2pDLGtDQUFZLG9CQUFaLGtDQUFZOzBDQUFDO0FBUzVCO0lBREMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHVDQUFjLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7O3lDQUNsQztBQUkvQjtJQURDLElBQUEsa0JBQVEsRUFBQyxHQUFHLEVBQUUsQ0FBQyx1Q0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUMxRCx1Q0FBYyxvQkFBZCx1Q0FBYzt3Q0FBQztBQUk1QjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTt1Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTt1Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrREFDNUMsSUFBSSxvQkFBSixJQUFJO3VDQUFDO2VBakVOLElBQUk7SUFEaEIsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQztHQUNILElBQUksQ0FrRWhCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHVzZXJcXGVudGl0aWVzXFx1c2VyLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5LnRzXHJcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjog4LmA4Lie4Li04LmI4LihIFJlbGF0aW9ucyDguIHguLHguJogVXNlckFzc2lnbm1lbnQg4LmB4Lil4LiwIFVzZXJQcmVmZXJlbmNlIChUMS4zKVxyXG5cclxuaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcclxuICBVcGRhdGVEYXRlQ29sdW1uLFxyXG4gIERlbGV0ZURhdGVDb2x1bW4sXHJcbiAgTWFueVRvT25lLFxyXG4gIE9uZVRvTWFueSxcclxuICBPbmVUb09uZSxcclxuICBKb2luQ29sdW1uLFxyXG59IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7IC8vIEFkanVzdCBwYXRoIGFzIG5lZWRlZFxyXG5pbXBvcnQgeyBVc2VyQXNzaWdubWVudCB9IGZyb20gJy4vdXNlci1hc3NpZ25tZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlIH0gZnJvbSAnLi91c2VyLXByZWZlcmVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XHJcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcblxyXG5ARW50aXR5KCd1c2VycycpXHJcbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xyXG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXHJcbiAgQEV4Y2x1ZGUoKVxyXG4gIHVzZXJfaWQhOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyB1bmlxdWU6IHRydWUsIGxlbmd0aDogNTAgfSlcclxuICB1c2VybmFtZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwYXNzd29yZF9oYXNoJywgc2VsZWN0OiBmYWxzZSB9KSAvLyDguYTguKHguYggU2VsZWN0IFBhc3N3b3JkIOC5guC4lOC4oiBEZWZhdWx0XHJcbiAgcGFzc3dvcmQhOiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyB1bmlxdWU6IHRydWUsIGxlbmd0aDogMTAwIH0pXHJcbiAgZW1haWwhOiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnZmlyc3RfbmFtZScsIG51bGxhYmxlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgZmlyc3ROYW1lPzogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2xhc3RfbmFtZScsIG51bGxhYmxlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgbGFzdE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdmYWlsZWRfYXR0ZW1wdHMnLCBkZWZhdWx0OiAwIH0pXHJcbiAgZmFpbGVkQXR0ZW1wdHMhOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnbG9ja2VkX3VudGlsJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcclxuICBsb2NrZWRVbnRpbD86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGFzdF9sb2dpbl9hdCcsIHR5cGU6ICd0aW1lc3RhbXAnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIGxhc3RMb2dpbkF0PzogRGF0ZTtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdsaW5lX2lkJywgbnVsbGFibGU6IHRydWUsIGxlbmd0aDogMTAwIH0pXHJcbiAgbGluZUlkPzogc3RyaW5nO1xyXG5cclxuICAvLyBSZWxhdGlvbiDguIHguLHguJogT3JnYW5pemF0aW9uICjguKrguLHguIfguIHguLHguJTguKvguKXguLHguIEpXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcmltYXJ5X29yZ2FuaXphdGlvbl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgQEV4Y2x1ZGUoKSAvLyBJTlQgSUQgLSBuZXZlciBleHBvc2UsIHVzZSBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgaW5zdGVhZCAoQURSLTAxOSlcclxuICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uLCB7IG51bGxhYmxlOiB0cnVlLCBvbkRlbGV0ZTogJ1NFVCBOVUxMJyB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3ByaW1hcnlfb3JnYW5pemF0aW9uX2lkJyB9KVxyXG4gIG9yZ2FuaXphdGlvbj86IE9yZ2FuaXphdGlvbjtcclxuXHJcbiAgLy8gQURSLTAxOTogRXhwb3NlIFVVSUQgaW5zdGVhZCBvZiBJTlQgSURcclxuICBnZXQgcHJpbWFyeU9yZ2FuaXphdGlvblB1YmxpY0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmdhbml6YXRpb24/LnB1YmxpY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVsYXRpb24g4LiB4Lix4LiaIEFzc2lnbm1lbnRzIChSQkFDKVxyXG4gIEBPbmVUb01hbnkoKCkgPT4gVXNlckFzc2lnbm1lbnQsIChhc3NpZ25tZW50KSA9PiBhc3NpZ25tZW50LnVzZXIpXHJcbiAgYXNzaWdubWVudHM/OiBVc2VyQXNzaWdubWVudFtdO1xyXG5cclxuICAvLyBSZWxhdGlvbiDguIHguLHguJogUHJlZmVyZW5jZXMgKDE6MSlcclxuICBAT25lVG9PbmUoKCkgPT4gVXNlclByZWZlcmVuY2UsIChwcmVmKSA9PiBwcmVmLnVzZXIsIHsgY2FzY2FkZTogdHJ1ZSB9KVxyXG4gIHByZWZlcmVuY2U/OiBVc2VyUHJlZmVyZW5jZTtcclxuXHJcbiAgLy8gQmFzZSBFbnRpdHkgRmllbGRzXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlO1xyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7XHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnLCBzZWxlY3Q6IGZhbHNlIH0pXHJcbiAgZGVsZXRlZEF0PzogRGF0ZTtcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2.map new file mode 100644 index 0000000..61db0be --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dc/userentity_dc28e03d983755869ca5787ce3ebd3b2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user.entity.ts\r\n// บันทึกการแก้ไข: เพิ่ม Relations กับ UserAssignment และ UserPreference (T1.3)\r\n\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n ManyToOne,\r\n OneToMany,\r\n OneToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Organization } from '../../organization/entities/organization.entity'; // Adjust path as needed\r\nimport { UserAssignment } from './user-assignment.entity';\r\nimport { UserPreference } from './user-preference.entity';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Exclude } from 'class-transformer';\r\n\r\n@Entity('users')\r\nexport class User extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn({ name: 'user_id' })\r\n @Exclude()\r\n user_id!: number;\r\n\r\n @Column({ unique: true, length: 50 })\r\n username!: string;\r\n\r\n @Column({ name: 'password_hash', select: false }) // ไม่ Select Password โดย Default\r\n password!: string;\r\n\r\n @Column({ unique: true, length: 100 })\r\n email!: string;\r\n\r\n @Column({ name: 'first_name', nullable: true, length: 50 })\r\n firstName?: string;\r\n\r\n @Column({ name: 'last_name', nullable: true, length: 50 })\r\n lastName?: string;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n @Column({ name: 'failed_attempts', default: 0 })\r\n failedAttempts!: number;\r\n\r\n @Column({ name: 'locked_until', type: 'datetime', nullable: true })\r\n lockedUntil?: Date;\r\n\r\n @Column({ name: 'last_login_at', type: 'timestamp', nullable: true })\r\n lastLoginAt?: Date;\r\n\r\n @Column({ name: 'line_id', nullable: true, length: 100 })\r\n lineId?: string;\r\n\r\n // Relation กับ Organization (สังกัดหลัก)\r\n @Column({ name: 'primary_organization_id', nullable: true })\r\n @Exclude() // INT ID - never expose, use primaryOrganizationPublicId instead (ADR-019)\r\n primaryOrganizationId?: number;\r\n\r\n @ManyToOne(() => Organization, { nullable: true, onDelete: 'SET NULL' })\r\n @JoinColumn({ name: 'primary_organization_id' })\r\n organization?: Organization;\r\n\r\n // ADR-019: Expose UUID instead of INT ID\r\n get primaryOrganizationPublicId(): string | undefined {\r\n return this.organization?.publicId;\r\n }\r\n\r\n // Relation กับ Assignments (RBAC)\r\n @OneToMany(() => UserAssignment, (assignment) => assignment.user)\r\n assignments?: UserAssignment[];\r\n\r\n // Relation กับ Preferences (1:1)\r\n @OneToOne(() => UserPreference, (pref) => pref.user, { cascade: true })\r\n preference?: UserPreference;\r\n\r\n // Base Entity Fields\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n\r\n @DeleteDateColumn({ name: 'deleted_at', select: false })\r\n deletedAt?: Date;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076 new file mode 100644 index 0000000..7683206 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076 @@ -0,0 +1,620 @@ +5563eeed4bfe4ee045e518b4ea2dac90 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const common_1 = require("@nestjs/common"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +describe('CorrespondenceService', () => { + let service; + let numberingService; + let correspondenceRepo; + let revisionRepo; + let testingModule; + let _dataSource; + const createMockRepository = () => ({ + find: jest.fn(), + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + softDelete: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + leftJoinAndSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getOne: jest.fn().mockResolvedValue(null), + getMany: jest.fn().mockResolvedValue([]), + getManyAndCount: jest.fn().mockResolvedValue([[], 0]), + })), + }); + const mockDataSource = { + createQueryRunner: jest.fn(() => ({ + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn(), + save: jest.fn(), + findOne: jest.fn(), + }, + })), + getRepository: jest.fn(() => createMockRepository()), + manager: { + findOne: jest.fn(), + }, + }; + beforeEach(async () => { + testingModule = await testing_1.Test.createTestingModule({ + providers: [ + correspondence_service_1.CorrespondenceService, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_reference_entity_1.CorrespondenceReference), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_tag_entity_1.CorrespondenceTag), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(organization_entity_1.Organization), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_recipient_entity_1.CorrespondenceRecipient), + useValue: createMockRepository(), + }, + { + provide: document_numbering_service_1.DocumentNumberingService, + useValue: { + generateNextNumber: jest.fn(), + updateNumberForDraft: jest.fn(), + previewNextNumber: jest.fn(), + }, + }, + { + provide: json_schema_service_1.JsonSchemaService, + useValue: { validate: jest.fn() }, + }, + { + provide: workflow_engine_service_1.WorkflowEngineService, + useValue: { createInstance: jest.fn() }, + }, + { + provide: user_service_1.UserService, + useValue: { + findOne: jest.fn(), + getUserPermissions: jest.fn().mockResolvedValue([]), + }, + }, + { + provide: typeorm_2.DataSource, + useValue: mockDataSource, + }, + { + provide: search_service_1.SearchService, + useValue: { indexDocument: jest.fn() }, + }, + { + provide: file_storage_service_1.FileStorageService, + useValue: { commit: jest.fn().mockResolvedValue([]) }, + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveProjectId: jest.fn().mockResolvedValue(1), + resolveOrganizationId: jest.fn().mockResolvedValue(1), + }, + }, + { + provide: notification_service_1.NotificationService, + useValue: { send: jest.fn().mockResolvedValue(undefined) }, + }, + ], + }).compile(); + service = testingModule.get(correspondence_service_1.CorrespondenceService); + numberingService = testingModule.get(document_numbering_service_1.DocumentNumberingService); + correspondenceRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence)); + revisionRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision)); + _dataSource = testingModule.get(typeorm_2.DataSource); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('update', () => { + it('should allow non-draft update for org-admin+ permissions', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.cancel', + ]); + jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({ + id: 1, + publicId: 'corr-uuid-1', + correspondenceNumber: 'CORR-001', + projectId: 1, + createdAt: new Date(), + revisions: [], + }); + await expect(service.update(1, { subject: 'Updated Subject' }, mockUser)).resolves.toBeDefined(); + }); + it('should reject non-draft update for non-admin permissions', async () => { + const mockUser = { + user_id: 2, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 101, + correspondenceId: 2, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.edit', + ]); + await expect(service.update(2, { subject: 'Should Fail' }, mockUser)).rejects.toThrow(common_1.ForbiddenException); + }); + it('should NOT regenerate number if critical fields unchanged', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 1, + disciplineId: 3, + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).not.toHaveBeenCalled(); + }); + it('should regenerate number if Project ID changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 2, + }; + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(2); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Document Type changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + typeId: 999, + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + typeRepo.findOne.mockResolvedValue({ + id: 999, + typeCode: 'NEW-TYPE', + }); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Recipient Organization changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + // Access DataSource manager for mocking + mockDataSource.manager.findOne.mockResolvedValue({ + id: 88, + organizationCode: 'NEW-ORG', + }); + const updateDto = { + recipients: [{ type: 'TO', organizationId: 88 }], + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + }); + describe('create', () => { + it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: null, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + originatorId: 'originator-uuid', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const userService = testingModule.get(user_service_1.UserService); + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + userService.findOne.mockResolvedValue({ + user_id: 1, + primaryOrganizationId: null, + }); + userService.getUserPermissions.mockResolvedValue([ + 'system.manage_all', + ]); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockImplementation((value) => { + if (value === 'originator-uuid') + return 10; + if (value === 'recipient-uuid') + return 20; + return 0; + }); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LTR', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_entity_1.Correspondence, expect.objectContaining({ originatorId: 10 })); + }); + it('should set revisionLabel to "A" for RFA type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFA', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to "A" for RFI type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFI', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to null for LETTER type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LETTER', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + it('should set revisionLabel to undefined for MEMO type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'MEMO', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCw2Q0FBcUQ7QUFDckQscUNBQWlEO0FBQ2pELDJDQUFvRDtBQUNwRCxxRUFBaUU7QUFDakUsNEVBQWtFO0FBQ2xFLDhGQUFtRjtBQUNuRixzRkFBMkU7QUFDM0UsMEZBQStFO0FBQy9FLGdHQUFxRjtBQUNyRixvRkFBeUU7QUFDekUsc0ZBQTRFO0FBQzVFLGdHQUFxRjtBQUNyRiwwR0FBcUc7QUFDckcsNEVBQXVFO0FBQ3ZFLHdGQUFtRjtBQUNuRix1REFBbUQ7QUFDbkQsNkRBQXlEO0FBQ3pELHlGQUFvRjtBQUNwRix1RkFBa0Y7QUFDbEYsK0VBQTJFO0FBSzNFLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7SUFDckMsSUFBSSxPQUE4QixDQUFDO0lBQ25DLElBQUksZ0JBQTBDLENBQUM7SUFDL0MsSUFBSSxrQkFBOEMsQ0FBQztJQUNuRCxJQUFJLFlBQWdELENBQUM7SUFDckQsSUFBSSxhQUE0QixDQUFDO0lBQ2pDLElBQUksV0FBdUIsQ0FBQztJQUU1QixNQUFNLG9CQUFvQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ3JCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENB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T0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUNyRCx1REFBc0IsRUFDdEIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQ3RELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2Uuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcclxuaW1wb3J0IHsgZ2V0UmVwb3NpdG9yeVRva2VuIH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgRGF0YVNvdXJjZSwgUmVwb3NpdG9yeSB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBGb3JiaWRkZW5FeGNlcHRpb24gfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU2VydmljZSB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVR5cGUgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VTdGF0dXMgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXN0YXR1cy5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVmZXJlbmNlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVGFnIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS10YWcuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyaW5nU2VydmljZSB9IGZyb20gJy4uL2RvY3VtZW50LW51bWJlcmluZy9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEpzb25TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vanNvbi1zY2hlbWEvanNvbi1zY2hlbWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93RW5naW5lU2VydmljZSB9IGZyb20gJy4uL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFV1aWRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvdXVpZC1yZXNvbHZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vdXBkYXRlLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vY3JlYXRlLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuXHJcbmRlc2NyaWJlKCdDb3JyZXNwb25kZW5jZVNlcnZpY2UnLCAoKSA9PiB7XHJcbiAgbGV0IHNlcnZpY2U6IENvcnJlc3BvbmRlbmNlU2VydmljZTtcclxuICBsZXQgbnVtYmVyaW5nU2VydmljZTogRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlO1xyXG4gIGxldCBjb3JyZXNwb25kZW5jZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2U+O1xyXG4gIGxldCByZXZpc2lvblJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZXZpc2lvbj47XHJcbiAgbGV0IHRlc3RpbmdNb2R1bGU6IFRlc3RpbmdNb2R1bGU7XHJcbiAgbGV0IF9kYXRhU291cmNlOiBEYXRhU291cmNlO1xyXG5cclxuICBjb25zdCBjcmVhdGVNb2NrUmVwb3NpdG9yeSA9ICgpID0+ICh7XHJcbiAgICBmaW5kOiBqZXN0LmZuKCksXHJcbiAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICBjcmVhdGU6IGplc3QuZm4oKSxcclxuICAgIHNhdmU6IGplc3QuZm4oKSxcclxuICAgIHVwZGF0ZTogamVzdC5mbigpLFxyXG4gICAgZGVsZXRlOiBqZXN0LmZuKCksXHJcbiAgICBzb2Z0RGVsZXRlOiBqZXN0LmZuKCksXHJcbiAgICBjcmVhdGVRdWVyeUJ1aWxkZXI6IGplc3QuZm4oKCkgPT4gKHtcclxuICAgICAgbGVmdEpvaW5BbmRTZWxlY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICB3aGVyZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIGFuZFdoZXJlOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgb3JkZXJCeTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIHNraXA6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICB0YWtlOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgZ2V0T25lOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXHJcbiAgICAgIGdldE1hbnk6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSksXHJcbiAgICAgIGdldE1hbnlBbmRDb3VudDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFtbXSwgMF0pLFxyXG4gICAgfSkpLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBtb2NrRGF0YVNvdXJjZSA9IHtcclxuICAgIGNyZWF0ZVF1ZXJ5UnVubmVyOiBqZXN0LmZuKCgpID0+ICh7XHJcbiAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcclxuICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxyXG4gICAgICAgIHNhdmU6IGplc3QuZm4oKSxcclxuICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgIH0sXHJcbiAgICB9KSksXHJcbiAgICBnZXRSZXBvc2l0b3J5OiBqZXN0LmZuKCgpID0+IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCkpLFxyXG4gICAgbWFuYWdlcjoge1xyXG4gICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xyXG4gICAgdGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XHJcbiAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlU2VydmljZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2UpLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVR5cGUpLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VSZWZlcmVuY2UpLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUYWcpLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oT3JnYW5pemF0aW9uKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmVjaXBpZW50KSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHtcclxuICAgICAgICAgICAgZ2VuZXJhdGVOZXh0TnVtYmVyOiBqZXN0LmZuKCksXHJcbiAgICAgICAgICAgIHVwZGF0ZU51bWJlckZvckRyYWZ0OiBqZXN0LmZuKCksXHJcbiAgICAgICAgICAgIHByZXZpZXdOZXh0TnVtYmVyOiBqZXN0LmZuKCksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogSnNvblNjaGVtYVNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZTogeyB2YWxpZGF0ZTogamVzdC5mbigpIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBXb3JrZmxvd0VuZ2luZVNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZTogeyBjcmVhdGVJbnN0YW5jZTogamVzdC5mbigpIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBVc2VyU2VydmljZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB7XHJcbiAgICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICAgICAgZ2V0VXNlclBlcm1pc3Npb25zOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IERhdGFTb3VyY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja0RhdGFTb3VyY2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBTZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgaW5kZXhEb2N1bWVudDogamVzdC5mbigpIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBGaWxlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZTogeyBjb21taXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSkgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IFV1aWRSZXNvbHZlclNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZToge1xyXG4gICAgICAgICAgICByZXNvbHZlUHJvamVjdElkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMSksXHJcbiAgICAgICAgICAgIHJlc29sdmVPcmdhbml6YXRpb25JZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZTogeyBzZW5kOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KS5jb21waWxlKCk7XHJcblxyXG4gICAgc2VydmljZSA9IHRlc3RpbmdNb2R1bGUuZ2V0PENvcnJlc3BvbmRlbmNlU2VydmljZT4oQ29ycmVzcG9uZGVuY2VTZXJ2aWNlKTtcclxuICAgIG51bWJlcmluZ1NlcnZpY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxEb2N1bWVudE51bWJlcmluZ1NlcnZpY2U+KFxyXG4gICAgICBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2VcclxuICAgICk7XHJcbiAgICBjb3JyZXNwb25kZW5jZVJlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlPj4oXHJcbiAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZSlcclxuICAgICk7XHJcbiAgICByZXZpc2lvblJlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+PihcclxuICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmV2aXNpb24pXHJcbiAgICApO1xyXG4gICAgX2RhdGFTb3VyY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxEYXRhU291cmNlPihEYXRhU291cmNlKTtcclxuICB9KTtcclxuXHJcbiAgaXQoJ3Nob3VsZCBiZSBkZWZpbmVkJywgKCkgPT4ge1xyXG4gICAgZXhwZWN0KHNlcnZpY2UpLnRvQmVEZWZpbmVkKCk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCd1cGRhdGUnLCAoKSA9PiB7XHJcbiAgICBpdCgnc2hvdWxkIGFsbG93IG5vbi1kcmFmdCB1cGRhdGUgZm9yIG9yZy1hZG1pbisgcGVybWlzc2lvbnMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDEsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDEsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiAyMyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDIzLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdTVUJPV04nLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgKHVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKFtcclxuICAgICAgICAnY29ycmVzcG9uZGVuY2UuY2FuY2VsJyxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBqZXN0LnNweU9uKGNvcnJlc3BvbmRlbmNlUmVwbywgJ2ZpbmRPbmUnKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgcHVibGljSWQ6ICdjb3JyLXV1aWQtMScsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdDT1JSLTAwMScsXHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICByZXZpc2lvbnM6IFtdLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgYXdhaXQgZXhwZWN0KFxyXG4gICAgICAgIHNlcnZpY2UudXBkYXRlKDEsIHsgc3ViamVjdDogJ1VwZGF0ZWQgU3ViamVjdCcgfSwgbW9ja1VzZXIpXHJcbiAgICAgICkucmVzb2x2ZXMudG9CZURlZmluZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1kcmFmdCB1cGRhdGUgZm9yIG5vbi1hZG1pbiBwZXJtaXNzaW9ucycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMixcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDEsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMixcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDIzLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihyZXZpc2lvblJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja1JldmlzaW9uIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbik7XHJcblxyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMjMsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ1NVQk9XTicsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxVc2VyU2VydmljZT4oVXNlclNlcnZpY2UpO1xyXG4gICAgICAodXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoW1xyXG4gICAgICAgICdjb3JyZXNwb25kZW5jZS5lZGl0JyxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBhd2FpdCBleHBlY3QoXHJcbiAgICAgICAgc2VydmljZS51cGRhdGUoMiwgeyBzdWJqZWN0OiAnU2hvdWxkIEZhaWwnIH0sIG1vY2tVc2VyKVxyXG4gICAgICApLnJlamVjdHMudG9UaHJvdyhGb3JiaWRkZW5FeGNlcHRpb24pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBOT1QgcmVnZW5lcmF0ZSBudW1iZXIgaWYgY3JpdGljYWwgZmllbGRzIHVuY2hhbmdlZCcsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7IGlkOiAxLCBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogNSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiAyLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogMyxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnT0xELU5VTScsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgcmVjaXBpZW50VHlwZTogJ1RPJywgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDk5IH1dLFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKGNvcnJlc3BvbmRlbmNlUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrQ29yciBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGNvbnN0IHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogMyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgcmVnZW5lcmF0ZSBudW1iZXIgaWYgUHJvamVjdCBJRCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHsgaWQ6IDEsIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDEsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiA1LFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IG1vY2tDb3JyID0ge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogMixcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ09MRC1OVU0nLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHJlY2lwaWVudFR5cGU6ICdUTycsIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiA5OSB9XSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja0NvcnIgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICBjb25zdCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHByb2plY3RJZDogMixcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIpO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS51cGRhdGUoMSwgdXBkYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QoXHJcbiAgICAgICAgbnVtYmVyaW5nU2VydmljZS51cGRhdGVOdW1iZXJGb3JEcmFmdCBhcyBqZXN0Lk1vY2tcclxuICAgICAgKS50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHJlZ2VuZXJhdGUgbnVtYmVyIGlmIERvY3VtZW50IFR5cGUgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7IGlkOiAxLCBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogNSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihyZXZpc2lvblJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja1JldmlzaW9uIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbik7XHJcblxyXG4gICAgICBjb25zdCBtb2NrQ29yciA9IHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwcm9qZWN0SWQ6IDEsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IDIsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiAzLFxyXG4gICAgICAgIG9yaWdpbmF0b3JJZDogMTAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdPTEQtTlVNJyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyByZWNpcGllbnRUeXBlOiAnVE8nLCByZWNpcGllbnRPcmdhbml6YXRpb25JZDogOTkgfV0sXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24oY29ycmVzcG9uZGVuY2VSZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tDb3JyIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgY29uc3QgdXBkYXRlRHRvOiBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICB0eXBlSWQ6IDk5OSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICAodHlwZVJlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogOTk5LFxyXG4gICAgICAgIHR5cGVDb2RlOiAnTkVXLVRZUEUnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCByZWdlbmVyYXRlIG51bWJlciBpZiBSZWNpcGllbnQgT3JnYW5pemF0aW9uIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBpZDogMSwgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDUsXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiAyLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogMyxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnT0xELU5VTScsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgcmVjaXBpZW50VHlwZTogJ1RPJywgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDk5IH1dLFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKGNvcnJlc3BvbmRlbmNlUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrQ29yciBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIC8vIEFjY2VzcyBEYXRhU291cmNlIG1hbmFnZXIgZm9yIG1vY2tpbmdcclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogODgsXHJcbiAgICAgICAgb3JnYW5pemF0aW9uQ29kZTogJ05FVy1PUkcnLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgT3JnYW5pemF0aW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgdHlwZTogJ1RPJywgb3JnYW5pemF0aW9uSWQ6IDg4IH1dLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS51cGRhdGUoMSwgdXBkYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QoXHJcbiAgICAgICAgbnVtYmVyaW5nU2VydmljZS51cGRhdGVOdW1iZXJGb3JEcmFmdCBhcyBqZXN0Lk1vY2tcclxuICAgICAgKS50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2NyZWF0ZScsICgpID0+IHtcclxuICAgIGl0KCdzaG91bGQgYWxsb3cgc3lzdGVtLm1hbmFnZV9hbGwgdXNlciB3aXRob3V0IHByaW1hcnlPcmdhbml6YXRpb25JZCB3aGVuIG9yaWdpbmF0b3JJZCBpcyBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IG51bGwsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6ICdvcmlnaW5hdG9yLXV1aWQnLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IG9yZ2FuaXphdGlvbklkOiAncmVjaXBpZW50LXV1aWQnLCB0eXBlOiAnVE8nIH1dLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxVc2VyU2VydmljZT4oVXNlclNlcnZpY2UpO1xyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXNlclNlcnZpY2UuZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogbnVsbCxcclxuICAgICAgfSk7XHJcbiAgICAgICh1c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnMgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAgJ3N5c3RlbS5tYW5hZ2VfYWxsJyxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbihcclxuICAgICAgICAodmFsdWU6IG51bWJlciB8IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnb3JpZ2luYXRvci11dWlkJykgcmV0dXJuIDEwO1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAncmVjaXBpZW50LXV1aWQnKSByZXR1cm4gMjA7XHJcbiAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAodHlwZVJlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICB0eXBlQ29kZTogJ0xUUicsXHJcbiAgICAgIH0pO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdEUkFGVCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKG51bWJlcmluZ1NlcnZpY2UuZ2VuZXJhdGVOZXh0TnVtYmVyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIG51bWJlcjogJ0RPQy0wMDEnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAsIG9yZ2FuaXphdGlvbkNvZGU6ICdPUkcnIH0pXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAyMCwgb3JnYW5pemF0aW9uQ29kZTogJ1JFQycgfSk7XHJcblxyXG4gICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHtcclxuICAgICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcclxuICAgICAgICBtYW5hZ2VyOiB7XHJcbiAgICAgICAgICBjcmVhdGU6IGplc3QuZm4oXHJcbiAgICAgICAgICAgIChfZW50aXR5OiB1bmtub3duLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gcGF5bG9hZFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHNhdmU6IGplc3RcclxuICAgICAgICAgICAgLmZuKClcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiA5OTksIHB1YmxpY0lkOiAnY29yci11dWlkJyB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwMDAgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShbXSksXHJcbiAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIChtb2NrRGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lciBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShcclxuICAgICAgICBxdWVyeVJ1bm5lclxyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5jcmVhdGUoY3JlYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QocXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlLFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgb3JpZ2luYXRvcklkOiAxMCB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV2aXNpb25MYWJlbCB0byBcIkFcIiBmb3IgUkZBIHR5cGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDEsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHByb2plY3RJZDogJ3Byb2plY3QtdXVpZCcsXHJcbiAgICAgICAgdHlwZUlkOiAxLFxyXG4gICAgICAgIHN1YmplY3Q6ICdUZXN0IFN1YmplY3QnLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IG9yZ2FuaXphdGlvbklkOiAncmVjaXBpZW50LXV1aWQnLCB0eXBlOiAnVE8nIH1dLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgdHlwZVJlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVR5cGUpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHN0YXR1c1JlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB1dWlkUmVzb2x2ZXIgPVxyXG4gICAgICAgIHRlc3RpbmdNb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xyXG5cclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMTAwKTtcclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgyMCk7XHJcblxyXG4gICAgICAodHlwZVJlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICB0eXBlQ29kZTogJ1JGQScsXHJcbiAgICAgIH0pO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdEUkFGVCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKG51bWJlcmluZ1NlcnZpY2UuZ2VuZXJhdGVOZXh0TnVtYmVyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIG51bWJlcjogJ0RPQy0wMDEnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAsIG9yZ2FuaXphdGlvbkNvZGU6ICdPUkcnIH0pXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAyMCwgb3JnYW5pemF0aW9uQ29kZTogJ1JFQycgfSk7XHJcblxyXG4gICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHtcclxuICAgICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcclxuICAgICAgICBtYW5hZ2VyOiB7XHJcbiAgICAgICAgICBjcmVhdGU6IGplc3QuZm4oXHJcbiAgICAgICAgICAgIChfZW50aXR5OiB1bmtub3duLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gcGF5bG9hZFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHNhdmU6IGplc3RcclxuICAgICAgICAgICAgLmZuKClcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiA5OTksIHB1YmxpY0lkOiAnY29yci11dWlkJyB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwMDAgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShbXSksXHJcbiAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIChtb2NrRGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lciBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShcclxuICAgICAgICBxdWVyeVJ1bm5lclxyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5jcmVhdGUoY3JlYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QocXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXHJcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyByZXZpc2lvbkxhYmVsOiAnQScgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgc2V0IHJldmlzaW9uTGFiZWwgdG8gXCJBXCIgZm9yIFJGSSB0eXBlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdXVpZFJlc29sdmVyID1cclxuICAgICAgICB0ZXN0aW5nTW9kdWxlLmdldDxVdWlkUmVzb2x2ZXJTZXJ2aWNlPihVdWlkUmVzb2x2ZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDEwMCk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMjApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdSRkknLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgcmV2aXNpb25MYWJlbDogJ0EnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNldCByZXZpc2lvbkxhYmVsIHRvIG51bGwgZm9yIExFVFRFUiB0eXBlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdXVpZFJlc29sdmVyID1cclxuICAgICAgICB0ZXN0aW5nTW9kdWxlLmdldDxVdWlkUmVzb2x2ZXJTZXJ2aWNlPihVdWlkUmVzb2x2ZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDEwMCk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMjApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdMRVRURVInLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgcmV2aXNpb25MYWJlbDogdW5kZWZpbmVkIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNldCByZXZpc2lvbkxhYmVsIHRvIHVuZGVmaW5lZCBmb3IgTUVNTyB0eXBlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdXVpZFJlc29sdmVyID1cclxuICAgICAgICB0ZXN0aW5nTW9kdWxlLmdldDxVdWlkUmVzb2x2ZXJTZXJ2aWNlPihVdWlkUmVzb2x2ZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDEwMCk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMjApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdNRU1PJyxcclxuICAgICAgfSk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ0RSQUZUJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAobnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgbnVtYmVyOiAnRE9DLTAwMScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMCwgb3JnYW5pemF0aW9uQ29kZTogJ09SRycgfSlcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDIwLCBvcmdhbml6YXRpb25Db2RlOiAnUkVDJyB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0ge1xyXG4gICAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcmVsZWFzZTogamVzdC5mbigpLFxyXG4gICAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICAgIGNyZWF0ZTogamVzdC5mbihcclxuICAgICAgICAgICAgKF9lbnRpdHk6IHVua25vd24sIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBwYXlsb2FkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2F2ZTogamVzdFxyXG4gICAgICAgICAgICAuZm4oKVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDk5OSwgcHVibGljSWQ6ICdjb3JyLXV1aWQnIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAwMCB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKSxcclxuICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgKG1vY2tEYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKFxyXG4gICAgICAgIHF1ZXJ5UnVubmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHJldmlzaW9uTGFiZWw6IHVuZGVmaW5lZCB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn0pO1xyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076.map new file mode 100644 index 0000000..6aa93b9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/correspondenceservicespec_dd65cc9106ac238963ddf5ec24c97076.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\r\nimport { getRepositoryToken } from '@nestjs/typeorm';\r\nimport { DataSource, Repository } from 'typeorm';\r\nimport { ForbiddenException } from '@nestjs/common';\r\nimport { CorrespondenceService } from './correspondence.service';\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { User } from '../user/entities/user.entity';\r\n\r\ndescribe('CorrespondenceService', () => {\r\n let service: CorrespondenceService;\r\n let numberingService: DocumentNumberingService;\r\n let correspondenceRepo: Repository;\r\n let revisionRepo: Repository;\r\n let testingModule: TestingModule;\r\n let _dataSource: DataSource;\r\n\r\n const createMockRepository = () => ({\r\n find: jest.fn(),\r\n findOne: jest.fn(),\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n update: jest.fn(),\r\n delete: jest.fn(),\r\n softDelete: jest.fn(),\r\n createQueryBuilder: jest.fn(() => ({\r\n leftJoinAndSelect: jest.fn().mockReturnThis(),\r\n where: jest.fn().mockReturnThis(),\r\n andWhere: jest.fn().mockReturnThis(),\r\n orderBy: jest.fn().mockReturnThis(),\r\n skip: jest.fn().mockReturnThis(),\r\n take: jest.fn().mockReturnThis(),\r\n getOne: jest.fn().mockResolvedValue(null),\r\n getMany: jest.fn().mockResolvedValue([]),\r\n getManyAndCount: jest.fn().mockResolvedValue([[], 0]),\r\n })),\r\n });\r\n\r\n const mockDataSource = {\r\n createQueryRunner: jest.fn(() => ({\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n findOne: jest.fn(),\r\n },\r\n })),\r\n getRepository: jest.fn(() => createMockRepository()),\r\n manager: {\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n beforeEach(async () => {\r\n testingModule = await Test.createTestingModule({\r\n providers: [\r\n CorrespondenceService,\r\n {\r\n provide: getRepositoryToken(Correspondence),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevision),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceType),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceStatus),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceReference),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceTag),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(Organization),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRecipient),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: DocumentNumberingService,\r\n useValue: {\r\n generateNextNumber: jest.fn(),\r\n updateNumberForDraft: jest.fn(),\r\n previewNextNumber: jest.fn(),\r\n },\r\n },\r\n {\r\n provide: JsonSchemaService,\r\n useValue: { validate: jest.fn() },\r\n },\r\n {\r\n provide: WorkflowEngineService,\r\n useValue: { createInstance: jest.fn() },\r\n },\r\n {\r\n provide: UserService,\r\n useValue: {\r\n findOne: jest.fn(),\r\n getUserPermissions: jest.fn().mockResolvedValue([]),\r\n },\r\n },\r\n {\r\n provide: DataSource,\r\n useValue: mockDataSource,\r\n },\r\n {\r\n provide: SearchService,\r\n useValue: { indexDocument: jest.fn() },\r\n },\r\n {\r\n provide: FileStorageService,\r\n useValue: { commit: jest.fn().mockResolvedValue([]) },\r\n },\r\n {\r\n provide: UuidResolverService,\r\n useValue: {\r\n resolveProjectId: jest.fn().mockResolvedValue(1),\r\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\r\n },\r\n },\r\n {\r\n provide: NotificationService,\r\n useValue: { send: jest.fn().mockResolvedValue(undefined) },\r\n },\r\n ],\r\n }).compile();\r\n\r\n service = testingModule.get(CorrespondenceService);\r\n numberingService = testingModule.get(\r\n DocumentNumberingService\r\n );\r\n correspondenceRepo = testingModule.get>(\r\n getRepositoryToken(Correspondence)\r\n );\r\n revisionRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceRevision)\r\n );\r\n _dataSource = testingModule.get(DataSource);\r\n });\r\n\r\n it('should be defined', () => {\r\n expect(service).toBeDefined();\r\n });\r\n\r\n describe('update', () => {\r\n it('should allow non-draft update for org-admin+ permissions', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.cancel',\r\n ]);\r\n\r\n jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({\r\n id: 1,\r\n publicId: 'corr-uuid-1',\r\n correspondenceNumber: 'CORR-001',\r\n projectId: 1,\r\n createdAt: new Date(),\r\n revisions: [],\r\n } as unknown as Correspondence);\r\n\r\n await expect(\r\n service.update(1, { subject: 'Updated Subject' }, mockUser)\r\n ).resolves.toBeDefined();\r\n });\r\n\r\n it('should reject non-draft update for non-admin permissions', async () => {\r\n const mockUser = {\r\n user_id: 2,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 101,\r\n correspondenceId: 2,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.edit',\r\n ]);\r\n\r\n await expect(\r\n service.update(2, { subject: 'Should Fail' }, mockUser)\r\n ).rejects.toThrow(ForbiddenException);\r\n });\r\n\r\n it('should NOT regenerate number if critical fields unchanged', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 1,\r\n disciplineId: 3,\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Project ID changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 2,\r\n };\r\n\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(2);\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Document Type changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n typeId: 999,\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 999,\r\n typeCode: 'NEW-TYPE',\r\n });\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Recipient Organization changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n // Access DataSource manager for mocking\r\n mockDataSource.manager.findOne.mockResolvedValue({\r\n id: 88,\r\n organizationCode: 'NEW-ORG',\r\n } as unknown as Organization);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n recipients: [{ type: 'TO', organizationId: 88 }],\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n });\r\n\r\n describe('create', () => {\r\n it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n originatorId: 'originator-uuid',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const userService = testingModule.get(UserService);\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (userService.findOne as jest.Mock).mockResolvedValue({\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n });\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'system.manage_all',\r\n ]);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockImplementation(\r\n (value: number | string) => {\r\n if (value === 'originator-uuid') return 10;\r\n if (value === 'recipient-uuid') return 20;\r\n return 0;\r\n }\r\n );\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LTR',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n Correspondence,\r\n expect.objectContaining({ originatorId: 10 })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFA type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFA',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFI type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFI',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to null for LETTER type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LETTER',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to undefined for MEMO type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'MEMO',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1 new file mode 100644 index 0000000..767aae8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1 @@ -0,0 +1,47 @@ +0e0c0bc2d8479de6b3790451b006cf97 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const migration_controller_1 = require("./migration.controller"); +const migration_service_1 = require("./migration.service"); +describe('MigrationController', () => { + let controller; + let service; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + controllers: [migration_controller_1.MigrationController], + providers: [ + { + provide: migration_service_1.MigrationService, + useValue: { + importCorrespondence: jest + .fn() + .mockResolvedValue({ message: 'Success' }), + }, + }, + ], + }).compile(); + controller = module.get(migration_controller_1.MigrationController); + service = module.get(migration_service_1.MigrationService); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + it('should call importCorrespondence on service', async () => { + const dto = { + document_number: 'DOC-001', + subject: 'Legacy Record', + category: 'Correspondence', + source_file_path: '/staging_ai/test.pdf', + migrated_by: 'SYSTEM_IMPORT', + batch_id: 'batch1', + project_id: 1, + }; + const idempotencyKey = 'key123'; + const user = { userId: 5 }; + const result = await controller.importCorrespondence(dto, idempotencyKey, user); + expect(result).toEqual({ message: 'Success' }); + expect(service.importCorrespondence).toHaveBeenCalledWith(dto, idempotencyKey, 5); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uY29udHJvbGxlci5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELGlFQUE2RDtBQUM3RCwyREFBdUQ7QUFHdkQsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxJQUFJLFVBQStCLENBQUM7SUFDcEMsSUFBSSxPQUF5QixDQUFDO0lBRTlCLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixNQUFNLE1BQU0sR0FBa0IsTUFBTSxjQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDM0QsV0FBVyxFQUFFLENBQUMsMENBQW1CLENBQUM7WUFDbEMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxvQ0FBZ0I7b0JBQ3pCLFFBQVEsRUFBRTt3QkFDUixvQkFBb0IsRUFBRSxJQUFJOzZCQUN2QixFQUFFLEVBQUU7NkJBQ0osaUJBQWlCLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7cUJBQzdDO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBc0IsMENBQW1CLENBQUMsQ0FBQztRQUNsRSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsb0NBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNELE1BQU0sR0FBRyxHQUE0QjtZQUNuQyxlQUFlLEVBQUUsU0FBUztZQUMxQixPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxXQUFXLEVBQUUsZUFBZTtZQUM1QixRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsQ0FBQztTQUNkLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsb0JBQW9CLENBQ2xELEdBQUcsRUFDSCxjQUFjLEVBQ2QsSUFBSSxDQUNMLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUN2RCxHQUFHLEVBQ0gsY0FBYyxFQUNkLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXG1pZ3JhdGlvbi5jb250cm9sbGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBNaWdyYXRpb25Db250cm9sbGVyIH0gZnJvbSAnLi9taWdyYXRpb24uY29udHJvbGxlcic7XG5pbXBvcnQgeyBNaWdyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9taWdyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5kZXNjcmliZSgnTWlncmF0aW9uQ29udHJvbGxlcicsICgpID0+IHtcbiAgbGV0IGNvbnRyb2xsZXI6IE1pZ3JhdGlvbkNvbnRyb2xsZXI7XG4gIGxldCBzZXJ2aWNlOiBNaWdyYXRpb25TZXJ2aWNlO1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW01pZ3JhdGlvbkNvbnRyb2xsZXJdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNaWdyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBpbXBvcnRDb3JyZXNwb25kZW5jZTogamVzdFxuICAgICAgICAgICAgICAuZm4oKVxuICAgICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoeyBtZXNzYWdlOiAnU3VjY2VzcycgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uQ29udHJvbGxlcj4oTWlncmF0aW9uQ29udHJvbGxlcik7XG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uU2VydmljZT4oTWlncmF0aW9uU2VydmljZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3QoY29udHJvbGxlcikudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjYWxsIGltcG9ydENvcnJlc3BvbmRlbmNlIG9uIHNlcnZpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byA9IHtcbiAgICAgIGRvY3VtZW50X251bWJlcjogJ0RPQy0wMDEnLFxuICAgICAgc3ViamVjdDogJ0xlZ2FjeSBSZWNvcmQnLFxuICAgICAgY2F0ZWdvcnk6ICdDb3JyZXNwb25kZW5jZScsXG4gICAgICBzb3VyY2VfZmlsZV9wYXRoOiAnL3N0YWdpbmdfYWkvdGVzdC5wZGYnLFxuICAgICAgbWlncmF0ZWRfYnk6ICdTWVNURU1fSU1QT1JUJyxcbiAgICAgIGJhdGNoX2lkOiAnYmF0Y2gxJyxcbiAgICAgIHByb2plY3RfaWQ6IDEsXG4gICAgfTtcblxuICAgIGNvbnN0IGlkZW1wb3RlbmN5S2V5ID0gJ2tleTEyMyc7XG4gICAgY29uc3QgdXNlciA9IHsgdXNlcklkOiA1IH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgICAgZHRvLFxuICAgICAgaWRlbXBvdGVuY3lLZXksXG4gICAgICB1c2VyXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgbWVzc2FnZTogJ1N1Y2Nlc3MnIH0pO1xuICAgIGV4cGVjdChzZXJ2aWNlLmltcG9ydENvcnJlc3BvbmRlbmNlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGR0byxcbiAgICAgIGlkZW1wb3RlbmN5S2V5LFxuICAgICAgNVxuICAgICk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1.map new file mode 100644 index 0000000..a7763e2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/dd/migrationcontrollerspec_dd4c82decb258b970afd93c4a7440fc1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,iEAA6D;AAC7D,2DAAuD;AAGvD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,UAA+B,CAAC;IACpC,IAAI,OAAyB,CAAC;IAE9B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,0CAAmB,CAAC;YAClC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,oCAAgB;oBACzB,QAAQ,EAAE;wBACR,oBAAoB,EAAE,IAAI;6BACvB,EAAE,EAAE;6BACJ,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;qBAC7C;iBACF;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAsB,0CAAmB,CAAC,CAAC;QAClE,OAAO,GAAG,MAAM,CAAC,GAAG,CAAmB,oCAAgB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,GAAG,GAA4B;YACnC,eAAe,EAAE,SAAS;YAC1B,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,gBAAgB;YAC1B,gBAAgB,EAAE,sBAAsB;YACxC,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,MAAM,cAAc,GAAG,QAAQ,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAClD,GAAG,EACH,cAAc,EACd,IAAI,CACL,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CACvD,GAAG,EACH,cAAc,EACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { MigrationController } from './migration.controller';\nimport { MigrationService } from './migration.service';\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\n\ndescribe('MigrationController', () => {\n let controller: MigrationController;\n let service: MigrationService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [MigrationController],\n providers: [\n {\n provide: MigrationService,\n useValue: {\n importCorrespondence: jest\n .fn()\n .mockResolvedValue({ message: 'Success' }),\n },\n },\n ],\n }).compile();\n\n controller = module.get(MigrationController);\n service = module.get(MigrationService);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n it('should call importCorrespondence on service', async () => {\n const dto: ImportCorrespondenceDto = {\n document_number: 'DOC-001',\n subject: 'Legacy Record',\n category: 'Correspondence',\n source_file_path: '/staging_ai/test.pdf',\n migrated_by: 'SYSTEM_IMPORT',\n batch_id: 'batch1',\n project_id: 1,\n };\n\n const idempotencyKey = 'key123';\n const user = { userId: 5 };\n\n const result = await controller.importCorrespondence(\n dto,\n idempotencyKey,\n user\n );\n expect(result).toEqual({ message: 'Success' });\n expect(service.importCorrespondence).toHaveBeenCalledWith(\n dto,\n idempotencyKey,\n 5\n );\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc new file mode 100644 index 0000000..f137df5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc @@ -0,0 +1,148 @@ +82efdf74334317d54a482bf60927f289 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FormatService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_format_entity_1 = require("../entities/document-number-format.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +const correspondence_type_entity_1 = require("../../correspondence/entities/correspondence-type.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const discipline_entity_1 = require("../../master/entities/discipline.entity"); +let FormatService = class FormatService { + constructor(formatRepo, projectRepo, typeRepo, orgRepo, disciplineRepo) { + this.formatRepo = formatRepo; + this.projectRepo = projectRepo; + this.typeRepo = typeRepo; + this.orgRepo = orgRepo; + this.disciplineRepo = disciplineRepo; + } + async format(options) { + const { template, isDefault } = await this.resolveFormatAndScope(options); + const currentYear = options.year || new Date().getFullYear(); + const tokens = await this.resolveTokens(options, currentYear); + const previewNumber = this.replaceTokens(template, tokens, options.sequence); + return { previewNumber, isDefault }; + } + // --- Helpers --- + async resolveFormatAndScope(options) { + // 1. Specific Format + const specificFormat = await this.formatRepo.findOne({ + where: { + projectId: options.projectId, + correspondenceTypeId: options.correspondenceTypeId, + }, + }); + if (specificFormat) + return { + template: specificFormat.formatTemplate, + resetSequenceYearly: specificFormat.resetSequenceYearly, + isDefault: false, + }; + // 2. Default Format + const defaultFormat = await this.formatRepo.findOne({ + where: { projectId: options.projectId, correspondenceTypeId: (0, typeorm_2.IsNull)() }, + }); + if (defaultFormat) + return { + template: defaultFormat.formatTemplate, + resetSequenceYearly: defaultFormat.resetSequenceYearly, + isDefault: true, + }; + // 3. Fallback + return { + template: '{ORG}-{RECIPIENT}-{SEQ:4}/{YEAR:BE}', + resetSequenceYearly: true, + isDefault: true, + }; + } + async resolveTokens(options, year) { + const [project, type, recipientCode, disciplineCode, orgCode] = await Promise.all([ + this.projectRepo.findOne({ + where: { id: options.projectId }, + select: ['projectCode'], + }), + this.typeRepo.findOne({ + where: { id: options.correspondenceTypeId }, + select: ['typeCode'], + }), + this.resolveRecipientCode(options.recipientOrganizationId), + this.resolveDisciplineCode(options.disciplineId), + this.resolveOrgCode(options.originatorOrganizationId), + ]); + return { + '{PROJECT}': project?.projectCode || 'PROJ', + '{TYPE}': type?.typeCode || 'DOC', + '{ORG}': orgCode, + '{RECIPIENT}': recipientCode, + '{DISCIPLINE}': disciplineCode, + '{YEAR}': year.toString(), + '{YEAR:BE}': (year + 543).toString(), + '{REV}': '0', + }; + } + replaceTokens(template, tokens, sequence) { + let result = template; + for (const [key, value] of Object.entries(tokens)) { + result = result.replace(new RegExp(key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), value); + } + const seqMatch = result.match(/{SEQ:(\d+)}/); + if (seqMatch) { + const padding = Number(seqMatch[1]); + result = result.replace(seqMatch[0], sequence.toString().padStart(padding, '0')); + } + return result; + } + async resolveRecipientCode(recipientId) { + if (!recipientId) + return 'GEN'; + const org = await this.orgRepo.findOne({ + where: { id: recipientId }, + select: ['organizationCode'], + }); + return org ? org.organizationCode : 'GEN'; + } + async resolveOrgCode(orgId) { + if (!orgId) + return 'GEN'; + const org = await this.orgRepo.findOne({ + where: { id: orgId }, + select: ['organizationCode'], + }); + return org ? org.organizationCode : 'GEN'; + } + async resolveDisciplineCode(disciplineId) { + if (!disciplineId) + return 'GEN'; + const discipline = await this.disciplineRepo.findOne({ + where: { id: disciplineId }, + select: ['disciplineCode'], + }); + return discipline ? discipline.disciplineCode : 'GEN'; + } +}; +exports.FormatService = FormatService; +exports.FormatService = FormatService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_format_entity_1.DocumentNumberFormat)), + __param(1, (0, typeorm_1.InjectRepository)(project_entity_1.Project)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(organization_entity_1.Organization)), + __param(4, (0, typeorm_1.InjectRepository)(discipline_entity_1.Discipline)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object]) +], FormatService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZm9ybWF0LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1Qyw2Q0FBbUQ7QUFDbkQscUNBQTZDO0FBQzdDLDZGQUFpRjtBQUNqRiwwRUFBZ0U7QUFDaEUseUdBQThGO0FBQzlGLHlGQUErRTtBQUMvRSwrRUFBcUU7QUFvQjlELElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFDeEIsWUFFVSxVQUE0QyxFQUU1QyxXQUFnQyxFQUVoQyxRQUF3QyxFQUV4QyxPQUFpQyxFQUVqQyxjQUFzQztRQVJ0QyxlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUU1QyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFFaEMsYUFBUSxHQUFSLFFBQVEsQ0FBZ0M7UUFFeEMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFFakMsbUJBQWMsR0FBZCxjQUFjLENBQXdCO0lBQzdDLENBQUM7SUFFSixLQUFLLENBQUMsTUFBTSxDQUNWLE9BQXNCO1FBRXRCLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdEMsUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLENBQUMsUUFBUSxDQUNqQixDQUFDO1FBQ0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0JBQWtCO0lBRVYsS0FBSyxD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QUFDO1FBQ0gsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsWUFBcUI7UUFDdkQsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ25ELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUU7WUFDM0IsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN4RCxDQUFDO0NBQ0YsQ0FBQTtBQXJKWSxzQ0FBYTt3QkFBYixhQUFhO0lBRHpCLElBQUEsbUJBQVUsR0FBRTtJQUdSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxvREFBb0IsQ0FBQyxDQUFBO0lBRXRDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyx3QkFBTyxDQUFDLENBQUE7SUFFekIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLCtDQUFrQixDQUFDLENBQUE7SUFFcEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLGtDQUFZLENBQUMsQ0FBQTtJQUU5QixXQUFBLElBQUEsMEJBQWdCLEVBQUMsOEJBQVUsQ0FBQyxDQUFBO3lEQVBULG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVULG9CQUFVLG9CQUFWLG9CQUFVLG9EQUViLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVYLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVILG9CQUFVLG9CQUFWLG9CQUFVO0dBWHpCLGFBQWEsQ0FxSnpCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGZvcm1hdC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5LCBJc051bGwgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJGb3JtYXQgfSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZm9ybWF0LmVudGl0eSc7XHJcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi4vLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdHlwZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IERpc2NpcGxpbmUgfSBmcm9tICcuLi8uLi9tYXN0ZXIvZW50aXRpZXMvZGlzY2lwbGluZS5lbnRpdHknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPcHRpb25zIHtcclxuICBwcm9qZWN0SWQ6IG51bWJlcjtcclxuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xyXG4gIHN1YlR5cGVJZD86IG51bWJlcjtcclxuICByZmFUeXBlSWQ/OiBudW1iZXI7XHJcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xyXG4gIHNlcXVlbmNlOiBudW1iZXI7XHJcbiAgcmVzZXRTY29wZTogc3RyaW5nO1xyXG4gIHllYXI/OiBudW1iZXI7XHJcbiAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBudW1iZXI7XHJcbiAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVjb2RlZFRva2VucyB7XHJcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBGb3JtYXRTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyRm9ybWF0KVxyXG4gICAgcHJpdmF0ZSBmb3JtYXRSZXBvOiBSZXBvc2l0b3J5PERvY3VtZW50TnVtYmVyRm9ybWF0PixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFByb2plY3QpXHJcbiAgICBwcml2YXRlIHByb2plY3RSZXBvOiBSZXBvc2l0b3J5PFByb2plY3Q+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgcHJpdmF0ZSB0eXBlUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoT3JnYW5pemF0aW9uKVxyXG4gICAgcHJpdmF0ZSBvcmdSZXBvOiBSZXBvc2l0b3J5PE9yZ2FuaXphdGlvbj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEaXNjaXBsaW5lKVxyXG4gICAgcHJpdmF0ZSBkaXNjaXBsaW5lUmVwbzogUmVwb3NpdG9yeTxEaXNjaXBsaW5lPlxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgZm9ybWF0KFxyXG4gICAgb3B0aW9uczogRm9ybWF0T3B0aW9uc1xyXG4gICk6IFByb21pc2U8eyBwcmV2aWV3TnVtYmVyOiBzdHJpbmc7IGlzRGVmYXVsdDogYm9vbGVhbiB9PiB7XHJcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBpc0RlZmF1bHQgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZUZvcm1hdEFuZFNjb3BlKG9wdGlvbnMpO1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBvcHRpb25zLnllYXIgfHwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5yZXNvbHZlVG9rZW5zKG9wdGlvbnMsIGN1cnJlbnRZZWFyKTtcclxuXHJcbiAgICBjb25zdCBwcmV2aWV3TnVtYmVyID0gdGhpcy5yZXBsYWNlVG9rZW5zKFxyXG4gICAgICB0ZW1wbGF0ZSxcclxuICAgICAgdG9rZW5zLFxyXG4gICAgICBvcHRpb25zLnNlcXVlbmNlXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHsgcHJldmlld051bWJlciwgaXNEZWZhdWx0IH07XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gSGVscGVycyAtLS1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRm9ybWF0QW5kU2NvcGUob3B0aW9uczogRm9ybWF0T3B0aW9ucyk6IFByb21pc2U8e1xyXG4gICAgdGVtcGxhdGU6IHN0cmluZztcclxuICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IGJvb2xlYW47XHJcbiAgICBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgfT4ge1xyXG4gICAgLy8gMS4gU3BlY2lmaWMgRm9ybWF0XHJcbiAgICBjb25zdCBzcGVjaWZpY0Zvcm1hdCA9IGF3YWl0IHRoaXMuZm9ybWF0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbnMucHJvamVjdElkLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBvcHRpb25zLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoc3BlY2lmaWNGb3JtYXQpXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdGVtcGxhdGU6IHNwZWNpZmljRm9ybWF0LmZvcm1hdFRlbXBsYXRlLFxyXG4gICAgICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IHNwZWNpZmljRm9ybWF0LnJlc2V0U2VxdWVuY2VZZWFybHksXHJcbiAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAvLyAyLiBEZWZhdWx0IEZvcm1hdFxyXG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IGF3YWl0IHRoaXMuZm9ybWF0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcHJvamVjdElkOiBvcHRpb25zLnByb2plY3RJZCwgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IElzTnVsbCgpIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChkZWZhdWx0Rm9ybWF0KVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRlbXBsYXRlOiBkZWZhdWx0Rm9ybWF0LmZvcm1hdFRlbXBsYXRlLFxyXG4gICAgICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IGRlZmF1bHRGb3JtYXQucmVzZXRTZXF1ZW5jZVllYXJseSxcclxuICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgLy8gMy4gRmFsbGJhY2tcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRlbXBsYXRlOiAne09SR30te1JFQ0lQSUVOVH0te1NFUTo0fS97WUVBUjpCRX0nLFxyXG4gICAgICByZXNldFNlcXVlbmNlWWVhcmx5OiB0cnVlLFxyXG4gICAgICBpc0RlZmF1bHQ6IHRydWUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVG9rZW5zKFxyXG4gICAgb3B0aW9uczogRm9ybWF0T3B0aW9ucyxcclxuICAgIHllYXI6IG51bWJlclxyXG4gICk6IFByb21pc2U8RGVjb2RlZFRva2Vucz4ge1xyXG4gICAgY29uc3QgW3Byb2plY3QsIHR5cGUsIHJlY2lwaWVudENvZGUsIGRpc2NpcGxpbmVDb2RlLCBvcmdDb2RlXSA9XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICB0aGlzLnByb2plY3RSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IG9wdGlvbnMucHJvamVjdElkIH0sXHJcbiAgICAgICAgICBzZWxlY3Q6IFsncHJvamVjdENvZGUnXSxcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLnR5cGVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IG9wdGlvbnMuY29ycmVzcG9uZGVuY2VUeXBlSWQgfSxcclxuICAgICAgICAgIHNlbGVjdDogWyd0eXBlQ29kZSddLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVzb2x2ZVJlY2lwaWVudENvZGUob3B0aW9ucy5yZWNpcGllbnRPcmdhbml6YXRpb25JZCksXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlRGlzY2lwbGluZUNvZGUob3B0aW9ucy5kaXNjaXBsaW5lSWQpLFxyXG4gICAgICAgIHRoaXMucmVzb2x2ZU9yZ0NvZGUob3B0aW9ucy5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQpLFxyXG4gICAgICBdKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAne1BST0pFQ1R9JzogcHJvamVjdD8ucHJvamVjdENvZGUgfHwgJ1BST0onLFxyXG4gICAgICAne1RZUEV9JzogdHlwZT8udHlwZUNvZGUgfHwgJ0RPQycsXHJcbiAgICAgICd7T1JHfSc6IG9yZ0NvZGUsXHJcbiAgICAgICd7UkVDSVBJRU5UfSc6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICd7RElTQ0lQTElORX0nOiBkaXNjaXBsaW5lQ29kZSxcclxuICAgICAgJ3tZRUFSfSc6IHllYXIudG9TdHJpbmcoKSxcclxuICAgICAgJ3tZRUFSOkJFfSc6ICh5ZWFyICsgNTQzKS50b1N0cmluZygpLFxyXG4gICAgICAne1JFVn0nOiAnMCcsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXBsYWNlVG9rZW5zKFxyXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcclxuICAgIHRva2VuczogRGVjb2RlZFRva2VucyxcclxuICAgIHNlcXVlbmNlOiBudW1iZXJcclxuICApOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModG9rZW5zKSkge1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShcclxuICAgICAgICBuZXcgUmVnRXhwKGtleS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpLFxyXG4gICAgICAgIHZhbHVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZXFNYXRjaCA9IHJlc3VsdC5tYXRjaCgve1NFUTooXFxkKyl9Lyk7XHJcbiAgICBpZiAoc2VxTWF0Y2gpIHtcclxuICAgICAgY29uc3QgcGFkZGluZyA9IE51bWJlcihzZXFNYXRjaFsxXSk7XHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFxyXG4gICAgICAgIHNlcU1hdGNoWzBdLFxyXG4gICAgICAgIHNlcXVlbmNlLnRvU3RyaW5nKCkucGFkU3RhcnQocGFkZGluZywgJzAnKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlY2lwaWVudENvZGUocmVjaXBpZW50SWQ/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKCFyZWNpcGllbnRJZCkgcmV0dXJuICdHRU4nO1xyXG4gICAgY29uc3Qgb3JnID0gYXdhaXQgdGhpcy5vcmdSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZDogcmVjaXBpZW50SWQgfSxcclxuICAgICAgc2VsZWN0OiBbJ29yZ2FuaXphdGlvbkNvZGUnXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9yZyA/IG9yZy5vcmdhbml6YXRpb25Db2RlIDogJ0dFTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVPcmdDb2RlKG9yZ0lkPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghb3JnSWQpIHJldHVybiAnR0VOJztcclxuICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMub3JnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IG9yZ0lkIH0sXHJcbiAgICAgIHNlbGVjdDogWydvcmdhbml6YXRpb25Db2RlJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvcmcgPyBvcmcub3JnYW5pemF0aW9uQ29kZSA6ICdHRU4nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRGlzY2lwbGluZUNvZGUoZGlzY2lwbGluZUlkPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghZGlzY2lwbGluZUlkKSByZXR1cm4gJ0dFTic7XHJcbiAgICBjb25zdCBkaXNjaXBsaW5lID0gYXdhaXQgdGhpcy5kaXNjaXBsaW5lUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGRpc2NpcGxpbmVJZCB9LFxyXG4gICAgICBzZWxlY3Q6IFsnZGlzY2lwbGluZUNvZGUnXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NpcGxpbmUgPyBkaXNjaXBsaW5lLmRpc2NpcGxpbmVDb2RlIDogJ0dFTic7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc.map new file mode 100644 index 0000000..301dd7d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/formatservice_df5c1e9f93aedeb4ad8d2031d06cd2dc.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\format.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\format.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, IsNull } from 'typeorm';\r\nimport { DocumentNumberFormat } from '../entities/document-number-format.entity';\r\nimport { Project } from '../../project/entities/project.entity';\r\nimport { CorrespondenceType } from '../../correspondence/entities/correspondence-type.entity';\r\nimport { Organization } from '../../organization/entities/organization.entity';\r\nimport { Discipline } from '../../master/entities/discipline.entity';\r\n\r\nexport interface FormatOptions {\r\n projectId: number;\r\n correspondenceTypeId: number;\r\n subTypeId?: number;\r\n rfaTypeId?: number;\r\n disciplineId?: number;\r\n sequence: number;\r\n resetScope: string;\r\n year?: number;\r\n originatorOrganizationId: number;\r\n recipientOrganizationId?: number;\r\n}\r\n\r\nexport interface DecodedTokens {\r\n [key: string]: string;\r\n}\r\n\r\n@Injectable()\r\nexport class FormatService {\r\n constructor(\r\n @InjectRepository(DocumentNumberFormat)\r\n private formatRepo: Repository,\r\n @InjectRepository(Project)\r\n private projectRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(Organization)\r\n private orgRepo: Repository,\r\n @InjectRepository(Discipline)\r\n private disciplineRepo: Repository\r\n ) {}\r\n\r\n async format(\r\n options: FormatOptions\r\n ): Promise<{ previewNumber: string; isDefault: boolean }> {\r\n const { template, isDefault } = await this.resolveFormatAndScope(options);\r\n const currentYear = options.year || new Date().getFullYear();\r\n const tokens = await this.resolveTokens(options, currentYear);\r\n\r\n const previewNumber = this.replaceTokens(\r\n template,\r\n tokens,\r\n options.sequence\r\n );\r\n return { previewNumber, isDefault };\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n private async resolveFormatAndScope(options: FormatOptions): Promise<{\r\n template: string;\r\n resetSequenceYearly: boolean;\r\n isDefault: boolean;\r\n }> {\r\n // 1. Specific Format\r\n const specificFormat = await this.formatRepo.findOne({\r\n where: {\r\n projectId: options.projectId,\r\n correspondenceTypeId: options.correspondenceTypeId,\r\n },\r\n });\r\n if (specificFormat)\r\n return {\r\n template: specificFormat.formatTemplate,\r\n resetSequenceYearly: specificFormat.resetSequenceYearly,\r\n isDefault: false,\r\n };\r\n\r\n // 2. Default Format\r\n const defaultFormat = await this.formatRepo.findOne({\r\n where: { projectId: options.projectId, correspondenceTypeId: IsNull() },\r\n });\r\n if (defaultFormat)\r\n return {\r\n template: defaultFormat.formatTemplate,\r\n resetSequenceYearly: defaultFormat.resetSequenceYearly,\r\n isDefault: true,\r\n };\r\n\r\n // 3. Fallback\r\n return {\r\n template: '{ORG}-{RECIPIENT}-{SEQ:4}/{YEAR:BE}',\r\n resetSequenceYearly: true,\r\n isDefault: true,\r\n };\r\n }\r\n\r\n private async resolveTokens(\r\n options: FormatOptions,\r\n year: number\r\n ): Promise {\r\n const [project, type, recipientCode, disciplineCode, orgCode] =\r\n await Promise.all([\r\n this.projectRepo.findOne({\r\n where: { id: options.projectId },\r\n select: ['projectCode'],\r\n }),\r\n this.typeRepo.findOne({\r\n where: { id: options.correspondenceTypeId },\r\n select: ['typeCode'],\r\n }),\r\n this.resolveRecipientCode(options.recipientOrganizationId),\r\n this.resolveDisciplineCode(options.disciplineId),\r\n this.resolveOrgCode(options.originatorOrganizationId),\r\n ]);\r\n\r\n return {\r\n '{PROJECT}': project?.projectCode || 'PROJ',\r\n '{TYPE}': type?.typeCode || 'DOC',\r\n '{ORG}': orgCode,\r\n '{RECIPIENT}': recipientCode,\r\n '{DISCIPLINE}': disciplineCode,\r\n '{YEAR}': year.toString(),\r\n '{YEAR:BE}': (year + 543).toString(),\r\n '{REV}': '0',\r\n };\r\n }\r\n\r\n private replaceTokens(\r\n template: string,\r\n tokens: DecodedTokens,\r\n sequence: number\r\n ): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(tokens)) {\r\n result = result.replace(\r\n new RegExp(key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'),\r\n value\r\n );\r\n }\r\n const seqMatch = result.match(/{SEQ:(\\d+)}/);\r\n if (seqMatch) {\r\n const padding = Number(seqMatch[1]);\r\n result = result.replace(\r\n seqMatch[0],\r\n sequence.toString().padStart(padding, '0')\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n private async resolveRecipientCode(recipientId?: number): Promise {\r\n if (!recipientId) return 'GEN';\r\n const org = await this.orgRepo.findOne({\r\n where: { id: recipientId },\r\n select: ['organizationCode'],\r\n });\r\n return org ? org.organizationCode : 'GEN';\r\n }\r\n\r\n private async resolveOrgCode(orgId?: number): Promise {\r\n if (!orgId) return 'GEN';\r\n const org = await this.orgRepo.findOne({\r\n where: { id: orgId },\r\n select: ['organizationCode'],\r\n });\r\n return org ? org.organizationCode : 'GEN';\r\n }\r\n\r\n private async resolveDisciplineCode(disciplineId?: number): Promise {\r\n if (!disciplineId) return 'GEN';\r\n const discipline = await this.disciplineRepo.findOne({\r\n where: { id: disciplineId },\r\n select: ['disciplineCode'],\r\n });\r\n return discipline ? discipline.disciplineCode : 'GEN';\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5 new file mode 100644 index 0000000..ab93957 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5 @@ -0,0 +1,78 @@ +13340187d49b680ecdfe6abb0e074407 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Notification = exports.NotificationType = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +var NotificationType; +(function (NotificationType) { + NotificationType["EMAIL"] = "EMAIL"; + NotificationType["LINE"] = "LINE"; + NotificationType["SYSTEM"] = "SYSTEM"; +})(NotificationType || (exports.NotificationType = NotificationType = {})); +let Notification = class Notification extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Notification = Notification; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Notification.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id' }), + __metadata("design:type", Number) +], Notification.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 255 }), + __metadata("design:type", String) +], Notification.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text' }), + __metadata("design:type", String) +], Notification.prototype, "message", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'notification_type', + type: 'enum', + enum: NotificationType, + }), + __metadata("design:type", String) +], Notification.prototype, "notificationType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_read', default: false }), + __metadata("design:type", Boolean) +], Notification.prototype, "isRead", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'entity_type', length: 50, nullable: true }), + __metadata("design:type", String) +], Notification.prototype, "entityType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'entity_id', nullable: true }), + __metadata("design:type", Number) +], Notification.prototype, "entityId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Notification.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], Notification.prototype, "user", void 0); +exports.Notification = Notification = __decorate([ + (0, typeorm_1.Entity)('notifications') +], Notification); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxlbnRpdGllc1xcbm90aWZpY2F0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLGlFQUF1RDtBQUN2RCxnRkFBMkU7QUFDM0UseURBQTRDO0FBRTVDLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQixtQ0FBZSxDQUFBO0lBQ2YsaUNBQWEsQ0FBQTtJQUNiLHFDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUkzQjtBQUdNLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxpQ0FBYztDQXdDL0MsQ0FBQTtBQXhDWSxvQ0FBWTtBQUd2QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzt3Q0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs0Q0FDWjtBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7MkNBQ1Q7QUFHZjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7NkNBQ1I7QUFPakI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGdCQUFnQjtLQUN2QixDQUFDOztzREFDa0M7QUFHcEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7NENBQzNCO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Z0RBQ3hDO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzhDQUM1QjtBQUtsQjtJQUZDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDeEMsSUFBQSx1QkFBYSxHQUFFO2tEQUNKLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQU1qQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztrREFDekIsa0JBQUksb0JBQUosa0JBQUk7MENBQUM7dUJBdkNELFlBQVk7SUFEeEIsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQztHQUNYLFlBQVksQ0F3Q3hCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG5vdGlmaWNhdGlvblxcZW50aXRpZXNcXG5vdGlmaWNhdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgUHJpbWFyeUNvbHVtbiwgLy8g4pyFIFtGaXhdIOC5gOC4nuC4tOC5iOC4oSBJbXBvcnQg4LiZ4Li14LmJXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5leHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcbiAgRU1BSUwgPSAnRU1BSUwnLFxuICBMSU5FID0gJ0xJTkUnLFxuICBTWVNURU0gPSAnU1lTVEVNJyxcbn1cblxuQEVudGl0eSgnbm90aWZpY2F0aW9ucycpXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcgfSlcbiAgbWVzc2FnZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnbm90aWZpY2F0aW9uX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBOb3RpZmljYXRpb25UeXBlLFxuICB9KVxuICBub3RpZmljYXRpb25UeXBlITogTm90aWZpY2F0aW9uVHlwZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX3JlYWQnLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBpc1JlYWQhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW50aXR5X3R5cGUnLCBsZW5ndGg6IDUwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBlbnRpdHlUeXBlPzogc3RyaW5nOyAvLyBlLmcuLCAncmZhJywgJ2NpcmN1bGF0aW9uJywgJ2NvcnJlc3BvbmRlbmNlJ1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW50aXR5X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZW50aXR5SWQ/OiBudW1iZXI7XG5cbiAgLy8g4pyFIFtGaXhdIOC4o+C4p+C4oSBEZWNvcmF0b3Ig4LmE4Lin4LmJ4LiX4Li14LmI4LiZ4Li14LmI4LiX4Li14LmI4LmA4LiU4Li14Lii4LinICjguYDguJvguYfguJnguJfguLHguYnguIcgQ3JlYXRlRGF0ZSDguYHguKXguLAgUHJpbWFyeUNvbHVtbiDguKrguLPguKvguKPguLHguJogUGFydGl0aW9uKVxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBAUHJpbWFyeUNvbHVtbigpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXG4gIHVzZXIhOiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5.map new file mode 100644 index 0000000..a96695b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/notificationentity_e0b85313b8088d726a438ab9cc2f85a5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\entities\\notification.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,iEAAuD;AACvD,gFAA2E;AAC3E,yDAA4C;AAE5C,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,mCAAe,CAAA;IACf,iCAAa,CAAA;IACb,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,gCAAhB,gBAAgB,QAI3B;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,iCAAc;CAwC/C,CAAA;AAxCY,oCAAY;AAGvB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;wCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CACT;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACR;AAOjB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;KACvB,CAAC;;sDACkC;AAGpC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;4CAC3B;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACxC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC5B;AAKlB;IAFC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACxC,IAAA,uBAAa,GAAE;kDACJ,IAAI,oBAAJ,IAAI;+CAAC;AAMjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;0CAAC;uBAvCD,YAAY;IADxB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,YAAY,CAwCxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\entities\\notification.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n PrimaryColumn, // ✅ [Fix] เพิ่ม Import นี้\n} from 'typeorm';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\nexport enum NotificationType {\n EMAIL = 'EMAIL',\n LINE = 'LINE',\n SYSTEM = 'SYSTEM',\n}\n\n@Entity('notifications')\nexport class Notification extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'user_id' })\n userId!: number;\n\n @Column({ length: 255 })\n title!: string;\n\n @Column({ type: 'text' })\n message!: string;\n\n @Column({\n name: 'notification_type',\n type: 'enum',\n enum: NotificationType,\n })\n notificationType!: NotificationType;\n\n @Column({ name: 'is_read', default: false })\n isRead!: boolean;\n\n @Column({ name: 'entity_type', length: 50, nullable: true })\n entityType?: string; // e.g., 'rfa', 'circulation', 'correspondence'\n\n @Column({ name: 'entity_id', nullable: true })\n entityId?: number;\n\n // ✅ [Fix] รวม Decorator ไว้ที่นี่ที่เดียว (เป็นทั้ง CreateDate และ PrimaryColumn สำหรับ Partition)\n @CreateDateColumn({ name: 'created_at' })\n @PrimaryColumn()\n createdAt!: Date;\n\n // --- Relations ---\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'user_id' })\n user!: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317 new file mode 100644 index 0000000..63b0d67 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317 @@ -0,0 +1,65 @@ +5fe6685aed65a08e3734f479cb92fc03 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tag = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let Tag = class Tag { +}; +exports.Tag = Tag; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], Tag.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'tag_name', length: 100 }), + __metadata("design:type", String) +], Tag.prototype, "tagName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'color_code', length: 30, default: 'default' }), + __metadata("design:type", String) +], Tag.prototype, "colorCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_a = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _a : Object) +], Tag.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Tag.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Tag.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', type: 'int', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", Object) +], Tag.prototype, "deletedAt", void 0); +exports.Tag = Tag = __decorate([ + (0, typeorm_1.Entity)('tags'), + (0, typeorm_1.Unique)('ux_tag_project', ['projectId', 'tagName']) +], Tag); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcdGFnLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBVWlCO0FBQ2pCLDBFQUFnRTtBQUl6RCxJQUFNLEdBQUcsR0FBVCxNQUFNLEdBQUc7Q0FnQ2YsQ0FBQTtBQWhDWSxrQkFBRztBQUVkO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0JBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NDQUNsQztBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztvQ0FDekI7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOztzQ0FDNUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0NBQ2I7QUFLNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO29DQUFDO0FBR2xCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NDQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NDQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0NBQ2xDO0FBRzFCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7c0NBQ2pCO2NBL0JiLEdBQUc7SUFGZixJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDO0lBQ2QsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0dBQ3RDLEdBQUcsQ0FnQ2YiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcdGFnLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVudGl0eSxcclxuICBDb2x1bW4sXHJcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcclxuICBDcmVhdGVEYXRlQ29sdW1uLFxyXG4gIFVwZGF0ZURhdGVDb2x1bW4sXHJcbiAgRGVsZXRlRGF0ZUNvbHVtbixcclxuICBVbmlxdWUsXHJcbiAgTWFueVRvT25lLFxyXG4gIEpvaW5Db2x1bW4sXHJcbn0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcclxuXHJcbkBFbnRpdHkoJ3RhZ3MnKVxyXG5AVW5pcXVlKCd1eF90YWdfcHJvamVjdCcsIFsncHJvamVjdElkJywgJ3RhZ05hbWUnXSlcclxuZXhwb3J0IGNsYXNzIFRhZyB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCB0eXBlOiAnaW50JywgbnVsbGFibGU6IHRydWUgfSlcclxuICBwcm9qZWN0SWQhOiBudW1iZXIgfCBudWxsOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3RhZ19uYW1lJywgbGVuZ3RoOiAxMDAgfSlcclxuICB0YWdOYW1lITogc3RyaW5nOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbG9yX2NvZGUnLCBsZW5ndGg6IDMwLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSlcclxuICBjb2xvckNvZGUhOiBzdHJpbmc7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgZGVzY3JpcHRpb24hOiBzdHJpbmcgfCBudWxsOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICAvLyBSZWxhdGlvbnNcclxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcclxuICBwcm9qZWN0PzogUHJvamVjdDtcclxuXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIGNyZWF0ZWRCeSE6IG51bWJlciB8IG51bGw7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXHJcbiAgZGVsZXRlZEF0ITogRGF0ZSB8IG51bGw7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317.map new file mode 100644 index 0000000..6dabd4d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/tagentity_e084a246ab81ebbb0804752cd788d317.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\tag.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,0EAAgE;AAIzD,IAAM,GAAG,GAAT,MAAM,GAAG;CAgCf,CAAA;AAhCY,kBAAG;AAEd;IADC,IAAA,gCAAsB,GAAE;;+BACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAClC;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oCACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;;sCAC5C;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wCACb;AAK5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;oCAAC;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAClC;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;sCACjB;cA/Bb,GAAG;IAFf,IAAA,gBAAM,EAAC,MAAM,CAAC;IACd,IAAA,gBAAM,EAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;GACtC,GAAG,CAgCf","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\tag.entity.ts"],"sourcesContent":["import {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n Unique,\r\n ManyToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Project } from '../../project/entities/project.entity';\r\n\r\n@Entity('tags')\r\n@Unique('ux_tag_project', ['projectId', 'tagName'])\r\nexport class Tag {\r\n @PrimaryGeneratedColumn()\r\n id!: number; // เพิ่ม !\r\n\r\n @Column({ name: 'project_id', type: 'int', nullable: true })\r\n projectId!: number | null; // เพิ่ม !\r\n\r\n @Column({ name: 'tag_name', length: 100 })\r\n tagName!: string; // เพิ่ม !\r\n\r\n @Column({ name: 'color_code', length: 30, default: 'default' })\r\n colorCode!: string; // เพิ่ม !\r\n\r\n @Column({ type: 'text', nullable: true })\r\n description!: string | null; // เพิ่ม !\r\n\r\n // Relations\r\n @ManyToOne(() => Project)\r\n @JoinColumn({ name: 'project_id' })\r\n project?: Project;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date; // เพิ่ม !\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date; // เพิ่ม !\r\n\r\n @Column({ name: 'created_by', type: 'int', nullable: true })\r\n createdBy!: number | null; // เพิ่ม !\r\n\r\n @DeleteDateColumn({ name: 'deleted_at' })\r\n deletedAt!: Date | null; // เพิ่ม !\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a new file mode 100644 index 0000000..5899f63 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a @@ -0,0 +1,449 @@ +1a9b069726d4b7f21953a8159810d5a0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var DocumentNumberingService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberingService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const config_1 = require("@nestjs/config"); +const document_number_format_entity_1 = require("../entities/document-number-format.entity"); +const document_number_audit_entity_1 = require("../entities/document-number-audit.entity"); +const document_number_error_entity_1 = require("../entities/document-number-error.entity"); +// Services +const counter_service_1 = require("./counter.service"); +const reservation_service_1 = require("./reservation.service"); +const format_service_1 = require("./format.service"); +const document_numbering_lock_service_1 = require("./document-numbering-lock.service"); +const manual_override_service_1 = require("./manual-override.service"); +const metrics_service_1 = require("./metrics.service"); +const uuid_resolver_service_1 = require("../../../common/services/uuid-resolver.service"); +let DocumentNumberingService = DocumentNumberingService_1 = class DocumentNumberingService { + constructor(formatRepo, auditRepo, errorRepo, counterService, reservationService, formatService, lockService, configService, manualOverrideService, metricsService, entityManager, uuidResolver) { + this.formatRepo = formatRepo; + this.auditRepo = auditRepo; + this.errorRepo = errorRepo; + this.counterService = counterService; + this.reservationService = reservationService; + this.formatService = formatService; + this.lockService = lockService; + this.configService = configService; + this.manualOverrideService = manualOverrideService; + this.metricsService = metricsService; + this.entityManager = entityManager; + this.uuidResolver = uuidResolver; + this.logger = new common_1.Logger(DocumentNumberingService_1.name); + } + /** + * ADR-019: Public facade for controllers to resolve project/organization IDs + */ + async resolveIdForPreview(type, id) { + if (type === 'project') + return this.uuidResolver.resolveProjectId(id); + return this.uuidResolver.resolveOrganizationId(id); + } + async generateNextNumber(ctx) { + let lock = null; + try { + // 0. Check Idempotency (Ideally done in Guard/Middleware, but double check here if passed) + // Note: If idempotencyKey exists in ctx, check audit log for existing SUCCESS entry? + // Omitted for brevity as per spec usually handled by middleware or separate check. + const currentYear = new Date().getFullYear(); + const resetScope = `YEAR_${currentYear}`; + // 1. Prepare Counter Key + const key = { + projectId: ctx.projectId, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId || 0, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId || 0, + rfaTypeId: ctx.rfaTypeId || 0, + disciplineId: ctx.disciplineId || 0, + resetScope: resetScope, + }; + // 2. Acquire Redis Lock + try { + // Map CounterKeyDto to LockCounterKey (names slightly different or cast if same) + lock = await this.lockService.acquireLock({ + projectId: key.projectId, + originatorOrgId: key.originatorOrganizationId, + recipientOrgId: key.recipientOrganizationId, + correspondenceTypeId: key.correspondenceTypeId, + subTypeId: key.subTypeId, + rfaTypeId: key.rfaTypeId, + disciplineId: key.disciplineId, + resetScope: key.resetScope, + }); + } + catch (e) { + const errorMessage = e instanceof Error ? e.message : String(e); + this.logger.warn(`Failed to acquire Redis lock, falling back to DB lock only: ${errorMessage}`); + this.metricsService.lockFailures.inc({ + project_id: String(key.projectId), + }); + // Fallback: Proceed without Redlock, relying on CounterService DB optimistic lock + } + // 3. Increment Counter + const sequence = await this.counterService.incrementCounter(key); + // 4. Format Number + const { previewNumber: documentNumber } = await this.formatService.format({ + projectId: ctx.projectId, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId, + rfaTypeId: ctx.rfaTypeId, + disciplineId: ctx.disciplineId, + sequence: sequence, + resetScope: resetScope, + year: currentYear, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId, + }); + // 5. Audit Log + const audit = await this.logAudit({ + documentNumber, + counterKey: JSON.stringify(key), + templateUsed: 'DELEGATED_TO_FORMAT_SERVICE', + context: ctx, + isSuccess: true, + operation: 'GENERATE', + // metadata: { idempotencyKey: ctx.idempotencyKey } // If available + }); + this.metricsService.numbersGenerated.inc({ + project_id: String(ctx.projectId), + type_id: String(ctx.typeId), + }); + return { number: documentNumber, auditId: audit.id }; + } + catch (error) { + await this.logError(error, ctx, 'GENERATE'); + throw error; + } + finally { + if (lock) { + await this.lockService.releaseLock(lock); + } + } + } + async reserveNumber(dto, userId, ipAddress) { + try { + // Delegate completely to ReservationService + return await this.reservationService.reserve(dto, userId, ipAddress || '0.0.0.0', 'Unknown' // userAgent not passed in legacy call + ); + } + catch (error) { + this.logger.error('Reservation failed', error); + throw error; + } + } + async confirmReservation(dto, userId) { + return this.reservationService.confirm(dto, userId); + } + async cancelReservation(token, userId) { + return this.reservationService.cancel(token, userId); + } + async previewNumber(ctx) { + const currentYear = new Date().getFullYear(); + const resetScope = `YEAR_${currentYear}`; + const key = { + projectId: ctx.projectId, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId || 0, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId || 0, + rfaTypeId: ctx.rfaTypeId || 0, + disciplineId: ctx.disciplineId || 0, + resetScope: resetScope, + }; + const currentSeq = await this.counterService.getCurrentCounter(key); + const nextSequence = currentSeq + 1; + const { previewNumber, isDefault } = await this.formatService.format({ + projectId: ctx.projectId, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId, + rfaTypeId: ctx.rfaTypeId, + disciplineId: ctx.disciplineId, + sequence: nextSequence, + resetScope: resetScope, + year: currentYear, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId, + }); + return { previewNumber, nextSequence, isDefault }; + } + /** + * Generates a new number for a draft when its context changes. + */ + async updateNumberForDraft(currentNumber, oldCtx, newCtx) { + const result = await this.generateNextNumber(newCtx); + return result.number; + } + // --- Admin / Legacy --- + async getTemplates() { + return this.formatRepo.find({ + relations: ['project', 'correspondenceType'], + }); + } + async getTemplatesByProject(projectId) { + const internalId = await this.uuidResolver.resolveProjectId(projectId); + return this.formatRepo.find({ + where: { projectId: internalId }, + relations: ['project', 'correspondenceType'], + }); + } + async saveTemplate(dto) { + try { + this.logger.log(`Saving numbering template: ${JSON.stringify(dto)}`); + // Resolve project ID if it's a UUID/String + if (dto.projectId && typeof dto.projectId === 'string') { + dto.projectId = await this.uuidResolver.resolveProjectId(dto.projectId); + } + // Upsert logic: If no ID provided, check for existing template with same business key + if (!dto.id) { + const existing = await this.formatRepo.findOne({ + where: { + projectId: Number(dto.projectId), + correspondenceTypeId: dto.correspondenceTypeId + ? (0, typeorm_2.Equal)(dto.correspondenceTypeId) + : (0, typeorm_2.IsNull)(), + disciplineId: dto.disciplineId || 0, + }, + }); + if (existing) { + this.logger.log(`Found existing template ID: ${existing.id} for business key, updating instead of creating.`); + dto.id = existing.id; + } + } + const result = await this.formatRepo.save(dto); + this.logger.log(`Successfully saved template ID: ${result.id}`); + return result; + } + catch (e) { + this.logger.error(`Failed to save numbering template: ${e instanceof Error ? e.message : String(e)}`, e instanceof Error ? e.stack : undefined); + throw e; + } + } + async deleteTemplate(id) { + return this.formatRepo.delete(id); + } + async getAuditLogs(limit) { + return this.auditRepo.find({ take: limit, order: { createdAt: 'DESC' } }); + } + async getErrorLogs(limit) { + return this.errorRepo.find({ take: limit, order: { createdAt: 'DESC' } }); + } + async getSequences(projectId) { + await Promise.resolve(projectId); // satisfy unused + return []; + } + async setCounterValue(id, sequence) { + await Promise.resolve(id); // satisfy unused + await Promise.resolve(sequence); + throw new common_1.BadRequestException('Updating counter by single ID is not supported with composite keys. Use manualOverride.'); + } + async manualOverride(dto, userId) { + return this.manualOverrideService.applyOverride(dto, userId); + } + async voidAndReplace(dto) { + // 1. Find the audit log for this number to get context + const lastAudit = await this.auditRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + order: { createdAt: 'DESC' }, + }); + if (!lastAudit) { + // If not found in audit, we can't easily regenerate with same context unless passed in dto. + // For now, log a warning and return error or just log the void decision. + this.logger.warn(`Void request for unknown number: ${dto.documentNumber}`); + // Create a void audit anyway if possible? + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: {}, + templateUsed: 'VOID_UNKNOWN', + context: { userId: 0, ipAddress: '0.0.0.0' }, // System + isSuccess: true, + operation: 'VOID', + status: 'VOID', + newValue: 'VOIDED', + metadata: { reason: dto.reason }, + }); + return { status: 'VOIDED_UNKNOWN_CONTEXT' }; + } + // 2. Log VOID + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: lastAudit.counterKey, + templateUsed: lastAudit.templateUsed, + context: { userId: 0, ipAddress: '0.0.0.0' }, // TODO: Pass userId from controller + isSuccess: true, + operation: 'VOID', + status: 'VOID', + oldValue: dto.documentNumber, + newValue: 'VOIDED', + metadata: { reason: dto.reason, replace: dto.replace }, + }); + if (dto.replace) { + // 3. Generate Replacement + // Parse context from lastAudit.counterKey? + // GenerateNumberContext needs more than counterKey. + // But we can reconstruct it. + let context; + try { + const rawKey = lastAudit.counterKey; + const key = typeof rawKey === 'string' + ? JSON.parse(rawKey) + : rawKey; + context = { + projectId: Number(key.projectId), + typeId: Number(key.correspondenceTypeId), + subTypeId: Number(key.subTypeId), + rfaTypeId: Number(key.rfaTypeId), + disciplineId: Number(key.disciplineId), + originatorOrganizationId: Number(key.originatorOrganizationId) || 0, + recipientOrganizationId: Number(key.recipientOrganizationId) || 0, + userId: 0, // System replacement + }; + const next = await this.generateNextNumber(context); + return { + status: 'REPLACED', + oldNumber: dto.documentNumber, + newNumber: next.number, + }; + } + catch (e) { + this.logger.error(`Failed to replace number ${dto.documentNumber}`, e); + return { + status: 'VOIDED_REPLACE_FAILED', + error: e instanceof Error ? e.message : String(e), + }; + } + } + return { status: 'VOIDED' }; + } + async cancelNumber(dto) { + // Similar to VOID but status CANCELLED + const lastAudit = await this.auditRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + order: { createdAt: 'DESC' }, + }); + const contextKey = lastAudit?.counterKey; + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: contextKey || {}, + templateUsed: lastAudit?.templateUsed || 'CANCEL', + context: { + userId: 0, + ipAddress: '0.0.0.0', + projectId: dto.projectId || 0, + }, + isSuccess: true, + operation: 'CANCEL', + status: 'CANCELLED', + metadata: { reason: dto.reason }, + }); + return { status: 'CANCELLED' }; + } + async bulkImport(items) { + const results = { success: 0, failed: 0, errors: [] }; + // items expected to be ManualOverrideDto[] or similar + // Actually bulk import usually means "Here is a list of EXISTING numbers used in legacy system" + // So we should parse them and update counters if they are higher. + // Implementation: For each item, likely delegate to ManualOverrideService if it fits schema. + // Or if items is just a number of CSV rows? + // Assuming items is parsed CSV rows. + for (const item of items) { + try { + // Adapt item to ManualOverrideDto + /* + CSV columns: ProjectID, TypeID, OriginatorID, RecipientID, LastNumber + */ + if (item.newLastNumber && item.correspondenceTypeId) { + await this.manualOverrideService.applyOverride(item, 0); // 0 = System + results.success++; + } + } + catch (e) { + results.failed++; + results.errors.push(`Failed item ${JSON.stringify(item)}: ${e instanceof Error ? e.message : String(e)}`); + } + } + return results; + } + async logAudit(data) { + const audit = this.auditRepo.create({ + documentNumber: data.documentNumber, + counterKey: data.counterKey, + templateUsed: data.templateUsed, + isSuccess: data.isSuccess, + operation: data.operation, + status: data.status, + oldValue: data.oldValue, + newValue: data.newValue, + metadata: data.metadata, + userId: data.context.userId, + ipAddress: data.context.ipAddress, + }); + return this.auditRepo.save(audit); + } + mapErrorType(error) { + const name = error.name || ''; + const msg = error.message || ''; + if (name === 'ConflictException' || msg.includes('version')) + return 'VERSION_CONFLICT'; + if (msg.includes('lock') || msg.includes('timeout')) + return 'LOCK_TIMEOUT'; + if (msg.includes('Redis') || msg.includes('redis')) + return 'REDIS_ERROR'; + if (msg.includes('duplicate') || msg.includes('Duplicate')) + return 'DUPLICATE_NUMBER'; + if (msg.includes('validation') || msg.includes('Validation')) + return 'VALIDATION_ERROR'; + if (msg.includes('exhausted') || msg.includes('maximum')) + return 'SEQUENCE_EXHAUSTED'; + if (msg.includes('expired') || msg.includes('reservation')) + return 'RESERVATION_EXPIRED'; + if (msg.includes('database') || msg.includes('query')) + return 'DB_ERROR'; + return 'GENERATE_ERROR'; + } + async logError(error, ctx, operation) { + try { + const err = error instanceof Error ? error : new Error(String(error)); + const errEntity = this.errorRepo.create({ + errorMessage: err.message || 'Unknown Error', + errorType: this.mapErrorType(err), + contextData: { + ...(typeof ctx === 'object' && ctx !== null + ? ctx + : {}), + operation, + }, + }); + await this.errorRepo.save(errEntity); + } + catch (e) { + this.logger.error('Failed to log error to DB', e); + } + } +}; +exports.DocumentNumberingService = DocumentNumberingService; +exports.DocumentNumberingService = DocumentNumberingService = DocumentNumberingService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_format_entity_1.DocumentNumberFormat)), + __param(1, (0, typeorm_1.InjectRepository)(document_number_audit_entity_1.DocumentNumberAudit)), + __param(2, (0, typeorm_1.InjectRepository)(document_number_error_entity_1.DocumentNumberError)), + __param(10, (0, typeorm_1.InjectEntityManager)()), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _d : Object, typeof (_e = typeof reservation_service_1.ReservationService !== "undefined" && reservation_service_1.ReservationService) === "function" ? _e : Object, typeof (_f = typeof format_service_1.FormatService !== "undefined" && format_service_1.FormatService) === "function" ? _f : Object, typeof (_g = typeof document_numbering_lock_service_1.DocumentNumberingLockService !== "undefined" && document_numbering_lock_service_1.DocumentNumberingLockService) === "function" ? _g : Object, typeof (_h = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _h : Object, typeof (_j = typeof manual_override_service_1.ManualOverrideService !== "undefined" && manual_override_service_1.ManualOverrideService) === "function" ? _j : Object, typeof (_k = typeof metrics_service_1.MetricsService !== "undefined" && metrics_service_1.MetricsService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.EntityManager !== "undefined" && typeorm_2.EntityManager) === "function" ? _l : Object, typeof (_m = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _m : Object]) +], DocumentNumberingService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUU7QUFDekUsNkNBQXdFO0FBQ3hFLHFDQUFtRTtBQUNuRSwyQ0FBK0M7QUFFL0MsNkZBQWlGO0FBQ2pGLDJGQUErRTtBQUMvRSwyRkFBK0U7QUFFL0UsV0FBVztBQUNYLHVEQUFtRDtBQUNuRCwrREFBMkQ7QUFDM0QscURBQWlEO0FBQ2pELHVGQUFpRjtBQUNqRix1RUFBa0U7QUFDbEUsdURBQW1EO0FBY25ELDBGQUFxRjtBQUc5RSxJQUFNLHdCQUF3QixnQ0FBOUIsTUFBTSx3QkFBd0I7SUFHbkMsWUFFRSxVQUFvRCxFQUVwRCxTQUFrRCxFQUVsRCxTQUFrRCxFQUUxQyxjQUE4QixFQUM5QixrQkFBc0MsRUFDdEMsYUFBNEIsRUFDNUIsV0FBeUMsRUFDekMsYUFBNEIsRUFDNUIscUJBQTRDLEVBQzVDLGNBQThCLEVBRXRDLGFBQW9DLEVBQzVCLFlBQWlDO1FBZmpDLGVBQVUsR0FBVixVQUFVLENBQWtDO1FBRTVDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBRTFDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBRTFDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUU5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFuQjFCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQywwQkFBd0IsQ0FB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XFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGRvY3VtZW50LW51bWJlcmluZy5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSwgSW5qZWN0RW50aXR5TWFuYWdlciB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnksIEVudGl0eU1hbmFnZXIsIElzTnVsbCwgRXF1YWwgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcclxuXHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHknO1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eSc7XHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRXJyb3IgfSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZXJyb3IuZW50aXR5JztcclxuXHJcbi8vIFNlcnZpY2VzXHJcbmltcG9ydCB7IENvdW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi9jb3VudGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXNlcnZhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Jlc2VydmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UgfSBmcm9tICcuL2RvY3VtZW50LW51bWJlcmluZy1sb2NrLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYW51YWxPdmVycmlkZVNlcnZpY2UgfSBmcm9tICcuL21hbnVhbC1vdmVycmlkZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWV0cmljc1NlcnZpY2UgfSBmcm9tICcuL21ldHJpY3Muc2VydmljZSc7XHJcblxyXG4vLyBEVE9zXHJcbmltcG9ydCB7IENvdW50ZXJLZXlEdG8gfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcclxuaW1wb3J0IHsgR2VuZXJhdGVOdW1iZXJDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kb2N1bWVudC1udW1iZXJpbmcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBSZXNlcnZlTnVtYmVyRHRvLFxyXG4gIFJlc2VydmVOdW1iZXJSZXNwb25zZUR0byxcclxufSBmcm9tICcuLi9kdG8vcmVzZXJ2ZS1udW1iZXIuZHRvJztcclxuaW1wb3J0IHtcclxuICBDb25maXJtUmVzZXJ2YXRpb25EdG8sXHJcbiAgQ29uZmlybVJlc2VydmF0aW9uUmVzcG9uc2VEdG8sXHJcbn0gZnJvbSAnLi4vZHRvL2NvbmZpcm0tcmVzZXJ2YXRpb24uZHRvJztcclxuaW1wb3J0IHsgTWFudWFsT3ZlcnJpZGVEdG8gfSBmcm9tICcuLi9kdG8vbWFudWFsLW92ZXJyaWRlLmR0byc7XHJcbmltcG9ydCB7IFV1aWRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vc2VydmljZXMvdXVpZC1yZXNvbHZlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERvY3VtZW50TnVtYmVyaW5nU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKERvY3VtZW50TnVtYmVyaW5nU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckZvcm1hdClcclxuICAgIHByaXZhdGUgZm9ybWF0UmVwbzogUmVwb3NpdG9yeTxEb2N1bWVudE51bWJlckZvcm1hdD4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckF1ZGl0KVxyXG4gICAgcHJpdmF0ZSBhdWRpdFJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckVycm9yKVxyXG4gICAgcHJpdmF0ZSBlcnJvclJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJFcnJvcj4sXHJcblxyXG4gICAgcHJpdmF0ZSBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc2VydmF0aW9uU2VydmljZTogUmVzZXJ2YXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NrU2VydmljZTogRG9jdW1lbnROdW1iZXJpbmdMb2NrU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgbWFudWFsT3ZlcnJpZGVTZXJ2aWNlOiBNYW51YWxPdmVycmlkZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1ldHJpY3NTZXJ2aWNlOiBNZXRyaWNzU2VydmljZSxcclxuICAgIEBJbmplY3RFbnRpdHlNYW5hZ2VyKClcclxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcixcclxuICAgIHByaXZhdGUgdXVpZFJlc29sdmVyOiBVdWlkUmVzb2x2ZXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBBRFItMDE5OiBQdWJsaWMgZmFjYWRlIGZvciBjb250cm9sbGVycyB0byByZXNvbHZlIHByb2plY3Qvb3JnYW5pemF0aW9uIElEc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlc29sdmVJZEZvclByZXZpZXcoXHJcbiAgICB0eXBlOiAncHJvamVjdCcgfCAnb3JnYW5pemF0aW9uJyxcclxuICAgIGlkOiBudW1iZXIgfCBzdHJpbmdcclxuICApOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgaWYgKHR5cGUgPT09ICdwcm9qZWN0JykgcmV0dXJuIHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQoaWQpO1xyXG4gICAgcmV0dXJuIHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChpZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZW5lcmF0ZU5leHROdW1iZXIoXHJcbiAgICBjdHg6IEdlbmVyYXRlTnVtYmVyQ29udGV4dFxyXG4gICk6IFByb21pc2U8eyBudW1iZXI6IHN0cmluZzsgYXVkaXRJZDogbnVtYmVyIH0+IHtcclxuICAgIGxldCBsb2NrID0gbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIDAuIENoZWNrIElkZW1wb3RlbmN5IChJZGVhbGx5IGRvbmUgaW4gR3VhcmQvTWlkZGxld2FyZSwgYnV0IGRvdWJsZSBjaGVjayBoZXJlIGlmIHBhc3NlZClcclxuICAgICAgLy8gTm90ZTogSWYgaWRlbXBvdGVuY3lLZXkgZXhpc3RzIGluIGN0eCwgY2hlY2sgYXVkaXQgbG9nIGZvciBleGlzdGluZyBTVUNDRVNTIGVudHJ5P1xyXG4gICAgICAvLyBPbWl0dGVkIGZvciBicmV2aXR5IGFzIHBlciBzcGVjIHVzdWFsbHkgaGFuZGxlZCBieSBtaWRkbGV3YXJlIG9yIHNlcGFyYXRlIGNoZWNrLlxyXG5cclxuICAgICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgIGNvbnN0IHJlc2V0U2NvcGUgPSBgWUVBUl8ke2N1cnJlbnRZZWFyfWA7XHJcblxyXG4gICAgICAvLyAxLiBQcmVwYXJlIENvdW50ZXIgS2V5XHJcbiAgICAgIGNvbnN0IGtleTogQ291bnRlcktleUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IGN0eC5wcm9qZWN0SWQsXHJcbiAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdHgub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjdHgucmVjaXBpZW50T3JnYW5pemF0aW9uSWQgfHwgMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgICBzdWJUeXBlSWQ6IGN0eC5zdWJUeXBlSWQgfHwgMCxcclxuICAgICAgICByZmFUeXBlSWQ6IGN0eC5yZmFUeXBlSWQgfHwgMCxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IGN0eC5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgICByZXNldFNjb3BlOiByZXNldFNjb3BlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gMi4gQWNxdWlyZSBSZWRpcyBMb2NrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gTWFwIENvdW50ZXJLZXlEdG8gdG8gTG9ja0NvdW50ZXJLZXkgKG5hbWVzIHNsaWdodGx5IGRpZmZlcmVudCBvciBjYXN0IGlmIHNhbWUpXHJcbiAgICAgICAgbG9jayA9IGF3YWl0IHRoaXMubG9ja1NlcnZpY2UuYWNxdWlyZUxvY2soe1xyXG4gICAgICAgICAgcHJvamVjdElkOiBrZXkucHJvamVjdElkLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ0lkOiBrZXkub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnSWQ6IGtleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBrZXkuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBzdWJUeXBlSWQ6IGtleS5zdWJUeXBlSWQsXHJcbiAgICAgICAgICByZmFUeXBlSWQ6IGtleS5yZmFUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGtleS5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgICByZXNldFNjb3BlOiBrZXkucmVzZXRTY29wZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYEZhaWxlZCB0byBhY3F1aXJlIFJlZGlzIGxvY2ssIGZhbGxpbmcgYmFjayB0byBEQiBsb2NrIG9ubHk6ICR7ZXJyb3JNZXNzYWdlfWBcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWV0cmljc1NlcnZpY2UubG9ja0ZhaWx1cmVzLmluYyh7XHJcbiAgICAgICAgICBwcm9qZWN0X2lkOiBTdHJpbmcoa2V5LnByb2plY3RJZCksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gRmFsbGJhY2s6IFByb2NlZWQgd2l0aG91dCBSZWRsb2NrLCByZWx5aW5nIG9uIENvdW50ZXJTZXJ2aWNlIERCIG9wdGltaXN0aWMgbG9ja1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyAzLiBJbmNyZW1lbnQgQ291bnRlclxyXG4gICAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuaW5jcmVtZW50Q291bnRlcihrZXkpO1xyXG5cclxuICAgICAgLy8gNC4gRm9ybWF0IE51bWJlclxyXG4gICAgICBjb25zdCB7IHByZXZpZXdOdW1iZXI6IGRvY3VtZW50TnVtYmVyIH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb2plY3RJZDogY3R4LnByb2plY3RJZCxcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBjdHgudHlwZUlkLFxyXG4gICAgICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkLFxyXG4gICAgICAgICAgcmZhVHlwZUlkOiBjdHgucmZhVHlwZUlkLFxyXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiBjdHguZGlzY2lwbGluZUlkLFxyXG4gICAgICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlLFxyXG4gICAgICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgICAgICAgIHllYXI6IGN1cnJlbnRZZWFyLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdHgub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyA1LiBBdWRpdCBMb2dcclxuICAgICAgY29uc3QgYXVkaXQgPSBhd2FpdCB0aGlzLmxvZ0F1ZGl0KHtcclxuICAgICAgICBkb2N1bWVudE51bWJlcixcclxuICAgICAgICBjb3VudGVyS2V5OiBKU09OLnN0cmluZ2lmeShrZXkpLFxyXG4gICAgICAgIHRlbXBsYXRlVXNlZDogJ0RFTEVHQVRFRF9UT19GT1JNQVRfU0VSVklDRScsXHJcbiAgICAgICAgY29udGV4dDogY3R4LFxyXG4gICAgICAgIGlzU3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBvcGVyYXRpb246ICdHRU5FUkFURScsXHJcbiAgICAgICAgLy8gbWV0YWRhdGE6IHsgaWRlbXBvdGVuY3lLZXk6IGN0eC5pZGVtcG90ZW5jeUtleSB9IC8vIElmIGF2YWlsYWJsZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubWV0cmljc1NlcnZpY2UubnVtYmVyc0dlbmVyYXRlZC5pbmMoe1xyXG4gICAgICAgIHByb2plY3RfaWQ6IFN0cmluZyhjdHgucHJvamVjdElkKSxcclxuICAgICAgICB0eXBlX2lkOiBTdHJpbmcoY3R4LnR5cGVJZCksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHsgbnVtYmVyOiBkb2N1bWVudE51bWJlciwgYXVkaXRJZDogYXVkaXQuaWQgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nRXJyb3IoZXJyb3IsIGN0eCwgJ0dFTkVSQVRFJyk7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaWYgKGxvY2spIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvY2tTZXJ2aWNlLnJlbGVhc2VMb2NrKGxvY2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXNlcnZlTnVtYmVyKFxyXG4gICAgZHRvOiBSZXNlcnZlTnVtYmVyRHRvLFxyXG4gICAgdXNlcklkOiBudW1iZXIsXHJcbiAgICBpcEFkZHJlc3M/OiBzdHJpbmdcclxuICApOiBQcm9taXNlPFJlc2VydmVOdW1iZXJSZXNwb25zZUR0bz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRGVsZWdhdGUgY29tcGxldGVseSB0byBSZXNlcnZhdGlvblNlcnZpY2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzZXJ2YXRpb25TZXJ2aWNlLnJlc2VydmUoXHJcbiAgICAgICAgZHRvLFxyXG4gICAgICAgIHVzZXJJZCxcclxuICAgICAgICBpcEFkZHJlc3MgfHwgJzAuMC4wLjAnLFxyXG4gICAgICAgICdVbmtub3duJyAvLyB1c2VyQWdlbnQgbm90IHBhc3NlZCBpbiBsZWdhY3kgY2FsbFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1Jlc2VydmF0aW9uIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtUmVzZXJ2YXRpb24oXHJcbiAgICBkdG86IENvbmZpcm1SZXNlcnZhdGlvbkR0byxcclxuICAgIHVzZXJJZDogbnVtYmVyXHJcbiAgKTogUHJvbWlzZTxDb25maXJtUmVzZXJ2YXRpb25SZXNwb25zZUR0bz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzZXJ2YXRpb25TZXJ2aWNlLmNvbmZpcm0oZHRvLCB1c2VySWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsUmVzZXJ2YXRpb24odG9rZW46IHN0cmluZywgdXNlcklkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnJlc2VydmF0aW9uU2VydmljZS5jYW5jZWwodG9rZW4sIHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcmV2aWV3TnVtYmVyKGN0eDogR2VuZXJhdGVOdW1iZXJDb250ZXh0KTogUHJvbWlzZTx7XHJcbiAgICBwcmV2aWV3TnVtYmVyOiBzdHJpbmc7XHJcbiAgICBuZXh0U2VxdWVuY2U6IG51bWJlcjtcclxuICAgIGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICB9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IHJlc2V0U2NvcGUgPSBgWUVBUl8ke2N1cnJlbnRZZWFyfWA7XHJcblxyXG4gICAgY29uc3Qga2V5OiBDb3VudGVyS2V5RHRvID0ge1xyXG4gICAgICBwcm9qZWN0SWQ6IGN0eC5wcm9qZWN0SWQsXHJcbiAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogY3R4Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcclxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCB8fCAwLFxyXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkIHx8IDAsXHJcbiAgICAgIHJmYVR5cGVJZDogY3R4LnJmYVR5cGVJZCB8fCAwLFxyXG4gICAgICBkaXNjaXBsaW5lSWQ6IGN0eC5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY3VycmVudFNlcSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuZ2V0Q3VycmVudENvdW50ZXIoa2V5KTtcclxuICAgIGNvbnN0IG5leHRTZXF1ZW5jZSA9IGN1cnJlbnRTZXEgKyAxO1xyXG5cclxuICAgIGNvbnN0IHsgcHJldmlld051bWJlciwgaXNEZWZhdWx0IH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KHtcclxuICAgICAgcHJvamVjdElkOiBjdHgucHJvamVjdElkLFxyXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkLFxyXG4gICAgICByZmFUeXBlSWQ6IGN0eC5yZmFUeXBlSWQsXHJcbiAgICAgIGRpc2NpcGxpbmVJZDogY3R4LmRpc2NpcGxpbmVJZCxcclxuICAgICAgc2VxdWVuY2U6IG5leHRTZXF1ZW5jZSxcclxuICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgICAgeWVhcjogY3VycmVudFllYXIsXHJcbiAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogY3R4Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcclxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IHByZXZpZXdOdW1iZXIsIG5leHRTZXF1ZW5jZSwgaXNEZWZhdWx0IH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBuZXcgbnVtYmVyIGZvciBhIGRyYWZ0IHdoZW4gaXRzIGNvbnRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVOdW1iZXJGb3JEcmFmdChcclxuICAgIGN1cnJlbnROdW1iZXI6IHN0cmluZyxcclxuICAgIG9sZEN0eDogR2VuZXJhdGVOdW1iZXJDb250ZXh0LFxyXG4gICAgbmV3Q3R4OiBHZW5lcmF0ZU51bWJlckNvbnRleHRcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU5leHROdW1iZXIobmV3Q3R4KTtcclxuICAgIHJldHVybiByZXN1bHQubnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIEFkbWluIC8gTGVnYWN5IC0tLVxyXG5cclxuICBhc3luYyBnZXRUZW1wbGF0ZXMoKTogUHJvbWlzZTxEb2N1bWVudE51bWJlckZvcm1hdFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXBvLmZpbmQoe1xyXG4gICAgICByZWxhdGlvbnM6IFsncHJvamVjdCcsICdjb3JyZXNwb25kZW5jZVR5cGUnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGVtcGxhdGVzQnlQcm9qZWN0KFxyXG4gICAgcHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmdcclxuICApOiBQcm9taXNlPERvY3VtZW50TnVtYmVyRm9ybWF0W10+IHtcclxuICAgIGNvbnN0IGludGVybmFsSWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKHByb2plY3RJZCk7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBwcm9qZWN0SWQ6IGludGVybmFsSWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3Byb2plY3QnLCAnY29ycmVzcG9uZGVuY2VUeXBlJ10sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVUZW1wbGF0ZShcclxuICAgIGR0bzogUGFydGlhbDxEb2N1bWVudE51bWJlckZvcm1hdD4gJiB7IHByb2plY3RJZD86IG51bWJlciB8IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTxEb2N1bWVudE51bWJlckZvcm1hdD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKGBTYXZpbmcgbnVtYmVyaW5nIHRlbXBsYXRlOiAke0pTT04uc3RyaW5naWZ5KGR0byl9YCk7XHJcblxyXG4gICAgICAvLyBSZXNvbHZlIHByb2plY3QgSUQgaWYgaXQncyBhIFVVSUQvU3RyaW5nXHJcbiAgICAgIGlmIChkdG8ucHJvamVjdElkICYmIHR5cGVvZiBkdG8ucHJvamVjdElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGR0by5wcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKGR0by5wcm9qZWN0SWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcHNlcnQgbG9naWM6IElmIG5vIElEIHByb3ZpZGVkLCBjaGVjayBmb3IgZXhpc3RpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIGJ1c2luZXNzIGtleVxyXG4gICAgICBpZiAoIWR0by5pZCkge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5mb3JtYXRSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgICAgcHJvamVjdElkOiBOdW1iZXIoZHRvLnByb2plY3RJZCksXHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBkdG8uY29ycmVzcG9uZGVuY2VUeXBlSWRcclxuICAgICAgICAgICAgICA/IEVxdWFsKGR0by5jb3JyZXNwb25kZW5jZVR5cGVJZClcclxuICAgICAgICAgICAgICA6IElzTnVsbCgpLFxyXG4gICAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGR0by5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgICAgIGBGb3VuZCBleGlzdGluZyB0ZW1wbGF0ZSBJRDogJHtleGlzdGluZy5pZH0gZm9yIGJ1c2luZXNzIGtleSwgdXBkYXRpbmcgaW5zdGVhZCBvZiBjcmVhdGluZy5gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZHRvLmlkID0gZXhpc3RpbmcuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZvcm1hdFJlcG8uc2F2ZShkdG8pO1xyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFN1Y2Nlc3NmdWxseSBzYXZlZCB0ZW1wbGF0ZSBJRDogJHtyZXN1bHQuaWR9YCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBudW1iZXJpbmcgdGVtcGxhdGU6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXHJcbiAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yID8gZS5zdGFjayA6IHVuZGVmaW5lZFxyXG4gICAgICApO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlVGVtcGxhdGUoaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0UmVwby5kZWxldGUoaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QXVkaXRMb2dzKGxpbWl0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmF1ZGl0UmVwby5maW5kKHsgdGFrZTogbGltaXQsIG9yZGVyOiB7IGNyZWF0ZWRBdDogJ0RFU0MnIH0gfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcnJvckxvZ3MobGltaXQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JSZXBvLmZpbmQoeyB0YWtlOiBsaW1pdCwgb3JkZXI6IHsgY3JlYXRlZEF0OiAnREVTQycgfSB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFNlcXVlbmNlcyhwcm9qZWN0SWQ/OiBudW1iZXIpIHtcclxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShwcm9qZWN0SWQpOyAvLyBzYXRpc2Z5IHVudXNlZFxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0Q291bnRlclZhbHVlKGlkOiBudW1iZXIsIHNlcXVlbmNlOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShpZCk7IC8vIHNhdGlzZnkgdW51c2VkXHJcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoc2VxdWVuY2UpO1xyXG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICdVcGRhdGluZyBjb3VudGVyIGJ5IHNpbmdsZSBJRCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggY29tcG9zaXRlIGtleXMuIFVzZSBtYW51YWxPdmVycmlkZS4nXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWFudWFsT3ZlcnJpZGUoZHRvOiBNYW51YWxPdmVycmlkZUR0bywgdXNlcklkOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLm1hbnVhbE92ZXJyaWRlU2VydmljZS5hcHBseU92ZXJyaWRlKGR0bywgdXNlcklkKTtcclxuICB9XHJcbiAgYXN5bmMgdm9pZEFuZFJlcGxhY2UoZHRvOiB7XHJcbiAgICBkb2N1bWVudE51bWJlcjogc3RyaW5nO1xyXG4gICAgcmVhc29uOiBzdHJpbmc7XHJcbiAgICByZXBsYWNlOiBib29sZWFuO1xyXG4gIH0pIHtcclxuICAgIC8vIDEuIEZpbmQgdGhlIGF1ZGl0IGxvZyBmb3IgdGhpcyBudW1iZXIgdG8gZ2V0IGNvbnRleHRcclxuICAgIGNvbnN0IGxhc3RBdWRpdCA9IGF3YWl0IHRoaXMuYXVkaXRSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyIH0sXHJcbiAgICAgIG9yZGVyOiB7IGNyZWF0ZWRBdDogJ0RFU0MnIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWxhc3RBdWRpdCkge1xyXG4gICAgICAvLyBJZiBub3QgZm91bmQgaW4gYXVkaXQsIHdlIGNhbid0IGVhc2lseSByZWdlbmVyYXRlIHdpdGggc2FtZSBjb250ZXh0IHVubGVzcyBwYXNzZWQgaW4gZHRvLlxyXG4gICAgICAvLyBGb3Igbm93LCBsb2cgYSB3YXJuaW5nIGFuZCByZXR1cm4gZXJyb3Igb3IganVzdCBsb2cgdGhlIHZvaWQgZGVjaXNpb24uXHJcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgYFZvaWQgcmVxdWVzdCBmb3IgdW5rbm93biBudW1iZXI6ICR7ZHRvLmRvY3VtZW50TnVtYmVyfWBcclxuICAgICAgKTtcclxuICAgICAgLy8gQ3JlYXRlIGEgdm9pZCBhdWRpdCBhbnl3YXkgaWYgcG9zc2libGU/XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nQXVkaXQoe1xyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiBkdG8uZG9jdW1lbnROdW1iZXIsXHJcbiAgICAgICAgY291bnRlcktleToge30sXHJcbiAgICAgICAgdGVtcGxhdGVVc2VkOiAnVk9JRF9VTktOT1dOJyxcclxuICAgICAgICBjb250ZXh0OiB7IHVzZXJJZDogMCwgaXBBZGRyZXNzOiAnMC4wLjAuMCcgfSwgLy8gU3lzdGVtXHJcbiAgICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIG9wZXJhdGlvbjogJ1ZPSUQnLFxyXG4gICAgICAgIHN0YXR1czogJ1ZPSUQnLFxyXG4gICAgICAgIG5ld1ZhbHVlOiAnVk9JREVEJyxcclxuICAgICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24gfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB7IHN0YXR1czogJ1ZPSURFRF9VTktOT1dOX0NPTlRFWFQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gTG9nIFZPSURcclxuICAgIGF3YWl0IHRoaXMubG9nQXVkaXQoe1xyXG4gICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBjb3VudGVyS2V5OiBsYXN0QXVkaXQuY291bnRlcktleSxcclxuICAgICAgdGVtcGxhdGVVc2VkOiBsYXN0QXVkaXQudGVtcGxhdGVVc2VkLFxyXG4gICAgICBjb250ZXh0OiB7IHVzZXJJZDogMCwgaXBBZGRyZXNzOiAnMC4wLjAuMCcgfSwgLy8gVE9ETzogUGFzcyB1c2VySWQgZnJvbSBjb250cm9sbGVyXHJcbiAgICAgIGlzU3VjY2VzczogdHJ1ZSxcclxuICAgICAgb3BlcmF0aW9uOiAnVk9JRCcsXHJcbiAgICAgIHN0YXR1czogJ1ZPSUQnLFxyXG4gICAgICBvbGRWYWx1ZTogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBuZXdWYWx1ZTogJ1ZPSURFRCcsXHJcbiAgICAgIG1ldGFkYXRhOiB7IHJlYXNvbjogZHRvLnJlYXNvbiwgcmVwbGFjZTogZHRvLnJlcGxhY2UgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChkdG8ucmVwbGFjZSkge1xyXG4gICAgICAvLyAzLiBHZW5lcmF0ZSBSZXBsYWNlbWVudFxyXG4gICAgICAvLyBQYXJzZSBjb250ZXh0IGZyb20gbGFzdEF1ZGl0LmNvdW50ZXJLZXk/XHJcbiAgICAgIC8vIEdlbmVyYXRlTnVtYmVyQ29udGV4dCBuZWVkcyBtb3JlIHRoYW4gY291bnRlcktleS5cclxuICAgICAgLy8gQnV0IHdlIGNhbiByZWNvbnN0cnVjdCBpdC5cclxuICAgICAgbGV0IGNvbnRleHQ6IEdlbmVyYXRlTnVtYmVyQ29udGV4dDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByYXdLZXkgPSBsYXN0QXVkaXQuY291bnRlcktleTtcclxuICAgICAgICBjb25zdCBrZXkgPVxyXG4gICAgICAgICAgdHlwZW9mIHJhd0tleSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgPyAoSlNPTi5wYXJzZShyYXdLZXkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxyXG4gICAgICAgICAgICA6IHJhd0tleTtcclxuXHJcbiAgICAgICAgY29udGV4dCA9IHtcclxuICAgICAgICAgIHByb2plY3RJZDogTnVtYmVyKGtleS5wcm9qZWN0SWQpLFxyXG4gICAgICAgICAgdHlwZUlkOiBOdW1iZXIoa2V5LmNvcnJlc3BvbmRlbmNlVHlwZUlkKSxcclxuICAgICAgICAgIHN1YlR5cGVJZDogTnVtYmVyKGtleS5zdWJUeXBlSWQpLFxyXG4gICAgICAgICAgcmZhVHlwZUlkOiBOdW1iZXIoa2V5LnJmYVR5cGVJZCksXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IE51bWJlcihrZXkuZGlzY2lwbGluZUlkKSxcclxuICAgICAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogTnVtYmVyKGtleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQpIHx8IDAsXHJcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogTnVtYmVyKGtleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCkgfHwgMCxcclxuICAgICAgICAgIHVzZXJJZDogMCwgLy8gU3lzdGVtIHJlcGxhY2VtZW50XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVOZXh0TnVtYmVyKGNvbnRleHQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzdGF0dXM6ICdSRVBMQUNFRCcsXHJcbiAgICAgICAgICBvbGROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgICAgIG5ld051bWJlcjogbmV4dC5udW1iZXIsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVwbGFjZSBudW1iZXIgJHtkdG8uZG9jdW1lbnROdW1iZXJ9YCwgZSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHN0YXR1czogJ1ZPSURFRF9SRVBMQUNFX0ZBSUxFRCcsXHJcbiAgICAgICAgICBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBzdGF0dXM6ICdWT0lERUQnIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxOdW1iZXIoZHRvOiB7XHJcbiAgICBkb2N1bWVudE51bWJlcjogc3RyaW5nO1xyXG4gICAgcmVhc29uOiBzdHJpbmc7XHJcbiAgICBwcm9qZWN0SWQ/OiBudW1iZXI7XHJcbiAgfSkge1xyXG4gICAgLy8gU2ltaWxhciB0byBWT0lEIGJ1dCBzdGF0dXMgQ0FOQ0VMTEVEXHJcbiAgICBjb25zdCBsYXN0QXVkaXQgPSBhd2FpdCB0aGlzLmF1ZGl0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlciB9LFxyXG4gICAgICBvcmRlcjogeyBjcmVhdGVkQXQ6ICdERVNDJyB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29udGV4dEtleSA9IGxhc3RBdWRpdD8uY291bnRlcktleTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvZ0F1ZGl0KHtcclxuICAgICAgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgY291bnRlcktleTogY29udGV4dEtleSB8fCB7fSxcclxuICAgICAgdGVtcGxhdGVVc2VkOiBsYXN0QXVkaXQ/LnRlbXBsYXRlVXNlZCB8fCAnQ0FOQ0VMJyxcclxuICAgICAgY29udGV4dDoge1xyXG4gICAgICAgIHVzZXJJZDogMCxcclxuICAgICAgICBpcEFkZHJlc3M6ICcwLjAuMC4wJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IGR0by5wcm9qZWN0SWQgfHwgMCxcclxuICAgICAgfSxcclxuICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICBvcGVyYXRpb246ICdDQU5DRUwnLFxyXG4gICAgICBzdGF0dXM6ICdDQU5DRUxMRUQnLFxyXG4gICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24gfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IHN0YXR1czogJ0NBTkNFTExFRCcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJ1bGtJbXBvcnQoaXRlbXM6IE1hbnVhbE92ZXJyaWRlRHRvW10pIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSB7IHN1Y2Nlc3M6IDAsIGZhaWxlZDogMCwgZXJyb3JzOiBbXSBhcyBzdHJpbmdbXSB9O1xyXG5cclxuICAgIC8vIGl0ZW1zIGV4cGVjdGVkIHRvIGJlIE1hbnVhbE92ZXJyaWRlRHRvW10gb3Igc2ltaWxhclxyXG4gICAgLy8gQWN0dWFsbHkgYnVsayBpbXBvcnQgdXN1YWxseSBtZWFucyBcIkhlcmUgaXMgYSBsaXN0IG9mIEVYSVNUSU5HIG51bWJlcnMgdXNlZCBpbiBsZWdhY3kgc3lzdGVtXCJcclxuICAgIC8vIFNvIHdlIHNob3VsZCBwYXJzZSB0aGVtIGFuZCB1cGRhdGUgY291bnRlcnMgaWYgdGhleSBhcmUgaGlnaGVyLlxyXG5cclxuICAgIC8vIEltcGxlbWVudGF0aW9uOiBGb3IgZWFjaCBpdGVtLCBsaWtlbHkgZGVsZWdhdGUgdG8gTWFudWFsT3ZlcnJpZGVTZXJ2aWNlIGlmIGl0IGZpdHMgc2NoZW1hLlxyXG4gICAgLy8gT3IgaWYgaXRlbXMgaXMganVzdCBhIG51bWJlciBvZiBDU1Ygcm93cz9cclxuICAgIC8vIEFzc3VtaW5nIGl0ZW1zIGlzIHBhcnNlZCBDU1Ygcm93cy5cclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBBZGFwdCBpdGVtIHRvIE1hbnVhbE92ZXJyaWRlRHRvXHJcbiAgICAgICAgLypcclxuICAgICAgICAgIENTViBjb2x1bW5zOiBQcm9qZWN0SUQsIFR5cGVJRCwgT3JpZ2luYXRvcklELCBSZWNpcGllbnRJRCwgTGFzdE51bWJlclxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKGl0ZW0ubmV3TGFzdE51bWJlciAmJiBpdGVtLmNvcnJlc3BvbmRlbmNlVHlwZUlkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm1hbnVhbE92ZXJyaWRlU2VydmljZS5hcHBseU92ZXJyaWRlKGl0ZW0sIDApOyAvLyAwID0gU3lzdGVtXHJcbiAgICAgICAgICByZXN1bHRzLnN1Y2Nlc3MrKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXN1bHRzLmZhaWxlZCsrO1xyXG4gICAgICAgIHJlc3VsdHMuZXJyb3JzLnB1c2goXHJcbiAgICAgICAgICBgRmFpbGVkIGl0ZW0gJHtKU09OLnN0cmluZ2lmeShpdGVtKX06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9nQXVkaXQoZGF0YToge1xyXG4gICAgZG9jdW1lbnROdW1iZXI6IHN0cmluZztcclxuICAgIGNvdW50ZXJLZXk6IHVua25vd247XHJcbiAgICB0ZW1wbGF0ZVVzZWQ6IHN0cmluZztcclxuICAgIGNvbnRleHQ6IHsgcHJvamVjdElkPzogbnVtYmVyOyB1c2VySWQ/OiBudW1iZXI7IGlwQWRkcmVzcz86IHN0cmluZyB9O1xyXG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xyXG4gICAgb3BlcmF0aW9uOiBzdHJpbmc7XHJcbiAgICBzdGF0dXM/OiBzdHJpbmc7XHJcbiAgICBvbGRWYWx1ZT86IHN0cmluZztcclxuICAgIG5ld1ZhbHVlPzogc3RyaW5nO1xyXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICB9KTogUHJvbWlzZTxEb2N1bWVudE51bWJlckF1ZGl0PiB7XHJcbiAgICBjb25zdCBhdWRpdCA9IHRoaXMuYXVkaXRSZXBvLmNyZWF0ZSh7XHJcbiAgICAgIGRvY3VtZW50TnVtYmVyOiBkYXRhLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBjb3VudGVyS2V5OiBkYXRhLmNvdW50ZXJLZXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICAgIHRlbXBsYXRlVXNlZDogZGF0YS50ZW1wbGF0ZVVzZWQsXHJcbiAgICAgIGlzU3VjY2VzczogZGF0YS5pc1N1Y2Nlc3MsXHJcbiAgICAgIG9wZXJhdGlvbjogZGF0YS5vcGVyYXRpb24sXHJcbiAgICAgIHN0YXR1czogZGF0YS5zdGF0dXMsXHJcbiAgICAgIG9sZFZhbHVlOiBkYXRhLm9sZFZhbHVlLFxyXG4gICAgICBuZXdWYWx1ZTogZGF0YS5uZXdWYWx1ZSxcclxuICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXHJcbiAgICAgIHVzZXJJZDogZGF0YS5jb250ZXh0LnVzZXJJZCxcclxuICAgICAgaXBBZGRyZXNzOiBkYXRhLmNvbnRleHQuaXBBZGRyZXNzLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5hdWRpdFJlcG8uc2F2ZShhdWRpdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEVycm9yVHlwZShlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgJyc7XHJcbiAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlIHx8ICcnO1xyXG4gICAgaWYgKG5hbWUgPT09ICdDb25mbGljdEV4Y2VwdGlvbicgfHwgbXNnLmluY2x1ZGVzKCd2ZXJzaW9uJykpXHJcbiAgICAgIHJldHVybiAnVkVSU0lPTl9DT05GTElDVCc7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCdsb2NrJykgfHwgbXNnLmluY2x1ZGVzKCd0aW1lb3V0JykpIHJldHVybiAnTE9DS19USU1FT1VUJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ1JlZGlzJykgfHwgbXNnLmluY2x1ZGVzKCdyZWRpcycpKSByZXR1cm4gJ1JFRElTX0VSUk9SJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpIHx8IG1zZy5pbmNsdWRlcygnRHVwbGljYXRlJykpXHJcbiAgICAgIHJldHVybiAnRFVQTElDQVRFX05VTUJFUic7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCd2YWxpZGF0aW9uJykgfHwgbXNnLmluY2x1ZGVzKCdWYWxpZGF0aW9uJykpXHJcbiAgICAgIHJldHVybiAnVkFMSURBVElPTl9FUlJPUic7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBtc2cuaW5jbHVkZXMoJ21heGltdW0nKSlcclxuICAgICAgcmV0dXJuICdTRVFVRU5DRV9FWEhBVVNURUQnO1xyXG4gICAgaWYgKG1zZy5pbmNsdWRlcygnZXhwaXJlZCcpIHx8IG1zZy5pbmNsdWRlcygncmVzZXJ2YXRpb24nKSlcclxuICAgICAgcmV0dXJuICdSRVNFUlZBVElPTl9FWFBJUkVEJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ2RhdGFiYXNlJykgfHwgbXNnLmluY2x1ZGVzKCdxdWVyeScpKSByZXR1cm4gJ0RCX0VSUk9SJztcclxuICAgIHJldHVybiAnR0VORVJBVEVfRVJST1InO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dFcnJvcihlcnJvcjogdW5rbm93biwgY3R4OiB1bmtub3duLCBvcGVyYXRpb246IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZXJyID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICBjb25zdCBlcnJFbnRpdHkgPSB0aGlzLmVycm9yUmVwby5jcmVhdGUoe1xyXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UgfHwgJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIGVycm9yVHlwZTogdGhpcy5tYXBFcnJvclR5cGUoZXJyKSxcclxuICAgICAgICBjb250ZXh0RGF0YToge1xyXG4gICAgICAgICAgLi4uKHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmIGN0eCAhPT0gbnVsbFxyXG4gICAgICAgICAgICA/IChjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgICAgb3BlcmF0aW9uLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmVycm9yUmVwby5zYXZlKGVyckVudGl0eSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9nIGVycm9yIHRvIERCJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a.map new file mode 100644 index 0000000..166180e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/documentnumberingservice_e1f30d9c71a448ed16199c674687b20a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering.service.ts"],"sourcesContent":["import { Injectable, Logger, BadRequestException } from '@nestjs/common';\r\nimport { InjectRepository, InjectEntityManager } from '@nestjs/typeorm';\r\nimport { Repository, EntityManager, IsNull, Equal } from 'typeorm';\r\nimport { ConfigService } from '@nestjs/config';\r\n\r\nimport { DocumentNumberFormat } from '../entities/document-number-format.entity';\r\nimport { DocumentNumberAudit } from '../entities/document-number-audit.entity';\r\nimport { DocumentNumberError } from '../entities/document-number-error.entity';\r\n\r\n// Services\r\nimport { CounterService } from './counter.service';\r\nimport { ReservationService } from './reservation.service';\r\nimport { FormatService } from './format.service';\r\nimport { DocumentNumberingLockService } from './document-numbering-lock.service';\r\nimport { ManualOverrideService } from './manual-override.service';\r\nimport { MetricsService } from './metrics.service';\r\n\r\n// DTOs\r\nimport { CounterKeyDto } from '../dto/counter-key.dto';\r\nimport { GenerateNumberContext } from '../interfaces/document-numbering.interface';\r\nimport {\r\n ReserveNumberDto,\r\n ReserveNumberResponseDto,\r\n} from '../dto/reserve-number.dto';\r\nimport {\r\n ConfirmReservationDto,\r\n ConfirmReservationResponseDto,\r\n} from '../dto/confirm-reservation.dto';\r\nimport { ManualOverrideDto } from '../dto/manual-override.dto';\r\nimport { UuidResolverService } from '../../../common/services/uuid-resolver.service';\r\n\r\n@Injectable()\r\nexport class DocumentNumberingService {\r\n private readonly logger = new Logger(DocumentNumberingService.name);\r\n\r\n constructor(\r\n @InjectRepository(DocumentNumberFormat)\r\n private formatRepo: Repository,\r\n @InjectRepository(DocumentNumberAudit)\r\n private auditRepo: Repository,\r\n @InjectRepository(DocumentNumberError)\r\n private errorRepo: Repository,\r\n\r\n private counterService: CounterService,\r\n private reservationService: ReservationService,\r\n private formatService: FormatService,\r\n private lockService: DocumentNumberingLockService,\r\n private configService: ConfigService,\r\n private manualOverrideService: ManualOverrideService,\r\n private metricsService: MetricsService,\r\n @InjectEntityManager()\r\n private entityManager: EntityManager,\r\n private uuidResolver: UuidResolverService\r\n ) {}\r\n\r\n /**\r\n * ADR-019: Public facade for controllers to resolve project/organization IDs\r\n */\r\n async resolveIdForPreview(\r\n type: 'project' | 'organization',\r\n id: number | string\r\n ): Promise {\r\n if (type === 'project') return this.uuidResolver.resolveProjectId(id);\r\n return this.uuidResolver.resolveOrganizationId(id);\r\n }\r\n\r\n async generateNextNumber(\r\n ctx: GenerateNumberContext\r\n ): Promise<{ number: string; auditId: number }> {\r\n let lock = null;\r\n try {\r\n // 0. Check Idempotency (Ideally done in Guard/Middleware, but double check here if passed)\r\n // Note: If idempotencyKey exists in ctx, check audit log for existing SUCCESS entry?\r\n // Omitted for brevity as per spec usually handled by middleware or separate check.\r\n\r\n const currentYear = new Date().getFullYear();\r\n const resetScope = `YEAR_${currentYear}`;\r\n\r\n // 1. Prepare Counter Key\r\n const key: CounterKeyDto = {\r\n projectId: ctx.projectId,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId || 0,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId || 0,\r\n rfaTypeId: ctx.rfaTypeId || 0,\r\n disciplineId: ctx.disciplineId || 0,\r\n resetScope: resetScope,\r\n };\r\n\r\n // 2. Acquire Redis Lock\r\n try {\r\n // Map CounterKeyDto to LockCounterKey (names slightly different or cast if same)\r\n lock = await this.lockService.acquireLock({\r\n projectId: key.projectId,\r\n originatorOrgId: key.originatorOrganizationId,\r\n recipientOrgId: key.recipientOrganizationId,\r\n correspondenceTypeId: key.correspondenceTypeId,\r\n subTypeId: key.subTypeId,\r\n rfaTypeId: key.rfaTypeId,\r\n disciplineId: key.disciplineId,\r\n resetScope: key.resetScope,\r\n });\r\n } catch (e) {\r\n const errorMessage = e instanceof Error ? e.message : String(e);\r\n this.logger.warn(\r\n `Failed to acquire Redis lock, falling back to DB lock only: ${errorMessage}`\r\n );\r\n this.metricsService.lockFailures.inc({\r\n project_id: String(key.projectId),\r\n });\r\n // Fallback: Proceed without Redlock, relying on CounterService DB optimistic lock\r\n }\r\n\r\n // 3. Increment Counter\r\n const sequence = await this.counterService.incrementCounter(key);\r\n\r\n // 4. Format Number\r\n const { previewNumber: documentNumber } = await this.formatService.format(\r\n {\r\n projectId: ctx.projectId,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId,\r\n rfaTypeId: ctx.rfaTypeId,\r\n disciplineId: ctx.disciplineId,\r\n sequence: sequence,\r\n resetScope: resetScope,\r\n year: currentYear,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId,\r\n }\r\n );\r\n\r\n // 5. Audit Log\r\n const audit = await this.logAudit({\r\n documentNumber,\r\n counterKey: JSON.stringify(key),\r\n templateUsed: 'DELEGATED_TO_FORMAT_SERVICE',\r\n context: ctx,\r\n isSuccess: true,\r\n operation: 'GENERATE',\r\n // metadata: { idempotencyKey: ctx.idempotencyKey } // If available\r\n });\r\n\r\n this.metricsService.numbersGenerated.inc({\r\n project_id: String(ctx.projectId),\r\n type_id: String(ctx.typeId),\r\n });\r\n\r\n return { number: documentNumber, auditId: audit.id };\r\n } catch (error: unknown) {\r\n await this.logError(error, ctx, 'GENERATE');\r\n throw error;\r\n } finally {\r\n if (lock) {\r\n await this.lockService.releaseLock(lock);\r\n }\r\n }\r\n }\r\n\r\n async reserveNumber(\r\n dto: ReserveNumberDto,\r\n userId: number,\r\n ipAddress?: string\r\n ): Promise {\r\n try {\r\n // Delegate completely to ReservationService\r\n return await this.reservationService.reserve(\r\n dto,\r\n userId,\r\n ipAddress || '0.0.0.0',\r\n 'Unknown' // userAgent not passed in legacy call\r\n );\r\n } catch (error: unknown) {\r\n this.logger.error('Reservation failed', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async confirmReservation(\r\n dto: ConfirmReservationDto,\r\n userId: number\r\n ): Promise {\r\n return this.reservationService.confirm(dto, userId);\r\n }\r\n\r\n async cancelReservation(token: string, userId: number): Promise {\r\n return this.reservationService.cancel(token, userId);\r\n }\r\n\r\n async previewNumber(ctx: GenerateNumberContext): Promise<{\r\n previewNumber: string;\r\n nextSequence: number;\r\n isDefault: boolean;\r\n }> {\r\n const currentYear = new Date().getFullYear();\r\n const resetScope = `YEAR_${currentYear}`;\r\n\r\n const key: CounterKeyDto = {\r\n projectId: ctx.projectId,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId || 0,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId || 0,\r\n rfaTypeId: ctx.rfaTypeId || 0,\r\n disciplineId: ctx.disciplineId || 0,\r\n resetScope: resetScope,\r\n };\r\n\r\n const currentSeq = await this.counterService.getCurrentCounter(key);\r\n const nextSequence = currentSeq + 1;\r\n\r\n const { previewNumber, isDefault } = await this.formatService.format({\r\n projectId: ctx.projectId,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId,\r\n rfaTypeId: ctx.rfaTypeId,\r\n disciplineId: ctx.disciplineId,\r\n sequence: nextSequence,\r\n resetScope: resetScope,\r\n year: currentYear,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId,\r\n });\r\n\r\n return { previewNumber, nextSequence, isDefault };\r\n }\r\n\r\n /**\r\n * Generates a new number for a draft when its context changes.\r\n */\r\n async updateNumberForDraft(\r\n currentNumber: string,\r\n oldCtx: GenerateNumberContext,\r\n newCtx: GenerateNumberContext\r\n ): Promise {\r\n const result = await this.generateNextNumber(newCtx);\r\n return result.number;\r\n }\r\n\r\n // --- Admin / Legacy ---\r\n\r\n async getTemplates(): Promise {\r\n return this.formatRepo.find({\r\n relations: ['project', 'correspondenceType'],\r\n });\r\n }\r\n\r\n async getTemplatesByProject(\r\n projectId: number | string\r\n ): Promise {\r\n const internalId = await this.uuidResolver.resolveProjectId(projectId);\r\n return this.formatRepo.find({\r\n where: { projectId: internalId },\r\n relations: ['project', 'correspondenceType'],\r\n });\r\n }\r\n\r\n async saveTemplate(\r\n dto: Partial & { projectId?: number | string }\r\n ): Promise {\r\n try {\r\n this.logger.log(`Saving numbering template: ${JSON.stringify(dto)}`);\r\n\r\n // Resolve project ID if it's a UUID/String\r\n if (dto.projectId && typeof dto.projectId === 'string') {\r\n dto.projectId = await this.uuidResolver.resolveProjectId(dto.projectId);\r\n }\r\n\r\n // Upsert logic: If no ID provided, check for existing template with same business key\r\n if (!dto.id) {\r\n const existing = await this.formatRepo.findOne({\r\n where: {\r\n projectId: Number(dto.projectId),\r\n correspondenceTypeId: dto.correspondenceTypeId\r\n ? Equal(dto.correspondenceTypeId)\r\n : IsNull(),\r\n disciplineId: dto.disciplineId || 0,\r\n },\r\n });\r\n if (existing) {\r\n this.logger.log(\r\n `Found existing template ID: ${existing.id} for business key, updating instead of creating.`\r\n );\r\n dto.id = existing.id;\r\n }\r\n }\r\n\r\n const result = await this.formatRepo.save(dto);\r\n this.logger.log(`Successfully saved template ID: ${result.id}`);\r\n return result;\r\n } catch (e: unknown) {\r\n this.logger.error(\r\n `Failed to save numbering template: ${e instanceof Error ? e.message : String(e)}`,\r\n e instanceof Error ? e.stack : undefined\r\n );\r\n throw e;\r\n }\r\n }\r\n\r\n async deleteTemplate(id: number) {\r\n return this.formatRepo.delete(id);\r\n }\r\n\r\n async getAuditLogs(limit: number) {\r\n return this.auditRepo.find({ take: limit, order: { createdAt: 'DESC' } });\r\n }\r\n\r\n async getErrorLogs(limit: number) {\r\n return this.errorRepo.find({ take: limit, order: { createdAt: 'DESC' } });\r\n }\r\n\r\n async getSequences(projectId?: number) {\r\n await Promise.resolve(projectId); // satisfy unused\r\n return [];\r\n }\r\n\r\n async setCounterValue(id: number, sequence: number) {\r\n await Promise.resolve(id); // satisfy unused\r\n await Promise.resolve(sequence);\r\n throw new BadRequestException(\r\n 'Updating counter by single ID is not supported with composite keys. Use manualOverride.'\r\n );\r\n }\r\n\r\n async manualOverride(dto: ManualOverrideDto, userId: number) {\r\n return this.manualOverrideService.applyOverride(dto, userId);\r\n }\r\n async voidAndReplace(dto: {\r\n documentNumber: string;\r\n reason: string;\r\n replace: boolean;\r\n }) {\r\n // 1. Find the audit log for this number to get context\r\n const lastAudit = await this.auditRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n order: { createdAt: 'DESC' },\r\n });\r\n\r\n if (!lastAudit) {\r\n // If not found in audit, we can't easily regenerate with same context unless passed in dto.\r\n // For now, log a warning and return error or just log the void decision.\r\n this.logger.warn(\r\n `Void request for unknown number: ${dto.documentNumber}`\r\n );\r\n // Create a void audit anyway if possible?\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: {},\r\n templateUsed: 'VOID_UNKNOWN',\r\n context: { userId: 0, ipAddress: '0.0.0.0' }, // System\r\n isSuccess: true,\r\n operation: 'VOID',\r\n status: 'VOID',\r\n newValue: 'VOIDED',\r\n metadata: { reason: dto.reason },\r\n });\r\n return { status: 'VOIDED_UNKNOWN_CONTEXT' };\r\n }\r\n\r\n // 2. Log VOID\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: lastAudit.counterKey,\r\n templateUsed: lastAudit.templateUsed,\r\n context: { userId: 0, ipAddress: '0.0.0.0' }, // TODO: Pass userId from controller\r\n isSuccess: true,\r\n operation: 'VOID',\r\n status: 'VOID',\r\n oldValue: dto.documentNumber,\r\n newValue: 'VOIDED',\r\n metadata: { reason: dto.reason, replace: dto.replace },\r\n });\r\n\r\n if (dto.replace) {\r\n // 3. Generate Replacement\r\n // Parse context from lastAudit.counterKey?\r\n // GenerateNumberContext needs more than counterKey.\r\n // But we can reconstruct it.\r\n let context: GenerateNumberContext;\r\n try {\r\n const rawKey = lastAudit.counterKey;\r\n const key =\r\n typeof rawKey === 'string'\r\n ? (JSON.parse(rawKey) as Record)\r\n : rawKey;\r\n\r\n context = {\r\n projectId: Number(key.projectId),\r\n typeId: Number(key.correspondenceTypeId),\r\n subTypeId: Number(key.subTypeId),\r\n rfaTypeId: Number(key.rfaTypeId),\r\n disciplineId: Number(key.disciplineId),\r\n originatorOrganizationId: Number(key.originatorOrganizationId) || 0,\r\n recipientOrganizationId: Number(key.recipientOrganizationId) || 0,\r\n userId: 0, // System replacement\r\n };\r\n\r\n const next = await this.generateNextNumber(context);\r\n return {\r\n status: 'REPLACED',\r\n oldNumber: dto.documentNumber,\r\n newNumber: next.number,\r\n };\r\n } catch (e) {\r\n this.logger.error(`Failed to replace number ${dto.documentNumber}`, e);\r\n return {\r\n status: 'VOIDED_REPLACE_FAILED',\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n return { status: 'VOIDED' };\r\n }\r\n\r\n async cancelNumber(dto: {\r\n documentNumber: string;\r\n reason: string;\r\n projectId?: number;\r\n }) {\r\n // Similar to VOID but status CANCELLED\r\n const lastAudit = await this.auditRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n order: { createdAt: 'DESC' },\r\n });\r\n\r\n const contextKey = lastAudit?.counterKey;\r\n\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: contextKey || {},\r\n templateUsed: lastAudit?.templateUsed || 'CANCEL',\r\n context: {\r\n userId: 0,\r\n ipAddress: '0.0.0.0',\r\n projectId: dto.projectId || 0,\r\n },\r\n isSuccess: true,\r\n operation: 'CANCEL',\r\n status: 'CANCELLED',\r\n metadata: { reason: dto.reason },\r\n });\r\n\r\n return { status: 'CANCELLED' };\r\n }\r\n\r\n async bulkImport(items: ManualOverrideDto[]) {\r\n const results = { success: 0, failed: 0, errors: [] as string[] };\r\n\r\n // items expected to be ManualOverrideDto[] or similar\r\n // Actually bulk import usually means \"Here is a list of EXISTING numbers used in legacy system\"\r\n // So we should parse them and update counters if they are higher.\r\n\r\n // Implementation: For each item, likely delegate to ManualOverrideService if it fits schema.\r\n // Or if items is just a number of CSV rows?\r\n // Assuming items is parsed CSV rows.\r\n\r\n for (const item of items) {\r\n try {\r\n // Adapt item to ManualOverrideDto\r\n /*\r\n CSV columns: ProjectID, TypeID, OriginatorID, RecipientID, LastNumber\r\n */\r\n if (item.newLastNumber && item.correspondenceTypeId) {\r\n await this.manualOverrideService.applyOverride(item, 0); // 0 = System\r\n results.success++;\r\n }\r\n } catch (e) {\r\n results.failed++;\r\n results.errors.push(\r\n `Failed item ${JSON.stringify(item)}: ${e instanceof Error ? e.message : String(e)}`\r\n );\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private async logAudit(data: {\r\n documentNumber: string;\r\n counterKey: unknown;\r\n templateUsed: string;\r\n context: { projectId?: number; userId?: number; ipAddress?: string };\r\n isSuccess: boolean;\r\n operation: string;\r\n status?: string;\r\n oldValue?: string;\r\n newValue?: string;\r\n metadata?: Record;\r\n }): Promise {\r\n const audit = this.auditRepo.create({\r\n documentNumber: data.documentNumber,\r\n counterKey: data.counterKey as Record,\r\n templateUsed: data.templateUsed,\r\n isSuccess: data.isSuccess,\r\n operation: data.operation,\r\n status: data.status,\r\n oldValue: data.oldValue,\r\n newValue: data.newValue,\r\n metadata: data.metadata,\r\n userId: data.context.userId,\r\n ipAddress: data.context.ipAddress,\r\n });\r\n return this.auditRepo.save(audit);\r\n }\r\n\r\n private mapErrorType(error: Error): string {\r\n const name = error.name || '';\r\n const msg = error.message || '';\r\n if (name === 'ConflictException' || msg.includes('version'))\r\n return 'VERSION_CONFLICT';\r\n if (msg.includes('lock') || msg.includes('timeout')) return 'LOCK_TIMEOUT';\r\n if (msg.includes('Redis') || msg.includes('redis')) return 'REDIS_ERROR';\r\n if (msg.includes('duplicate') || msg.includes('Duplicate'))\r\n return 'DUPLICATE_NUMBER';\r\n if (msg.includes('validation') || msg.includes('Validation'))\r\n return 'VALIDATION_ERROR';\r\n if (msg.includes('exhausted') || msg.includes('maximum'))\r\n return 'SEQUENCE_EXHAUSTED';\r\n if (msg.includes('expired') || msg.includes('reservation'))\r\n return 'RESERVATION_EXPIRED';\r\n if (msg.includes('database') || msg.includes('query')) return 'DB_ERROR';\r\n return 'GENERATE_ERROR';\r\n }\r\n\r\n private async logError(error: unknown, ctx: unknown, operation: string) {\r\n try {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n const errEntity = this.errorRepo.create({\r\n errorMessage: err.message || 'Unknown Error',\r\n errorType: this.mapErrorType(err),\r\n contextData: {\r\n ...(typeof ctx === 'object' && ctx !== null\r\n ? (ctx as Record)\r\n : {}),\r\n operation,\r\n },\r\n });\r\n await this.errorRepo.save(errEntity);\r\n } catch (e) {\r\n this.logger.error('Failed to log error to DB', e);\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5 new file mode 100644 index 0000000..51328da --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5 @@ -0,0 +1,42 @@ +95691959b999bf3e510fb4b6ef1c7c34 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OrganizationRole = void 0; +const typeorm_1 = require("typeorm"); +const base_entity_1 = require("../../../common/entities/base.entity"); +/** + * OrganizationRole Entity + * Represents the role/type of an organization in the system + * (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY) + * + * Schema reference: organization_roles table (lines 205-211 in schema SQL) + */ +let OrganizationRole = class OrganizationRole extends base_entity_1.BaseEntity { +}; +exports.OrganizationRole = OrganizationRole; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], OrganizationRole.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'role_name', + length: 20, + unique: true, + comment: 'Role name (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)', + }), + __metadata("design:type", String) +], OrganizationRole.prototype, "roleName", void 0); +exports.OrganizationRole = OrganizationRole = __decorate([ + (0, typeorm_1.Entity)('organization_roles') +], OrganizationRole); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcb3JnYW5pemF0aW9uXFxlbnRpdGllc1xcb3JnYW5pemF0aW9uLXJvbGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUNqRSxzRUFBa0U7QUFFbEU7Ozs7OztHQU1HO0FBRUksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSx3QkFBVTtDQVcvQyxDQUFBO0FBWFksNENBQWdCO0FBRTNCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7NENBQ2I7QUFRWjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsa0VBQWtFO0tBQzVFLENBQUM7O2tEQUNnQjsyQkFWUCxnQkFBZ0I7SUFENUIsSUFBQSxnQkFBTSxFQUFDLG9CQUFvQixDQUFDO0dBQ2hCLGdCQUFnQixDQVc1QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxvcmdhbml6YXRpb25cXGVudGl0aWVzXFxvcmdhbml6YXRpb24tcm9sZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBDb2x1bW4sIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvYmFzZS5lbnRpdHknO1xuXG4vKipcbiAqIE9yZ2FuaXphdGlvblJvbGUgRW50aXR5XG4gKiBSZXByZXNlbnRzIHRoZSByb2xlL3R5cGUgb2YgYW4gb3JnYW5pemF0aW9uIGluIHRoZSBzeXN0ZW1cbiAqIChPV05FUiwgREVTSUdORVIsIENPTlNVTFRBTlQsIENPTlRSQUNUT1IsIFRISVJEX1BBUlRZKVxuICpcbiAqIFNjaGVtYSByZWZlcmVuY2U6IG9yZ2FuaXphdGlvbl9yb2xlcyB0YWJsZSAobGluZXMgMjA1LTIxMSBpbiBzY2hlbWEgU1FMKVxuICovXG5ARW50aXR5KCdvcmdhbml6YXRpb25fcm9sZXMnKVxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblJvbGUgZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAncm9sZV9uYW1lJyxcbiAgICBsZW5ndGg6IDIwLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICBjb21tZW50OiAnUm9sZSBuYW1lIChPV05FUiwgREVTSUdORVIsIENPTlNVTFRBTlQsIENPTlRSQUNUT1IsIFRISVJEX1BBUlRZKScsXG4gIH0pXG4gIHJvbGVOYW1lITogc3RyaW5nO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5.map new file mode 100644 index 0000000..f975bf1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e1/organizationroleentity_e199ef2079345958af90c42687a018b5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization-role.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AACjE,sEAAkE;AAElE;;;;;;GAMG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,wBAAU;CAW/C,CAAA;AAXY,4CAAgB;AAE3B;IADC,IAAA,gCAAsB,GAAE;;4CACb;AAQZ;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,kEAAkE;KAC5E,CAAC;;kDACgB;2BAVP,gBAAgB;IAD5B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;GAChB,gBAAgB,CAW5B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization-role.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\nimport { BaseEntity } from '../../../common/entities/base.entity';\n\n/**\n * OrganizationRole Entity\n * Represents the role/type of an organization in the system\n * (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)\n *\n * Schema reference: organization_roles table (lines 205-211 in schema SQL)\n */\n@Entity('organization_roles')\nexport class OrganizationRole extends BaseEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({\n name: 'role_name',\n length: 20,\n unique: true,\n comment: 'Role name (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)',\n })\n roleName!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b new file mode 100644 index 0000000..9a1eb3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b @@ -0,0 +1,28 @@ +bcb72451389188fe12a13aa93be14537 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AddReferenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class AddReferenceDto { +} +exports.AddReferenceDto = AddReferenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Target Correspondence UUID to reference (ADR-019)', + example: '019505a1-7c3e-7000-8000-abc123def456', + }), + (0, class_validator_1.IsUUID)('all'), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], AddReferenceDto.prototype, "targetUuid", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYWRkLXJlZmVyZW5jZS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFEO0FBQ3JELDZDQUE4QztBQUU5QyxNQUFhLGVBQWU7Q0FRM0I7QUFSRCwwQ0FRQztBQURDO0lBTkMsSUFBQSxxQkFBVyxFQUFDO1FBQ1gsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxPQUFPLEVBQUUsc0NBQXNDO0tBQ2hELENBQUM7SUFDRCxJQUFBLHdCQUFNLEVBQUMsS0FBSyxDQUFDO0lBQ2IsSUFBQSw0QkFBVSxHQUFFOzttREFDTyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxhZGQtcmVmZXJlbmNlLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1VVSUQsIElzTm90RW1wdHkgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5leHBvcnQgY2xhc3MgQWRkUmVmZXJlbmNlRHRvIHtcbiAgQEFwaVByb3BlcnR5KHtcbiAgICBkZXNjcmlwdGlvbjogJ1RhcmdldCBDb3JyZXNwb25kZW5jZSBVVUlEIHRvIHJlZmVyZW5jZSAoQURSLTAxOSknLFxuICAgIGV4YW1wbGU6ICcwMTk1MDVhMS03YzNlLTcwMDAtODAwMC1hYmMxMjNkZWY0NTYnLFxuICB9KVxuICBASXNVVUlEKCdhbGwnKVxuICBASXNOb3RFbXB0eSgpXG4gIHRhcmdldFV1aWQhOiBzdHJpbmc7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b.map new file mode 100644 index 0000000..a208591 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/addreferencedto_e2e93fdd7fa68d9b92ea457b24365e9b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\add-reference.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAqD;AACrD,6CAA8C;AAE9C,MAAa,eAAe;CAQ3B;AARD,0CAQC;AADC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,sCAAsC;KAChD,CAAC;IACD,IAAA,wBAAM,EAAC,KAAK,CAAC;IACb,IAAA,4BAAU,GAAE;;mDACO","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\add-reference.dto.ts"],"sourcesContent":["import { IsUUID, IsNotEmpty } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\n\nexport class AddReferenceDto {\n @ApiProperty({\n description: 'Target Correspondence UUID to reference (ADR-019)',\n example: '019505a1-7c3e-7000-8000-abc123def456',\n })\n @IsUUID('all')\n @IsNotEmpty()\n targetUuid!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322 new file mode 100644 index 0000000..b8f0fa5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322 @@ -0,0 +1,47 @@ +4bc0bb500816942a9c2d82eab1801e81 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var AuditService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AuditService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_audit_entity_1 = require("../entities/document-number-audit.entity"); +let AuditService = AuditService_1 = class AuditService { + constructor(auditRepo) { + this.auditRepo = auditRepo; + this.logger = new common_1.Logger(AuditService_1.name); + } + async log(entry) { + try { + // Async save - do not await strictly if we want fire-and-forget, but for data integrity await is safer in critical flows + // For performance, we might offload to a queue, but direct save is safer for now. + const logEntry = this.auditRepo.create(entry); + await this.auditRepo.save(logEntry); + } + catch (error) { + this.logger.error('Failed to write audit log', error); + // Fail silent or throw? -> Fail silent to not crash the main flow, assuming log is secondary + } + } +}; +exports.AuditService = AuditService; +exports.AuditService = AuditService = AuditService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_audit_entity_1.DocumentNumberAudit)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object]) +], AuditService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcYXVkaXQuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUNwRCw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLDJGQUErRTtBQUd4RSxJQUFNLFlBQVksb0JBQWxCLE1BQU0sWUFBWTtJQUd2QixZQUVFLFNBQTJEO1FBQTFDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBSjVDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxjQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFLckQsQ0FBQztJQUVKLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBbUM7UUFDM0MsSUFBSSxDQUFDO1lBQ0gseUhBQXlIO1lBQ3pILGtGQUFrRjtZQUNsRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsNkZBQTZGO1FBQy9GLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQW5CWSxvQ0FBWTt1QkFBWixZQUFZO0lBRHhCLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrREFBbUIsQ0FBQyxDQUFBO3lEQUNWLG9CQUFVLG9CQUFWLG9CQUFVO0dBTDdCLFlBQVksQ0FtQnhCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGF1ZGl0LnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdWRpdFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQXVkaXRTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyQXVkaXQpXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD5cbiAgKSB7fVxuXG4gIGFzeW5jIGxvZyhlbnRyeTogUGFydGlhbDxEb2N1bWVudE51bWJlckF1ZGl0Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luYyBzYXZlIC0gZG8gbm90IGF3YWl0IHN0cmljdGx5IGlmIHdlIHdhbnQgZmlyZS1hbmQtZm9yZ2V0LCBidXQgZm9yIGRhdGEgaW50ZWdyaXR5IGF3YWl0IGlzIHNhZmVyIGluIGNyaXRpY2FsIGZsb3dzXG4gICAgICAvLyBGb3IgcGVyZm9ybWFuY2UsIHdlIG1pZ2h0IG9mZmxvYWQgdG8gYSBxdWV1ZSwgYnV0IGRpcmVjdCBzYXZlIGlzIHNhZmVyIGZvciBub3cuXG4gICAgICBjb25zdCBsb2dFbnRyeSA9IHRoaXMuYXVkaXRSZXBvLmNyZWF0ZShlbnRyeSk7XG4gICAgICBhd2FpdCB0aGlzLmF1ZGl0UmVwby5zYXZlKGxvZ0VudHJ5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byB3cml0ZSBhdWRpdCBsb2cnLCBlcnJvcik7XG4gICAgICAvLyBGYWlsIHNpbGVudCBvciB0aHJvdz8gLT4gRmFpbCBzaWxlbnQgdG8gbm90IGNyYXNoIHRoZSBtYWluIGZsb3csIGFzc3VtaW5nIGxvZyBpcyBzZWNvbmRhcnlcbiAgICB9XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322.map new file mode 100644 index 0000000..a0fe51b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e2/auditservice_e2598f39804f4335edbc19499af81322.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\audit.service.ts","mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,6CAAmD;AACnD,qCAAqC;AACrC,2FAA+E;AAGxE,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAGvB,YAEE,SAA2D;QAA1C,cAAS,GAAT,SAAS,CAAiC;QAJ5C,WAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;IAKrD,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,KAAmC;QAC3C,IAAI,CAAC;YACH,yHAAyH;YACzH,kFAAkF;YAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACtD,6FAA6F;QAC/F,CAAC;IACH,CAAC;CACF,CAAA;AAnBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,0BAAgB,EAAC,kDAAmB,CAAC,CAAA;yDACV,oBAAU,oBAAV,oBAAU;GAL7B,YAAY,CAmBxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\audit.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { DocumentNumberAudit } from '../entities/document-number-audit.entity';\n\n@Injectable()\nexport class AuditService {\n private readonly logger = new Logger(AuditService.name);\n\n constructor(\n @InjectRepository(DocumentNumberAudit)\n private readonly auditRepo: Repository\n ) {}\n\n async log(entry: Partial): Promise {\n try {\n // Async save - do not await strictly if we want fire-and-forget, but for data integrity await is safer in critical flows\n // For performance, we might offload to a queue, but direct save is safer for now.\n const logEntry = this.auditRepo.create(entry);\n await this.auditRepo.save(logEntry);\n } catch (error) {\n this.logger.error('Failed to write audit log', error);\n // Fail silent or throw? -> Fail silent to not crash the main flow, assuming log is secondary\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749 new file mode 100644 index 0000000..10e8222 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749 @@ -0,0 +1,58 @@ +15cb4fea31d79b7a1b107de05ba734d9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingMainCategory = void 0; +const typeorm_1 = require("typeorm"); +let ShopDrawingMainCategory = class ShopDrawingMainCategory { +}; +exports.ShopDrawingMainCategory = ShopDrawingMainCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_code', length: 50, unique: true }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "mainCategoryCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_name', length: 255 }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "mainCategoryName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], ShopDrawingMainCategory.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingMainCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingMainCategory.prototype, "updatedAt", void 0); +exports.ShopDrawingMainCategory = ShopDrawingMainCategory = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_main_categories') +], ShopDrawingMainCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1tYWluLWNhdGVnb3J5LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBR1YsSUFBTSx1QkFBdUIsR0FBN0IsTUFBTSx1QkFBdUI7Q0EyQm5DLENBQUE7QUEzQlksMERBQXVCO0FBRWxDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7MERBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lFQUN2QztBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O2lFQUMxQjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7MERBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztrQ0ExQk4sdUJBQXVCO0lBRG5DLElBQUEsZ0JBQU0sRUFBQyw4QkFBOEIsQ0FBQztHQUMxQix1QkFBdUIsQ0EyQm5DIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxzaG9wLWRyYXdpbmctbWFpbi1jYXRlZ29yeS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdzaG9wX2RyYXdpbmdfbWFpbl9jYXRlZ29yaWVzJylcbmV4cG9ydCBjbGFzcyBTaG9wRHJhd2luZ01haW5DYXRlZ29yeSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2NvZGUnLCBsZW5ndGg6IDUwLCB1bmlxdWU6IHRydWUgfSlcbiAgbWFpbkNhdGVnb3J5Q29kZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ21haW5fY2F0ZWdvcnlfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIG1haW5DYXRlZ29yeU5hbWUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7IC8vIG51bGxhYmxlXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749.map new file mode 100644 index 0000000..fda4bff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingmaincategoryentity_e36661009314b375ec2d5bbcc85d2749.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-main-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA2BnC,CAAA;AA3BY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;0DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;iEACvC;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;iEAC1B;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yDAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;kCA1BN,uBAAuB;IADnC,IAAA,gBAAM,EAAC,8BAA8B,CAAC;GAC1B,uBAAuB,CA2BnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-main-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\n\n@Entity('shop_drawing_main_categories')\nexport class ShopDrawingMainCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'main_category_code', length: 50, unique: true })\n mainCategoryCode!: string; // เติม !\n\n @Column({ name: 'main_category_name', length: 255 })\n mainCategoryName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1 new file mode 100644 index 0000000..c8e94b4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1 @@ -0,0 +1,56 @@ +074e5ba9ce3fabac4b472060929f5b51 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingSubcatCatMap = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const contract_drawing_category_entity_1 = require("./contract-drawing-category.entity"); +const contract_drawing_sub_category_entity_1 = require("./contract-drawing-sub-category.entity"); +let ContractDrawingSubcatCatMap = class ContractDrawingSubcatCatMap { +}; +exports.ContractDrawingSubcatCatMap = ContractDrawingSubcatCatMap; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "categoryId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_a = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _a : Object) +], ContractDrawingSubcatCatMap.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_sub_category_entity_1.ContractDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_cat_id' }), + __metadata("design:type", typeof (_b = typeof contract_drawing_sub_category_entity_1.ContractDrawingSubCategory !== "undefined" && contract_drawing_sub_category_entity_1.ContractDrawingSubCategory) === "function" ? _b : Object) +], ContractDrawingSubcatCatMap.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_category_entity_1.ContractDrawingCategory), + (0, typeorm_1.JoinColumn)({ name: 'cat_id' }), + __metadata("design:type", typeof (_c = typeof contract_drawing_category_entity_1.ContractDrawingCategory !== "undefined" && contract_drawing_category_entity_1.ContractDrawingCategory) === "function" ? _c : Object) +], ContractDrawingSubcatCatMap.prototype, "category", void 0); +exports.ContractDrawingSubcatCatMap = ContractDrawingSubcatCatMap = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_subcat_cat_maps') +], ContractDrawingSubcatCatMap); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViY2F0LWNhdC1tYXAuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsMEVBQWdFO0FBQ2hFLHlGQUE2RTtBQUM3RSxpR0FBb0Y7QUFHN0UsSUFBTSwyQkFBMkIsR0FBakMsTUFBTSwyQkFBMkI7Q0F3QnZDLENBQUE7QUF4Qlksa0VBQTJCO0FBRXRDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7dURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4REFDNUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0VBQ3hCO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytEQUN2QjtBQUlwQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87NERBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUVBQTBCLENBQUM7SUFDM0MsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNyQixpRUFBMEIsb0JBQTFCLGlFQUEwQjtnRUFBQztBQUl6QztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwREFBdUIsQ0FBQztJQUN4QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7a0RBQ3BCLDBEQUF1QixvQkFBdkIsMERBQXVCOzZEQUFDO3NDQXZCeEIsMkJBQTJCO0lBRHZDLElBQUEsZ0JBQU0sRUFBQyxrQ0FBa0MsQ0FBQztHQUM5QiwyQkFBMkIsQ0F3QnZDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxjb250cmFjdC1kcmF3aW5nLXN1YmNhdC1jYXQtbWFwLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZ0NhdGVnb3J5IH0gZnJvbSAnLi9jb250cmFjdC1kcmF3aW5nLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeSB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ19zdWJjYXRfY2F0X21hcHMnKVxuZXhwb3J0IGNsYXNzIENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcCB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcHJvamVjdElkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHN1YkNhdGVnb3J5SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjYXRfaWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjYXRlZ29yeUlkPzogbnVtYmVyO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdD86IFByb2plY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnk/OiBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeTtcblxuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0RHJhd2luZ0NhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjYXRfaWQnIH0pXG4gIGNhdGVnb3J5PzogQ29udHJhY3REcmF3aW5nQ2F0ZWdvcnk7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1.map new file mode 100644 index 0000000..cfdfaf9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/contractdrawingsubcatcatmapentity_e6c9554e1ccabb45815c38a7fb21edd1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-subcat-cat-map.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,0EAAgE;AAChE,yFAA6E;AAC7E,iGAAoF;AAG7E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;CAwBvC,CAAA;AAxBY,kEAA2B;AAEtC;IADC,IAAA,gCAAsB,GAAE;;uDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8DAC5B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEACxB;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+DACvB;AAIpB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;4DAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iEAA0B,CAAC;IAC3C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACrB,iEAA0B,oBAA1B,iEAA0B;gEAAC;AAIzC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;kDACpB,0DAAuB,oBAAvB,0DAAuB;6DAAC;sCAvBxB,2BAA2B;IADvC,IAAA,gBAAM,EAAC,kCAAkC,CAAC;GAC9B,2BAA2B,CAwBvC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-subcat-cat-map.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { ContractDrawingCategory } from './contract-drawing-category.entity';\nimport { ContractDrawingSubCategory } from './contract-drawing-sub-category.entity';\n\n@Entity('contract_drawing_subcat_cat_maps')\nexport class ContractDrawingSubcatCatMap {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id', nullable: true })\n projectId?: number;\n\n @Column({ name: 'sub_cat_id', nullable: true })\n subCategoryId?: number;\n\n @Column({ name: 'cat_id', nullable: true })\n categoryId?: number;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => ContractDrawingSubCategory)\n @JoinColumn({ name: 'sub_cat_id' })\n subCategory?: ContractDrawingSubCategory;\n\n @ManyToOne(() => ContractDrawingCategory)\n @JoinColumn({ name: 'cat_id' })\n category?: ContractDrawingCategory;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214 new file mode 100644 index 0000000..738c98b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214 @@ -0,0 +1,64 @@ +43aab2cc2f71ed8207bc09b8d574e3bc +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Organization = void 0; +const typeorm_1 = require("typeorm"); +const organization_role_entity_1 = require("./organization-role.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Organization = class Organization extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Organization = Organization; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Organization.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_code', length: 20, unique: true }), + (0, typeorm_1.Index)('idx_org_code'), + __metadata("design:type", String) +], Organization.prototype, "organizationCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_name', length: 255 }), + __metadata("design:type", String) +], Organization.prototype, "organizationName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id', nullable: true }), + __metadata("design:type", Number) +], Organization.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Organization.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Organization.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Organization.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Organization.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_role_entity_1.OrganizationRole, { nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_d = typeof organization_role_entity_1.OrganizationRole !== "undefined" && organization_role_entity_1.OrganizationRole) === "function" ? _d : Object) +], Organization.prototype, "organizationRole", void 0); +exports.Organization = Organization = __decorate([ + (0, typeorm_1.Entity)('organizations') +], Organization); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcb3JnYW5pemF0aW9uXFxlbnRpdGllc1xcb3JnYW5pemF0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBVWlCO0FBQ2pCLHlFQUE4RDtBQUM5RCxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxpQ0FBYztDQStCL0MsQ0FBQTtBQS9CWSxvQ0FBWTtBQUd2QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzt3Q0FDRTtBQUlaO0lBRkMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9ELElBQUEsZUFBSyxFQUFDLGNBQWMsQ0FBQzs7c0RBQ0k7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztzREFDekI7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzVCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzhDQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywyQ0FBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7a0RBQ2IsMkNBQWdCLG9CQUFoQiwyQ0FBZ0I7c0RBQUM7dUJBOUJ6QixZQUFZO0lBRHhCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxZQUFZLENBK0J4QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxvcmdhbml6YXRpb25cXGVudGl0aWVzXFxvcmdhbml6YXRpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxuICBEZWxldGVEYXRlQ29sdW1uLFxuICBJbmRleCxcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblJvbGUgfSBmcm9tICcuL29yZ2FuaXphdGlvbi1yb2xlLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ29yZ2FuaXphdGlvbnMnKVxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvbiBleHRlbmRzIFV1aWRCYXNlRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBARXhjbHVkZSgpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX2NvZGUnLCBsZW5ndGg6IDIwLCB1bmlxdWU6IHRydWUgfSlcbiAgQEluZGV4KCdpZHhfb3JnX2NvZGUnKVxuICBvcmdhbml6YXRpb25Db2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX25hbWUnLCBsZW5ndGg6IDI1NSB9KVxuICBvcmdhbml6YXRpb25OYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncm9sZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJvbGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IE9yZ2FuaXphdGlvblJvbGUsIHsgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgb3JnYW5pemF0aW9uUm9sZT86IE9yZ2FuaXphdGlvblJvbGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214.map new file mode 100644 index 0000000..402e94f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/organizationentity_e6c1336d09598974caf3216496457214.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,yEAA8D;AAC9D,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,iCAAc;CA+B/C,CAAA;AA/BY,oCAAY;AAGvB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;wCACE;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAA,eAAK,EAAC,cAAc,CAAC;;sDACI;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sDACzB;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2CAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACb,2CAAgB,oBAAhB,2CAAgB;sDAAC;uBA9BzB,YAAY;IADxB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,YAAY,CA+BxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Index,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { OrganizationRole } from './organization-role.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('organizations')\nexport class Organization extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'organization_code', length: 20, unique: true })\n @Index('idx_org_code')\n organizationCode!: string;\n\n @Column({ name: 'organization_name', length: 255 })\n organizationName!: string;\n\n @Column({ name: 'role_id', nullable: true })\n roleId?: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt!: Date;\n\n // Relations\n @ManyToOne(() => OrganizationRole, { nullable: true })\n @JoinColumn({ name: 'role_id' })\n organizationRole?: OrganizationRole;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913 new file mode 100644 index 0000000..775c56c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913 @@ -0,0 +1,88 @@ +44e675a368131d73a63042b53b7ae55b +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var DueDateReminderService_1; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DueDateReminderService = void 0; +const common_1 = require("@nestjs/common"); +const schedule_1 = require("@nestjs/schedule"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +let DueDateReminderService = DueDateReminderService_1 = class DueDateReminderService { + constructor(revisionRepo, notificationService, userService) { + this.revisionRepo = revisionRepo; + this.notificationService = notificationService; + this.userService = userService; + this.logger = new common_1.Logger(DueDateReminderService_1.name); + } + async sendDueDateReminders() { + this.logger.log('Running due date reminder check...'); + const now = new Date(); + const threeDaysLater = new Date(now); + threeDaysLater.setDate(threeDaysLater.getDate() + 3); + const revisions = await this.revisionRepo.find({ + where: { + isCurrent: true, + dueDate: (0, typeorm_2.Between)(now, threeDaysLater), + }, + relations: ['correspondence', 'correspondence.originator', 'status'], + }); + this.logger.log(`Found ${revisions.length} correspondences approaching due date`); + for (const revision of revisions) { + const corr = revision.correspondence; + if (!corr) + continue; + const statusCode = revision.status?.statusCode ?? ''; + if (statusCode === 'CANCELLED' || statusCode === 'CLBOWN') + continue; + if (!corr.originatorId) + continue; + try { + const targetUserId = await this.userService.findDocControlIdByOrg(corr.originatorId); + if (!targetUserId) + continue; + const daysLeft = Math.ceil((revision.dueDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)); + await this.notificationService.send({ + userId: targetUserId, + title: 'Due Date Approaching', + message: `${corr.correspondenceNumber} — "${revision.subject}" is due in ${daysLeft} day${daysLeft === 1 ? '' : 's'}.`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: corr.id, + link: `/correspondences/${corr.publicId}`, + }); + } + catch (err) { + this.logger.warn(`Due date reminder failed for ${corr.correspondenceNumber}: ${err.message}`); + } + } + } +}; +exports.DueDateReminderService = DueDateReminderService; +__decorate([ + (0, schedule_1.Cron)(schedule_1.CronExpression.EVERY_DAY_AT_8AM), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], DueDateReminderService.prototype, "sendDueDateReminders", null); +exports.DueDateReminderService = DueDateReminderService = DueDateReminderService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _b : Object, typeof (_c = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _c : Object]) +], DueDateReminderService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBb0Q7QUFDcEQsK0NBQXdEO0FBQ3hELDZDQUFtRDtBQUNuRCxxQ0FBOEM7QUFDOUMsOEZBQW1GO0FBQ25GLCtFQUEyRTtBQUMzRSx1REFBbUQ7QUFHNUMsSUFBTSxzQkFBc0IsOEJBQTVCLE1BQU0sc0JBQXNCO0lBR2pDLFlBRUUsWUFBd0QsRUFDaEQsbUJBQXdDLEVBQ3hDLFdBQXdCO1FBRnhCLGlCQUFZLEdBQVosWUFBWSxDQUFvQztRQUNoRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTmpCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx3QkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQU8vRCxDQUFDO0lBR0UsQUFBTixLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzdDLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsSUFBSTtnQkFDZixPQUFPLEVBQUUsSUFBQSxpQkFBTyxFQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7YUFDdEM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxRQUFRLENBQUM7U0FDckUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsU0FBUyxTQUFTLENBQUMsTUFBTSx1Q0FBdUMsQ0FDakUsQ0FBQztRQUVGLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxTQUFTO1lBRXBCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFVBQVUsS0FBSyxXQUFXLElBQUksVUFBVSxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUVwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsU0FBUztZQUVqQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUMvRCxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZO29CQUFFLFNBQVM7Z0JBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3hCLENBQUMsUUFBUSxDQUFDLE9BQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUN0RSxDQUFDO2dCQUVGLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztvQkFDbEMsTUFBTSxFQUFFLFlBQVk7b0JBQ3BCLEtBQUssRUFBRSxzQkFBc0I7b0JBQzdCLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsT0FBTyxRQUFRLENBQUMsT0FBTyxlQUFlLFFBQVEsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztvQkFDdEgsSUFBSSxFQUFFLE9BQU87b0JBQ2IsVUFBVSxFQUFFLGdCQUFnQjtvQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNqQixJQUFJLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxRQUFRLEVBQUU7aUJBQzFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGdDQUFnQyxJQUFJLENBQUMsb0JBQW9CLEtBQU0sR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUN2RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQWpFWSx3REFBc0I7QUFXM0I7SUFETCxJQUFBLGVBQUksRUFBQyx5QkFBYyxDQUFDLGdCQUFnQixDQUFDOzs7O2tFQXNEckM7aUNBaEVVLHNCQUFzQjtJQURsQyxJQUFBLG1CQUFVLEdBQUU7SUFLUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsdURBQXNCLENBQUMsQ0FBQTt5REFDbkIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ0gsMENBQW1CLG9CQUFuQiwwQ0FBbUIsb0RBQzNCLDBCQUFXLG9CQUFYLDBCQUFXO0dBUHZCLHNCQUFzQixDQWlFbEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDcm9uLCBDcm9uRXhwcmVzc2lvbiB9IGZyb20gJ0BuZXN0anMvc2NoZWR1bGUnO1xyXG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgUmVwb3NpdG9yeSwgQmV0d2VlbiB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyL3VzZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEdWVEYXRlUmVtaW5kZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoRHVlRGF0ZVJlbWluZGVyU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVJldmlzaW9uKVxyXG4gICAgcHJpdmF0ZSByZXZpc2lvblJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZXZpc2lvbj4sXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgQENyb24oQ3JvbkV4cHJlc3Npb24uRVZFUllfREFZX0FUXzhBTSlcclxuICBhc3luYyBzZW5kRHVlRGF0ZVJlbWluZGVycygpIHtcclxuICAgIHRoaXMubG9nZ2VyLmxvZygnUnVubmluZyBkdWUgZGF0ZSByZW1pbmRlciBjaGVjay4uLicpO1xyXG5cclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB0aHJlZURheXNMYXRlciA9IG5ldyBEYXRlKG5vdyk7XHJcbiAgICB0aHJlZURheXNMYXRlci5zZXREYXRlKHRocmVlRGF5c0xhdGVyLmdldERhdGUoKSArIDMpO1xyXG5cclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBkdWVEYXRlOiBCZXR3ZWVuKG5vdywgdGhyZWVEYXlzTGF0ZXIpLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnLCAnY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcicsICdzdGF0dXMnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyLmxvZyhcclxuICAgICAgYEZvdW5kICR7cmV2aXNpb25zLmxlbmd0aH0gY29ycmVzcG9uZGVuY2VzIGFwcHJvYWNoaW5nIGR1ZSBkYXRlYFxyXG4gICAgKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJldmlzaW9uIG9mIHJldmlzaW9ucykge1xyXG4gICAgICBjb25zdCBjb3JyID0gcmV2aXNpb24uY29ycmVzcG9uZGVuY2U7XHJcbiAgICAgIGlmICghY29ycikgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmV2aXNpb24uc3RhdHVzPy5zdGF0dXNDb2RlID8/ICcnO1xyXG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gJ0NBTkNFTExFRCcgfHwgc3RhdHVzQ29kZSA9PT0gJ0NMQk9XTicpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCFjb3JyLm9yaWdpbmF0b3JJZCkgY29udGludWU7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnKFxyXG4gICAgICAgICAgY29yci5vcmlnaW5hdG9ySWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghdGFyZ2V0VXNlcklkKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF5c0xlZnQgPSBNYXRoLmNlaWwoXHJcbiAgICAgICAgICAocmV2aXNpb24uZHVlRGF0ZSEuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCh7XHJcbiAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgIHRpdGxlOiAnRHVlIERhdGUgQXBwcm9hY2hpbmcnLFxyXG4gICAgICAgICAgbWVzc2FnZTogYCR7Y29yci5jb3JyZXNwb25kZW5jZU51bWJlcn0g4oCUIFwiJHtyZXZpc2lvbi5zdWJqZWN0fVwiIGlzIGR1ZSBpbiAke2RheXNMZWZ0fSBkYXkke2RheXNMZWZ0ID09PSAxID8gJycgOiAncyd9LmAsXHJcbiAgICAgICAgICB0eXBlOiAnRU1BSUwnLFxyXG4gICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgIGVudGl0eUlkOiBjb3JyLmlkLFxyXG4gICAgICAgICAgbGluazogYC9jb3JyZXNwb25kZW5jZXMvJHtjb3JyLnB1YmxpY0lkfWAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBgRHVlIGRhdGUgcmVtaW5kZXIgZmFpbGVkIGZvciAke2NvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXJ9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913.map new file mode 100644 index 0000000..3dca5df --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/duedatereminderservice_e92736215f5694b692ef5aa73860c913.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\r\nimport { Cron, CronExpression } from '@nestjs/schedule';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, Between } from 'typeorm';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\n@Injectable()\r\nexport class DueDateReminderService {\r\n private readonly logger = new Logger(DueDateReminderService.name);\r\n\r\n constructor(\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n private notificationService: NotificationService,\r\n private userService: UserService\r\n ) {}\r\n\r\n @Cron(CronExpression.EVERY_DAY_AT_8AM)\r\n async sendDueDateReminders() {\r\n this.logger.log('Running due date reminder check...');\r\n\r\n const now = new Date();\r\n const threeDaysLater = new Date(now);\r\n threeDaysLater.setDate(threeDaysLater.getDate() + 3);\r\n\r\n const revisions = await this.revisionRepo.find({\r\n where: {\r\n isCurrent: true,\r\n dueDate: Between(now, threeDaysLater),\r\n },\r\n relations: ['correspondence', 'correspondence.originator', 'status'],\r\n });\r\n\r\n this.logger.log(\r\n `Found ${revisions.length} correspondences approaching due date`\r\n );\r\n\r\n for (const revision of revisions) {\r\n const corr = revision.correspondence;\r\n if (!corr) continue;\r\n\r\n const statusCode = revision.status?.statusCode ?? '';\r\n if (statusCode === 'CANCELLED' || statusCode === 'CLBOWN') continue;\r\n\r\n if (!corr.originatorId) continue;\r\n\r\n try {\r\n const targetUserId = await this.userService.findDocControlIdByOrg(\r\n corr.originatorId\r\n );\r\n if (!targetUserId) continue;\r\n\r\n const daysLeft = Math.ceil(\r\n (revision.dueDate!.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)\r\n );\r\n\r\n await this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Due Date Approaching',\r\n message: `${corr.correspondenceNumber} — \"${revision.subject}\" is due in ${daysLeft} day${daysLeft === 1 ? '' : 's'}.`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: corr.id,\r\n link: `/correspondences/${corr.publicId}`,\r\n });\r\n } catch (err) {\r\n this.logger.warn(\r\n `Due date reminder failed for ${corr.correspondenceNumber}: ${(err as Error).message}`\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422 new file mode 100644 index 0000000..556a610 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422 @@ -0,0 +1,75 @@ +ce82c3a571f9064abc6f276907e30932 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberError = void 0; +const typeorm_1 = require("typeorm"); +let DocumentNumberError = class DocumentNumberError { +}; +exports.DocumentNumberError = DocumentNumberError; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberError.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'error_type', + type: 'enum', + enum: [ + 'LOCK_TIMEOUT', + 'VERSION_CONFLICT', + 'DB_ERROR', + 'REDIS_ERROR', + 'VALIDATION_ERROR', + 'SEQUENCE_EXHAUSTED', + 'RESERVATION_EXPIRED', + 'DUPLICATE_NUMBER', + 'GENERATE_ERROR', + ], + }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "errorType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'error_message', type: 'text' }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "errorMessage", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'stack_trace', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "stackTrace", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'context_data', type: 'json', nullable: true }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], DocumentNumberError.prototype, "contextData", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberError.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', length: 45, nullable: true }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberError.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'resolved_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], DocumentNumberError.prototype, "resolvedAt", void 0); +exports.DocumentNumberError = DocumentNumberError = __decorate([ + (0, typeorm_1.Entity)('document_number_errors'), + (0, typeorm_1.Index)(['errorType']), + (0, typeorm_1.Index)(['createdAt']), + (0, typeorm_1.Index)(['userId']) +], DocumentNumberError); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWVycm9yLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBTVYsSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBbUI7Q0F5Qy9CLENBQUE7QUF6Q1ksa0RBQW1CO0FBRTlCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0NBQ2I7QUFpQlo7SUFmQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRTtZQUNKLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsVUFBVTtZQUNWLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsZ0JBQWdCO1NBQ2pCO0tBQ0YsQ0FBQzs7c0RBQ2lCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O3lEQUMxQjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3VEQUMxQztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELE1BQU0sb0JBQU4sTUFBTTt3REFBa0I7QUFHdEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzVCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQ3hDO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDdEQsSUFBSSxvQkFBSixJQUFJO3VEQUFDOzhCQXhDUCxtQkFBbUI7SUFKL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0lBQ2hDLElBQUEsZUFBSyxFQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQixJQUFBLGVBQUssRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0dBQ0wsbUJBQW1CLENBeUMvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXGVudGl0aWVzXFxkb2N1bWVudC1udW1iZXItZXJyb3IuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBJbmRleCxcbn0gZnJvbSAndHlwZW9ybSc7XG5cbkBFbnRpdHkoJ2RvY3VtZW50X251bWJlcl9lcnJvcnMnKVxuQEluZGV4KFsnZXJyb3JUeXBlJ10pXG5ASW5kZXgoWydjcmVhdGVkQXQnXSlcbkBJbmRleChbJ3VzZXJJZCddKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50TnVtYmVyRXJyb3Ige1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdlcnJvcl90eXBlJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogW1xuICAgICAgJ0xPQ0tfVElNRU9VVCcsXG4gICAgICAnVkVSU0lPTl9DT05GTElDVCcsXG4gICAgICAnREJfRVJST1InLFxuICAgICAgJ1JFRElTX0VSUk9SJyxcbiAgICAgICdWQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICdTRVFVRU5DRV9FWEhBVVNURUQnLFxuICAgICAgJ1JFU0VSVkFUSU9OX0VYUElSRUQnLFxuICAgICAgJ0RVUExJQ0FURV9OVU1CRVInLFxuICAgICAgJ0dFTkVSQVRFX0VSUk9SJyxcbiAgICBdLFxuICB9KVxuICBlcnJvclR5cGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdlcnJvcl9tZXNzYWdlJywgdHlwZTogJ3RleHQnIH0pXG4gIGVycm9yTWVzc2FnZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YWNrX3RyYWNlJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29udGV4dF9kYXRhJywgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXNlcl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVzZXJJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lwX2FkZHJlc3MnLCBsZW5ndGg6IDQ1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBpcEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Jlc29sdmVkX2F0JywgdHlwZTogJ3RpbWVzdGFtcCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlc29sdmVkQXQ/OiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422.map new file mode 100644 index 0000000..9621e5b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/documentnumbererrorentity_ead431100796cc33dbb58d8c9b26e422.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-error.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAMV,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAyC/B,CAAA;AAzCY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,GAAE;;+CACb;AAiBZ;IAfC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE;YACJ,cAAc;YACd,kBAAkB;YAClB,UAAU;YACV,aAAa;YACb,kBAAkB;YAClB,oBAAoB;YACpB,qBAAqB;YACrB,kBAAkB;YAClB,gBAAgB;SACjB;KACF,CAAC;;sDACiB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC1C;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;wDAAkB;AAGtC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACxC;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACtD,IAAI,oBAAJ,IAAI;uDAAC;8BAxCP,mBAAmB;IAJ/B,IAAA,gBAAM,EAAC,wBAAwB,CAAC;IAChC,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,CAAC;IACpB,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,CAAC;IACpB,IAAA,eAAK,EAAC,CAAC,QAAQ,CAAC,CAAC;GACL,mBAAmB,CAyC/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-error.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('document_number_errors')\n@Index(['errorType'])\n@Index(['createdAt'])\n@Index(['userId'])\nexport class DocumentNumberError {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({\n name: 'error_type',\n type: 'enum',\n enum: [\n 'LOCK_TIMEOUT',\n 'VERSION_CONFLICT',\n 'DB_ERROR',\n 'REDIS_ERROR',\n 'VALIDATION_ERROR',\n 'SEQUENCE_EXHAUSTED',\n 'RESERVATION_EXPIRED',\n 'DUPLICATE_NUMBER',\n 'GENERATE_ERROR',\n ],\n })\n errorType!: string;\n\n @Column({ name: 'error_message', type: 'text' })\n errorMessage!: string;\n\n @Column({ name: 'stack_trace', type: 'text', nullable: true })\n stackTrace?: string;\n\n @Column({ name: 'context_data', type: 'json', nullable: true })\n contextData?: Record;\n\n @Column({ name: 'user_id', nullable: true })\n userId?: number;\n\n @Column({ name: 'ip_address', length: 45, nullable: true })\n ipAddress?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'resolved_at', type: 'timestamp', nullable: true })\n resolvedAt?: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade new file mode 100644 index 0000000..7a20fb4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade @@ -0,0 +1,127 @@ +d0160eb46eefc40be7ec59f301171280 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingRevision = void 0; +const typeorm_1 = require("typeorm"); +const shop_drawing_entity_1 = require("./shop-drawing.entity"); +const contract_drawing_entity_1 = require("./contract-drawing.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ShopDrawingRevision = class ShopDrawingRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ShopDrawingRevision = ShopDrawingRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'shop_drawing_id' }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "shopDrawingId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'title', length: 255 }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'legacy_drawing_number', length: 100, nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "legacyDrawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', length: 10, nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingRevision.prototype, "revisionDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_current', + type: 'boolean', + nullable: true, + default: null, + }), + __metadata("design:type", Object) +], ShopDrawingRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_entity_1.ShopDrawing, (shopDrawing) => shopDrawing.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'shop_drawing_id' }), + __metadata("design:type", typeof (_c = typeof shop_drawing_entity_1.ShopDrawing !== "undefined" && shop_drawing_entity_1.ShopDrawing) === "function" ? _c : Object) +], ShopDrawingRevision.prototype, "shopDrawing", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], ShopDrawingRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], ShopDrawingRevision.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => contract_drawing_entity_1.ContractDrawing), + (0, typeorm_1.JoinTable)({ + name: 'shop_drawing_revision_contract_refs', + joinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'contract_drawing_id', + referencedColumnName: 'id', + }, + }), + __metadata("design:type", Array) +], ShopDrawingRevision.prototype, "contractDrawings", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'shop_drawing_revision_attachments', + joinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], ShopDrawingRevision.prototype, "attachments", void 0); +exports.ShopDrawingRevision = ShopDrawingRevision = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_revisions'), + (0, typeorm_1.Unique)(['shopDrawingId', 'isCurrent']) +], ShopDrawingRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQiwrREFBb0Q7QUFDcEQsdUVBQTREO0FBQzVELCtGQUFxRjtBQUNyRixpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUlyQyxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFvQixTQUFRLGlDQUFjO0NBb0Z0RCxDQUFBO0FBcEZZLGtEQUFtQjtBQUc5QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzsrQ0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzBEQUNiO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzJEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O2tEQUN4QjtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztnRUFDMUM7QUFHN0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBEQUN4QztBQUd2QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELElBQUksb0JBQUosSUFBSTt5REFBQztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt3REFDcEI7QUFHckI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFRakI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOztzREFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQzVCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NEQUM1QjtBQU9uQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxpQ0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO1FBQ3BFLFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUM7SUFDRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIsaUNBQVcsb0JBQVgsaUNBQVc7d0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO29EQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO29EQUFDO0FBZWY7SUFaQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMseUNBQWUsQ0FBQztJQUNqQyxJQUFBLG1CQUFTLEVBQUM7UUFDVCxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtRQUNELGlCQUFpQixFQUFFO1lBQ2pCLElBQUksRUFBRSxxQkFBcUI7WUFDM0Isb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtLQUNGLENBQUM7OzZEQUNtQztBQVlyQztJQVRDLElBQUEsb0JBQVUsRUFBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBVSxDQUFDO0lBQzVCLElBQUEsbUJBQVMsRUFBQztRQUNULElBQUksRUFBRSxtQ0FBbUM7UUFDekMsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxvQkFBb0IsRUFBRSxJQUFJO1NBQzNCO1FBQ0QsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRTtLQUN6RSxDQUFDOzt3REFDeUI7OEJBbkZoQixtQkFBbUI7SUFGL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0lBQ2hDLElBQUEsZ0JBQU0sRUFBQyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztHQUMxQixtQkFBbUIsQ0FvRi9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxzaG9wLWRyYXdpbmctcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbiAgVW5pcXVlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFNob3BEcmF3aW5nIH0gZnJvbSAnLi9zaG9wLWRyYXdpbmcuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZyB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy5lbnRpdHknO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdzaG9wX2RyYXdpbmdfcmV2aXNpb25zJylcbkBVbmlxdWUoWydzaG9wRHJhd2luZ0lkJywgJ2lzQ3VycmVudCddKVxuZXhwb3J0IGNsYXNzIFNob3BEcmF3aW5nUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Nob3BfZHJhd2luZ19pZCcgfSlcbiAgc2hvcERyYXdpbmdJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICd0aXRsZScsIGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGVnYWN5X2RyYXdpbmdfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGxlZ2FjeURyYXdpbmdOdW1iZXI/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXZpc2lvbl9sYWJlbCcsIGxlbmd0aDogMTAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJldmlzaW9uTGFiZWw/OiBzdHJpbmc7IC8vIG51bGxhYmxlIOC5g+C4iuC5iSA/XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXZpc2lvbl9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpc2lvbkRhdGU/OiBEYXRlOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2lzX2N1cnJlbnQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICBkZWZhdWx0OiBudWxsLFxuICB9KVxuICBpc0N1cnJlbnQ/OiBib29sZWFuIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nLCAoc2hvcERyYXdpbmcpID0+IHNob3BEcmF3aW5nLnJldmlzaW9ucywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Nob3BfZHJhd2luZ19pZCcgfSlcbiAgc2hvcERyYXdpbmchOiBTaG9wRHJhd2luZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknIH0pXG4gIGNyZWF0b3I/OiBVc2VyO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScgfSlcbiAgdXBkYXRlcj86IFVzZXI7XG5cbiAgLy8gUmVmZXJlbmNlcyB0byBDb250cmFjdCBEcmF3aW5ncyAoTTpOKVxuICBATWFueVRvTWFueSgoKSA9PiBDb250cmFjdERyYXdpbmcpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdzaG9wX2RyYXdpbmdfcmV2aXNpb25fY29udHJhY3RfcmVmcycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7XG4gICAgICBuYW1lOiAnY29udHJhY3RfZHJhd2luZ19pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICB9KVxuICBjb250cmFjdERyYXdpbmdzITogQ29udHJhY3REcmF3aW5nW107IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgLy8gQXR0YWNobWVudHMgKE06TilcbiAgQE1hbnlUb01hbnkoKCkgPT4gQXR0YWNobWVudClcbiAgQEpvaW5UYWJsZSh7XG4gICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9hdHRhY2htZW50cycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7IG5hbWU6ICdhdHRhY2htZW50X2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcgfSxcbiAgfSlcbiAgYXR0YWNobWVudHMhOiBBdHRhY2htZW50W107IC8vIOC5gOC4leC4tOC4oSAhICjguJXguLHguKfguJfguLXguYggZXJyb3IpXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade.map new file mode 100644 index 0000000..1238784 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/shopdrawingrevisionentity_ea591a1eae98ae8e4c3321bda804eade.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n Unique,\n} from 'typeorm';\nimport { ShopDrawing } from './shop-drawing.entity';\nimport { ContractDrawing } from './contract-drawing.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('shop_drawing_revisions')\n@Unique(['shopDrawingId', 'isCurrent'])\nexport class ShopDrawingRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // เติม !\n\n @Column({ name: 'shop_drawing_id' })\n shopDrawingId!: number; // เติม !\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // เติม !\n\n @Column({ name: 'title', length: 255 })\n title!: string; // เติม !\n\n @Column({ name: 'legacy_drawing_number', length: 100, nullable: true })\n legacyDrawingNumber?: string;\n\n @Column({ name: 'revision_label', length: 10, nullable: true })\n revisionLabel?: string; // nullable ใช้ ?\n\n @Column({ name: 'revision_date', type: 'date', nullable: true })\n revisionDate?: Date; // nullable ใช้ ?\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable ใช้ ?\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @Column({\n name: 'is_current',\n type: 'boolean',\n nullable: true,\n default: null,\n })\n isCurrent?: boolean | null;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => ShopDrawing, (shopDrawing) => shopDrawing.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'shop_drawing_id' })\n shopDrawing!: ShopDrawing; // เติม !\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n // References to Contract Drawings (M:N)\n @ManyToMany(() => ContractDrawing)\n @JoinTable({\n name: 'shop_drawing_revision_contract_refs',\n joinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: {\n name: 'contract_drawing_id',\n referencedColumnName: 'id',\n },\n })\n contractDrawings!: ContractDrawing[]; // เติม !\n\n // Attachments (M:N)\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'shop_drawing_revision_attachments',\n joinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[]; // เติม ! (ตัวที่ error)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516 new file mode 100644 index 0000000..103b938 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516 @@ -0,0 +1,133 @@ +d6ef7e254993d7b4929678c51729d095 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var VirtualColumnService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VirtualColumnService = void 0; +// File: src/modules/json-schema/services/virtual-column.service.ts +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +let VirtualColumnService = VirtualColumnService_1 = class VirtualColumnService { + constructor(dataSource) { + this.dataSource = dataSource; + this.logger = new common_1.Logger(VirtualColumnService_1.name); + } + /** + * สร้าง/อัปเดต Virtual Columns และ Index บน Database จริง + */ + async setupVirtualColumns(tableName, configs) { + if (!configs || configs.length === 0) + return; + // ใช้ QueryRunner เพื่อให้จัดการ Transaction หรือ Connection ได้ละเอียด + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + try { + this.logger.log(`Start setting up virtual columns for table '${tableName}'...`); + // 1. ตรวจสอบว่าตารางมีอยู่จริงไหม + const tableExists = await queryRunner.hasTable(tableName); + if (!tableExists) { + this.logger.warn(`Table '${tableName}' not found. Skipping virtual columns.`); + return; + } + for (const config of configs) { + await this.ensureVirtualColumn(queryRunner, tableName, config); + if (config.indexType) { + await this.ensureIndex(queryRunner, tableName, config); + } + } + this.logger.log(`Finished setting up virtual columns for '${tableName}'.`); + } + catch (err) { + this.logger.error(`Failed to setup virtual columns: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err.stack : undefined); + throw err; + } + finally { + await queryRunner.release(); + } + } + /** + * สร้าง Column ถ้ายังไม่มี + */ + async ensureVirtualColumn(queryRunner, tableName, config) { + const hasColumn = await queryRunner.hasColumn(tableName, config.columnName); + if (!hasColumn) { + const sql = this.generateAddColumnSql(tableName, config); + this.logger.log(`Executing: ${sql}`); + await queryRunner.query(sql); + } + else { + // TODO: (Advance) ถ้ามี Column แล้ว แต่ Definition เปลี่ยน อาจต้อง ALTER MODIFY + this.logger.debug(`Column '${config.columnName}' already exists in '${tableName}'.`); + } + } + /** + * สร้าง Index ถ้ายังไม่มี + */ + async ensureIndex(queryRunner, tableName, config) { + const indexName = `idx_${tableName}_${config.columnName}`; + // ตรวจสอบว่า Index มีอยู่จริงไหม (Query จาก information_schema เพื่อความชัวร์) + const checkIndexSql = ` + SELECT COUNT(1) as count + FROM information_schema.STATISTICS + WHERE table_schema = DATABASE() + AND table_name = ? + AND index_name = ? + `; + const result = (await queryRunner.query(checkIndexSql, [ + tableName, + indexName, + ])); + if (result[0]?.count === 0) { + const sql = `CREATE ${config.indexType === 'UNIQUE' ? 'UNIQUE' : ''} INDEX ${indexName} ON ${tableName} (${config.columnName})`; + this.logger.log(`Creating Index: ${sql}`); + await queryRunner.query(sql); + } + } + /** + * Generate SQL สำหรับ MariaDB 10.11 Virtual Column + * Syntax: ADD COLUMN name type GENERATED ALWAYS AS (expr) VIRTUAL + */ + generateAddColumnSql(tableName, config) { + const dbType = this.mapDataTypeToSql(config.dataType); + // JSON_UNQUOTE(JSON_EXTRACT(details, '$.path')) + // ใช้ 'details' เป็นชื่อ column JSON หลัก (ต้องตรงกับ Database Schema ที่ออกแบบไว้) + const expression = `JSON_UNQUOTE(JSON_EXTRACT(details, '${config.jsonPath}'))`; + // Handle Type Casting inside expression if needed, + // but usually MariaDB handles string return from JSON_EXTRACT. + // For INT/DATE, virtual column type definition enforces it. + return `ALTER TABLE ${tableName} ADD COLUMN ${config.columnName} ${dbType} GENERATED ALWAYS AS (${expression}) VIRTUAL`; + } + mapDataTypeToSql(type) { + switch (type) { + case 'INT': + return 'INT'; + case 'VARCHAR': + return 'VARCHAR(255)'; + case 'BOOLEAN': + return 'TINYINT(1)'; + case 'DATE': + return 'DATE'; + case 'DATETIME': + return 'DATETIME'; + case 'DECIMAL': + return 'DECIMAL(10,2)'; + default: + return 'VARCHAR(255)'; + } + } +}; +exports.VirtualColumnService = VirtualColumnService; +exports.VirtualColumnService = VirtualColumnService = VirtualColumnService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_1.DataSource !== "undefined" && typeorm_1.DataSource) === "function" ? _a : Object]) +], VirtualColumnService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx2aXJ0dWFsLWNvbHVtbi5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUVBQW1FO0FBQ25FLDJDQUFvRDtBQUNwRCxxQ0FBa0Q7QUFJM0MsSUFBTSxvQkFBb0IsNEJBQTFCLE1BQU0sb0JBQW9CO0lBRy9CLFlBQTZCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFGbEMsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLHNCQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRVYsQ0FBQztJQUV2RDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLE9BQThCO1FBQ3pFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUU3Qyx3RUFBd0U7UUFDeEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLCtDQUErQyxTQUFTLE1BQU0sQ0FDL0QsQ0FBQztZQUVGLGtDQUFrQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxVQUFVLFNBQVMsd0NBQXdDLENBQzVELENBQUM7Z0JBQ0YsT0FBTztZQUNULENBQUM7WUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFF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QUFNLFVBQVUsR0FBRyx1Q0FBdUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxDQUFDO1FBRS9FLG1EQUFtRDtRQUNuRCwrREFBK0Q7UUFDL0QsNERBQTREO1FBRTVELE9BQU8sZUFBZSxTQUFTLGVBQWUsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLHlCQUF5QixVQUFVLFdBQVcsQ0FBQztJQUMxSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLEtBQUssU0FBUztnQkFDWixPQUFPLFlBQVksQ0FBQztZQUN0QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssU0FBUztnQkFDWixPQUFPLGVBQWUsQ0FBQztZQUN6QjtnQkFDRSxPQUFPLGNBQWMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUE3SVksb0RBQW9COytCQUFwQixvQkFBb0I7SUFEaEMsSUFBQSxtQkFBVSxHQUFFO3lEQUk4QixvQkFBVSxvQkFBVixvQkFBVTtHQUh4QyxvQkFBb0IsQ0E2SWhDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxzZXJ2aWNlc1xcdmlydHVhbC1jb2x1bW4uc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9zZXJ2aWNlcy92aXJ0dWFsLWNvbHVtbi5zZXJ2aWNlLnRzXHJcbmltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgRGF0YVNvdXJjZSwgUXVlcnlSdW5uZXIgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgVmlydHVhbENvbHVtbkNvbmZpZyB9IGZyb20gJy4uL2VudGl0aWVzL2pzb24tc2NoZW1hLmVudGl0eSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsQ29sdW1uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFZpcnR1YWxDb2x1bW5TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4quC4o+C5ieC4suC4hy/guK3guLHguJvguYDguJTguJUgVmlydHVhbCBDb2x1bW5zIOC5geC4peC4sCBJbmRleCDguJrguJkgRGF0YWJhc2Ug4LiI4Lij4Li04LiHXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0dXBWaXJ0dWFsQ29sdW1ucyh0YWJsZU5hbWU6IHN0cmluZywgY29uZmlnczogVmlydHVhbENvbHVtbkNvbmZpZ1tdKSB7XHJcbiAgICBpZiAoIWNvbmZpZ3MgfHwgY29uZmlncy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyDguYPguIrguYkgUXVlcnlSdW5uZXIg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJ4LiI4Lix4LiU4LiB4Liy4LijIFRyYW5zYWN0aW9uIOC4q+C4o+C4t+C4rSBDb25uZWN0aW9uIOC5hOC4lOC5ieC4peC4sOC5gOC4reC4teC4ouC4lFxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgYFN0YXJ0IHNldHRpbmcgdXAgdmlydHVhbCBjb2x1bW5zIGZvciB0YWJsZSAnJHt0YWJsZU5hbWV9Jy4uLmBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIDEuIOC4leC4o+C4p+C4iOC4quC4reC4muC4p+C5iOC4suC4leC4suC4o+C4suC4h+C4oeC4teC4reC4ouC4ueC5iOC4iOC4o+C4tOC4h+C5hOC4q+C4oVxyXG4gICAgICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IHF1ZXJ5UnVubmVyLmhhc1RhYmxlKHRhYmxlTmFtZSk7XHJcbiAgICAgIGlmICghdGFibGVFeGlzdHMpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYFRhYmxlICcke3RhYmxlTmFtZX0nIG5vdCBmb3VuZC4gU2tpcHBpbmcgdmlydHVhbCBjb2x1bW5zLmBcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlVmlydHVhbENvbHVtbihxdWVyeVJ1bm5lciwgdGFibGVOYW1lLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLmluZGV4VHlwZSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleChxdWVyeVJ1bm5lciwgdGFibGVOYW1lLCBjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICAgIGBGaW5pc2hlZCBzZXR0aW5nIHVwIHZpcnR1YWwgY29sdW1ucyBmb3IgJyR7dGFibGVOYW1lfScuYFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gc2V0dXAgdmlydHVhbCBjb2x1bW5zOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxyXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4quC4o+C5ieC4suC4hyBDb2x1bW4g4LiW4LmJ4Liy4Lii4Lix4LiH4LmE4Lih4LmI4Lih4Li1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVWaXJ0dWFsQ29sdW1uKFxyXG4gICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxyXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgICBjb25maWc6IFZpcnR1YWxDb2x1bW5Db25maWdcclxuICApIHtcclxuICAgIGNvbnN0IGhhc0NvbHVtbiA9IGF3YWl0IHF1ZXJ5UnVubmVyLmhhc0NvbHVtbih0YWJsZU5hbWUsIGNvbmZpZy5jb2x1bW5OYW1lKTtcclxuXHJcbiAgICBpZiAoIWhhc0NvbHVtbikge1xyXG4gICAgICBjb25zdCBzcWwgPSB0aGlzLmdlbmVyYXRlQWRkQ29sdW1uU3FsKHRhYmxlTmFtZSwgY29uZmlnKTtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKGBFeGVjdXRpbmc6ICR7c3FsfWApO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5xdWVyeShzcWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogKEFkdmFuY2UpIOC4luC5ieC4suC4oeC4tSBDb2x1bW4g4LmB4Lil4LmJ4LinIOC5geC4leC5iCBEZWZpbml0aW9uIOC5gOC4m+C4peC4teC5iOC4ouC4mSDguK3guLLguIjguJXguYnguK3guIcgQUxURVIgTU9ESUZZXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxyXG4gICAgICAgIGBDb2x1bW4gJyR7Y29uZmlnLmNvbHVtbk5hbWV9JyBhbHJlYWR5IGV4aXN0cyBpbiAnJHt0YWJsZU5hbWV9Jy5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKrguKPguYnguLLguIcgSW5kZXgg4LiW4LmJ4Liy4Lii4Lix4LiH4LmE4Lih4LmI4Lih4Li1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbmRleChcclxuICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcclxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBWaXJ0dWFsQ29sdW1uQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBjb25zdCBpbmRleE5hbWUgPSBgaWR4XyR7dGFibGVOYW1lfV8ke2NvbmZpZy5jb2x1bW5OYW1lfWA7XHJcblxyXG4gICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIEluZGV4IOC4oeC4teC4reC4ouC4ueC5iOC4iOC4o+C4tOC4h+C5hOC4q+C4oSAoUXVlcnkg4LiI4Liy4LiBIGluZm9ybWF0aW9uX3NjaGVtYSDguYDguJ7guLfguYjguK3guITguKfguLLguKHguIrguLHguKfguKPguYwpXHJcbiAgICBjb25zdCBjaGVja0luZGV4U3FsID0gYFxyXG4gICAgICBTRUxFQ1QgQ09VTlQoMSkgYXMgY291bnRcclxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuU1RBVElTVElDU1xyXG4gICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpXHJcbiAgICAgIEFORCB0YWJsZV9uYW1lID0gP1xyXG4gICAgICBBTkQgaW5kZXhfbmFtZSA9ID9cclxuICAgIGA7XHJcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoY2hlY2tJbmRleFNxbCwgW1xyXG4gICAgICB0YWJsZU5hbWUsXHJcbiAgICAgIGluZGV4TmFtZSxcclxuICAgIF0pKSBhcyB7IGNvdW50OiBudW1iZXIgfVtdO1xyXG5cclxuICAgIGlmIChyZXN1bHRbMF0/LmNvdW50ID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHNxbCA9IGBDUkVBVEUgJHtjb25maWcuaW5kZXhUeXBlID09PSAnVU5JUVVFJyA/ICdVTklRVUUnIDogJyd9IElOREVYICR7aW5kZXhOYW1lfSBPTiAke3RhYmxlTmFtZX0gKCR7Y29uZmlnLmNvbHVtbk5hbWV9KWA7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhgQ3JlYXRpbmcgSW5kZXg6ICR7c3FsfWApO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5xdWVyeShzcWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgU1FMIOC4quC4s+C4q+C4o+C4seC4miBNYXJpYURCIDEwLjExIFZpcnR1YWwgQ29sdW1uXHJcbiAgICogU3ludGF4OiBBREQgQ09MVU1OIG5hbWUgdHlwZSBHRU5FUkFURUQgQUxXQVlTIEFTIChleHByKSBWSVJUVUFMXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUFkZENvbHVtblNxbChcclxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBWaXJ0dWFsQ29sdW1uQ29uZmlnXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRiVHlwZSA9IHRoaXMubWFwRGF0YVR5cGVUb1NxbChjb25maWcuZGF0YVR5cGUpO1xyXG4gICAgLy8gSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5wYXRoJykpXHJcbiAgICAvLyDguYPguIrguYkgJ2RldGFpbHMnIOC5gOC4m+C5h+C4meC4iuC4t+C5iOC4rSBjb2x1bW4gSlNPTiDguKvguKXguLHguIEgKOC4leC5ieC4reC4h+C4leC4o+C4h+C4geC4seC4miBEYXRhYmFzZSBTY2hlbWEg4LiX4Li14LmI4Lit4Lit4LiB4LmB4Lia4Lia4LmE4Lin4LmJKVxyXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IGBKU09OX1VOUVVPVEUoSlNPTl9FWFRSQUNUKGRldGFpbHMsICcke2NvbmZpZy5qc29uUGF0aH0nKSlgO1xyXG5cclxuICAgIC8vIEhhbmRsZSBUeXBlIENhc3RpbmcgaW5zaWRlIGV4cHJlc3Npb24gaWYgbmVlZGVkLFxyXG4gICAgLy8gYnV0IHVzdWFsbHkgTWFyaWFEQiBoYW5kbGVzIHN0cmluZyByZXR1cm4gZnJvbSBKU09OX0VYVFJBQ1QuXHJcbiAgICAvLyBGb3IgSU5UL0RBVEUsIHZpcnR1YWwgY29sdW1uIHR5cGUgZGVmaW5pdGlvbiBlbmZvcmNlcyBpdC5cclxuXHJcbiAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7Y29uZmlnLmNvbHVtbk5hbWV9ICR7ZGJUeXBlfSBHRU5FUkFURUQgQUxXQVlTIEFTICgke2V4cHJlc3Npb259KSBWSVJUVUFMYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRGF0YVR5cGVUb1NxbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ0lOVCc6XHJcbiAgICAgICAgcmV0dXJuICdJTlQnO1xyXG4gICAgICBjYXNlICdWQVJDSEFSJzpcclxuICAgICAgICByZXR1cm4gJ1ZBUkNIQVIoMjU1KSc7XHJcbiAgICAgIGNhc2UgJ0JPT0xFQU4nOlxyXG4gICAgICAgIHJldHVybiAnVElOWUlOVCgxKSc7XHJcbiAgICAgIGNhc2UgJ0RBVEUnOlxyXG4gICAgICAgIHJldHVybiAnREFURSc7XHJcbiAgICAgIGNhc2UgJ0RBVEVUSU1FJzpcclxuICAgICAgICByZXR1cm4gJ0RBVEVUSU1FJztcclxuICAgICAgY2FzZSAnREVDSU1BTCc6XHJcbiAgICAgICAgcmV0dXJuICdERUNJTUFMKDEwLDIpJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ1ZBUkNIQVIoMjU1KSc7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516.map new file mode 100644 index 0000000..2d70d02 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ed/virtualcolumnservice_ed232263455f8d2f2cd64638606de516.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\virtual-column.service.ts","mappings":";;;;;;;;;;;;;;AAAA,mEAAmE;AACnE,2CAAoD;AACpD,qCAAkD;AAI3C,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAG/B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QAFlC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAEV,CAAC;IAEvD;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,OAA8B;QACzE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7C,wEAAwE;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACxD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+CAA+C,SAAS,MAAM,CAC/D,CAAC;YAEF,kCAAkC;YAClC,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,UAAU,SAAS,wCAAwC,CAC5D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAE/D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,4CAA4C,SAAS,IAAI,CAC1D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC7C,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,WAAwB,EACxB,SAAiB,EACjB,MAA2B;QAE3B,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAE5E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,gFAAgF;YAChF,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,WAAW,MAAM,CAAC,UAAU,wBAAwB,SAAS,IAAI,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACvB,WAAwB,EACxB,SAAiB,EACjB,MAA2B;QAE3B,MAAM,SAAS,GAAG,OAAO,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1D,+EAA+E;QAC/E,MAAM,aAAa,GAAG;;;;;;KAMrB,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE;YACrD,SAAS;YACT,SAAS;SACV,CAAC,CAAwB,CAAC;QAE3B,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,UAAU,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,SAAS,OAAO,SAAS,KAAK,MAAM,CAAC,UAAU,GAAG,CAAC;YAChI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAC1C,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAC1B,SAAiB,EACjB,MAA2B;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,gDAAgD;QAChD,oFAAoF;QACpF,MAAM,UAAU,GAAG,uCAAuC,MAAM,CAAC,QAAQ,KAAK,CAAC;QAE/E,mDAAmD;QACnD,+DAA+D;QAC/D,4DAA4D;QAE5D,OAAO,eAAe,SAAS,eAAe,MAAM,CAAC,UAAU,IAAI,MAAM,yBAAyB,UAAU,WAAW,CAAC;IAC1H,CAAC;IAEO,gBAAgB,CAAC,IAAY;QACnC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC;YACf,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC;YACxB,KAAK,SAAS;gBACZ,OAAO,YAAY,CAAC;YACtB,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,UAAU;gBACb,OAAO,UAAU,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO,eAAe,CAAC;YACzB;gBACE,OAAO,cAAc,CAAC;QAC1B,CAAC;IACH,CAAC;CACF,CAAA;AA7IY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;yDAI8B,oBAAU,oBAAV,oBAAU;GAHxC,oBAAoB,CA6IhC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\virtual-column.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/virtual-column.service.ts\r\nimport { Injectable, Logger } from '@nestjs/common';\r\nimport { DataSource, QueryRunner } from 'typeorm';\r\nimport { VirtualColumnConfig } from '../entities/json-schema.entity';\r\n\r\n@Injectable()\r\nexport class VirtualColumnService {\r\n private readonly logger = new Logger(VirtualColumnService.name);\r\n\r\n constructor(private readonly dataSource: DataSource) {}\r\n\r\n /**\r\n * สร้าง/อัปเดต Virtual Columns และ Index บน Database จริง\r\n */\r\n async setupVirtualColumns(tableName: string, configs: VirtualColumnConfig[]) {\r\n if (!configs || configs.length === 0) return;\r\n\r\n // ใช้ QueryRunner เพื่อให้จัดการ Transaction หรือ Connection ได้ละเอียด\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n\r\n try {\r\n this.logger.log(\r\n `Start setting up virtual columns for table '${tableName}'...`\r\n );\r\n\r\n // 1. ตรวจสอบว่าตารางมีอยู่จริงไหม\r\n const tableExists = await queryRunner.hasTable(tableName);\r\n if (!tableExists) {\r\n this.logger.warn(\r\n `Table '${tableName}' not found. Skipping virtual columns.`\r\n );\r\n return;\r\n }\r\n\r\n for (const config of configs) {\r\n await this.ensureVirtualColumn(queryRunner, tableName, config);\r\n\r\n if (config.indexType) {\r\n await this.ensureIndex(queryRunner, tableName, config);\r\n }\r\n }\r\n\r\n this.logger.log(\r\n `Finished setting up virtual columns for '${tableName}'.`\r\n );\r\n } catch (err: unknown) {\r\n this.logger.error(\r\n `Failed to setup virtual columns: ${err instanceof Error ? err.message : String(err)}`,\r\n err instanceof Error ? err.stack : undefined\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n /**\r\n * สร้าง Column ถ้ายังไม่มี\r\n */\r\n private async ensureVirtualColumn(\r\n queryRunner: QueryRunner,\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ) {\r\n const hasColumn = await queryRunner.hasColumn(tableName, config.columnName);\r\n\r\n if (!hasColumn) {\r\n const sql = this.generateAddColumnSql(tableName, config);\r\n this.logger.log(`Executing: ${sql}`);\r\n await queryRunner.query(sql);\r\n } else {\r\n // TODO: (Advance) ถ้ามี Column แล้ว แต่ Definition เปลี่ยน อาจต้อง ALTER MODIFY\r\n this.logger.debug(\r\n `Column '${config.columnName}' already exists in '${tableName}'.`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * สร้าง Index ถ้ายังไม่มี\r\n */\r\n private async ensureIndex(\r\n queryRunner: QueryRunner,\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ) {\r\n const indexName = `idx_${tableName}_${config.columnName}`;\r\n\r\n // ตรวจสอบว่า Index มีอยู่จริงไหม (Query จาก information_schema เพื่อความชัวร์)\r\n const checkIndexSql = `\r\n SELECT COUNT(1) as count\r\n FROM information_schema.STATISTICS\r\n WHERE table_schema = DATABASE()\r\n AND table_name = ?\r\n AND index_name = ?\r\n `;\r\n const result = (await queryRunner.query(checkIndexSql, [\r\n tableName,\r\n indexName,\r\n ])) as { count: number }[];\r\n\r\n if (result[0]?.count === 0) {\r\n const sql = `CREATE ${config.indexType === 'UNIQUE' ? 'UNIQUE' : ''} INDEX ${indexName} ON ${tableName} (${config.columnName})`;\r\n this.logger.log(`Creating Index: ${sql}`);\r\n await queryRunner.query(sql);\r\n }\r\n }\r\n\r\n /**\r\n * Generate SQL สำหรับ MariaDB 10.11 Virtual Column\r\n * Syntax: ADD COLUMN name type GENERATED ALWAYS AS (expr) VIRTUAL\r\n */\r\n private generateAddColumnSql(\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ): string {\r\n const dbType = this.mapDataTypeToSql(config.dataType);\r\n // JSON_UNQUOTE(JSON_EXTRACT(details, '$.path'))\r\n // ใช้ 'details' เป็นชื่อ column JSON หลัก (ต้องตรงกับ Database Schema ที่ออกแบบไว้)\r\n const expression = `JSON_UNQUOTE(JSON_EXTRACT(details, '${config.jsonPath}'))`;\r\n\r\n // Handle Type Casting inside expression if needed,\r\n // but usually MariaDB handles string return from JSON_EXTRACT.\r\n // For INT/DATE, virtual column type definition enforces it.\r\n\r\n return `ALTER TABLE ${tableName} ADD COLUMN ${config.columnName} ${dbType} GENERATED ALWAYS AS (${expression}) VIRTUAL`;\r\n }\r\n\r\n private mapDataTypeToSql(type: string): string {\r\n switch (type) {\r\n case 'INT':\r\n return 'INT';\r\n case 'VARCHAR':\r\n return 'VARCHAR(255)';\r\n case 'BOOLEAN':\r\n return 'TINYINT(1)';\r\n case 'DATE':\r\n return 'DATE';\r\n case 'DATETIME':\r\n return 'DATETIME';\r\n case 'DECIMAL':\r\n return 'DECIMAL(10,2)';\r\n default:\r\n return 'VARCHAR(255)';\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8 new file mode 100644 index 0000000..d65b872 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8 @@ -0,0 +1,42 @@ +19c2bf4018ef993662d5343a6296d9d2 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceTag = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +const tag_entity_1 = require("../../master/entities/tag.entity"); +let CorrespondenceTag = class CorrespondenceTag { +}; +exports.CorrespondenceTag = CorrespondenceTag; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceTag.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'tag_id' }), + __metadata("design:type", Number) +], CorrespondenceTag.prototype, "tagId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceTag.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => tag_entity_1.Tag, { onDelete: 'CASCADE', eager: true }), + (0, typeorm_1.JoinColumn)({ name: 'tag_id' }), + __metadata("design:type", typeof (_b = typeof tag_entity_1.Tag !== "undefined" && tag_entity_1.Tag) === "function" ? _b : Object) +], CorrespondenceTag.prototype, "tag", void 0); +exports.CorrespondenceTag = CorrespondenceTag = __decorate([ + (0, typeorm_1.Entity)('correspondence_tags') +], CorrespondenceTag); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10YWcuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBQ3pELGlFQUF1RDtBQUdoRCxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFpQjtDQWM3QixDQUFBO0FBZFksOENBQWlCO0FBRTVCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLENBQUM7OzJEQUNuQjtBQUcxQjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Z0RBQ25CO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsc0NBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN4RCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztrREFDekIsc0NBQWMsb0JBQWQsc0NBQWM7eURBQUM7QUFJaEM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzFELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztrREFDekIsZ0JBQUcsb0JBQUgsZ0JBQUc7OENBQUM7NEJBYkMsaUJBQWlCO0lBRDdCLElBQUEsZ0JBQU0sRUFBQyxxQkFBcUIsQ0FBQztHQUNqQixpQkFBaUIsQ0FjN0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10YWcuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSwgUHJpbWFyeUNvbHVtbiwgTWFueVRvT25lLCBKb2luQ29sdW1uIH0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi8uLi9tYXN0ZXIvZW50aXRpZXMvdGFnLmVudGl0eSc7XHJcblxyXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV90YWdzJylcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlVGFnIHtcclxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcclxuICBjb3JyZXNwb25kZW5jZUlkITogbnVtYmVyO1xyXG5cclxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICd0YWdfaWQnIH0pXHJcbiAgdGFnSWQhOiBudW1iZXI7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxyXG4gIGNvcnJlc3BvbmRlbmNlPzogQ29ycmVzcG9uZGVuY2U7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gVGFnLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScsIGVhZ2VyOiB0cnVlIH0pXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndGFnX2lkJyB9KVxyXG4gIHRhZz86IFRhZztcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8.map new file mode 100644 index 0000000..0120f99 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/correspondencetagentity_ee93e93c3bfb4d1980c001646ec6ace8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-tag.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AACzD,iEAAuD;AAGhD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAc7B,CAAA;AAdY,8CAAiB;AAE5B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;2DACnB;AAG1B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;gDACnB;AAIf;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;kDACzB,sCAAc,oBAAd,sCAAc;yDAAC;AAIhC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,gBAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;kDACzB,gBAAG,oBAAH,gBAAG;8CAAC;4BAbC,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,qBAAqB,CAAC;GACjB,iBAAiB,CAc7B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-tag.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\r\nimport { Correspondence } from './correspondence.entity';\r\nimport { Tag } from '../../master/entities/tag.entity';\r\n\r\n@Entity('correspondence_tags')\r\nexport class CorrespondenceTag {\r\n @PrimaryColumn({ name: 'correspondence_id' })\r\n correspondenceId!: number;\r\n\r\n @PrimaryColumn({ name: 'tag_id' })\r\n tagId!: number;\r\n\r\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\r\n @JoinColumn({ name: 'correspondence_id' })\r\n correspondence?: Correspondence;\r\n\r\n @ManyToOne(() => Tag, { onDelete: 'CASCADE', eager: true })\r\n @JoinColumn({ name: 'tag_id' })\r\n tag?: Tag;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327 new file mode 100644 index 0000000..c3fca76 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327 @@ -0,0 +1,47 @@ +53584d8ebb04cde6b88b778e7c726ac3 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportTransaction = void 0; +const typeorm_1 = require("typeorm"); +let ImportTransaction = class ImportTransaction { +}; +exports.ImportTransaction = ImportTransaction; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ImportTransaction.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Index)('idx_idem_key', { unique: true }), + (0, typeorm_1.Column)({ name: 'idempotency_key', length: 255, unique: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "idempotencyKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, nullable: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'batch_id', length: 100, nullable: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "batchId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', default: 201 }), + __metadata("design:type", Number) +], ImportTransaction.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ImportTransaction.prototype, "createdAt", void 0); +exports.ImportTransaction = ImportTransaction = __decorate([ + (0, typeorm_1.Entity)('import_transactions') +], ImportTransaction); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcaW1wb3J0LXRyYW5zYWN0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBR1YsSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7Q0FtQjdCLENBQUE7QUFuQlksOENBQWlCO0FBRTVCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7NkNBQ2I7QUFJWjtJQUZDLElBQUEsZUFBSyxFQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUN2QztBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7eURBQ3pDO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0RBQ3pDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7O3FEQUMxQjtBQUdwQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtvREFBQzs0QkFsQk4saUJBQWlCO0lBRDdCLElBQUEsZ0JBQU0sRUFBQyxxQkFBcUIsQ0FBQztHQUNqQixpQkFBaUIsQ0FtQjdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZW50aXRpZXNcXGltcG9ydC10cmFuc2FjdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnaW1wb3J0X3RyYW5zYWN0aW9ucycpXG5leHBvcnQgY2xhc3MgSW1wb3J0VHJhbnNhY3Rpb24ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBJbmRleCgnaWR4X2lkZW1fa2V5JywgeyB1bmlxdWU6IHRydWUgfSlcbiAgQENvbHVtbih7IG5hbWU6ICdpZGVtcG90ZW5jeV9rZXknLCBsZW5ndGg6IDI1NSwgdW5pcXVlOiB0cnVlIH0pXG4gIGlkZW1wb3RlbmN5S2V5ITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZG9jdW1lbnRfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYmF0Y2hfaWQnLCBsZW5ndGg6IDEwMCwgbnVsbGFibGU6IHRydWUgfSlcbiAgYmF0Y2hJZCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YXR1c19jb2RlJywgZGVmYXVsdDogMjAxIH0pXG4gIHN0YXR1c0NvZGUhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327.map new file mode 100644 index 0000000..896bae9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/importtransactionentity_ef0b3c735862df86a5f73487e7db8327.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\import-transaction.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAmB7B,CAAA;AAnBY,8CAAiB;AAE5B;IADC,IAAA,gCAAsB,GAAE;;6CACb;AAIZ;IAFC,IAAA,eAAK,EAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;yDACvC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDACzC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACzC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;;qDAC1B;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;oDAAC;4BAlBN,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,qBAAqB,CAAC;GACjB,iBAAiB,CAmB7B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\import-transaction.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('import_transactions')\nexport class ImportTransaction {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Index('idx_idem_key', { unique: true })\n @Column({ name: 'idempotency_key', length: 255, unique: true })\n idempotencyKey!: string;\n\n @Column({ name: 'document_number', length: 100, nullable: true })\n documentNumber!: string;\n\n @Column({ name: 'batch_id', length: 100, nullable: true })\n batchId!: string;\n\n @Column({ name: 'status_code', default: 201 })\n statusCode!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa new file mode 100644 index 0000000..bdb62ce --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa @@ -0,0 +1,31 @@ +4107ffd41799cc491c407852a84c0110 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const native_js_1 = require("./native.js"); +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +function v4(options, buf, offset) { + if (native_js_1.default.randomUUID && !buf && !options) { + return native_js_1.default.randomUUID(); + } + options = options || {}; + const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)(); + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(rnds); +} +exports.default = v4; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjQuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDNUIsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JELE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixNQUFNLElBQUksTUFBTSxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBuYXRpdmVfanNfMSA9IHJlcXVpcmUoXCIuL25hdGl2ZS5qc1wiKTtcbmNvbnN0IHJuZ19qc18xID0gcmVxdWlyZShcIi4vcm5nLmpzXCIpO1xuY29uc3Qgc3RyaW5naWZ5X2pzXzEgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIGlmIChuYXRpdmVfanNfMS5kZWZhdWx0LnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmF0aXZlX2pzXzEuZGVmYXVsdC5yYW5kb21VVUlEKCk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJuZHMgPSBvcHRpb25zLnJhbmRvbSA/PyBvcHRpb25zLnJuZz8uKCkgPz8gKDAsIHJuZ19qc18xLmRlZmF1bHQpKCk7XG4gICAgaWYgKHJuZHMubGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYW5kb20gYnl0ZXMgbGVuZ3RoIG11c3QgYmUgPj0gMTYnKTtcbiAgICB9XG4gICAgcm5kc1s2XSA9IChybmRzWzZdICYgMHgwZikgfCAweDQwO1xuICAgIHJuZHNbOF0gPSAocm5kc1s4XSAmIDB4M2YpIHwgMHg4MDtcbiAgICBpZiAoYnVmKSB7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAxNiA+IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVVUlEIGJ5dGUgcmFuZ2UgJHtvZmZzZXR9OiR7b2Zmc2V0ICsgMTV9IGlzIG91dCBvZiBidWZmZXIgYm91bmRzYCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIHJldHVybiAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShybmRzKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHY0O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa.map new file mode 100644 index 0000000..d5066a0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f2/v4_f274f1f3c3f47b5ad7bae9d7bcd51ffa.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v4.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM;IAC5B,IAAI,WAAW,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;QACrB,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,mBAAmB,MAAM,IAAI,MAAM,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v4.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst native_js_1 = require(\"./native.js\");\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v4(options, buf, offset) {\n if (native_js_1.default.randomUUID && !buf && !options) {\n return native_js_1.default.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(rnds);\n}\nexports.default = v4;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4 new file mode 100644 index 0000000..82103d0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4 @@ -0,0 +1,111 @@ +f6da0085c94bbbe103bac7886b88e668 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UuidResolverService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +const uuid_1 = require("uuid"); +/** + * Shared service to resolve hybrid identifiers (INT | UUID string) to internal INT IDs. + * Eliminates duplicated resolveId helpers across 8+ services. + * + * @see ADR-019 Hybrid Identifier Strategy + */ +let UuidResolverService = class UuidResolverService { + constructor(dataSource) { + this.dataSource = dataSource; + } + /** + * Checks if a string value is a numeric string (not UUID). + * Returns the parsed number or null if not numeric. + */ + tryParseInt(value) { + const num = Number(value); + return isNaN(num) ? null : num; + } + /** + * Low-level UUID lookup: find entity by uuid column, return pkColumn value. + */ + async lookupByUuid(entityName, tableName, pkColumn, uuid) { + if (!(0, uuid_1.validate)(uuid)) { + throw new common_1.NotFoundException(`Invalid identifier for ${entityName}: ${uuid}`); + } + const rows = await this.dataSource.manager.query(`SELECT \`${pkColumn}\` FROM \`${tableName}\` WHERE \`uuid\` = ? LIMIT 1`, [uuid]); + if (!rows.length) { + throw new common_1.NotFoundException(`${entityName} with UUID ${uuid} not found`); + } + return rows[0][pkColumn]; + } + /** + * Generic resolver: accepts INT or UUID string, returns internal INT ID. + * - If value is a number, returns it directly. + * - If value is a numeric string, parses and returns it. + * - If value is a UUID string, looks up the entity by uuid column. + */ + async resolve(entityName, tableName, pkColumn, value) { + if (typeof value === 'number') + return value; + const num = this.tryParseInt(value); + if (num !== null) + return num; + return this.lookupByUuid(entityName, tableName, pkColumn, value); + } + /** + * Resolve projectId (INT or UUID string) to internal INT ID. + */ + async resolveProjectId(projectId) { + return this.resolve('Project', 'projects', 'id', projectId); + } + /** + * Resolve organizationId (INT or UUID string) to internal INT ID. + */ + async resolveOrganizationId(orgId) { + return this.resolve('Organization', 'organizations', 'id', orgId); + } + /** + * Resolve correspondenceId (INT or UUID string) to internal INT ID. + */ + async resolveCorrespondenceId(corrId) { + return this.resolve('Correspondence', 'correspondences', 'id', corrId); + } + /** + * Resolve userId (INT or UUID string) to internal user_id. + */ + async resolveUserId(userId) { + return this.resolve('User', 'users', 'user_id', userId); + } + /** + * Resolve contractId (INT or UUID string) to internal INT ID. + */ + async resolveContractId(contractId) { + return this.resolve('Contract', 'contracts', 'id', contractId); + } + /** + * Resolve shopDrawingRevisionId (INT or UUID string) to internal INT ID. + */ + async resolveShopDrawingRevisionId(shopDrawingRevisionId) { + return this.resolve('Shop Drawing Revision', 'shop_drawing_revisions', 'id', shopDrawingRevisionId); + } + /** + * Resolve asBuiltDrawingRevisionId (INT or UUID string) to internal INT ID. + */ + async resolveAsBuiltDrawingRevisionId(asBuiltDrawingRevisionId) { + return this.resolve('As-Built Drawing Revision', 'asbuilt_drawing_revisions', 'id', asBuiltDrawingRevisionId); + } +}; +exports.UuidResolverService = UuidResolverService; +exports.UuidResolverService = UuidResolverService = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_1.DataSource !== "undefined" && typeorm_1.DataSource) === "function" ? _a : Object]) +], UuidResolverService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcdXVpZC1yZXNvbHZlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBK0Q7QUFDL0QscUNBQXFDO0FBQ3JDLCtCQUFnRDtBQUVoRDs7Ozs7R0FLRztBQUVJLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBQzlCLFlBQTZCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBRyxDQUFDO0lBRXZEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxLQUFhO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FDeEIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsSUFBWTtRQUVaLElBQUksQ0FBQyxJQUFBLGVBQVksRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSwwQkFBaUIsQ0FDekIsMEJBQTBCLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FDaEQsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLElBQUksR0FBNkIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ3hFLFlBQVksUUFBUSxhQUFhLFNBQVMsK0JBQStCLEVBQ3pFLENBQUMsSUFBSSxDQUFDLENBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLDBCQUFpQixDQUFDLEdBQUcsVUFBVSxjQUFjLElBQUksWUFBWSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsS0FBc0I7UUFFdEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsS0FBSyxJQUFJO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFFN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUEwQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQXNCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBdUI7UUFDbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXVCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBMkI7UUFDakQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyw0QkFBNEIsQ0FDaEMscUJBQXNDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0oscUJBQXFCLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsK0JBQStCLENBQ25DLHdCQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLDJCQUEyQixFQUMzQiwyQkFBMkIsRUFDM0IsSUFBSSxFQUNKLHdCQUF3QixDQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUE7QUF6SFksa0RBQW1COzhCQUFuQixtQkFBbUI7SUFEL0IsSUFBQSxtQkFBVSxHQUFFO3lEQUU4QixvQkFBVSxvQkFBVixvQkFBVTtHQUR4QyxtQkFBbUIsQ0F5SC9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcc2VydmljZXNcXHV1aWQtcmVzb2x2ZXIuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IHZhbGlkYXRlIGFzIHV1aWRWYWxpZGF0ZSB9IGZyb20gJ3V1aWQnO1xuXG4vKipcbiAqIFNoYXJlZCBzZXJ2aWNlIHRvIHJlc29sdmUgaHlicmlkIGlkZW50aWZpZXJzIChJTlQgfCBVVUlEIHN0cmluZykgdG8gaW50ZXJuYWwgSU5UIElEcy5cbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCByZXNvbHZlSWQgaGVscGVycyBhY3Jvc3MgOCsgc2VydmljZXMuXG4gKlxuICogQHNlZSBBRFItMDE5IEh5YnJpZCBJZGVudGlmaWVyIFN0cmF0ZWd5XG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgdmFsdWUgaXMgYSBudW1lcmljIHN0cmluZyAobm90IFVVSUQpLlxuICAgKiBSZXR1cm5zIHRoZSBwYXJzZWQgbnVtYmVyIG9yIG51bGwgaWYgbm90IG51bWVyaWMuXG4gICAqL1xuICBwcml2YXRlIHRyeVBhcnNlSW50KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiBpc05hTihudW0pID8gbnVsbCA6IG51bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb3ctbGV2ZWwgVVVJRCBsb29rdXA6IGZpbmQgZW50aXR5IGJ5IHV1aWQgY29sdW1uLCByZXR1cm4gcGtDb2x1bW4gdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvb2t1cEJ5VXVpZChcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcGtDb2x1bW46IHN0cmluZyxcbiAgICB1dWlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXV1aWRWYWxpZGF0ZSh1dWlkKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxuICAgICAgICBgSW52YWxpZCBpZGVudGlmaWVyIGZvciAke2VudGl0eU5hbWV9OiAke3V1aWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+W10gPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5xdWVyeShcbiAgICAgIGBTRUxFQ1QgXFxgJHtwa0NvbHVtbn1cXGAgRlJPTSBcXGAke3RhYmxlTmFtZX1cXGAgV0hFUkUgXFxgdXVpZFxcYCA9ID8gTElNSVQgMWAsXG4gICAgICBbdXVpZF1cbiAgICApO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGAke2VudGl0eU5hbWV9IHdpdGggVVVJRCAke3V1aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdW3BrQ29sdW1uXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmljIHJlc29sdmVyOiBhY2NlcHRzIElOVCBvciBVVUlEIHN0cmluZywgcmV0dXJucyBpbnRlcm5hbCBJTlQgSUQuXG4gICAqIC0gSWYgdmFsdWUgaXMgYSBudW1iZXIsIHJldHVybnMgaXQgZGlyZWN0bHkuXG4gICAqIC0gSWYgdmFsdWUgaXMgYSBudW1lcmljIHN0cmluZywgcGFyc2VzIGFuZCByZXR1cm5zIGl0LlxuICAgKiAtIElmIHZhbHVlIGlzIGEgVVVJRCBzdHJpbmcsIGxvb2tzIHVwIHRoZSBlbnRpdHkgYnkgdXVpZCBjb2x1bW4uXG4gICAqL1xuICBhc3luYyByZXNvbHZlKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBwa0NvbHVtbjogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuXG4gICAgY29uc3QgbnVtID0gdGhpcy50cnlQYXJzZUludCh2YWx1ZSk7XG4gICAgaWYgKG51bSAhPT0gbnVsbCkgcmV0dXJuIG51bTtcblxuICAgIHJldHVybiB0aGlzLmxvb2t1cEJ5VXVpZChlbnRpdHlOYW1lLCB0YWJsZU5hbWUsIHBrQ29sdW1uLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBwcm9qZWN0SWQgKElOVCBvciBVVUlEIHN0cmluZykgdG8gaW50ZXJuYWwgSU5UIElELlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVByb2plY3RJZChwcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZSgnUHJvamVjdCcsICdwcm9qZWN0cycsICdpZCcsIHByb2plY3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBvcmdhbml6YXRpb25JZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlT3JnYW5pemF0aW9uSWQob3JnSWQ6IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZSgnT3JnYW5pemF0aW9uJywgJ29yZ2FuaXphdGlvbnMnLCAnaWQnLCBvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBjb3JyZXNwb25kZW5jZUlkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIElOVCBJRC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVDb3JyZXNwb25kZW5jZUlkKGNvcnJJZDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKCdDb3JyZXNwb25kZW5jZScsICdjb3JyZXNwb25kZW5jZXMnLCAnaWQnLCBjb3JySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdXNlcklkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIHVzZXJfaWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlVXNlcklkKHVzZXJJZDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKCdVc2VyJywgJ3VzZXJzJywgJ3VzZXJfaWQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgY29udHJhY3RJZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJhY3RJZChjb250cmFjdElkOiBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoJ0NvbnRyYWN0JywgJ2NvbnRyYWN0cycsICdpZCcsIGNvbnRyYWN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgc2hvcERyYXdpbmdSZXZpc2lvbklkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIElOVCBJRC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVTaG9wRHJhd2luZ1JldmlzaW9uSWQoXG4gICAgc2hvcERyYXdpbmdSZXZpc2lvbklkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKFxuICAgICAgJ1Nob3AgRHJhd2luZyBSZXZpc2lvbicsXG4gICAgICAnc2hvcF9kcmF3aW5nX3JldmlzaW9ucycsXG4gICAgICAnaWQnLFxuICAgICAgc2hvcERyYXdpbmdSZXZpc2lvbklkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFzQnVpbHREcmF3aW5nUmV2aXNpb25JZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQXNCdWlsdERyYXdpbmdSZXZpc2lvbklkKFxuICAgIGFzQnVpbHREcmF3aW5nUmV2aXNpb25JZDogbnVtYmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShcbiAgICAgICdBcy1CdWlsdCBEcmF3aW5nIFJldmlzaW9uJyxcbiAgICAgICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25zJyxcbiAgICAgICdpZCcsXG4gICAgICBhc0J1aWx0RHJhd2luZ1JldmlzaW9uSWRcbiAgICApO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4.map new file mode 100644 index 0000000..eda7c4c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f4/uuidresolverservice_f4169b9a0d894f0117413e68a4e609b4.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.ts"],"sourcesContent":["import { Injectable, NotFoundException } from '@nestjs/common';\nimport { DataSource } from 'typeorm';\nimport { validate as uuidValidate } from 'uuid';\n\n/**\n * Shared service to resolve hybrid identifiers (INT | UUID string) to internal INT IDs.\n * Eliminates duplicated resolveId helpers across 8+ services.\n *\n * @see ADR-019 Hybrid Identifier Strategy\n */\n@Injectable()\nexport class UuidResolverService {\n constructor(private readonly dataSource: DataSource) {}\n\n /**\n * Checks if a string value is a numeric string (not UUID).\n * Returns the parsed number or null if not numeric.\n */\n private tryParseInt(value: string): number | null {\n const num = Number(value);\n return isNaN(num) ? null : num;\n }\n\n /**\n * Low-level UUID lookup: find entity by uuid column, return pkColumn value.\n */\n private async lookupByUuid(\n entityName: string,\n tableName: string,\n pkColumn: string,\n uuid: string\n ): Promise {\n if (!uuidValidate(uuid)) {\n throw new NotFoundException(\n `Invalid identifier for ${entityName}: ${uuid}`\n );\n }\n\n const rows: Record[] = await this.dataSource.manager.query(\n `SELECT \\`${pkColumn}\\` FROM \\`${tableName}\\` WHERE \\`uuid\\` = ? LIMIT 1`,\n [uuid]\n );\n\n if (!rows.length) {\n throw new NotFoundException(`${entityName} with UUID ${uuid} not found`);\n }\n\n return rows[0][pkColumn];\n }\n\n /**\n * Generic resolver: accepts INT or UUID string, returns internal INT ID.\n * - If value is a number, returns it directly.\n * - If value is a numeric string, parses and returns it.\n * - If value is a UUID string, looks up the entity by uuid column.\n */\n async resolve(\n entityName: string,\n tableName: string,\n pkColumn: string,\n value: number | string\n ): Promise {\n if (typeof value === 'number') return value;\n\n const num = this.tryParseInt(value);\n if (num !== null) return num;\n\n return this.lookupByUuid(entityName, tableName, pkColumn, value);\n }\n\n /**\n * Resolve projectId (INT or UUID string) to internal INT ID.\n */\n async resolveProjectId(projectId: number | string): Promise {\n return this.resolve('Project', 'projects', 'id', projectId);\n }\n\n /**\n * Resolve organizationId (INT or UUID string) to internal INT ID.\n */\n async resolveOrganizationId(orgId: number | string): Promise {\n return this.resolve('Organization', 'organizations', 'id', orgId);\n }\n\n /**\n * Resolve correspondenceId (INT or UUID string) to internal INT ID.\n */\n async resolveCorrespondenceId(corrId: number | string): Promise {\n return this.resolve('Correspondence', 'correspondences', 'id', corrId);\n }\n\n /**\n * Resolve userId (INT or UUID string) to internal user_id.\n */\n async resolveUserId(userId: number | string): Promise {\n return this.resolve('User', 'users', 'user_id', userId);\n }\n\n /**\n * Resolve contractId (INT or UUID string) to internal INT ID.\n */\n async resolveContractId(contractId: number | string): Promise {\n return this.resolve('Contract', 'contracts', 'id', contractId);\n }\n\n /**\n * Resolve shopDrawingRevisionId (INT or UUID string) to internal INT ID.\n */\n async resolveShopDrawingRevisionId(\n shopDrawingRevisionId: number | string\n ): Promise {\n return this.resolve(\n 'Shop Drawing Revision',\n 'shop_drawing_revisions',\n 'id',\n shopDrawingRevisionId\n );\n }\n\n /**\n * Resolve asBuiltDrawingRevisionId (INT or UUID string) to internal INT ID.\n */\n async resolveAsBuiltDrawingRevisionId(\n asBuiltDrawingRevisionId: number | string\n ): Promise {\n return this.resolve(\n 'As-Built Drawing Revision',\n 'asbuilt_drawing_revisions',\n 'id',\n asBuiltDrawingRevisionId\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1 new file mode 100644 index 0000000..7f01d3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1 @@ -0,0 +1,66 @@ +c859336883fb06670865a3ea9c584369 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaItem = void 0; +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("./rfa-revision.entity"); +const asbuilt_drawing_revision_entity_1 = require("../../drawing/entities/asbuilt-drawing-revision.entity"); +const shop_drawing_revision_entity_1 = require("../../drawing/entities/shop-drawing-revision.entity"); +let RfaItem = class RfaItem { +}; +exports.RfaItem = RfaItem; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaItem.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_revision_id' }), + __metadata("design:type", Number) +], RfaItem.prototype, "rfaRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'item_type', + type: 'enum', + enum: ['SHOP', 'AS_BUILT'], + }), + __metadata("design:type", String) +], RfaItem.prototype, "itemType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'shop_drawing_revision_id', nullable: true }), + __metadata("design:type", Number) +], RfaItem.prototype, "shopDrawingRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'asbuilt_drawing_revision_id', nullable: true }), + __metadata("design:type", Number) +], RfaItem.prototype, "asBuiltDrawingRevisionId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.items, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'rfa_revision_id' }), + __metadata("design:type", typeof (_a = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _a : Object) +], RfaItem.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_revision_entity_1.ShopDrawingRevision), + (0, typeorm_1.JoinColumn)({ name: 'shop_drawing_revision_id' }), + __metadata("design:type", typeof (_b = typeof shop_drawing_revision_entity_1.ShopDrawingRevision !== "undefined" && shop_drawing_revision_entity_1.ShopDrawingRevision) === "function" ? _b : Object) +], RfaItem.prototype, "shopDrawingRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision), + (0, typeorm_1.JoinColumn)({ name: 'asbuilt_drawing_revision_id' }), + __metadata("design:type", typeof (_c = typeof asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision !== "undefined" && asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision) === "function" ? _c : Object) +], RfaItem.prototype, "asBuiltDrawingRevision", void 0); +exports.RfaItem = RfaItem = __decorate([ + (0, typeorm_1.Entity)('rfa_items') +], RfaItem); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLWl0ZW0uZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsK0RBQW9EO0FBQ3BELDRHQUFnRztBQUNoRyxzR0FBMEY7QUFHbkYsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFPO0NBa0NuQixDQUFBO0FBbENZLDBCQUFPO0FBRWxCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bUNBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4Q0FDYjtBQU92QjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztLQUMzQixDQUFDOzt5Q0FDNkI7QUFHL0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztzREFDOUI7QUFHL0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt5REFDOUI7QUFPbEM7SUFKQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN0RCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7a0RBQzFCLGlDQUFXLG9CQUFYLGlDQUFXOzRDQUFDO0FBSTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtEQUFtQixDQUFDO0lBQ3BDLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDO2tEQUMzQixrREFBbUIsb0JBQW5CLGtEQUFtQjtvREFBQztBQUkxQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3REFBc0IsQ0FBQztJQUN2QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQztrREFDM0Isd0RBQXNCLG9CQUF0Qix3REFBc0I7dURBQUM7a0JBakNyQyxPQUFPO0lBRG5CLElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUM7R0FDUCxPQUFPLENBa0NuQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtaXRlbS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBFbnRpdHksXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBSZmFSZXZpc2lvbiB9IGZyb20gJy4vcmZhLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBBc0J1aWx0RHJhd2luZ1JldmlzaW9uIH0gZnJvbSAnLi4vLi4vZHJhd2luZy9lbnRpdGllcy9hc2J1aWx0LWRyYXdpbmctcmV2aXNpb24uZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuLi8uLi9kcmF3aW5nL2VudGl0aWVzL3Nob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfaXRlbXMnKVxuZXhwb3J0IGNsYXNzIFJmYUl0ZW0ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3JldmlzaW9uX2lkJyB9KVxuICByZmFSZXZpc2lvbklkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdpdGVtX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBbJ1NIT1AnLCAnQVNfQlVJTFQnXSxcbiAgfSlcbiAgaXRlbVR5cGUhOiAnU0hPUCcgfCAnQVNfQlVJTFQnO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2hvcF9kcmF3aW5nX3JldmlzaW9uX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgc2hvcERyYXdpbmdSZXZpc2lvbklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXNidWlsdF9kcmF3aW5nX3JldmlzaW9uX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYXNCdWlsdERyYXdpbmdSZXZpc2lvbklkPzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVJldmlzaW9uLCAocmZhUmV2KSA9PiByZmFSZXYuaXRlbXMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdyZmFfcmV2aXNpb25faWQnIH0pXG4gIHJmYVJldmlzaW9uITogUmZhUmV2aXNpb247XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBTaG9wRHJhd2luZ1JldmlzaW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdzaG9wX2RyYXdpbmdfcmV2aXNpb25faWQnIH0pXG4gIHNob3BEcmF3aW5nUmV2aXNpb24/OiBTaG9wRHJhd2luZ1JldmlzaW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQXNCdWlsdERyYXdpbmdSZXZpc2lvbilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnYXNidWlsdF9kcmF3aW5nX3JldmlzaW9uX2lkJyB9KVxuICBhc0J1aWx0RHJhd2luZ1JldmlzaW9uPzogQXNCdWlsdERyYXdpbmdSZXZpc2lvbjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1.map new file mode 100644 index 0000000..b69de76 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f5/rfaitementity_f50c2e5deeee1bdd58f2cc1b453855c1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-item.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,+DAAoD;AACpD,4GAAgG;AAChG,sGAA0F;AAGnF,IAAM,OAAO,GAAb,MAAM,OAAO;CAkCnB,CAAA;AAlCY,0BAAO;AAElB;IADC,IAAA,gCAAsB,GAAE;;mCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;8CACb;AAOvB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;KAC3B,CAAC;;yCAC6B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC9B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC9B;AAOlC;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;QACtD,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,iCAAW,oBAAX,iCAAW;4CAAC;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,CAAC;IACpC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;kDAC3B,kDAAmB,oBAAnB,kDAAmB;oDAAC;AAI1C;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;kDAC3B,wDAAsB,oBAAtB,wDAAsB;uDAAC;kBAjCrC,OAAO;IADnB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,OAAO,CAkCnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-item.entity.ts"],"sourcesContent":["import {\n Column,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n} from 'typeorm';\nimport { RfaRevision } from './rfa-revision.entity';\nimport { AsBuiltDrawingRevision } from '../../drawing/entities/asbuilt-drawing-revision.entity';\nimport { ShopDrawingRevision } from '../../drawing/entities/shop-drawing-revision.entity';\n\n@Entity('rfa_items')\nexport class RfaItem {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'rfa_revision_id' })\n rfaRevisionId!: number;\n\n @Column({\n name: 'item_type',\n type: 'enum',\n enum: ['SHOP', 'AS_BUILT'],\n })\n itemType!: 'SHOP' | 'AS_BUILT';\n\n @Column({ name: 'shop_drawing_revision_id', nullable: true })\n shopDrawingRevisionId?: number;\n\n @Column({ name: 'asbuilt_drawing_revision_id', nullable: true })\n asBuiltDrawingRevisionId?: number;\n\n // Relations\n @ManyToOne(() => RfaRevision, (rfaRev) => rfaRev.items, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'rfa_revision_id' })\n rfaRevision!: RfaRevision;\n\n @ManyToOne(() => ShopDrawingRevision)\n @JoinColumn({ name: 'shop_drawing_revision_id' })\n shopDrawingRevision?: ShopDrawingRevision;\n\n @ManyToOne(() => AsBuiltDrawingRevision)\n @JoinColumn({ name: 'asbuilt_drawing_revision_id' })\n asBuiltDrawingRevision?: AsBuiltDrawingRevision;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1 new file mode 100644 index 0000000..b3af476 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1 @@ -0,0 +1,207 @@ +2f43d7b4178ccfbe2e738f0bc828ca41 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationController = void 0; +const common_1 = require("@nestjs/common"); +const migration_service_1 = require("./migration.service"); +const import_correspondence_dto_1 = require("./dto/import-correspondence.dto"); +const enqueue_migration_dto_1 = require("./dto/enqueue-migration.dto"); +const commit_batch_dto_1 = require("./dto/commit-batch.dto"); +const create_migration_error_dto_1 = require("./dto/create-migration-error.dto"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const current_user_decorator_1 = require("../../common/decorators/current-user.decorator"); +const user_entity_1 = require("../user/entities/user.entity"); +const swagger_1 = require("@nestjs/swagger"); +const migration_queue_query_dto_1 = require("./dto/migration-queue-query.dto"); +let MigrationController = class MigrationController { + constructor(migrationService) { + this.migrationService = migrationService; + } + async importCorrespondence(dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.importCorrespondence(dto, idempotencyKey, userId); + } + async commitBatch(dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.commitBatch(dto, idempotencyKey, userId); + } + async enqueueRecord(dto) { + return this.migrationService.enqueueRecord(dto); + } + async getReviewQueue(query) { + return this.migrationService.getReviewQueue(query); + } + async getQueueItemById(id) { + return this.migrationService.getQueueItemById(id); + } + async createError(dto) { + return this.migrationService.createError(dto); + } + async getErrors(page, limit) { + return this.migrationService.getErrors(page, limit); + } + async approveQueueItem(id, dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.approveQueueItem(id, dto, idempotencyKey, userId); + } + async rejectQueueItem(id, user) { + const userId = user?.user_id || 5; + return this.migrationService.rejectQueueItem(id, userId); + } + getStagingFile(filePath, res) { + const stream = this.migrationService.getStagingFileStream(filePath); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'inline; filename="document.pdf"', + }); + stream.pipe(res); + } +}; +exports.MigrationController = MigrationController; +__decorate([ + (0, common_1.Post)('import'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Import generic legacy correspondence record via n8n integration', + }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key per document and batch to prevent duplicate inserts', + required: true, + }), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Headers)('idempotency-key')), + __param(2, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_b = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _b : Object, String, typeof (_c = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _c : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "importCorrespondence", null); +__decorate([ + (0, common_1.Post)('commit_batch'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Batch approve and import migration review queue items', + }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key for the entire batch to prevent duplicate execution', + required: true, + }), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Headers)('idempotency-key')), + __param(2, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof commit_batch_dto_1.CommitBatchDto !== "undefined" && commit_batch_dto_1.CommitBatchDto) === "function" ? _d : Object, String, typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "commitBatch", null); +__decorate([ + (0, common_1.Post)('queue'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Enqueue a record into the staging migration review queue', + }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_f = typeof enqueue_migration_dto_1.EnqueueMigrationDto !== "undefined" && enqueue_migration_dto_1.EnqueueMigrationDto) === "function" ? _f : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "enqueueRecord", null); +__decorate([ + (0, common_1.Get)('queue'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get migration review queue' }), + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_g = typeof migration_queue_query_dto_1.MigrationQueueQueryDto !== "undefined" && migration_queue_query_dto_1.MigrationQueueQueryDto) === "function" ? _g : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getReviewQueue", null); +__decorate([ + (0, common_1.Get)('queue/:id'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get a specific queue item by ID' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getQueueItemById", null); +__decorate([ + (0, common_1.Post)('errors'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Log a migration error from n8n workflow' }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_h = typeof create_migration_error_dto_1.CreateMigrationErrorDto !== "undefined" && create_migration_error_dto_1.CreateMigrationErrorDto) === "function" ? _h : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "createError", null); +__decorate([ + (0, common_1.Get)('errors'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get migration errors' }), + (0, swagger_1.ApiQuery)({ name: 'page', required: false, type: Number }), + (0, swagger_1.ApiQuery)({ name: 'limit', required: false, type: Number }), + __param(0, (0, common_1.Query)('page')), + __param(1, (0, common_1.Query)('limit')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, Number]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getErrors", null); +__decorate([ + (0, common_1.Post)('queue/:id/approve'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Approve and import a queued migration item' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key per document and batch to prevent duplicate inserts', + required: true, + }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Headers)('idempotency-key')), + __param(3, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, typeof (_j = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _j : Object, String, typeof (_k = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _k : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "approveQueueItem", null); +__decorate([ + (0, common_1.Post)('queue/:id/reject'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Reject a queued migration item' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, typeof (_l = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _l : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "rejectQueueItem", null); +__decorate([ + (0, common_1.Get)('staging-file'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Stream a file from staging' }), + (0, swagger_1.ApiQuery)({ name: 'path', required: true, type: String }), + __param(0, (0, common_1.Query)('path')), + __param(1, (0, common_1.Res)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Object]), + __metadata("design:returntype", void 0) +], MigrationController.prototype, "getStagingFile", null); +exports.MigrationController = MigrationController = __decorate([ + (0, swagger_1.ApiTags)('Migration'), + (0, swagger_1.ApiBearerAuth)(), + (0, common_1.Controller)('migration'), + __metadata("design:paramtypes", [typeof (_a = typeof migration_service_1.MigrationService !== "undefined" && migration_service_1.MigrationService) === "function" ? _a : Object]) +], MigrationController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uY29udHJvbGxlci50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBV3dCO0FBQ3hCLDJEQUF1RDtBQUN2RCwrRUFBMEU7QUFDMUUsdUVBQWtFO0FBQ2xFLDZEQUF3RDtBQUN4RCxpRkFBMkU7QUFDM0UsdUVBQWtFO0FBQ2xFLDJGQUE2RTtBQUM3RSw4REFBb0Q7QUFDcEQsNkNBT3lCO0FBQ3pCLCtFQUF5RTtBQU1sRSxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFtQjtJQUM5QixZQUE2QixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7SUFhN0QsQUFBTixLQUFLLENBQUMsb0JBQW9CLENBQ2hCLEdBQTRCLEVBQ1IsY0FBc0IsRUFDbkMsSUFBVTtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDL0MsR0FBRyxFQUNILGNBQWMsRUFDZCxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFhSyxBQUFOLEtBQUssQ0FBQyxXQUFXLENBQ1AsR0FBbUIsRUFDQyxjQUFzQixFQUNuQyxJQUFVO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFPSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQVMsR0FBd0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFLSyxBQUFOLEtBQUssQ0FBQyxjQUFjLENBQVUsS0FBNkI7UUFDekQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFNSyxBQUFOLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBNEIsRUFBVTtRQUMxRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBS0ssQUFBTixLQUFLLENBQUMsV0FBVyxDQUFTLEdBQTRCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBT0ssQUFBTixLQUFLLENBQUMsU0FBUyxDQUNFLElBQWEsRUFDWixLQUFjO1FBRTlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQVlLLEFBQU4sS0FBSyxDQUFDLGdCQUFnQixDQUNPLEVBQVUsRUFDN0IsR0FBNEIsRUFDUixjQUFzQixFQUNuQyxJQUFVO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUMzQyxFQUFFLEVBQ0YsR0FBRyxFQUNILGNBQWMsRUFDZCxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFNSyxBQUFOLEtBQUssQ0FBQyxlQUFlLENBQ1EsRUFBVSxFQUN0QixJQUFVO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQU1ELGNBQWMsQ0FBZ0IsUUFBZ0IsRUFBUyxHQUFhO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ04sY0FBYyxFQUFFLGlCQUFpQjtZQUNqQyxxQkFBcUIsRUFBRSxpQ0FBaUM7U0FDekQsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBQ0YsQ0FBQTtBQTNJWSxrREFBbUI7QUFjeEI7SUFYTCxJQUFBLGFBQUksRUFBQyxRQUFRLENBQUM7SUFDZCxJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLHNCQUFZLEVBQUM7UUFDWixPQUFPLEVBQUUsaUVBQWlFO0tBQzNFLENBQUM7SUFDRCxJQUFBLG1CQUFTLEVBQUM7UUFDVCxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFdBQVcsRUFDVCxnRUFBZ0U7UUFDbEUsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDO0lBRUMsV0FBQSxJQUFBLGFBQUksR0FBRSxDQUFBO0lBQ04sV0FBQSxJQUFBLGdCQUFPLEVBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUMxQixXQUFBLElBQUEsb0NBQVcsR0FBRSxDQUFBOzt5REFGRCxtREFBdUIsb0JBQXZCLG1EQUF1Qiw0REFFZixrQkFBSSxvQkFBSixrQkFBSTs7K0RBUTFCO0FBYUs7SUFYTCxJQUFBLGFBQUksRUFBQyxjQUFjLENBQUM7SUFDcEIsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxzQkFBWSxFQUFDO1FBQ1osT0FBTyxFQUFFLHVEQUF1RDtLQUNqRSxDQUFDO0lBQ0QsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixXQUFXLEVBQ1QsZ0VBQWdFO1FBQ2xFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztJQUVDLFdBQUEsSUFBQSxhQUFJLEdBQUUsQ0FBQTtJQUNOLFdBQUEsSUFBQSxnQkFBTyxFQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDMUIsV0FBQSxJQUFBLG9DQUFXLEdBQUUsQ0FBQTs7eURBRkQsaUNBQWMsb0JBQWQsaUNBQWMsNERBRU4sa0JBQUksb0JBQUosa0JBQUk7O3NEQUkxQjtBQU9LO0lBTEwsSUFBQSxhQUFJLEVBQUMsT0FBTyxDQUFDO0lBQ2IsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxzQkFBWSxFQUFDO1FBQ1osT0FBTyxFQUFFLDBEQUEwRDtLQUNwRSxDQUFDO0lBQ21CLFdBQUEsSUFBQSxhQUFJLEdBQUUsQ0FBQTs7eURBQU0sMkNBQW1CLG9CQUFuQiwyQ0FBbUI7O3dEQUVuRDtBQUtLO0lBSEwsSUFBQSxZQUFHLEVBQUMsT0FBTyxDQUFDO0lBQ1osSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLENBQUM7SUFDbEMsV0FBQSxJQUFBLGNBQUssR0FBRSxDQUFBOzt5REFBUSxrREFBc0Isb0JBQXRCLGtEQUFzQjs7eURBRTFEO0FBTUs7SUFKTCxJQUFBLFlBQUcsRUFBQyxXQUFXLENBQUM7SUFDaEIsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLENBQUM7SUFDNUQsSUFBQSxrQkFBUSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDZixXQUFBLElBQUEsY0FBSyxFQUFDLElBQUksRUFBRSxxQkFBWSxDQUFDLENBQUE7Ozs7MkRBRWhEO0FBS0s7SUFITCxJQUFBLGFBQUksRUFBQyxRQUFRLENBQUM7SUFDZCxJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsQ0FBQztJQUNsRCxXQUFBLElBQUEsYUFBSSxHQUFFLENBQUE7O3lEQUFNLG9EQUF1QixvQkFBdkIsb0RBQXVCOztzREFFckQ7QUFPSztJQUxMLElBQUEsWUFBRyxFQUFDLFFBQVEsQ0FBQztJQUNiLElBQUEsa0JBQVMsRUFBQyw2QkFBWSxDQUFDO0lBQ3ZCLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDO0lBQ2pELElBQUEsa0JBQVEsRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDekQsSUFBQSxrQkFBUSxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUV4RCxXQUFBLElBQUEsY0FBSyxFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2IsV0FBQSxJQUFBLGNBQUssRUFBQyxPQUFPLENBQUMsQ0FBQTs7OztvREFHaEI7QUFZSztJQVZMLElBQUEsYUFBSSxFQUFDLG1CQUFtQixDQUFDO0lBQ3pCLElBQUEsa0JBQVMsRUFBQyw2QkFBWSxDQUFDO0lBQ3ZCLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxDQUFDO0lBQ3ZFLElBQUEsa0JBQVEsRUFBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLElBQUEsbUJBQVMsRUFBQztRQUNULElBQUksRUFBRSxpQkFBaUI7UUFDdkIsV0FBVyxFQUNULGdFQUFnRTtRQUNsRSxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUM7SUFFQyxXQUFBLElBQUEsY0FBSyxFQUFDLElBQUksRUFBRSxxQkFBWSxDQUFDLENBQUE7SUFDekIsV0FBQSxJQUFBLGFBQUksR0FBRSxDQUFBO0lBQ04sV0FBQSxJQUFBLGdCQUFPLEVBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUMxQixXQUFBLElBQUEsb0NBQVcsR0FBRSxDQUFBOztpRUFGRCxtREFBdUIsb0JBQXZCLG1EQUF1Qiw0REFFZixrQkFBSSxvQkFBSixrQkFBSTs7MkRBUzFCO0FBTUs7SUFKTCxJQUFBLGFBQUksRUFBQyxrQkFBa0IsQ0FBQztJQUN4QixJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQztJQUMzRCxJQUFBLGtCQUFRLEVBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUVwQyxXQUFBLElBQUEsY0FBSyxFQUFDLElBQUksRUFBRSxxQkFBWSxDQUFDLENBQUE7SUFDekIsV0FBQSxJQUFBLG9DQUFXLEdBQUUsQ0FBQTs7aUVBQU8sa0JBQUksb0JBQUosa0JBQUk7OzBEQUkxQjtBQU1EO0lBSkMsSUFBQSxZQUFHLEVBQUMsY0FBYyxDQUFDO0lBQ25CLElBQUEsa0JBQVMsRUFBQyw2QkFBWSxDQUFDO0lBQ3ZCLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDO0lBQ3ZELElBQUEsa0JBQVEsRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDekMsV0FBQSxJQUFBLGNBQUssRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUFvQixXQUFBLElBQUEsWUFBRyxHQUFFLENBQUE7Ozs7eURBT3JEOzhCQTFJVSxtQkFBbUI7SUFIL0IsSUFBQSxpQkFBTyxFQUFDLFdBQVcsQ0FBQztJQUNwQixJQUFBLHVCQUFhLEdBQUU7SUFDZixJQUFBLG1CQUFVLEVBQUMsV0FBVyxDQUFDO3lEQUV5QixvQ0FBZ0Isb0JBQWhCLG9DQUFnQjtHQURwRCxtQkFBbUIsQ0EySS9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcbWlncmF0aW9uLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgUG9zdCxcbiAgQm9keSxcbiAgSGVhZGVycyxcbiAgVXNlR3VhcmRzLFxuICBHZXQsXG4gIFBhcmFtLFxuICBRdWVyeSxcbiAgUmVzLFxuICBQYXJzZUludFBpcGUsXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IE1pZ3JhdGlvblNlcnZpY2UgfSBmcm9tICcuL21pZ3JhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vaW1wb3J0LWNvcnJlc3BvbmRlbmNlLmR0byc7XG5pbXBvcnQgeyBFbnF1ZXVlTWlncmF0aW9uRHRvIH0gZnJvbSAnLi9kdG8vZW5xdWV1ZS1taWdyYXRpb24uZHRvJztcbmltcG9ydCB7IENvbW1pdEJhdGNoRHRvIH0gZnJvbSAnLi9kdG8vY29tbWl0LWJhdGNoLmR0byc7XG5pbXBvcnQgeyBDcmVhdGVNaWdyYXRpb25FcnJvckR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1taWdyYXRpb24tZXJyb3IuZHRvJztcbmltcG9ydCB7IEp3dEF1dGhHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvand0LWF1dGguZ3VhcmQnO1xuaW1wb3J0IHsgQ3VycmVudFVzZXIgfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycy9jdXJyZW50LXVzZXIuZGVjb3JhdG9yJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7XG4gIEFwaVRhZ3MsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpQmVhcmVyQXV0aCxcbiAgQXBpSGVhZGVyLFxuICBBcGlRdWVyeSxcbiAgQXBpUGFyYW0sXG59IGZyb20gJ0BuZXN0anMvc3dhZ2dlcic7XG5pbXBvcnQgeyBNaWdyYXRpb25RdWV1ZVF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vbWlncmF0aW9uLXF1ZXVlLXF1ZXJ5LmR0byc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5cbkBBcGlUYWdzKCdNaWdyYXRpb24nKVxuQEFwaUJlYXJlckF1dGgoKVxuQENvbnRyb2xsZXIoJ21pZ3JhdGlvbicpXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWlncmF0aW9uU2VydmljZTogTWlncmF0aW9uU2VydmljZSkge31cblxuICBAUG9zdCgnaW1wb3J0JylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oe1xuICAgIHN1bW1hcnk6ICdJbXBvcnQgZ2VuZXJpYyBsZWdhY3kgY29ycmVzcG9uZGVuY2UgcmVjb3JkIHZpYSBuOG4gaW50ZWdyYXRpb24nLFxuICB9KVxuICBAQXBpSGVhZGVyKHtcbiAgICBuYW1lOiAnSWRlbXBvdGVuY3ktS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdVbmlxdWUga2V5IHBlciBkb2N1bWVudCBhbmQgYmF0Y2ggdG8gcHJldmVudCBkdXBsaWNhdGUgaW5zZXJ0cycsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0pXG4gIGFzeW5jIGltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgIEBCb2R5KCkgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgICAgZHRvLFxuICAgICAgaWRlbXBvdGVuY3lLZXksXG4gICAgICB1c2VySWRcbiAgICApO1xuICB9XG5cbiAgQFBvc3QoJ2NvbW1pdF9iYXRjaCcpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHtcbiAgICBzdW1tYXJ5OiAnQmF0Y2ggYXBwcm92ZSBhbmQgaW1wb3J0IG1pZ3JhdGlvbiByZXZpZXcgcXVldWUgaXRlbXMnLFxuICB9KVxuICBAQXBpSGVhZGVyKHtcbiAgICBuYW1lOiAnSWRlbXBvdGVuY3ktS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdVbmlxdWUga2V5IGZvciB0aGUgZW50aXJlIGJhdGNoIHRvIHByZXZlbnQgZHVwbGljYXRlIGV4ZWN1dGlvbicsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0pXG4gIGFzeW5jIGNvbW1pdEJhdGNoKFxuICAgIEBCb2R5KCkgZHRvOiBDb21taXRCYXRjaER0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmNvbW1pdEJhdGNoKGR0bywgaWRlbXBvdGVuY3lLZXksIHVzZXJJZCk7XG4gIH1cblxuICBAUG9zdCgncXVldWUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7XG4gICAgc3VtbWFyeTogJ0VucXVldWUgYSByZWNvcmQgaW50byB0aGUgc3RhZ2luZyBtaWdyYXRpb24gcmV2aWV3IHF1ZXVlJyxcbiAgfSlcbiAgYXN5bmMgZW5xdWV1ZVJlY29yZChAQm9keSgpIGR0bzogRW5xdWV1ZU1pZ3JhdGlvbkR0bykge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGlvblNlcnZpY2UuZW5xdWV1ZVJlY29yZChkdG8pO1xuICB9XG5cbiAgQEdldCgncXVldWUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgbWlncmF0aW9uIHJldmlldyBxdWV1ZScgfSlcbiAgYXN5bmMgZ2V0UmV2aWV3UXVldWUoQFF1ZXJ5KCkgcXVlcnk6IE1pZ3JhdGlvblF1ZXVlUXVlcnlEdG8pIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFJldmlld1F1ZXVlKHF1ZXJ5KTtcbiAgfVxuXG4gIEBHZXQoJ3F1ZXVlLzppZCcpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBhIHNwZWNpZmljIHF1ZXVlIGl0ZW0gYnkgSUQnIH0pXG4gIEBBcGlQYXJhbSh7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciB9KVxuICBhc3luYyBnZXRRdWV1ZUl0ZW1CeUlkKEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFF1ZXVlSXRlbUJ5SWQoaWQpO1xuICB9XG5cbiAgQFBvc3QoJ2Vycm9ycycpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0xvZyBhIG1pZ3JhdGlvbiBlcnJvciBmcm9tIG44biB3b3JrZmxvdycgfSlcbiAgYXN5bmMgY3JlYXRlRXJyb3IoQEJvZHkoKSBkdG86IENyZWF0ZU1pZ3JhdGlvbkVycm9yRHRvKSB7XG4gICAgcmV0dXJuIHRoaXMubWlncmF0aW9uU2VydmljZS5jcmVhdGVFcnJvcihkdG8pO1xuICB9XG5cbiAgQEdldCgnZXJyb3JzJylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnR2V0IG1pZ3JhdGlvbiBlcnJvcnMnIH0pXG4gIEBBcGlRdWVyeSh7IG5hbWU6ICdwYWdlJywgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBOdW1iZXIgfSlcbiAgQEFwaVF1ZXJ5KHsgbmFtZTogJ2xpbWl0JywgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBOdW1iZXIgfSlcbiAgYXN5bmMgZ2V0RXJyb3JzKFxuICAgIEBRdWVyeSgncGFnZScpIHBhZ2U/OiBudW1iZXIsXG4gICAgQFF1ZXJ5KCdsaW1pdCcpIGxpbWl0PzogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGlvblNlcnZpY2UuZ2V0RXJyb3JzKHBhZ2UsIGxpbWl0KTtcbiAgfVxuXG4gIEBQb3N0KCdxdWV1ZS86aWQvYXBwcm92ZScpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0FwcHJvdmUgYW5kIGltcG9ydCBhIHF1ZXVlZCBtaWdyYXRpb24gaXRlbScgfSlcbiAgQEFwaVBhcmFtKHsgbmFtZTogJ2lkJywgdHlwZTogTnVtYmVyIH0pXG4gIEBBcGlIZWFkZXIoe1xuICAgIG5hbWU6ICdJZGVtcG90ZW5jeS1LZXknLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1VuaXF1ZSBrZXkgcGVyIGRvY3VtZW50IGFuZCBiYXRjaCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbnNlcnRzJyxcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgfSlcbiAgYXN5bmMgYXBwcm92ZVF1ZXVlSXRlbShcbiAgICBAUGFyYW0oJ2lkJywgUGFyc2VJbnRQaXBlKSBpZDogbnVtYmVyLFxuICAgIEBCb2R5KCkgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmFwcHJvdmVRdWV1ZUl0ZW0oXG4gICAgICBpZCxcbiAgICAgIGR0byxcbiAgICAgIGlkZW1wb3RlbmN5S2V5LFxuICAgICAgdXNlcklkXG4gICAgKTtcbiAgfVxuXG4gIEBQb3N0KCdxdWV1ZS86aWQvcmVqZWN0JylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnUmVqZWN0IGEgcXVldWVkIG1pZ3JhdGlvbiBpdGVtJyB9KVxuICBAQXBpUGFyYW0oeyBuYW1lOiAnaWQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgYXN5bmMgcmVqZWN0UXVldWVJdGVtKFxuICAgIEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIsXG4gICAgQEN1cnJlbnRVc2VyKCkgdXNlcjogVXNlclxuICApIHtcbiAgICBjb25zdCB1c2VySWQgPSB1c2VyPy51c2VyX2lkIHx8IDU7XG4gICAgcmV0dXJuIHRoaXMubWlncmF0aW9uU2VydmljZS5yZWplY3RRdWV1ZUl0ZW0oaWQsIHVzZXJJZCk7XG4gIH1cblxuICBAR2V0KCdzdGFnaW5nLWZpbGUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdTdHJlYW0gYSBmaWxlIGZyb20gc3RhZ2luZycgfSlcbiAgQEFwaVF1ZXJ5KHsgbmFtZTogJ3BhdGgnLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogU3RyaW5nIH0pXG4gIGdldFN0YWdpbmdGaWxlKEBRdWVyeSgncGF0aCcpIGZpbGVQYXRoOiBzdHJpbmcsIEBSZXMoKSByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFN0YWdpbmdGaWxlU3RyZWFtKGZpbGVQYXRoKTtcbiAgICByZXMuc2V0KHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogJ2lubGluZTsgZmlsZW5hbWU9XCJkb2N1bWVudC5wZGZcIicsXG4gICAgfSk7XG4gICAgc3RyZWFtLnBpcGUocmVzKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1.map new file mode 100644 index 0000000..06a2eb9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f6/migrationcontroller_f6a1078a9fc0bcd110945ad01e6756c1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.ts"],"sourcesContent":["import {\n Controller,\n Post,\n Body,\n Headers,\n UseGuards,\n Get,\n Param,\n Query,\n Res,\n ParseIntPipe,\n} from '@nestjs/common';\nimport { MigrationService } from './migration.service';\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\nimport { EnqueueMigrationDto } from './dto/enqueue-migration.dto';\nimport { CommitBatchDto } from './dto/commit-batch.dto';\nimport { CreateMigrationErrorDto } from './dto/create-migration-error.dto';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { CurrentUser } from '../../common/decorators/current-user.decorator';\nimport { User } from '../user/entities/user.entity';\nimport {\n ApiTags,\n ApiOperation,\n ApiBearerAuth,\n ApiHeader,\n ApiQuery,\n ApiParam,\n} from '@nestjs/swagger';\nimport { MigrationQueueQueryDto } from './dto/migration-queue-query.dto';\nimport type { Response } from 'express';\n\n@ApiTags('Migration')\n@ApiBearerAuth()\n@Controller('migration')\nexport class MigrationController {\n constructor(private readonly migrationService: MigrationService) {}\n\n @Post('import')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Import generic legacy correspondence record via n8n integration',\n })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key per document and batch to prevent duplicate inserts',\n required: true,\n })\n async importCorrespondence(\n @Body() dto: ImportCorrespondenceDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.importCorrespondence(\n dto,\n idempotencyKey,\n userId\n );\n }\n\n @Post('commit_batch')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Batch approve and import migration review queue items',\n })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key for the entire batch to prevent duplicate execution',\n required: true,\n })\n async commitBatch(\n @Body() dto: CommitBatchDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.commitBatch(dto, idempotencyKey, userId);\n }\n\n @Post('queue')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Enqueue a record into the staging migration review queue',\n })\n async enqueueRecord(@Body() dto: EnqueueMigrationDto) {\n return this.migrationService.enqueueRecord(dto);\n }\n\n @Get('queue')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get migration review queue' })\n async getReviewQueue(@Query() query: MigrationQueueQueryDto) {\n return this.migrationService.getReviewQueue(query);\n }\n\n @Get('queue/:id')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get a specific queue item by ID' })\n @ApiParam({ name: 'id', type: Number })\n async getQueueItemById(@Param('id', ParseIntPipe) id: number) {\n return this.migrationService.getQueueItemById(id);\n }\n\n @Post('errors')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Log a migration error from n8n workflow' })\n async createError(@Body() dto: CreateMigrationErrorDto) {\n return this.migrationService.createError(dto);\n }\n\n @Get('errors')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get migration errors' })\n @ApiQuery({ name: 'page', required: false, type: Number })\n @ApiQuery({ name: 'limit', required: false, type: Number })\n async getErrors(\n @Query('page') page?: number,\n @Query('limit') limit?: number\n ) {\n return this.migrationService.getErrors(page, limit);\n }\n\n @Post('queue/:id/approve')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Approve and import a queued migration item' })\n @ApiParam({ name: 'id', type: Number })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key per document and batch to prevent duplicate inserts',\n required: true,\n })\n async approveQueueItem(\n @Param('id', ParseIntPipe) id: number,\n @Body() dto: ImportCorrespondenceDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.approveQueueItem(\n id,\n dto,\n idempotencyKey,\n userId\n );\n }\n\n @Post('queue/:id/reject')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Reject a queued migration item' })\n @ApiParam({ name: 'id', type: Number })\n async rejectQueueItem(\n @Param('id', ParseIntPipe) id: number,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.rejectQueueItem(id, userId);\n }\n\n @Get('staging-file')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Stream a file from staging' })\n @ApiQuery({ name: 'path', required: true, type: String })\n getStagingFile(@Query('path') filePath: string, @Res() res: Response) {\n const stream = this.migrationService.getStagingFileStream(filePath);\n res.set({\n 'Content-Type': 'application/pdf',\n 'Content-Disposition': 'inline; filename=\"document.pdf\"',\n });\n stream.pipe(res);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5 new file mode 100644 index 0000000..07583e4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5 @@ -0,0 +1,33 @@ +5019cdf67797e6ff2434d8ead1f7c696 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0; +var max_js_1 = require("./max.js"); +Object.defineProperty(exports, "MAX", { enumerable: true, get: function () { return max_js_1.default; } }); +var nil_js_1 = require("./nil.js"); +Object.defineProperty(exports, "NIL", { enumerable: true, get: function () { return nil_js_1.default; } }); +var parse_js_1 = require("./parse.js"); +Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parse_js_1.default; } }); +var stringify_js_1 = require("./stringify.js"); +Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return stringify_js_1.default; } }); +var v1_js_1 = require("./v1.js"); +Object.defineProperty(exports, "v1", { enumerable: true, get: function () { return v1_js_1.default; } }); +var v1ToV6_js_1 = require("./v1ToV6.js"); +Object.defineProperty(exports, "v1ToV6", { enumerable: true, get: function () { return v1ToV6_js_1.default; } }); +var v3_js_1 = require("./v3.js"); +Object.defineProperty(exports, "v3", { enumerable: true, get: function () { return v3_js_1.default; } }); +var v4_js_1 = require("./v4.js"); +Object.defineProperty(exports, "v4", { enumerable: true, get: function () { return v4_js_1.default; } }); +var v5_js_1 = require("./v5.js"); +Object.defineProperty(exports, "v5", { enumerable: true, get: function () { return v5_js_1.default; } }); +var v6_js_1 = require("./v6.js"); +Object.defineProperty(exports, "v6", { enumerable: true, get: function () { return v6_js_1.default; } }); +var v6ToV1_js_1 = require("./v6ToV1.js"); +Object.defineProperty(exports, "v6ToV1", { enumerable: true, get: function () { return v6ToV1_js_1.default; } }); +var v7_js_1 = require("./v7.js"); +Object.defineProperty(exports, "v7", { enumerable: true, get: function () { return v7_js_1.default; } }); +var validate_js_1 = require("./validate.js"); +Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validate_js_1.default; } }); +var version_js_1 = require("./version.js"); +Object.defineProperty(exports, "version", { enumerable: true, get: function () { return version_js_1.default; } }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzVOLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0csSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRyxJQUFJLFVBQVUsR0FBRyxPQUFP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ekcsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsY0FBYyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXGluZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52ZXJzaW9uID0gZXhwb3J0cy52YWxpZGF0ZSA9IGV4cG9ydHMudjcgPSBleHBvcnRzLnY2VG9WMSA9IGV4cG9ydHMudjYgPSBleHBvcnRzLnY1ID0gZXhwb3J0cy52NCA9IGV4cG9ydHMudjMgPSBleHBvcnRzLnYxVG9WNiA9IGV4cG9ydHMudjEgPSBleHBvcnRzLnN0cmluZ2lmeSA9IGV4cG9ydHMucGFyc2UgPSBleHBvcnRzLk5JTCA9IGV4cG9ydHMuTUFYID0gdm9pZCAwO1xudmFyIG1heF9qc18xID0gcmVxdWlyZShcIi4vbWF4LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTUFYXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXhfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIG5pbF9qc18xID0gcmVxdWlyZShcIi4vbmlsLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTklMXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuaWxfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHBhcnNlX2pzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhcnNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXJzZV9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgc3RyaW5naWZ5X2pzXzEgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJpbmdpZnlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ2lmeV9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdjFfanNfMSA9IHJlcXVpcmUoXCIuL3YxLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYxX2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2MVRvVjZfanNfMSA9IHJlcXVpcmUoXCIuL3YxVG9WNi5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxVG9WNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjFUb1Y2X2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2M19qc18xID0gcmVxdWlyZShcIi4vdjMuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2M1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjNfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY0X2pzXzEgPSByZXF1aXJlKFwiLi92NC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2NF9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdjVfanNfMSA9IHJlcXVpcmUoXCIuL3Y1LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHY1X2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2Nl9qc18xID0gcmVxdWlyZShcIi4vdjYuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjZfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY2VG9WMV9qc18xID0gcmVxdWlyZShcIi4vdjZUb1YxLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjZUb1YxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2NlRvVjFfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY3X2pzXzEgPSByZXF1aXJlKFwiLi92Ny5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2N19qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdmFsaWRhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmFsaWRhdGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbGlkYXRlX2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2ZXJzaW9uX2pzXzEgPSByZXF1aXJlKFwiLi92ZXJzaW9uLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmVyc2lvblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmVyc2lvbl9qc18xLmRlZmF1bHQ7IH0gfSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5.map new file mode 100644 index 0000000..be5922b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/index_f783515cd5debf68fed6d8cafa6133e5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\index.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0;\nvar max_js_1 = require(\"./max.js\");\nObject.defineProperty(exports, \"MAX\", { enumerable: true, get: function () { return max_js_1.default; } });\nvar nil_js_1 = require(\"./nil.js\");\nObject.defineProperty(exports, \"NIL\", { enumerable: true, get: function () { return nil_js_1.default; } });\nvar parse_js_1 = require(\"./parse.js\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_js_1.default; } });\nvar stringify_js_1 = require(\"./stringify.js\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return stringify_js_1.default; } });\nvar v1_js_1 = require(\"./v1.js\");\nObject.defineProperty(exports, \"v1\", { enumerable: true, get: function () { return v1_js_1.default; } });\nvar v1ToV6_js_1 = require(\"./v1ToV6.js\");\nObject.defineProperty(exports, \"v1ToV6\", { enumerable: true, get: function () { return v1ToV6_js_1.default; } });\nvar v3_js_1 = require(\"./v3.js\");\nObject.defineProperty(exports, \"v3\", { enumerable: true, get: function () { return v3_js_1.default; } });\nvar v4_js_1 = require(\"./v4.js\");\nObject.defineProperty(exports, \"v4\", { enumerable: true, get: function () { return v4_js_1.default; } });\nvar v5_js_1 = require(\"./v5.js\");\nObject.defineProperty(exports, \"v5\", { enumerable: true, get: function () { return v5_js_1.default; } });\nvar v6_js_1 = require(\"./v6.js\");\nObject.defineProperty(exports, \"v6\", { enumerable: true, get: function () { return v6_js_1.default; } });\nvar v6ToV1_js_1 = require(\"./v6ToV1.js\");\nObject.defineProperty(exports, \"v6ToV1\", { enumerable: true, get: function () { return v6ToV1_js_1.default; } });\nvar v7_js_1 = require(\"./v7.js\");\nObject.defineProperty(exports, \"v7\", { enumerable: true, get: function () { return v7_js_1.default; } });\nvar validate_js_1 = require(\"./validate.js\");\nObject.defineProperty(exports, \"validate\", { enumerable: true, get: function () { return validate_js_1.default; } });\nvar version_js_1 = require(\"./version.js\");\nObject.defineProperty(exports, \"version\", { enumerable: true, get: function () { return version_js_1.default; } });\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912 new file mode 100644 index 0000000..1a56319 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912 @@ -0,0 +1,144 @@ +8150b30d642d2e60c2ef044bef476538 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberAudit = void 0; +const typeorm_1 = require("typeorm"); +let DocumentNumberAudit = class DocumentNumberAudit { +}; +exports.DocumentNumberAudit = DocumentNumberAudit; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "documentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100 }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'counter_key', type: 'json' }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], DocumentNumberAudit.prototype, "counterKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_used', length: 200 }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "templateUsed", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'operation', + type: 'enum', + enum: [ + 'RESERVE', + 'CONFIRM', + 'CANCEL', + 'MANUAL_OVERRIDE', + 'VOID', + 'VOID_REPLACE', + 'GENERATE', + ], + default: 'CONFIRM', + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "operation", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'status', + type: 'enum', + enum: ['RESERVED', 'CONFIRMED', 'CANCELLED', 'VOID', 'MANUAL'], + nullable: true, + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reservation_token', length: 36, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "reservationToken", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'idempotency_key', length: 36, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "idempotencyKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_organization_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "originatorOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'recipient_organization_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'old_value', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "oldValue", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'new_value', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "newValue", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'metadata', type: 'json', nullable: true }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], DocumentNumberAudit.prototype, "metadata", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', length: 45, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_agent', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "userAgent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_success', default: true }), + __metadata("design:type", Boolean) +], DocumentNumberAudit.prototype, "isSuccess", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'retry_count', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "retryCount", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'lock_wait_ms', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "lockWaitMs", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'total_duration_ms', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "totalDurationMs", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'fallback_used', + type: 'enum', + enum: ['NONE', 'DB_LOCK', 'RETRY'], + default: 'NONE', + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "fallbackUsed", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], DocumentNumberAudit.prototype, "createdAt", void 0); +exports.DocumentNumberAudit = DocumentNumberAudit = __decorate([ + (0, typeorm_1.Entity)('document_number_audit'), + (0, typeorm_1.Index)(['createdAt']), + (0, typeorm_1.Index)(['userId']), + (0, typeorm_1.Index)(['documentId']), + (0, typeorm_1.Index)(['status']), + (0, typeorm_1.Index)(['operation']), + (0, typeorm_1.Index)(['documentNumber']), + (0, typeorm_1.Index)(['reservationToken']) +], DocumentNumberAudit); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBVVYsSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBbUI7Q0E0Ri9CLENBQUE7QUE1Rlksa0RBQW1CO0FBRTlCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0NBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt1REFDNUI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzsyREFDekI7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztrREFDakMsTUFBTSxvQkFBTixNQUFNO3VEQUFrQjtBQUdyQztJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt5REFDekI7QUFnQnRCO0lBZEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUU7WUFDSixTQUFTO1lBQ1QsU0FBUztZQUNULFFBQVE7WUFDUixpQkFBaUI7WUFDakIsTUFBTTtZQUNOLGNBQWM7WUFDZCxVQUFVO1NBQ1g7UUFDRCxPQUFPLEVBQUUsU0FBUztLQUNuQixDQUFDOztzREFDaUI7QUFRbkI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsVUFB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QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pCLElBQUEsZUFBSyxFQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQixJQUFBLGVBQUssRUFBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BCLElBQUEsZUFBSyxFQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QixJQUFBLGVBQUssRUFBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7R0FDZixtQkFBbUIsQ0E0Ri9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcZW50aXRpZXNcXGRvY3VtZW50LW51bWJlci1hdWRpdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2F1ZGl0JylcbkBJbmRleChbJ2NyZWF0ZWRBdCddKVxuQEluZGV4KFsndXNlcklkJ10pXG5ASW5kZXgoWydkb2N1bWVudElkJ10pXG5ASW5kZXgoWydzdGF0dXMnXSlcbkBJbmRleChbJ29wZXJhdGlvbiddKVxuQEluZGV4KFsnZG9jdW1lbnROdW1iZXInXSlcbkBJbmRleChbJ3Jlc2VydmF0aW9uVG9rZW4nXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckF1ZGl0IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZG9jdW1lbnRJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X251bWJlcicsIGxlbmd0aDogMTAwIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY291bnRlcl9rZXknLCB0eXBlOiAnanNvbicgfSlcbiAgY291bnRlcktleSE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndGVtcGxhdGVfdXNlZCcsIGxlbmd0aDogMjAwIH0pXG4gIHRlbXBsYXRlVXNlZCE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnb3BlcmF0aW9uJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogW1xuICAgICAgJ1JFU0VSVkUnLFxuICAgICAgJ0NPTkZJUk0nLFxuICAgICAgJ0NBTkNFTCcsXG4gICAgICAnTUFOVUFMX09WRVJSSURFJyxcbiAgICAgICdWT0lEJyxcbiAgICAgICdWT0lEX1JFUExBQ0UnLFxuICAgICAgJ0dFTkVSQVRFJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdDT05GSVJNJyxcbiAgfSlcbiAgb3BlcmF0aW9uITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdzdGF0dXMnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBbJ1JFU0VSVkVEJywgJ0NPTkZJUk1FRCcsICdDQU5DRUxMRUQnLCAnVk9JRCcsICdNQU5VQUwnXSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgc3RhdHVzPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVzZXJ2YXRpb25fdG9rZW4nLCBsZW5ndGg6IDM2LCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXNlcnZhdGlvblRva2VuPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaWRlbXBvdGVuY3lfa2V5JywgbGVuZ3RoOiAzNiwgbnVsbGFibGU6IHRydWUgfSlcbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX29yZ2FuaXphdGlvbl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ29sZF92YWx1ZScsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgb2xkVmFsdWU/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICduZXdfdmFsdWUnLCB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG5ld1ZhbHVlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWV0YWRhdGEnLCB0eXBlOiAnanNvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1c2VyX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXNlcklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXBfYWRkcmVzcycsIGxlbmd0aDogNDUsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlwQWRkcmVzcz86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfYWdlbnQnLCB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVzZXJBZ2VudD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX3N1Y2Nlc3MnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzU3VjY2VzcyE6IGJvb2xlYW47XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXRyeV9jb3VudCcsIGRlZmF1bHQ6IDAgfSlcbiAgcmV0cnlDb3VudCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2xvY2tfd2FpdF9tcycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGxvY2tXYWl0TXM/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0b3RhbF9kdXJhdGlvbl9tcycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHRvdGFsRHVyYXRpb25Ncz86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZmFsbGJhY2tfdXNlZCcsXG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IFsnTk9ORScsICdEQl9MT0NLJywgJ1JFVFJZJ10sXG4gICAgZGVmYXVsdDogJ05PTkUnLFxuICB9KVxuICBmYWxsYmFja1VzZWQ/OiBzdHJpbmc7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912.map new file mode 100644 index 0000000..6d946aa --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/documentnumberauditentity_f9b076f64c9678d93028c088d672f912.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-audit.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-audit.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('document_number_audit')\n@Index(['createdAt'])\n@Index(['userId'])\n@Index(['documentId'])\n@Index(['status'])\n@Index(['operation'])\n@Index(['documentNumber'])\n@Index(['reservationToken'])\nexport class DocumentNumberAudit {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'document_id', nullable: true })\n documentId?: number;\n\n @Column({ name: 'document_number', length: 100 })\n documentNumber!: string;\n\n @Column({ name: 'counter_key', type: 'json' })\n counterKey!: Record;\n\n @Column({ name: 'template_used', length: 200 })\n templateUsed!: string;\n\n @Column({\n name: 'operation',\n type: 'enum',\n enum: [\n 'RESERVE',\n 'CONFIRM',\n 'CANCEL',\n 'MANUAL_OVERRIDE',\n 'VOID',\n 'VOID_REPLACE',\n 'GENERATE',\n ],\n default: 'CONFIRM',\n })\n operation!: string;\n\n @Column({\n name: 'status',\n type: 'enum',\n enum: ['RESERVED', 'CONFIRMED', 'CANCELLED', 'VOID', 'MANUAL'],\n nullable: true,\n })\n status?: string;\n\n @Column({ name: 'reservation_token', length: 36, nullable: true })\n reservationToken?: string;\n\n @Column({ name: 'idempotency_key', length: 36, nullable: true })\n idempotencyKey?: string;\n\n @Column({ name: 'originator_organization_id', nullable: true })\n originatorOrganizationId?: number;\n\n @Column({ name: 'recipient_organization_id', nullable: true })\n recipientOrganizationId?: number;\n\n @Column({ name: 'old_value', type: 'text', nullable: true })\n oldValue?: string;\n\n @Column({ name: 'new_value', type: 'text', nullable: true })\n newValue?: string;\n\n @Column({ name: 'metadata', type: 'json', nullable: true })\n metadata?: Record;\n\n @Column({ name: 'user_id', nullable: true })\n userId?: number;\n\n @Column({ name: 'ip_address', length: 45, nullable: true })\n ipAddress?: string;\n\n @Column({ name: 'user_agent', type: 'text', nullable: true })\n userAgent?: string;\n\n @Column({ name: 'is_success', default: true })\n isSuccess!: boolean;\n\n @Column({ name: 'retry_count', default: 0 })\n retryCount!: number;\n\n @Column({ name: 'lock_wait_ms', nullable: true })\n lockWaitMs?: number;\n\n @Column({ name: 'total_duration_ms', nullable: true })\n totalDurationMs?: number;\n\n @Column({\n name: 'fallback_used',\n type: 'enum',\n enum: ['NONE', 'DB_LOCK', 'RETRY'],\n default: 'NONE',\n })\n fallbackUsed?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5 new file mode 100644 index 0000000..b720f77 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5 @@ -0,0 +1,281 @@ +199ca3404cc2265cf1026f59bf4df336 +"use strict"; +// File: src/modules/user/user.service.ts +// บันทึกการแก้ไข: แก้ไข Error TS1272 โดยใช้ 'import type' สำหรับ Cache interface (T1.3) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const cache_manager_1 = require("@nestjs/cache-manager"); +const bcrypt = __importStar(require("bcrypt")); +const user_entity_1 = require("./entities/user.entity"); +const role_entity_1 = require("./entities/role.entity"); +const permission_entity_1 = require("./entities/permission.entity"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +let UserService = class UserService { + constructor(usersRepository, roleRepository, permissionRepository, cacheManager, uuidResolver) { + this.usersRepository = usersRepository; + this.roleRepository = roleRepository; + this.permissionRepository = permissionRepository; + this.cacheManager = cacheManager; + this.uuidResolver = uuidResolver; + } + // 1. สร้างผู้ใช้ (Hash Password ก่อนบันทึก) + async create(createUserDto) { + const salt = await bcrypt.genSalt(); + const hashedPassword = await bcrypt.hash(createUserDto.password, salt); + // ADR-019: Resolve UUID→INT for primaryOrganizationId + const resolvedOrgId = createUserDto.primaryOrganizationId + ? await this.uuidResolver.resolveOrganizationId(createUserDto.primaryOrganizationId) + : undefined; + const newUser = this.usersRepository.create({ + ...createUserDto, + primaryOrganizationId: resolvedOrgId, + password: hashedPassword, + }); + try { + return await this.usersRepository.save(newUser); + } + catch (error) { + const dbError = error; + if (dbError.code === 'ER_DUP_ENTRY') { + throw new common_1.ConflictException('Username or Email already exists'); + } + throw error; + } + } + // 2. ดึงข้อมูลทั้งหมด (Search & Pagination) + async findAll(params) { + const { search, roleId, primaryOrganizationId, page = 1, limit = 100, } = params || {}; + // Create query builder + const query = this.usersRepository + .createQueryBuilder('user') + .leftJoinAndSelect('user.preference', 'preference') // Optional + .leftJoinAndSelect('user.assignments', 'assignments') + .leftJoinAndSelect('assignments.role', 'role') + .leftJoinAndSelect('user.organization', 'organization') // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + .select([ + 'user.user_id', + 'user.publicId', + 'user.username', + 'user.email', + 'user.firstName', + 'user.lastName', + 'user.lineId', + 'user.isActive', + 'user.createdAt', + 'user.updatedAt', + 'assignments.id', + 'role.roleId', + 'role.roleName', + 'organization.publicId', // [FIX] Expose org UUID for getter (ADR-019) + ]); + // Apply Filters + if (search) { + query.andWhere('(user.username LIKE :search OR user.email LIKE :search OR user.firstName LIKE :search OR user.lastName LIKE :search)', { search: `%${search}%` }); + } + if (primaryOrganizationId) { + // ADR-019: Resolve UUID→INT for filtering + const resolvedOrgId = await this.uuidResolver.resolveOrganizationId(primaryOrganizationId); + query.andWhere('user.primaryOrganizationId = :orgId', { + orgId: resolvedOrgId, + }); + } + if (roleId) { + query.andWhere('role.roleId = :roleId', { roleId }); + } + // Pagination + query.skip((page - 1) * limit).take(limit); + const [data, total] = await query.getManyAndCount(); + return { + data, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + // 3. ดึงข้อมูลรายคน + async findOne(id) { + const user = await this.usersRepository.findOne({ + where: { user_id: id }, + relations: [ + 'preference', + 'assignments', + 'assignments.role', + 'assignments.role.permissions', // [FIX] Required for RBAC AbilityFactory + 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + ], + }); + if (!user) { + throw new common_1.NotFoundException(`User with ID ${id} not found`); + } + return user; + } + async findOneByUuid(publicId) { + const user = await this.usersRepository.findOne({ + where: { publicId }, + relations: [ + 'preference', + 'assignments', + 'assignments.role', + 'assignments.role.permissions', + 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + ], + }); + if (!user) { + throw new common_1.NotFoundException(`User with publicId ${publicId} not found`); + } + return user; + } + async findOneByUsername(username) { + return this.usersRepository.findOne({ where: { username } }); + } + // 4. แก้ไขข้อมูล + async update(uuid, updateUserDto) { + const user = await this.findOneByUuid(uuid); + if (updateUserDto.password) { + const salt = await bcrypt.genSalt(); + updateUserDto.password = await bcrypt.hash(updateUserDto.password, salt); + } + // ADR-019: Resolve UUID→INT for primaryOrganizationId before merge + const resolvedDto = { ...updateUserDto }; + if (updateUserDto.primaryOrganizationId !== undefined) { + resolvedDto.primaryOrganizationId = + await this.uuidResolver.resolveOrganizationId(updateUserDto.primaryOrganizationId); + } + const updatedUser = this.usersRepository.merge(user, resolvedDto); + const savedUser = await this.usersRepository.save(updatedUser); + // ⚠️ สำคัญ: เมื่อมีการแก้ไขข้อมูล User ต้องเคลียร์ Cache สิทธิ์เสมอ + await this.clearUserCache(user.user_id); + return savedUser; + } + // 5. ลบผู้ใช้ (Soft Delete) + async remove(uuid) { + const user = await this.findOneByUuid(uuid); + const result = await this.usersRepository.softDelete(user.user_id); + if (result.affected === 0) { + throw new common_1.NotFoundException(`User with UUID ${uuid} not found`); + } + // เคลียร์ Cache เมื่อลบ + await this.clearUserCache(user.user_id); + } + async findDocControlIdByOrg(organizationId) { + const user = await this.usersRepository.findOne({ + where: { primaryOrganizationId: organizationId }, + }); + return user ? user.user_id : null; + } + /** + * ✅ ดึงสิทธิ์ (Permission) โดยใช้ Caching Strategy + * TTL: 30 นาที (ตาม Requirement 6.5.2) + */ + async getUserPermissions(userId) { + const cacheKey = `permissions:user:${userId}`; + // 1. ลองดึงจาก Cache ก่อน + const cachedPermissions = await this.cacheManager.get(cacheKey); + if (cachedPermissions) { + return cachedPermissions; + } + // 2. ถ้าไม่มีใน Cache ให้ Query จาก DB (View: v_user_all_permissions) + const permissions = await this.usersRepository.query(`SELECT permission_name FROM v_user_all_permissions WHERE user_id = ?`, [ + userId, + ]); + const permissionList = permissions.map((row) => row.permission_name); + // 3. บันทึกลง Cache (TTL 1800 วินาที = 30 นาที) + await this.cacheManager.set(cacheKey, permissionList, 1800 * 1000); + return permissionList; + } + // --- Roles & Permissions (Helper for Admin/UI) --- + async findAllRoles() { + return this.roleRepository.find({ relations: ['permissions'] }); + } + async findAllPermissions() { + return this.permissionRepository.find(); + } + async updateRolePermissions(roleId, permissionIds) { + const role = await this.roleRepository.findOne({ + where: { roleId }, + relations: ['permissions'], + }); + if (!role) { + throw new common_1.NotFoundException(`Role ID ${roleId} not found`); + } + // Load permissions entities + const permissions = []; + if (permissionIds.length > 0) { + // Note: findByIds is deprecated in newer TypeORM, uses In() instead + // but if current version supports it or using a simplified query: + const perms = await this.permissionRepository + .createQueryBuilder('p') + .where('p.permissionId IN (:...ids)', { ids: permissionIds }) + .getMany(); + permissions.push(...perms); + } + role.permissions = permissions; + return this.roleRepository.save(role); + } + /** + * Helper สำหรับล้าง Cache เมื่อมีการเปลี่ยนแปลงสิทธิ์หรือบทบาท + */ + async clearUserCache(userId) { + await this.cacheManager.del(`permissions:user:${userId}`); + } +}; +exports.UserService = UserService; +exports.UserService = UserService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(user_entity_1.User)), + __param(1, (0, typeorm_1.InjectRepository)(role_entity_1.Role)), + __param(2, (0, typeorm_1.InjectRepository)(permission_entity_1.Permission)), + __param(3, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, Object, typeof (_d = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _d : Object]) +], UserService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcdXNlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7QUFBQSx5Q0FBeUM7QUFDekMsd0ZBQXdGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhGLDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLHlEQUFzRDtBQUV0RCwrQ0FBaUM7QUFDakMsd0RBQThDO0FBQzlDLHdEQUE4QztBQUM5QyxvRUFBMEQ7QUFJMUQsdUZBQWtGO0FBRzNFLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFDdEIsWUFFVSxlQUFpQyxFQUVqQyxjQUFnQyxFQUVoQyxvQkFBNEMsRUFDckIsWUFBbUIsRUFDMUMsWUFBaUM7UUFOakMsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBRWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUVoQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFPO1FBQzFDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtJQUN4QyxDQUFDO0lBRUosNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBNEI7UUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkUsc0RBQXNEO1FBQ3RELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUI7WUFDdkQsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FDM0MsYUFBYSxDQUFDLHFCQUFxQixDQUNwQztZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1B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SUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNGLENBQUE7QUF2Ulksa0NBQVc7c0JBQVgsV0FBVztJQUR2QixJQUFBLG1CQUFVLEdBQUU7SUFHUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsa0JBQUksQ0FBQyxDQUFBO0lBRXRCLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrQkFBSSxDQUFDLENBQUE7SUFFdEIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLDhCQUFVLENBQUMsQ0FBQTtJQUU1QixXQUFBLElBQUEsZUFBTSxFQUFDLDZCQUFhLENBQUMsQ0FBQTt5REFMRyxvQkFBVSxvQkFBVixvQkFBVSxvREFFWCxvQkFBVSxvQkFBVixvQkFBVSxvREFFSixvQkFBVSxvQkFBVixvQkFBVSw0REFFbEIsMkNBQW1CLG9CQUFuQiwyQ0FBbUI7R0FUaEMsV0FBVyxDQXVSdkIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcdXNlci5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3VzZXIvdXNlci5zZXJ2aWNlLnRzXHJcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjog4LmB4LiB4LmJ4LmE4LiCIEVycm9yIFRTMTI3MiDguYLguJTguKLguYPguIrguYkgJ2ltcG9ydCB0eXBlJyDguKrguLPguKvguKPguLHguJogQ2FjaGUgaW50ZXJmYWNlIChUMS4zKVxyXG5cclxuaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxyXG4gIENvbmZsaWN0RXhjZXB0aW9uLFxyXG4gIEluamVjdCxcclxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IENBQ0hFX01BTkFHRVIgfSBmcm9tICdAbmVzdGpzL2NhY2hlLW1hbmFnZXInO1xyXG5pbXBvcnQgdHlwZSB7IENhY2hlIH0gZnJvbSAnY2FjaGUtbWFuYWdlcic7IC8vIOKchSBGSVg6IOC5gOC4nuC4tOC5iOC4oSAndHlwZScg4LiV4Lij4LiH4LiZ4Li14LmJXHJcbmltcG9ydCAqIGFzIGJjcnlwdCBmcm9tICdiY3J5cHQnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi9lbnRpdGllcy91c2VyLmVudGl0eSc7XHJcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuL2VudGl0aWVzL3JvbGUuZW50aXR5JztcclxuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvcGVybWlzc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDcmVhdGVVc2VyRHRvIH0gZnJvbSAnLi9kdG8vY3JlYXRlLXVzZXIuZHRvJztcclxuaW1wb3J0IHsgVXBkYXRlVXNlckR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS11c2VyLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaFVzZXJEdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtdXNlci5kdG8nO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShVc2VyKVxyXG4gICAgcHJpdmF0ZSB1c2Vyc1JlcG9zaXRvcnk6IFJlcG9zaXRvcnk8VXNlcj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShSb2xlKVxyXG4gICAgcHJpdmF0ZSByb2xlUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxSb2xlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFBlcm1pc3Npb24pXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25SZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFBlcm1pc3Npb24+LFxyXG4gICAgQEluamVjdChDQUNIRV9NQU5BR0VSKSBwcml2YXRlIGNhY2hlTWFuYWdlcjogQ2FjaGUsXHJcbiAgICBwcml2YXRlIHV1aWRSZXNvbHZlcjogVXVpZFJlc29sdmVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLy8gMS4g4Liq4Lij4LmJ4Liy4LiH4Lic4Li54LmJ4LmD4LiK4LmJIChIYXNoIFBhc3N3b3JkIOC4geC5iOC4reC4meC4muC4seC4meC4l+C4tuC4gSlcclxuICBhc3luYyBjcmVhdGUoY3JlYXRlVXNlckR0bzogQ3JlYXRlVXNlckR0byk6IFByb21pc2U8VXNlcj4ge1xyXG4gICAgY29uc3Qgc2FsdCA9IGF3YWl0IGJjcnlwdC5nZW5TYWx0KCk7XHJcbiAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGNyZWF0ZVVzZXJEdG8ucGFzc3dvcmQsIHNhbHQpO1xyXG5cclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgVVVJROKGkklOVCBmb3IgcHJpbWFyeU9yZ2FuaXphdGlvbklkXHJcbiAgICBjb25zdCByZXNvbHZlZE9yZ0lkID0gY3JlYXRlVXNlckR0by5wcmltYXJ5T3JnYW5pemF0aW9uSWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICBjcmVhdGVVc2VyRHRvLnByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgbmV3VXNlciA9IHRoaXMudXNlcnNSZXBvc2l0b3J5LmNyZWF0ZSh7XHJcbiAgICAgIC4uLmNyZWF0ZVVzZXJEdG8sXHJcbiAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogcmVzb2x2ZWRPcmdJZCxcclxuICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlcnNSZXBvc2l0b3J5LnNhdmUobmV3VXNlcik7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICBjb25zdCBkYkVycm9yID0gZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH07XHJcbiAgICAgIGlmIChkYkVycm9yLmNvZGUgPT09ICdFUl9EVVBfRU5UUlknKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXhjZXB0aW9uKCdVc2VybmFtZSBvciBFbWFpbCBhbHJlYWR5IGV4aXN0cycpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gMi4g4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54Lil4LiX4Lix4LmJ4LiH4Lir4Lih4LiUIChTZWFyY2ggJiBQYWdpbmF0aW9uKVxyXG4gIGFzeW5jIGZpbmRBbGwocGFyYW1zPzogU2VhcmNoVXNlckR0byk6IFByb21pc2U8e1xyXG4gICAgZGF0YTogVXNlcltdO1xyXG4gICAgdG90YWw6IG51bWJlcjtcclxuICAgIHBhZ2U6IG51bWJlcjtcclxuICAgIGxpbWl0OiBudW1iZXI7XHJcbiAgICB0b3RhbFBhZ2VzOiBudW1iZXI7XHJcbiAgfT4ge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBzZWFyY2gsXHJcbiAgICAgIHJvbGVJZCxcclxuICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkLFxyXG4gICAgICBwYWdlID0gMSxcclxuICAgICAgbGltaXQgPSAxMDAsXHJcbiAgICB9ID0gcGFyYW1zIHx8IHt9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBxdWVyeSBidWlsZGVyXHJcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMudXNlcnNSZXBvc2l0b3J5XHJcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3VzZXInKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3VzZXIucHJlZmVyZW5jZScsICdwcmVmZXJlbmNlJykgLy8gT3B0aW9uYWxcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCd1c2VyLmFzc2lnbm1lbnRzJywgJ2Fzc2lnbm1lbnRzJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdhc3NpZ25tZW50cy5yb2xlJywgJ3JvbGUnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3VzZXIub3JnYW5pemF0aW9uJywgJ29yZ2FuaXphdGlvbicpIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICAuc2VsZWN0KFtcclxuICAgICAgICAndXNlci51c2VyX2lkJyxcclxuICAgICAgICAndXNlci5wdWJsaWNJZCcsXHJcbiAgICAgICAgJ3VzZXIudXNlcm5hbWUnLFxyXG4gICAgICAgICd1c2VyLmVtYWlsJyxcclxuICAgICAgICAndXNlci5maXJzdE5hbWUnLFxyXG4gICAgICAgICd1c2VyLmxhc3ROYW1lJyxcclxuICAgICAgICAndXNlci5saW5lSWQnLFxyXG4gICAgICAgICd1c2VyLmlzQWN0aXZlJyxcclxuICAgICAgICAndXNlci5jcmVhdGVkQXQnLFxyXG4gICAgICAgICd1c2VyLnVwZGF0ZWRBdCcsXHJcbiAgICAgICAgJ2Fzc2lnbm1lbnRzLmlkJyxcclxuICAgICAgICAncm9sZS5yb2xlSWQnLFxyXG4gICAgICAgICdyb2xlLnJvbGVOYW1lJyxcclxuICAgICAgICAnb3JnYW5pemF0aW9uLnB1YmxpY0lkJywgLy8gW0ZJWF0gRXhwb3NlIG9yZyBVVUlEIGZvciBnZXR0ZXIgKEFEUi0wMTkpXHJcbiAgICAgIF0pO1xyXG5cclxuICAgIC8vIEFwcGx5IEZpbHRlcnNcclxuICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoXHJcbiAgICAgICAgJyh1c2VyLnVzZXJuYW1lIExJS0UgOnNlYXJjaCBPUiB1c2VyLmVtYWlsIExJS0UgOnNlYXJjaCBPUiB1c2VyLmZpcnN0TmFtZSBMSUtFIDpzZWFyY2ggT1IgdXNlci5sYXN0TmFtZSBMSUtFIDpzZWFyY2gpJyxcclxuICAgICAgICB7IHNlYXJjaDogYCUke3NlYXJjaH0lYCB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByaW1hcnlPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUTihpJJTlQgZm9yIGZpbHRlcmluZ1xyXG4gICAgICBjb25zdCByZXNvbHZlZE9yZ0lkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICApO1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgndXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQgPSA6b3JnSWQnLCB7XHJcbiAgICAgICAgb3JnSWQ6IHJlc29sdmVkT3JnSWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb2xlSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3JvbGUucm9sZUlkID0gOnJvbGVJZCcsIHsgcm9sZUlkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBhZ2luYXRpb25cclxuICAgIHF1ZXJ5LnNraXAoKHBhZ2UgLSAxKSAqIGxpbWl0KS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbZGF0YSwgdG90YWxdID0gYXdhaXQgcXVlcnkuZ2V0TWFueUFuZENvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0YSxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gMy4g4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54Lil4Lij4Liy4Lii4LiE4LiZXHJcbiAgYXN5bmMgZmluZE9uZShpZDogbnVtYmVyKTogUHJvbWlzZTxVc2VyPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHVzZXJfaWQ6IGlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdwcmVmZXJlbmNlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMnLFxyXG4gICAgICAgICdhc3NpZ25tZW50cy5yb2xlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMucm9sZS5wZXJtaXNzaW9ucycsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBSQkFDIEFiaWxpdHlGYWN0b3J5XHJcbiAgICAgICAgJ29yZ2FuaXphdGlvbicsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciB3aXRoIElEICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXVpZChwdWJsaWNJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHB1YmxpY0lkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdwcmVmZXJlbmNlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMnLFxyXG4gICAgICAgICdhc3NpZ25tZW50cy5yb2xlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMucm9sZS5wZXJtaXNzaW9ucycsXHJcbiAgICAgICAgJ29yZ2FuaXphdGlvbicsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciB3aXRoIHB1YmxpY0lkICR7cHVibGljSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8VXNlciB8IG51bGw+IHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzUmVwb3NpdG9yeS5maW5kT25lKHsgd2hlcmU6IHsgdXNlcm5hbWUgfSB9KTtcclxuICB9XHJcblxyXG4gIC8vIDQuIOC5geC4geC5ieC5hOC4guC4guC5ieC4reC4oeC4ueC4pVxyXG4gIGFzeW5jIHVwZGF0ZSh1dWlkOiBzdHJpbmcsIHVwZGF0ZVVzZXJEdG86IFVwZGF0ZVVzZXJEdG8pOiBQcm9taXNlPFVzZXI+IHtcclxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcblxyXG4gICAgaWYgKHVwZGF0ZVVzZXJEdG8ucGFzc3dvcmQpIHtcclxuICAgICAgY29uc3Qgc2FsdCA9IGF3YWl0IGJjcnlwdC5nZW5TYWx0KCk7XHJcbiAgICAgIHVwZGF0ZVVzZXJEdG8ucGFzc3dvcmQgPSBhd2FpdCBiY3J5cHQuaGFzaCh1cGRhdGVVc2VyRHRvLnBhc3N3b3JkLCBzYWx0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUTihpJJTlQgZm9yIHByaW1hcnlPcmdhbml6YXRpb25JZCBiZWZvcmUgbWVyZ2VcclxuICAgIGNvbnN0IHJlc29sdmVkRHRvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4udXBkYXRlVXNlckR0byB9O1xyXG4gICAgaWYgKHVwZGF0ZVVzZXJEdG8ucHJpbWFyeU9yZ2FuaXphdGlvbklkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzb2x2ZWREdG8ucHJpbWFyeU9yZ2FuaXphdGlvbklkID1cclxuICAgICAgICBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICB1cGRhdGVVc2VyRHRvLnByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFVzZXIgPSB0aGlzLnVzZXJzUmVwb3NpdG9yeS5tZXJnZShcclxuICAgICAgdXNlcixcclxuICAgICAgcmVzb2x2ZWREdG8gYXMgUGFydGlhbDxVc2VyPlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHNhdmVkVXNlciA9IGF3YWl0IHRoaXMudXNlcnNSZXBvc2l0b3J5LnNhdmUodXBkYXRlZFVzZXIpO1xyXG5cclxuICAgIC8vIOKaoO+4jyDguKrguLPguITguLHguI06IOC5gOC4oeC4t+C5iOC4reC4oeC4teC4geC4suC4o+C5geC4geC5ieC5hOC4guC4guC5ieC4reC4oeC4ueC4pSBVc2VyIOC4leC5ieC4reC4h+C5gOC4hOC4peC4teC4ouC4o+C5jCBDYWNoZSDguKrguLTguJfguJjguLTguYzguYDguKrguKHguK1cclxuICAgIGF3YWl0IHRoaXMuY2xlYXJVc2VyQ2FjaGUodXNlci51c2VyX2lkKTtcclxuXHJcbiAgICByZXR1cm4gc2F2ZWRVc2VyO1xyXG4gIH1cclxuXHJcbiAgLy8gNS4g4Lil4Lia4Lic4Li54LmJ4LmD4LiK4LmJIChTb2Z0IERlbGV0ZSlcclxuICBhc3luYyByZW1vdmUodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuc29mdERlbGV0ZSh1c2VyLnVzZXJfaWQpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuYWZmZWN0ZWQgPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIHdpdGggVVVJRCAke3V1aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG4gICAgLy8g4LmA4LiE4Lil4Li14Lii4Lij4LmMIENhY2hlIOC5gOC4oeC4t+C5iOC4reC4peC4mlxyXG4gICAgYXdhaXQgdGhpcy5jbGVhclVzZXJDYWNoZSh1c2VyLnVzZXJfaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZERvY0NvbnRyb2xJZEJ5T3JnKG9yZ2FuaXphdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcclxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJzUmVwb3NpdG9yeS5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiBvcmdhbml6YXRpb25JZCB9LFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXNlciA/IHVzZXIudXNlcl9pZCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDinIUg4LiU4Li24LiH4Liq4Li04LiX4LiY4Li04LmMIChQZXJtaXNzaW9uKSDguYLguJTguKLguYPguIrguYkgQ2FjaGluZyBTdHJhdGVneVxyXG4gICAqIFRUTDogMzAg4LiZ4Liy4LiX4Li1ICjguJXguLLguKEgUmVxdWlyZW1lbnQgNi41LjIpXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VXNlclBlcm1pc3Npb25zKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgcGVybWlzc2lvbnM6dXNlcjoke3VzZXJJZH1gO1xyXG5cclxuICAgIC8vIDEuIOC4peC4reC4h+C4lOC4tuC4h+C4iOC4suC4gSBDYWNoZSDguIHguYjguK3guJlcclxuICAgIGNvbnN0IGNhY2hlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuZ2V0PHN0cmluZ1tdPihjYWNoZUtleSk7XHJcbiAgICBpZiAoY2FjaGVkUGVybWlzc2lvbnMpIHtcclxuICAgICAgcmV0dXJuIGNhY2hlZFBlcm1pc3Npb25zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIOC4luC5ieC4suC5hOC4oeC5iOC4oeC4teC5g+C4mSBDYWNoZSDguYPguKvguYkgUXVlcnkg4LiI4Liy4LiBIERCIChWaWV3OiB2X3VzZXJfYWxsX3Blcm1pc3Npb25zKVxyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJzUmVwb3NpdG9yeS5xdWVyeTxcclxuICAgICAgeyBwZXJtaXNzaW9uX25hbWU6IHN0cmluZyB9W11cclxuICAgID4oYFNFTEVDVCBwZXJtaXNzaW9uX25hbWUgRlJPTSB2X3VzZXJfYWxsX3Blcm1pc3Npb25zIFdIRVJFIHVzZXJfaWQgPSA/YCwgW1xyXG4gICAgICB1c2VySWQsXHJcbiAgICBdKTtcclxuXHJcbiAgICBjb25zdCBwZXJtaXNzaW9uTGlzdCA9IHBlcm1pc3Npb25zLm1hcCgocm93KSA9PiByb3cucGVybWlzc2lvbl9uYW1lKTtcclxuXHJcbiAgICAvLyAzLiDguJrguLHguJnguJfguLbguIHguKXguIcgQ2FjaGUgKFRUTCAxODAwIOC4p+C4tOC4meC4suC4l+C4tSA9IDMwIOC4meC4suC4l+C4tSlcclxuICAgIGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLnNldChjYWNoZUtleSwgcGVybWlzc2lvbkxpc3QsIDE4MDAgKiAxMDAwKTtcclxuXHJcbiAgICByZXR1cm4gcGVybWlzc2lvbkxpc3Q7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gUm9sZXMgJiBQZXJtaXNzaW9ucyAoSGVscGVyIGZvciBBZG1pbi9VSSkgLS0tXHJcblxyXG4gIGFzeW5jIGZpbmRBbGxSb2xlcygpOiBQcm9taXNlPFJvbGVbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVJlcG9zaXRvcnkuZmluZCh7IHJlbGF0aW9uczogWydwZXJtaXNzaW9ucyddIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEFsbFBlcm1pc3Npb25zKCk6IFByb21pc2U8UGVybWlzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBudW1iZXIsIHBlcm1pc3Npb25JZHM6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5yb2xlUmVwb3NpdG9yeS5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcm9sZUlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogWydwZXJtaXNzaW9ucyddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFyb2xlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgUm9sZSBJRCAke3JvbGVJZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9hZCBwZXJtaXNzaW9ucyBlbnRpdGllc1xyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcclxuICAgIGlmIChwZXJtaXNzaW9uSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gTm90ZTogZmluZEJ5SWRzIGlzIGRlcHJlY2F0ZWQgaW4gbmV3ZXIgVHlwZU9STSwgdXNlcyBJbigpIGluc3RlYWRcclxuICAgICAgLy8gYnV0IGlmIGN1cnJlbnQgdmVyc2lvbiBzdXBwb3J0cyBpdCBvciB1c2luZyBhIHNpbXBsaWZpZWQgcXVlcnk6XHJcbiAgICAgIGNvbnN0IHBlcm1zID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9uUmVwb3NpdG9yeVxyXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3AnKVxyXG4gICAgICAgIC53aGVyZSgncC5wZXJtaXNzaW9uSWQgSU4gKDouLi5pZHMpJywgeyBpZHM6IHBlcm1pc3Npb25JZHMgfSlcclxuICAgICAgICAuZ2V0TWFueSgpO1xyXG4gICAgICBwZXJtaXNzaW9ucy5wdXNoKC4uLnBlcm1zKTtcclxuICAgIH1cclxuXHJcbiAgICByb2xlLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XHJcbiAgICByZXR1cm4gdGhpcy5yb2xlUmVwb3NpdG9yeS5zYXZlKHJvbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIOC4quC4s+C4q+C4o+C4seC4muC4peC5ieC4suC4hyBDYWNoZSDguYDguKHguLfguYjguK3guKHguLXguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIfguKrguLTguJfguJjguLTguYzguKvguKPguLfguK3guJrguJfguJrguLLguJdcclxuICAgKi9cclxuICBhc3luYyBjbGVhclVzZXJDYWNoZSh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuZGVsKGBwZXJtaXNzaW9uczp1c2VyOiR7dXNlcklkfWApO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5.map new file mode 100644 index 0000000..d4e5743 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f9/userservice_f9710ddbca9c43ce35dce6675a3feef5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.ts"],"sourcesContent":["// File: src/modules/user/user.service.ts\r\n// บันทึกการแก้ไข: แก้ไข Error TS1272 โดยใช้ 'import type' สำหรับ Cache interface (T1.3)\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n ConflictException,\r\n Inject,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\r\nimport type { Cache } from 'cache-manager'; // ✅ FIX: เพิ่ม 'type' ตรงนี้\r\nimport * as bcrypt from 'bcrypt';\r\nimport { User } from './entities/user.entity';\r\nimport { Role } from './entities/role.entity';\r\nimport { Permission } from './entities/permission.entity';\r\nimport { CreateUserDto } from './dto/create-user.dto';\r\nimport { UpdateUserDto } from './dto/update-user.dto';\r\nimport { SearchUserDto } from './dto/search-user.dto';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n constructor(\r\n @InjectRepository(User)\r\n private usersRepository: Repository,\r\n @InjectRepository(Role)\r\n private roleRepository: Repository,\r\n @InjectRepository(Permission)\r\n private permissionRepository: Repository,\r\n @Inject(CACHE_MANAGER) private cacheManager: Cache,\r\n private uuidResolver: UuidResolverService\r\n ) {}\r\n\r\n // 1. สร้างผู้ใช้ (Hash Password ก่อนบันทึก)\r\n async create(createUserDto: CreateUserDto): Promise {\r\n const salt = await bcrypt.genSalt();\r\n const hashedPassword = await bcrypt.hash(createUserDto.password, salt);\r\n\r\n // ADR-019: Resolve UUID→INT for primaryOrganizationId\r\n const resolvedOrgId = createUserDto.primaryOrganizationId\r\n ? await this.uuidResolver.resolveOrganizationId(\r\n createUserDto.primaryOrganizationId\r\n )\r\n : undefined;\r\n\r\n const newUser = this.usersRepository.create({\r\n ...createUserDto,\r\n primaryOrganizationId: resolvedOrgId,\r\n password: hashedPassword,\r\n });\r\n\r\n try {\r\n return await this.usersRepository.save(newUser);\r\n } catch (error: unknown) {\r\n const dbError = error as { code?: string };\r\n if (dbError.code === 'ER_DUP_ENTRY') {\r\n throw new ConflictException('Username or Email already exists');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // 2. ดึงข้อมูลทั้งหมด (Search & Pagination)\r\n async findAll(params?: SearchUserDto): Promise<{\r\n data: User[];\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n }> {\r\n const {\r\n search,\r\n roleId,\r\n primaryOrganizationId,\r\n page = 1,\r\n limit = 100,\r\n } = params || {};\r\n\r\n // Create query builder\r\n const query = this.usersRepository\r\n .createQueryBuilder('user')\r\n .leftJoinAndSelect('user.preference', 'preference') // Optional\r\n .leftJoinAndSelect('user.assignments', 'assignments')\r\n .leftJoinAndSelect('assignments.role', 'role')\r\n .leftJoinAndSelect('user.organization', 'organization') // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n .select([\r\n 'user.user_id',\r\n 'user.publicId',\r\n 'user.username',\r\n 'user.email',\r\n 'user.firstName',\r\n 'user.lastName',\r\n 'user.lineId',\r\n 'user.isActive',\r\n 'user.createdAt',\r\n 'user.updatedAt',\r\n 'assignments.id',\r\n 'role.roleId',\r\n 'role.roleName',\r\n 'organization.publicId', // [FIX] Expose org UUID for getter (ADR-019)\r\n ]);\r\n\r\n // Apply Filters\r\n if (search) {\r\n query.andWhere(\r\n '(user.username LIKE :search OR user.email LIKE :search OR user.firstName LIKE :search OR user.lastName LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n if (primaryOrganizationId) {\r\n // ADR-019: Resolve UUID→INT for filtering\r\n const resolvedOrgId = await this.uuidResolver.resolveOrganizationId(\r\n primaryOrganizationId\r\n );\r\n query.andWhere('user.primaryOrganizationId = :orgId', {\r\n orgId: resolvedOrgId,\r\n });\r\n }\r\n\r\n if (roleId) {\r\n query.andWhere('role.roleId = :roleId', { roleId });\r\n }\r\n\r\n // Pagination\r\n query.skip((page - 1) * limit).take(limit);\r\n\r\n const [data, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n // 3. ดึงข้อมูลรายคน\r\n async findOne(id: number): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { user_id: id },\r\n relations: [\r\n 'preference',\r\n 'assignments',\r\n 'assignments.role',\r\n 'assignments.role.permissions', // [FIX] Required for RBAC AbilityFactory\r\n 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n ],\r\n });\r\n\r\n if (!user) {\r\n throw new NotFoundException(`User with ID ${id} not found`);\r\n }\r\n\r\n return user;\r\n }\r\n\r\n async findOneByUuid(publicId: string): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'preference',\r\n 'assignments',\r\n 'assignments.role',\r\n 'assignments.role.permissions',\r\n 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n ],\r\n });\r\n\r\n if (!user) {\r\n throw new NotFoundException(`User with publicId ${publicId} not found`);\r\n }\r\n\r\n return user;\r\n }\r\n\r\n async findOneByUsername(username: string): Promise {\r\n return this.usersRepository.findOne({ where: { username } });\r\n }\r\n\r\n // 4. แก้ไขข้อมูล\r\n async update(uuid: string, updateUserDto: UpdateUserDto): Promise {\r\n const user = await this.findOneByUuid(uuid);\r\n\r\n if (updateUserDto.password) {\r\n const salt = await bcrypt.genSalt();\r\n updateUserDto.password = await bcrypt.hash(updateUserDto.password, salt);\r\n }\r\n\r\n // ADR-019: Resolve UUID→INT for primaryOrganizationId before merge\r\n const resolvedDto: Record = { ...updateUserDto };\r\n if (updateUserDto.primaryOrganizationId !== undefined) {\r\n resolvedDto.primaryOrganizationId =\r\n await this.uuidResolver.resolveOrganizationId(\r\n updateUserDto.primaryOrganizationId\r\n );\r\n }\r\n\r\n const updatedUser = this.usersRepository.merge(\r\n user,\r\n resolvedDto as Partial\r\n );\r\n const savedUser = await this.usersRepository.save(updatedUser);\r\n\r\n // ⚠️ สำคัญ: เมื่อมีการแก้ไขข้อมูล User ต้องเคลียร์ Cache สิทธิ์เสมอ\r\n await this.clearUserCache(user.user_id);\r\n\r\n return savedUser;\r\n }\r\n\r\n // 5. ลบผู้ใช้ (Soft Delete)\r\n async remove(uuid: string): Promise {\r\n const user = await this.findOneByUuid(uuid);\r\n const result = await this.usersRepository.softDelete(user.user_id);\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException(`User with UUID ${uuid} not found`);\r\n }\r\n // เคลียร์ Cache เมื่อลบ\r\n await this.clearUserCache(user.user_id);\r\n }\r\n\r\n async findDocControlIdByOrg(organizationId: number): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { primaryOrganizationId: organizationId },\r\n });\r\n return user ? user.user_id : null;\r\n }\r\n\r\n /**\r\n * ✅ ดึงสิทธิ์ (Permission) โดยใช้ Caching Strategy\r\n * TTL: 30 นาที (ตาม Requirement 6.5.2)\r\n */\r\n async getUserPermissions(userId: number): Promise {\r\n const cacheKey = `permissions:user:${userId}`;\r\n\r\n // 1. ลองดึงจาก Cache ก่อน\r\n const cachedPermissions = await this.cacheManager.get(cacheKey);\r\n if (cachedPermissions) {\r\n return cachedPermissions;\r\n }\r\n\r\n // 2. ถ้าไม่มีใน Cache ให้ Query จาก DB (View: v_user_all_permissions)\r\n const permissions = await this.usersRepository.query<\r\n { permission_name: string }[]\r\n >(`SELECT permission_name FROM v_user_all_permissions WHERE user_id = ?`, [\r\n userId,\r\n ]);\r\n\r\n const permissionList = permissions.map((row) => row.permission_name);\r\n\r\n // 3. บันทึกลง Cache (TTL 1800 วินาที = 30 นาที)\r\n await this.cacheManager.set(cacheKey, permissionList, 1800 * 1000);\r\n\r\n return permissionList;\r\n }\r\n\r\n // --- Roles & Permissions (Helper for Admin/UI) ---\r\n\r\n async findAllRoles(): Promise {\r\n return this.roleRepository.find({ relations: ['permissions'] });\r\n }\r\n\r\n async findAllPermissions(): Promise {\r\n return this.permissionRepository.find();\r\n }\r\n\r\n async updateRolePermissions(roleId: number, permissionIds: number[]) {\r\n const role = await this.roleRepository.findOne({\r\n where: { roleId },\r\n relations: ['permissions'],\r\n });\r\n\r\n if (!role) {\r\n throw new NotFoundException(`Role ID ${roleId} not found`);\r\n }\r\n\r\n // Load permissions entities\r\n const permissions = [];\r\n if (permissionIds.length > 0) {\r\n // Note: findByIds is deprecated in newer TypeORM, uses In() instead\r\n // but if current version supports it or using a simplified query:\r\n const perms = await this.permissionRepository\r\n .createQueryBuilder('p')\r\n .where('p.permissionId IN (:...ids)', { ids: permissionIds })\r\n .getMany();\r\n permissions.push(...perms);\r\n }\r\n\r\n role.permissions = permissions;\r\n return this.roleRepository.save(role);\r\n }\r\n\r\n /**\r\n * Helper สำหรับล้าง Cache เมื่อมีการเปลี่ยนแปลงสิทธิ์หรือบทบาท\r\n */\r\n async clearUserCache(userId: number): Promise {\r\n await this.cacheManager.del(`permissions:user:${userId}`);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237 new file mode 100644 index 0000000..9e487ea --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237 @@ -0,0 +1,160 @@ +2a9abde98c43717692db5ea0d6457b89 +"use strict"; +// File: src/modules/correspondence/correspondence-workflow.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceWorkflowService_1; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceWorkflowService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +let CorrespondenceWorkflowService = CorrespondenceWorkflowService_1 = class CorrespondenceWorkflowService { + constructor(workflowEngine, correspondenceRepo, revisionRepo, statusRepo, recipientRepo, dataSource, notificationService, userService) { + this.workflowEngine = workflowEngine; + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.statusRepo = statusRepo; + this.recipientRepo = recipientRepo; + this.dataSource = dataSource; + this.notificationService = notificationService; + this.userService = userService; + this.logger = new common_1.Logger(CorrespondenceWorkflowService_1.name); + this.WORKFLOW_CODE = 'CORRESPONDENCE_FLOW_V1'; + } + async submitWorkflow(correspondenceId, userId, userRoles, // [FIX] Added roles for DSL requirements check + note) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + const revision = await this.revisionRepo.findOne({ + // ✅ FIX: CamelCase (correspondenceId, isCurrent) + where: { correspondenceId: correspondenceId, isCurrent: true }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Correspondence Revision for ID ${correspondenceId} not found`); + } + // ✅ FIX: Check undefined before access + if (!revision.correspondence) { + throw new common_1.NotFoundException(`Correspondence relation not found`); + } + const context = { + // ✅ FIX: CamelCase (projectId, correspondenceTypeId) + projectId: revision.correspondence.projectId, + typeId: revision.correspondence.correspondenceTypeId, + ownerId: userId, + amount: 0, + priority: 'NORMAL', + }; + const instance = await this.workflowEngine.createInstance(this.WORKFLOW_CODE, 'correspondence_revision', revision.id.toString(), context); + const transitionResult = await this.workflowEngine.processTransition(instance.id, 'SUBMIT', userId, note || 'Initial Submission', { roles: userRoles } // [FIX] Pass roles for DSL requirements check + ); + await this.syncStatus(revision, transitionResult.nextState, queryRunner); + await queryRunner.commitTransaction(); + // Notify TO recipient org users (fire-and-forget) + const corrForNotify = revision.correspondence; + if (corrForNotify) { + void this.recipientRepo + .find({ + where: { + correspondenceId: corrForNotify.id, + recipientType: 'TO', + }, + }) + .then(async (recipients) => { + for (const r of recipients) { + const targetUserId = await this.userService.findDocControlIdByOrg(r.recipientOrganizationId); + if (targetUserId) { + await this.notificationService.send({ + userId: targetUserId, + title: 'New Correspondence Received', + message: `${corrForNotify.correspondenceNumber} has been submitted to your organization.`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: revision.correspondenceId, + link: `/correspondences/${corrForNotify.publicId}`, + }); + } + } + }) + .catch((err) => this.logger.warn(`Submit notification failed: ${err.message}`)); + } + return { + instanceId: instance.id, + currentState: transitionResult.nextState, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to submit workflow: ${String(error)}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async processAction(instanceId, userId, dto) { + const result = await this.workflowEngine.processTransition(instanceId, dto.action, userId, dto.comment, dto.payload); + // ✅ FIX: Method exists now + const instance = await this.workflowEngine.getInstanceById(instanceId); + if (instance && instance.entityType === 'correspondence_revision') { + const revision = await this.revisionRepo.findOne({ + where: { id: Number(instance.entityId) }, + }); + if (revision) { + await this.syncStatus(revision, result.nextState); + } + } + return result; + } + async syncStatus(revision, workflowState, queryRunner) { + const statusMap = { + DRAFT: 'DRAFT', + IN_REVIEW: 'SUBOWN', + APPROVED: 'CLBOWN', + REJECTED: 'CCBOWN', + }; + const targetCode = statusMap[workflowState] || 'DRAFT'; + const status = await this.statusRepo.findOne({ + where: { statusCode: targetCode }, // ✅ FIX: CamelCase + }); + if (status) { + // ✅ FIX: CamelCase (correspondenceStatusId) + revision.statusId = status.id; + const manager = queryRunner + ? queryRunner.manager + : this.revisionRepo.manager; + await manager.save(revision); + } + } +}; +exports.CorrespondenceWorkflowService = CorrespondenceWorkflowService; +exports.CorrespondenceWorkflowService = CorrespondenceWorkflowService = CorrespondenceWorkflowService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_recipient_entity_1.CorrespondenceRecipient)), + __metadata("design:paramtypes", [typeof (_a = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _f : Object, typeof (_g = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _g : Object, typeof (_h = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _h : Object]) +], CorrespondenceWorkflowService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHNFQUFzRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEUsMkNBQXVFO0FBQ3ZFLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFHakQsd0ZBQW1GO0FBQ25GLDhGQUFtRjtBQUNuRiwwRkFBK0U7QUFDL0UsNEVBQWtFO0FBQ2xFLGdHQUFxRjtBQUNyRiwrRUFBMkU7QUFDM0UsdURBQW1EO0FBRzVDLElBQU0sNkJBQTZCLHFDQUFuQyxNQUFNLDZCQUE2QjtJQUl4QyxZQUNtQixjQUFxQyxFQUV0RCxrQkFBK0QsRUFFL0QsWUFBaUUsRUFFakUsVUFBNkQsRUFFN0QsYUFBbUUsRUFDbEQsVUFBc0IsRUFDdEIsbUJBQXdDLEVBQ3hDLFdBQXdCO1FBWHhCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUVyQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRTlDLGlCQUFZLEdBQVosWUFBWSxDQUFvQztRQUVoRCxlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUU1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUM7UUFDbEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBZjFCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQywrQkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLHdCQUF3QixDQUFDO0lBZXZELENBQUM7SUFFSixLQUFLLENBQUMsY0FBYyxDQUNsQixnQkFBd0IsRUFDeEIsTUFBYyxFQUNkLFNBQW1CLEVBQUUsK0NBQStDO0lBQ3BFLElBQWE7UUFFYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsTUFBTSxXQUFXLENBQUMsT0FB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V0FBQSxJQUFBLDBCQUFnQixFQUFDLHVEQUFzQixDQUFDLENBQUE7SUFFeEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLG1EQUFvQixDQUFDLENBQUE7SUFFdEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLHlEQUF1QixDQUFDLENBQUE7eURBUFQsK0NBQXFCLG9CQUFyQiwrQ0FBcUIsb0RBRWpCLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVoQixvQkFBVSxvQkFBVixvQkFBVSxvREFFWixvQkFBVSxvQkFBVixvQkFBVSxvREFFUCxvQkFBVSxvQkFBVixvQkFBVSxvREFDYixvQkFBVSxvQkFBVixvQkFBVSxvREFDRCwwQ0FBbUIsb0JBQW5CLDBDQUFtQixvREFDM0IsMEJBQVcsb0JBQVgsMEJBQVc7R0FoQmhDLDZCQUE2QixDQWlMekMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvY29ycmVzcG9uZGVuY2Utd29ya2Zsb3cuc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbmltcG9ydCB7IFdvcmtmbG93VHJhbnNpdGlvbkR0byB9IGZyb20gJy4uL3dvcmtmbG93LWVuZ2luZS9kdG8vd29ya2Zsb3ctdHJhbnNpdGlvbi5kdG8nO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UubmFtZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBXT1JLRkxPV19DT0RFID0gJ0NPUlJFU1BPTkRFTkNFX0ZMT1dfVjEnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dFbmdpbmU6IFdvcmtmbG93RW5naW5lU2VydmljZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3JyZXNwb25kZW5jZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2U+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbilcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25SZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXR1c1JlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlY2lwaWVudFJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZWNpcGllbnQ+LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyU2VydmljZTogVXNlclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdFdvcmtmbG93KFxyXG4gICAgY29ycmVzcG9uZGVuY2VJZDogbnVtYmVyLFxyXG4gICAgdXNlcklkOiBudW1iZXIsXHJcbiAgICB1c2VyUm9sZXM6IHN0cmluZ1tdLCAvLyBbRklYXSBBZGRlZCByb2xlcyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgbm90ZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXZpc2lvbiA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAoY29ycmVzcG9uZGVuY2VJZCwgaXNDdXJyZW50KVxyXG4gICAgICAgIHdoZXJlOiB7IGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlSWQsIGlzQ3VycmVudDogdHJ1ZSB9LFxyXG4gICAgICAgIHJlbGF0aW9uczogWydjb3JyZXNwb25kZW5jZSddLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXHJcbiAgICAgICAgICBgQ29ycmVzcG9uZGVuY2UgUmV2aXNpb24gZm9yIElEICR7Y29ycmVzcG9uZGVuY2VJZH0gbm90IGZvdW5kYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOKchSBGSVg6IENoZWNrIHVuZGVmaW5lZCBiZWZvcmUgYWNjZXNzXHJcbiAgICAgIGlmICghcmV2aXNpb24uY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYENvcnJlc3BvbmRlbmNlIHJlbGF0aW9uIG5vdCBmb3VuZGApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAocHJvamVjdElkLCBjb3JyZXNwb25kZW5jZVR5cGVJZClcclxuICAgICAgICBwcm9qZWN0SWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlLnByb2plY3RJZCxcclxuICAgICAgICB0eXBlSWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICAgIG93bmVySWQ6IHVzZXJJZCxcclxuICAgICAgICBhbW91bnQ6IDAsXHJcbiAgICAgICAgcHJpb3JpdHk6ICdOT1JNQUwnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLmNyZWF0ZUluc3RhbmNlKFxyXG4gICAgICAgIHRoaXMuV09SS0ZMT1dfQ09ERSxcclxuICAgICAgICAnY29ycmVzcG9uZGVuY2VfcmV2aXNpb24nLFxyXG4gICAgICAgIHJldmlzaW9uLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgY29udGV4dFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNpdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMud29ya2Zsb3dFbmdpbmUucHJvY2Vzc1RyYW5zaXRpb24oXHJcbiAgICAgICAgaW5zdGFuY2UuaWQsXHJcbiAgICAgICAgJ1NVQk1JVCcsXHJcbiAgICAgICAgdXNlcklkLFxyXG4gICAgICAgIG5vdGUgfHwgJ0luaXRpYWwgU3VibWlzc2lvbicsXHJcbiAgICAgICAgeyByb2xlczogdXNlclJvbGVzIH0gLy8gW0ZJWF0gUGFzcyByb2xlcyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5zeW5jU3RhdHVzKHJldmlzaW9uLCB0cmFuc2l0aW9uUmVzdWx0Lm5leHRTdGF0ZSwgcXVlcnlSdW5uZXIpO1xyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIE5vdGlmeSBUTyByZWNpcGllbnQgb3JnIHVzZXJzIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIGNvbnN0IGNvcnJGb3JOb3RpZnkgPSByZXZpc2lvbi5jb3JyZXNwb25kZW5jZTtcclxuICAgICAgaWYgKGNvcnJGb3JOb3RpZnkpIHtcclxuICAgICAgICB2b2lkIHRoaXMucmVjaXBpZW50UmVwb1xyXG4gICAgICAgICAgLmZpbmQoe1xyXG4gICAgICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJGb3JOb3RpZnkuaWQsXHJcbiAgICAgICAgICAgICAgcmVjaXBpZW50VHlwZTogJ1RPJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAudGhlbihhc3luYyAocmVjaXBpZW50cykgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjaXBpZW50cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldFVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnKFxyXG4gICAgICAgICAgICAgICAgci5yZWNpcGllbnRPcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgaWYgKHRhcmdldFVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQoe1xyXG4gICAgICAgICAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdOZXcgQ29ycmVzcG9uZGVuY2UgUmVjZWl2ZWQnLFxyXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHtjb3JyRm9yTm90aWZ5LmNvcnJlc3BvbmRlbmNlTnVtYmVyfSBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8geW91ciBvcmdhbml6YXRpb24uYCxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ0VNQUlMJyxcclxuICAgICAgICAgICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgIGxpbms6IGAvY29ycmVzcG9uZGVuY2VzLyR7Y29yckZvck5vdGlmeS5wdWJsaWNJZH1gLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBTdWJtaXQgbm90aWZpY2F0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCxcclxuICAgICAgICBjdXJyZW50U3RhdGU6IHRyYW5zaXRpb25SZXN1bHQubmV4dFN0YXRlLFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN1Ym1pdCB3b3JrZmxvdzogJHtTdHJpbmcoZXJyb3IpfWApO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHByb2Nlc3NBY3Rpb24oXHJcbiAgICBpbnN0YW5jZUlkOiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlcixcclxuICAgIGR0bzogV29ya2Zsb3dUcmFuc2l0aW9uRHRvXHJcbiAgKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLnByb2Nlc3NUcmFuc2l0aW9uKFxyXG4gICAgICBpbnN0YW5jZUlkLFxyXG4gICAgICBkdG8uYWN0aW9uLFxyXG4gICAgICB1c2VySWQsXHJcbiAgICAgIGR0by5jb21tZW50LFxyXG4gICAgICBkdG8ucGF5bG9hZFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDinIUgRklYOiBNZXRob2QgZXhpc3RzIG5vd1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLmdldEluc3RhbmNlQnlJZChpbnN0YW5jZUlkKTtcclxuXHJcbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZW50aXR5VHlwZSA9PT0gJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9uJykge1xyXG4gICAgICBjb25zdCByZXZpc2lvbiA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIHdoZXJlOiB7IGlkOiBOdW1iZXIoaW5zdGFuY2UuZW50aXR5SWQpIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocmV2aXNpb24pIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnN5bmNTdGF0dXMocmV2aXNpb24sIHJlc3VsdC5uZXh0U3RhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc3luY1N0YXR1cyhcclxuICAgIHJldmlzaW9uOiBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgd29ya2Zsb3dTdGF0ZTogc3RyaW5nLFxyXG4gICAgcXVlcnlSdW5uZXI/OiBpbXBvcnQoJ3R5cGVvcm0nKS5RdWVyeVJ1bm5lclxyXG4gICkge1xyXG4gICAgY29uc3Qgc3RhdHVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICBEUkFGVDogJ0RSQUZUJyxcclxuICAgICAgSU5fUkVWSUVXOiAnU1VCT1dOJyxcclxuICAgICAgQVBQUk9WRUQ6ICdDTEJPV04nLFxyXG4gICAgICBSRUpFQ1RFRDogJ0NDQk9XTicsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHRhcmdldENvZGUgPSBzdGF0dXNNYXBbd29ya2Zsb3dTdGF0ZV0gfHwgJ0RSQUZUJztcclxuXHJcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLnN0YXR1c1JlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6IHRhcmdldENvZGUgfSwgLy8g4pyFIEZJWDogQ2FtZWxDYXNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAoY29ycmVzcG9uZGVuY2VTdGF0dXNJZClcclxuICAgICAgcmV2aXNpb24uc3RhdHVzSWQgPSBzdGF0dXMuaWQ7XHJcblxyXG4gICAgICBjb25zdCBtYW5hZ2VyID0gcXVlcnlSdW5uZXJcclxuICAgICAgICA/IHF1ZXJ5UnVubmVyLm1hbmFnZXJcclxuICAgICAgICA6IHRoaXMucmV2aXNpb25SZXBvLm1hbmFnZXI7XHJcbiAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShyZXZpc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237.map new file mode 100644 index 0000000..d43a31d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fb/correspondenceworkflowservice_fbaf8c7b016e1d0311d3c712bbc2f237.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence-workflow.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence-workflow.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence-workflow.service.ts\r\n\r\nimport { Injectable, Logger, NotFoundException } from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { DataSource, Repository } from 'typeorm';\r\n\r\nimport { WorkflowTransitionDto } from '../workflow-engine/dto/workflow-transition.dto';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\n@Injectable()\r\nexport class CorrespondenceWorkflowService {\r\n private readonly logger = new Logger(CorrespondenceWorkflowService.name);\r\n private readonly WORKFLOW_CODE = 'CORRESPONDENCE_FLOW_V1';\r\n\r\n constructor(\r\n private readonly workflowEngine: WorkflowEngineService,\r\n @InjectRepository(Correspondence)\r\n private readonly correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private readonly revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private readonly statusRepo: Repository,\r\n @InjectRepository(CorrespondenceRecipient)\r\n private readonly recipientRepo: Repository,\r\n private readonly dataSource: DataSource,\r\n private readonly notificationService: NotificationService,\r\n private readonly userService: UserService\r\n ) {}\r\n\r\n async submitWorkflow(\r\n correspondenceId: number,\r\n userId: number,\r\n userRoles: string[], // [FIX] Added roles for DSL requirements check\r\n note?: string\r\n ) {\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n const revision = await this.revisionRepo.findOne({\r\n // ✅ FIX: CamelCase (correspondenceId, isCurrent)\r\n where: { correspondenceId: correspondenceId, isCurrent: true },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Correspondence Revision for ID ${correspondenceId} not found`\r\n );\r\n }\r\n\r\n // ✅ FIX: Check undefined before access\r\n if (!revision.correspondence) {\r\n throw new NotFoundException(`Correspondence relation not found`);\r\n }\r\n\r\n const context = {\r\n // ✅ FIX: CamelCase (projectId, correspondenceTypeId)\r\n projectId: revision.correspondence.projectId,\r\n typeId: revision.correspondence.correspondenceTypeId,\r\n ownerId: userId,\r\n amount: 0,\r\n priority: 'NORMAL',\r\n };\r\n\r\n const instance = await this.workflowEngine.createInstance(\r\n this.WORKFLOW_CODE,\r\n 'correspondence_revision',\r\n revision.id.toString(),\r\n context\r\n );\r\n\r\n const transitionResult = await this.workflowEngine.processTransition(\r\n instance.id,\r\n 'SUBMIT',\r\n userId,\r\n note || 'Initial Submission',\r\n { roles: userRoles } // [FIX] Pass roles for DSL requirements check\r\n );\r\n\r\n await this.syncStatus(revision, transitionResult.nextState, queryRunner);\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Notify TO recipient org users (fire-and-forget)\r\n const corrForNotify = revision.correspondence;\r\n if (corrForNotify) {\r\n void this.recipientRepo\r\n .find({\r\n where: {\r\n correspondenceId: corrForNotify.id,\r\n recipientType: 'TO',\r\n },\r\n })\r\n .then(async (recipients) => {\r\n for (const r of recipients) {\r\n const targetUserId = await this.userService.findDocControlIdByOrg(\r\n r.recipientOrganizationId\r\n );\r\n if (targetUserId) {\r\n await this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'New Correspondence Received',\r\n message: `${corrForNotify.correspondenceNumber} has been submitted to your organization.`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: revision.correspondenceId,\r\n link: `/correspondences/${corrForNotify.publicId}`,\r\n });\r\n }\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Submit notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n instanceId: instance.id,\r\n currentState: transitionResult.nextState,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(`Failed to submit workflow: ${String(error)}`);\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async processAction(\r\n instanceId: string,\r\n userId: number,\r\n dto: WorkflowTransitionDto\r\n ) {\r\n const result = await this.workflowEngine.processTransition(\r\n instanceId,\r\n dto.action,\r\n userId,\r\n dto.comment,\r\n dto.payload\r\n );\r\n\r\n // ✅ FIX: Method exists now\r\n const instance = await this.workflowEngine.getInstanceById(instanceId);\r\n\r\n if (instance && instance.entityType === 'correspondence_revision') {\r\n const revision = await this.revisionRepo.findOne({\r\n where: { id: Number(instance.entityId) },\r\n });\r\n if (revision) {\r\n await this.syncStatus(revision, result.nextState);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async syncStatus(\r\n revision: CorrespondenceRevision,\r\n workflowState: string,\r\n queryRunner?: import('typeorm').QueryRunner\r\n ) {\r\n const statusMap: Record = {\r\n DRAFT: 'DRAFT',\r\n IN_REVIEW: 'SUBOWN',\r\n APPROVED: 'CLBOWN',\r\n REJECTED: 'CCBOWN',\r\n };\r\n\r\n const targetCode = statusMap[workflowState] || 'DRAFT';\r\n\r\n const status = await this.statusRepo.findOne({\r\n where: { statusCode: targetCode }, // ✅ FIX: CamelCase\r\n });\r\n\r\n if (status) {\r\n // ✅ FIX: CamelCase (correspondenceStatusId)\r\n revision.statusId = status.id;\r\n\r\n const manager = queryRunner\r\n ? queryRunner.manager\r\n : this.revisionRepo.manager;\r\n await manager.save(revision);\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb new file mode 100644 index 0000000..b06e425 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb @@ -0,0 +1,43 @@ +e91bf642a3fb0b03c2cbf457cc92db70 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = exports.stringToBytes = void 0; +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); + const bytes = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} +exports.stringToBytes = stringToBytes; +exports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +function v35(version, hash, value, namespace, buf, offset) { + const valueBytes = typeof value === 'string' ? stringToBytes(value) : value; + const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace; + if (typeof namespace === 'string') { + namespace = (0, parse_js_1.default)(namespace); + } + if (namespace?.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } + let bytes = new Uint8Array(16 + valueBytes.length); + bytes.set(namespaceBytes); + bytes.set(valueBytes, namespaceBytes.length); + bytes = hash(bytes); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(bytes); +} +exports.default = v35; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjM1LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLGFBQWEsQ0FBQyxHQUFHO0lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNELE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsc0NBQXNDLENBQUM7QUFDckQsT0FBTyxDQUFDLEdBQUcsR0FBRyxzQ0FBc0MsQ0FBQztBQUNyRCxTQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDckQsTUFBTSxVQUFVLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM1RSxNQUFNLGNBQWMsR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RHLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFBSSxTQUFTLEVBQUUsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sU0FBUyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ3ZDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHYzNS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSBleHBvcnRzLnN0cmluZ1RvQnl0ZXMgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gICAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuZXhwb3J0cy5zdHJpbmdUb0J5dGVzID0gc3RyaW5nVG9CeXRlcztcbmV4cG9ydHMuRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnRzLlVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZnVuY3Rpb24gdjM1KHZlcnNpb24sIGhhc2gsIHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgY29uc3QgdmFsdWVCeXRlcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBzdHJpbmdUb0J5dGVzKHZhbHVlKSA6IHZhbHVlO1xuICAgIGNvbnN0IG5hbWVzcGFjZUJ5dGVzID0gdHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycgPyAoMCwgcGFyc2VfanNfMS5kZWZhdWx0KShuYW1lc3BhY2UpIDogbmFtZXNwYWNlO1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lc3BhY2UgPSAoMCwgcGFyc2VfanNfMS5kZWZhdWx0KShuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlPy5sZW5ndGggIT09IDE2KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH1cbiAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlQnl0ZXMubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlQnl0ZXMpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZUJ5dGVzLCBuYW1lc3BhY2VCeXRlcy5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaChieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSAoYnl0ZXNbOF0gJiAweDNmKSB8IDB4ODA7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjM1O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb.map new file mode 100644 index 0000000..be77d0a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/v35_fca1af3a7beb257668611362527174bb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v35.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,aAAa,CAAC,GAAG;IACtB,GAAG,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;AACtC,OAAO,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACrD,OAAO,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACrD,SAAS,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrD,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,MAAM,cAAc,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChC,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,kEAAkE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v35.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = exports.stringToBytes = void 0;\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str));\n const bytes = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n bytes[i] = str.charCodeAt(i);\n }\n return bytes;\n}\nexports.stringToBytes = stringToBytes;\nexports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nfunction v35(version, hash, value, namespace, buf, offset) {\n const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace;\n if (typeof namespace === 'string') {\n namespace = (0, parse_js_1.default)(namespace);\n }\n if (namespace?.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n }\n let bytes = new Uint8Array(16 + valueBytes.length);\n bytes.set(namespaceBytes);\n bytes.set(valueBytes, namespaceBytes.length);\n bytes = hash(bytes);\n bytes[6] = (bytes[6] & 0x0f) | version;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v35;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8 new file mode 100644 index 0000000..a23b671 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8 @@ -0,0 +1,54 @@ +5a8455555fc5390c39364feb1bafb80f +"use strict"; +// File: src/modules/user/entities/user-preference.entity.ts +// บันทึกการแก้ไข: Entity สำหรับเก็บการตั้งค่าส่วนตัวของผู้ใช้ แยกจากตาราง Users (T1.3) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserPreference = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("./user.entity"); +let UserPreference = class UserPreference { +}; +exports.UserPreference = UserPreference; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'user_id' }), + __metadata("design:type", Number) +], UserPreference.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'notify_email', default: true }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "notifyEmail", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'notify_line', default: true }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "notifyLine", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'digest_mode', default: false }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "digestMode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ui_theme', default: 'light', length: 20 }), + __metadata("design:type", String) +], UserPreference.prototype, "uiTheme", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], UserPreference.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => user_entity_1.User, (user) => user.preference, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], UserPreference.prototype, "user", void 0); +exports.UserPreference = UserPreference = __decorate([ + (0, typeorm_1.Entity)('user_preferences') +], UserPreference); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItcHJlZmVyZW5jZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDREQUE0RDtBQUM1RCx1RkFBdUY7Ozs7Ozs7Ozs7Ozs7QUFFdkYscUNBT2lCO0FBQ2pCLCtDQUFxQztBQUc5QixJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0NBdUIxQixDQUFBO0FBdkJZLHdDQUFjO0FBRXpCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs4Q0FDbkI7QUFHaEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzFCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUMxQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDOztrREFDM0I7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzsrQ0FDMUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFLakI7SUFGQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN4RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOzRDQUFDO3lCQXRCRCxjQUFjO0lBRDFCLElBQUEsZ0JBQU0sRUFBQyxrQkFBa0IsQ0FBQztHQUNkLGNBQWMsQ0F1QjFCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHVzZXJcXGVudGl0aWVzXFx1c2VyLXByZWZlcmVuY2UuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci1wcmVmZXJlbmNlLmVudGl0eS50c1xuLy8g4Lia4Lix4LiZ4LiX4Li24LiB4LiB4Liy4Lij4LmB4LiB4LmJ4LmE4LiCOiBFbnRpdHkg4Liq4Liz4Lir4Lij4Lix4Lia4LmA4LiB4LmH4Lia4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Liq4LmI4Lin4LiZ4LiV4Lix4Lin4LiC4Lit4LiH4Lic4Li54LmJ4LmD4LiK4LmJIOC5geC4ouC4geC4iOC4suC4geC4leC4suC4o+C4suC4hyBVc2VycyAoVDEuMylcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIE9uZVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXIuZW50aXR5JztcblxuQEVudGl0eSgndXNlcl9wcmVmZXJlbmNlcycpXG5leHBvcnQgY2xhc3MgVXNlclByZWZlcmVuY2Uge1xuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdub3RpZnlfZW1haWwnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIG5vdGlmeUVtYWlsITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ25vdGlmeV9saW5lJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBub3RpZnlMaW5lITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RpZ2VzdF9tb2RlJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgZGlnZXN0TW9kZSE6IGJvb2xlYW47IC8vIOC4o+C4seC4muC5geC4iOC5ieC4h+C5gOC4leC4t+C4reC4meC5geC4muC4muC4o+C4p+C4oSAoRGlnZXN0KSDguYHguJfguJkgUmVhbC10aW1lXG5cbiAgQENvbHVtbih7IG5hbWU6ICd1aV90aGVtZScsIGRlZmF1bHQ6ICdsaWdodCcsIGxlbmd0aDogMjAgfSlcbiAgdWlUaGVtZSE6IHN0cmluZztcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIC0tLSBSZWxhdGlvbiAtLS1cbiAgQE9uZVRvT25lKCgpID0+IFVzZXIsICh1c2VyKSA9PiB1c2VyLnByZWZlcmVuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VyITogVXNlcjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8.map new file mode 100644 index 0000000..9ec2687 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/userpreferenceentity_ffdeaf38ca1cbfa6de2ab4690658d6d8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-preference.entity.ts","mappings":";AAAA,4DAA4D;AAC5D,uFAAuF;;;;;;;;;;;;;AAEvF,qCAOiB;AACjB,+CAAqC;AAG9B,IAAM,cAAc,GAApB,MAAM,cAAc;CAuB1B,CAAA;AAvBY,wCAAc;AAEzB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACnB;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;mDAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;kDAC1B;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;kDAC3B;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;+CAC1C;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAKjB;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;yBAtBD,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAuB1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-preference.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user-preference.entity.ts\n// บันทึกการแก้ไข: Entity สำหรับเก็บการตั้งค่าส่วนตัวของผู้ใช้ แยกจากตาราง Users (T1.3)\n\nimport {\n Entity,\n Column,\n PrimaryColumn,\n UpdateDateColumn,\n OneToOne,\n JoinColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\n\n@Entity('user_preferences')\nexport class UserPreference {\n @PrimaryColumn({ name: 'user_id' })\n userId!: number;\n\n @Column({ name: 'notify_email', default: true })\n notifyEmail!: boolean;\n\n @Column({ name: 'notify_line', default: true })\n notifyLine!: boolean;\n\n @Column({ name: 'digest_mode', default: false })\n digestMode!: boolean; // รับแจ้งเตือนแบบรวม (Digest) แทน Real-time\n\n @Column({ name: 'ui_theme', default: 'light', length: 20 })\n uiTheme!: string;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // --- Relation ---\n @OneToOne(() => User, (user) => user.preference, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user!: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 b/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 new file mode 100644 index 0000000..de99ba9 --- /dev/null +++ b/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 @@ -0,0 +1 @@ +{"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts":[1,1747],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts":[0,2351],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts":[1,2764],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts":[1,1560],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts":[1,1866],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts":[1,1897]} \ No newline at end of file diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index f46900c..e5c5ffc 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -118,6 +118,14 @@ import { MigrationModule } from './modules/migration/migration.module'; charset: 'utf8mb4', autoLoadEntities: true, synchronize: false, // Production Ready: false + // ป้องกัน ECONNRESET จาก idle connection ที่ถูก MariaDB ตัด + connectTimeout: 30000, // 30 วินาที + acquireTimeout: 30000, // 30 วินาที + extra: { + connectionLimit: 10, + enableKeepAlive: true, // ส่ง TCP keepalive ป้องกัน connection ตาย + keepAliveInitialDelay: 10000, // 10 วินาทีก่อนส่ง keepalive ครั้งแรก + }, }), }), diff --git a/backend/src/modules/correspondence/correspondence.module.ts b/backend/src/modules/correspondence/correspondence.module.ts index 4fa3f31..a346763 100644 --- a/backend/src/modules/correspondence/correspondence.module.ts +++ b/backend/src/modules/correspondence/correspondence.module.ts @@ -13,6 +13,7 @@ import { CorrespondenceStatus } from './entities/correspondence-status.entity'; import { CorrespondenceReference } from './entities/correspondence-reference.entity'; import { CorrespondenceRecipient } from './entities/correspondence-recipient.entity'; import { CorrespondenceTag } from './entities/correspondence-tag.entity'; +import { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity'; import { Organization } from '../organization/entities/organization.entity'; // Dependent Modules @@ -40,6 +41,7 @@ import { NotificationModule } from '../notification/notification.module'; CorrespondenceReference, CorrespondenceRecipient, CorrespondenceTag, + CorrespondenceRevisionAttachment, Organization, ]), DocumentNumberingModule, diff --git a/backend/src/modules/correspondence/correspondence.service.ts b/backend/src/modules/correspondence/correspondence.service.ts index 331f2d3..40d9293 100644 --- a/backend/src/modules/correspondence/correspondence.service.ts +++ b/backend/src/modules/correspondence/correspondence.service.ts @@ -22,6 +22,7 @@ import { CorrespondenceTag } from './entities/correspondence-tag.entity'; import { Tag } from '../master/entities/tag.entity'; import { User } from '../user/entities/user.entity'; import { Organization } from '../organization/entities/organization.entity'; +import { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity'; // DTOs import { CreateCorrespondenceDto } from './dto/create-correspondence.dto'; @@ -89,7 +90,9 @@ export class CorrespondenceService { private searchService: SearchService, private fileStorageService: FileStorageService, private uuidResolver: UuidResolverService, - private notificationService: NotificationService + private notificationService: NotificationService, + @InjectRepository(CorrespondenceRevisionAttachment) + private revAttachRepo: Repository ) {} /** @@ -344,10 +347,25 @@ export class CorrespondenceService { ? new Date(createDto.documentDate) : undefined; - await this.fileStorageService.commit(createDto.attachmentTempIds, { - issueDate, - documentType: 'Correspondence', - }); + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit( + createDto.attachmentTempIds, + { issueDate, documentType: 'Correspondence' } + ); + + if (committed.length > 0) { + const links = committed.map((att, idx) => + queryRunner.manager.create(CorrespondenceRevisionAttachment, { + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: idx === 0, // ไฟล์แรกเป็น main document + }) + ); + await queryRunner.manager.save( + CorrespondenceRevisionAttachment, + links + ); + } } await queryRunner.commitTransaction(); @@ -496,6 +514,8 @@ export class CorrespondenceService { relations: [ 'revisions', 'revisions.status', + 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction + 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง 'type', 'project', 'originator', @@ -710,10 +730,25 @@ export class CorrespondenceService { ? new Date(updateDto.documentDate) : revision.issuedDate || revision.documentDate || undefined; - await this.fileStorageService.commit(updateDto.attachmentTempIds, { - issueDate: issueDate ? new Date(issueDate) : undefined, - documentType: 'Correspondence', - }); + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit( + updateDto.attachmentTempIds, + { + issueDate: issueDate ? new Date(issueDate) : undefined, + documentType: 'Correspondence', + } + ); + + if (committed.length > 0) { + const links = committed.map((att) => + this.revAttachRepo.create({ + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main + }) + ); + await this.revAttachRepo.save(links); + } } // 5. Update Recipients if provided diff --git a/backend/src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts b/backend/src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts new file mode 100644 index 0000000..88097ff --- /dev/null +++ b/backend/src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts @@ -0,0 +1,40 @@ +// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts +import { Entity, Column, ManyToOne, JoinColumn, PrimaryColumn } from 'typeorm'; +import { CorrespondenceRevision } from './correspondence-revision.entity'; +import { Attachment } from '../../../common/file-storage/entities/attachment.entity'; + +/** + * CorrespondenceRevisionAttachment + * + * ตารางเชื่อม correspondence_revisions กับ attachments (M:N) + * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id + * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision + */ +@Entity('correspondence_revision_attachments') +export class CorrespondenceRevisionAttachment { + // คีย์หลักของ revision ที่ผูกไฟล์นี้ + @PrimaryColumn({ name: 'correspondence_revision_id' }) + correspondenceRevisionId!: number; + + // คีย์หลักของ attachment + @PrimaryColumn({ name: 'attachment_id' }) + attachmentId!: number; + + // ไฟล์หลักของ revision นี้ (เช่น PDF หลัก) + @Column({ name: 'is_main_document', default: false }) + isMainDocument!: boolean; + + // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง CorrespondenceRevision + @ManyToOne( + () => CorrespondenceRevision, + (revision) => revision.attachmentLinks, + { onDelete: 'CASCADE' } + ) + @JoinColumn({ name: 'correspondence_revision_id' }) + revision?: CorrespondenceRevision; + + // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง Attachment + @ManyToOne(() => Attachment, { onDelete: 'CASCADE', eager: false }) + @JoinColumn({ name: 'attachment_id' }) + attachment?: Attachment; +} diff --git a/backend/src/modules/correspondence/entities/correspondence-revision.entity.ts b/backend/src/modules/correspondence/entities/correspondence-revision.entity.ts index fc7bd58..b66fefa 100644 --- a/backend/src/modules/correspondence/entities/correspondence-revision.entity.ts +++ b/backend/src/modules/correspondence/entities/correspondence-revision.entity.ts @@ -1,4 +1,3 @@ -// File: src/modules/correspondence/entities/correspondence-revision.entity.ts import { Entity, Column, @@ -8,6 +7,7 @@ import { CreateDateColumn, Index, OneToOne, + OneToMany, } from 'typeorm'; import { RfaRevision } from '../../rfa/entities/rfa-revision.entity'; import { Correspondence } from './correspondence.entity'; @@ -15,6 +15,7 @@ import { CorrespondenceStatus } from './correspondence-status.entity'; import { User } from '../../user/entities/user.entity'; import { UuidBaseEntity } from '../../../common/entities/uuid-base.entity'; import { Exclude } from 'class-transformer'; +import { CorrespondenceRevisionAttachment } from './correspondence-revision-attachment.entity'; @Entity('correspondence_revisions') // ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น @@ -116,4 +117,8 @@ export class CorrespondenceRevision extends UuidBaseEntity { // Added inverse relation for CTI mapping to subclasses (RFA) @OneToOne(() => RfaRevision, (rfaRev) => rfaRev.correspondenceRevision) rfaRevision?: RfaRevision; + + // [FIX v1.8.1] Relation: ไฟล์แนบของ revision นี้ผ่าน junction table + @OneToMany(() => CorrespondenceRevisionAttachment, (link) => link.revision) + attachmentLinks?: CorrespondenceRevisionAttachment[]; } diff --git a/backend/src/modules/document-numbering/services/reservation.service.ts b/backend/src/modules/document-numbering/services/reservation.service.ts index e222871..8235299 100644 --- a/backend/src/modules/document-numbering/services/reservation.service.ts +++ b/backend/src/modules/document-numbering/services/reservation.service.ts @@ -167,24 +167,33 @@ export class ReservationService { /** * Cron job: Cleanup expired reservations every 5 minutes + * ใช้ try/catch เพื่อรองรับ transient ECONNRESET — TypeORM pool จะ reconnect อัตโนมัติใน tick ถัดไป */ @Cron('*/5 * * * *') async cleanupExpired(): Promise { - const result = await this.reservationRepo - .createQueryBuilder() - .update() - .set({ - status: ReservationStatus.CANCELLED, - cancelledAt: () => 'NOW()', - }) - .where('document_number_status = :status', { - status: ReservationStatus.RESERVED, - }) - .andWhere('expires_at < NOW()') - .execute(); + try { + const result = await this.reservationRepo + .createQueryBuilder() + .update() + .set({ + status: ReservationStatus.CANCELLED, + cancelledAt: () => 'NOW()', + }) + .where('document_number_status = :status', { + status: ReservationStatus.RESERVED, + }) + .andWhere('expires_at < NOW()') + .execute(); - if ((result.affected ?? 0) > 0) { - this.logger.log(`Cleaned up ${result.affected} expired reservations`); + if ((result.affected ?? 0) > 0) { + this.logger.log(`Cleaned up ${result.affected} expired reservations`); + } + } catch (error: unknown) { + // ECONNRESET บน idle connection — TypeORM จะ reconnect pool ใน request ถัดไปโดยอัตโนมัติ + const msg = error instanceof Error ? error.message : String(error); + this.logger.warn( + `[cleanupExpired] Transient DB error (will retry next tick): ${msg}` + ); } } diff --git a/frontend/components/correspondences/detail.tsx b/frontend/components/correspondences/detail.tsx index d5f700e..ae4a6fb 100644 --- a/frontend/components/correspondences/detail.tsx +++ b/frontend/components/correspondences/detail.tsx @@ -53,7 +53,9 @@ export function CorrespondenceDetail({ data, selectedRevisionId }: Correspondenc const subject = currentRevision?.subject || '-'; const description = currentRevision?.description || '-'; const status = currentRevision?.status?.statusCode || 'UNKNOWN'; - const attachments = currentRevision?.attachments || []; + // [FIX v1.8.1] flatten attachmentLinks จาก junction table แทน attachments โดยตรง + const attachments = + currentRevision?.attachmentLinks?.map((link) => link.attachment) ?? []; const importance = (currentRevision?.details?.importance as string) || 'NORMAL'; const canEditMetadata = hasPermission('correspondence.edit'); const privilegedEditableStatuses = ['SUBCSC', 'SUBOWN', 'IN_REVIEW_CSC']; @@ -294,10 +296,15 @@ export function CorrespondenceDetail({ data, selectedRevisionId }: Correspondenc >
- {file.name} + {file.originalFilename}
diff --git a/frontend/components/correspondences/form.tsx b/frontend/components/correspondences/form.tsx index 5469040..f01b1d8 100644 --- a/frontend/components/correspondences/form.tsx +++ b/frontend/components/correspondences/form.tsx @@ -24,7 +24,9 @@ import { toast } from 'sonner'; // Updated Zod Schema with all required fields const correspondenceSchema = z.object({ projectId: z.string().min(1, 'Please select a Project'), - contractId: z.string().min(1, 'Please select a Contract'), + // [FIX v1.8.1] contractId optional เพราะ correspondences ไม่มี contract_id โดยตรง + // จะ auto-populate จาก discipline เฉพาะ UI เท่านั้น + contractId: z.string().optional(), documentTypeId: z.number().min(1, 'Please select a Document Type'), disciplineId: z.number().optional(), subject: z.string().min(5, 'Subject must be at least 5 characters'), @@ -66,6 +68,12 @@ interface DisciplineOption { id: number; disciplineCode: string; codeNameEn?: string; + // [FIX v1.8.1] บาง API ส่ง contract relation มาด้วย → ใช้ resolve contractId + contract?: { + publicId?: string; + contractName?: string; + contractCode?: string; + }; } interface InitialCorrespondenceData { @@ -168,7 +176,8 @@ export function CorrespondenceForm({ projectId: normalizePublicId(initialData?.project?.publicId) ?? normalizePublicId(initialData?.projectId), - contractId: normalizePublicId(initialData?.contract?.publicId), + // [FIX v1.8.1] correspondences ไม่มี contract_id โดยตรง → จะ auto-populate จาก discipline useEffect + contractId: undefined, documentTypeId: initialData?.correspondenceTypeId || undefined, disciplineId: initialData?.disciplineId || undefined, subject: currentRev?.subject || currentRev?.title || '', @@ -241,6 +250,21 @@ export function CorrespondenceForm({ } }, [contractId, setValue]); + // [FIX v1.8.1] Auto-populate contractId จาก discipline เมื่อ edit mode + // disciplines API ส่ง contract relation มาด้วย ถ้ามี discipline + useEffect(() => { + if (!initialData?.disciplineId) return; + if (disciplines.length === 0) return; + // ถ้ามี contractId ใน form แล้ว ไม่ต้อง override + const currentContractId = watch('contractId'); + if (currentContractId) return; + + const matched = disciplines.find((d) => d.id === initialData.disciplineId); + if (matched?.contract?.publicId) { + setValue('contractId', matched.contract.publicId); + } + }, [initialData?.disciplineId, disciplines, setValue, watch]); + const [isUploading, setIsUploading] = useState(false); const onSubmit = async (data: FormData) => { diff --git a/frontend/types/correspondence.ts b/frontend/types/correspondence.ts index 9ad4765..78ac9cb 100644 --- a/frontend/types/correspondence.ts +++ b/frontend/types/correspondence.ts @@ -6,13 +6,20 @@ export interface Organization { export interface Attachment { publicId: string; // ADR-019: public identifier - name: string; - url: string; - size?: number; - type?: string; + originalFilename: string; + storedFilename?: string; + fileSize?: number; + mimeType?: string; + filePath?: string; createdAt?: string; } +// [FIX v1.8.1] ประเภทข้อมูล junction table correspondence_revision_attachments +export interface AttachmentLink { + isMainDocument: boolean; + attachment: Attachment; +} + // Used in List View mainly export interface CorrespondenceRevision { publicId: string; // ADR-019: public identifier @@ -34,7 +41,8 @@ export interface CorrespondenceRevision { statusName: string; }; details?: Record | null; - attachments?: Attachment[]; + // [FIX v1.8.1] ไฟล์แนบผ่าน junction table (correspondence_revision_attachments) + attachmentLinks?: AttachmentLink[]; createdAt: string; // Nested Relation from Backend Refactor diff --git a/specs/03-Data-and-Storage/03-01-data-dictionary.md b/specs/03-Data-and-Storage/03-01-data-dictionary.md index 0d88011..4bd7124 100644 --- a/specs/03-Data-and-Storage/03-01-data-dictionary.md +++ b/specs/03-Data-and-Storage/03-01-data-dictionary.md @@ -78,8 +78,8 @@ erDiagram shop_drawing_sub_categories ||--o{ shop_drawings : "sub_categorizes" %% Attachments - attachments ||--o{ correspondence_attachments : "attached_to" - correspondences ||--o{ correspondence_attachments : "has" + attachments ||--o{ correspondence_revision_attachments : "attached_to" + correspondence_revisions ||--o{ correspondence_revision_attachments : "has" ``` --- @@ -357,7 +357,7 @@ erDiagram **Relationships**: - Parent: correspondence_types, **disciplines**, projects, organizations, users -- Children: correspondence_revisions, correspondence_recipients, correspondence_tags, correspondence_references, correspondence_attachments, circulations, transmittals +- Children: correspondence_revisions, correspondence_recipients, correspondence_tags, correspondence_references, circulations, transmittals --- @@ -1386,7 +1386,7 @@ erDiagram **Relationships**: - Parent: users -- Referenced by: correspondence_attachments, circulation_attachments, shop_drawing_revision_attachments, contract_drawing_attachments +- Referenced by: correspondence_revision_attachments, circulation_attachments, shop_drawing_revision_attachments, contract_drawing_attachments **Business Rules**: @@ -1398,33 +1398,37 @@ erDiagram --- -### 8.2 correspondence_attachments +### 8.2 correspondence_revision_attachments (UPDATE v1.8.1) -**Purpose**: Junction table linking correspondences to file attachments (M:N) +**Purpose**: Junction table linking **correspondence_revisions** to file attachments (M:N) -| Column Name | Data Type | Constraints | Description | -| ----------------- | --------- | --------------- | ---------------------------- | -| correspondence_id | INT | PRIMARY KEY, FK | Reference to correspondences | -| attachment_id | INT | PRIMARY KEY, FK | Reference to attachments | -| is_main_document | BOOLEAN | DEFAULT FALSE | Main/primary document flag | +> **[FIX v1.8.1]** เปลี่ยนจาก `correspondence_attachments` (FK → `correspondences.id`) → `correspondence_revision_attachments` (FK → `correspondence_revisions.id`) +> เหตุผล: ไฟล์แนบผูกกับ revision ไม่ใช่ correspondence master เพราะแต่ละ revision อาจมีไฟล์แนบต่างกัน + +| Column Name | Data Type | Constraints | Description | +| ---------------------------- | --------- | --------------- | --------------------------------------- | +| correspondence_revision_id | INT | PRIMARY KEY, FK | Reference to correspondence_revisions | +| attachment_id | INT | PRIMARY KEY, FK | Reference to attachments | +| is_main_document | BOOLEAN | DEFAULT FALSE | Main/primary document flag of revision | **Indexes**: -- PRIMARY KEY (correspondence_id, attachment_id) -- FOREIGN KEY (correspondence_id) REFERENCES correspondences(id) ON DELETE CASCADE +- PRIMARY KEY (correspondence_revision_id, attachment_id) +- FOREIGN KEY (correspondence_revision_id) REFERENCES correspondence_revisions(id) ON DELETE CASCADE - FOREIGN KEY (attachment_id) REFERENCES attachments(id) ON DELETE CASCADE -- INDEX (attachment_id) -- INDEX (is_main_document) +- INDEX idx_corr_rev_att_revision (correspondence_revision_id) **Relationships**: -- Parent: correspondences, attachments +- Parent: correspondence_revisions, attachments +- correspondence_revisions has `attachmentLinks` OneToMany relation **Business Rules**: -- One correspondence can have multiple attachments -- One attachment can be linked to multiple correspondences -- is_main_document identifies primary file (typically PDF) +- One revision can have multiple attachments +- One attachment can be linked to multiple revisions +- is_main_document identifies primary file of that revision (typically PDF) +- เมื่อ create/update correspondence → commit attachments → บันทึก revision_id ลงตารางนี้ --- diff --git a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-01-drop.sql b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-01-drop.sql index 5e84ed9..843c49f 100644 --- a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-01-drop.sql +++ b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-01-drop.sql @@ -1,4 +1,4 @@ --- ========================================================== +-- ========================================================== -- DMS v1.8.0 Schema Part 1/3: DROP Statements -- รันไฟล์นี้ก่อน เพื่อล้างตารางเดิมทั้งหมด -- ========================================================== @@ -98,7 +98,7 @@ DROP TABLE IF EXISTS shop_drawing_revision_attachments; DROP TABLE IF EXISTS asbuilt_drawing_revision_attachments; -DROP TABLE IF EXISTS correspondence_attachments; +DROP TABLE IF EXISTS correspondence_revision_attachments; DROP TABLE IF EXISTS attachments; diff --git a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-02-tables.sql b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-02-tables.sql index edbf1a9..d46b672 100644 --- a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-02-tables.sql +++ b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-02-tables.sql @@ -848,15 +848,18 @@ CREATE TABLE attachments ( UNIQUE INDEX idx_attachments_uuid (uuid) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "กลาง" เก็บไฟล์แนบทั้งหมดของระบบ'; --- ตารางเชื่อม correspondences กับ attachments (M:N) -CREATE TABLE correspondence_attachments ( - correspondence_id INT COMMENT 'ID ของเอกสาร', - attachment_id INT COMMENT 'ID ของไฟล์แนบ', - is_main_document BOOLEAN DEFAULT FALSE COMMENT '(1 = ไฟล์หลัก)', - PRIMARY KEY (correspondence_id, attachment_id), - FOREIGN KEY (correspondence_id) REFERENCES correspondences (id) ON DELETE CASCADE, - FOREIGN KEY (attachment_id) REFERENCES attachments (id) ON DELETE CASCADE -) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเชื่อม correspondences กับ attachments (M :N)'; +-- ตารางเชื่อม correspondence_revisions กับ attachments (M:N) +-- [FIX] FK เปลี่ยนจาก correspondences.id → correspondence_revisions.id +-- เหตุผล: ไฟล์แนบผูกกับ revision ไม่ใช่ correspondence master (แต่ละ revision มีไฟล์ต่างกัน) +CREATE TABLE correspondence_revision_attachments ( + correspondence_revision_id INT NOT NULL COMMENT 'ID ของ Revision ที่ผูกไฟล์แนบนี้', + attachment_id INT NOT NULL COMMENT 'ID ของไฟล์แนบ', + is_main_document BOOLEAN DEFAULT FALSE COMMENT '(1 = ไฟล์หลักของ Revision นี้)', + PRIMARY KEY (correspondence_revision_id, attachment_id), + FOREIGN KEY (correspondence_revision_id) REFERENCES correspondence_revisions (id) ON DELETE CASCADE, + FOREIGN KEY (attachment_id) REFERENCES attachments (id) ON DELETE CASCADE, + INDEX idx_corr_rev_att_revision (correspondence_revision_id) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเชื่อม correspondence_revisions กับ attachments (M:N)'; -- ตารางเชื่อม circulations กับ attachments (M:N) CREATE TABLE circulation_attachments ( diff --git a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-03-views-indexes.sql b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-03-views-indexes.sql index 8fa40d8..65ed4ae 100644 --- a/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-03-views-indexes.sql +++ b/specs/03-Data-and-Storage/lcbp3-v1.8.0-schema-03-views-indexes.sql @@ -1,4 +1,4 @@ --- ========================================================== +-- ========================================================== -- DMS v1.8.0 Schema Part 3/3: Views, Indexes, Partitioning -- รัน: หลังจาก 02-schema-tables.sql เสร็จ -- ========================================================== @@ -397,16 +397,20 @@ SELECT 'CORRESPONDENCE' AS document_type, p.uuid AS project_uuid, p.project_code, p.project_name, - COUNT(ca.attachment_id) AS attachment_count, + COUNT(cra.attachment_id) AS attachment_count, MAX(a.created_at) AS latest_attachment_date FROM correspondences c - INNER JOIN projects p ON c.project_id = p.id - LEFT JOIN correspondence_attachments ca ON c.id = ca.correspondence_id - LEFT JOIN attachments a ON ca.attachment_id = a.id + INNER JOIN projects p ON c.project_id = p.id -- [FIX] JOIN ผ่าน correspondence_revisions เพราะไฟล์ผูกกับ revision ไม่ใช่ correspondence master + LEFT JOIN correspondence_revisions cr ON c.id = cr.correspondence_id + AND cr.is_current = TRUE + LEFT JOIN correspondence_revision_attachments cra ON cr.id = cra.correspondence_revision_id + LEFT JOIN attachments a ON cra.attachment_id = a.id WHERE c.deleted_at IS NULL GROUP BY c.id, + c.uuid, c.correspondence_number, c.project_id, + p.uuid, p.project_code, p.project_name UNION ALL