diff --git a/migrations/app/migrations_manifest.txt b/migrations/app/migrations_manifest.txt index 65fc8340982..b35b9a7819b 100644 --- a/migrations/app/migrations_manifest.txt +++ b/migrations/app/migrations_manifest.txt @@ -1040,6 +1040,7 @@ 20241111223224_change_international_sit_services_to_accessorials.up.sql 20241115214553_create_re_fsc_multipliers_table.up.sql 20241119151019_stored_procs_for_ordering_service_items.up.sql +20241119163933_set_inactive_NSRA15_oconus_rate_areas.up.sql 20241120221040_change_port_location_fk_to_correct_table.up.sql 20241122155416_total_dependents_calculation.up.sql 20241126222026_add_sort_column_to_re_service_items.up.sql diff --git a/migrations/app/schema/20241119163933_set_inactive_NSRA15_oconus_rate_areas.up.sql b/migrations/app/schema/20241119163933_set_inactive_NSRA15_oconus_rate_areas.up.sql new file mode 100644 index 00000000000..bd6b9e404d3 --- /dev/null +++ b/migrations/app/schema/20241119163933_set_inactive_NSRA15_oconus_rate_areas.up.sql @@ -0,0 +1,288 @@ +-- Set re_oconus_rate_area to active=false per duty location IDs +update public.re_oconus_rate_areas set active = false +where id in ( +select + distinct o.id as oconus_rate_area_id +from + duty_locations d, + addresses a, + v_locations v, + re_oconus_rate_areas o, + re_rate_areas ra +where + d.id in ( + 'bfec82a4-b46f-453b-8b88-c588a6954186', + '3a94f6a8-c2b8-4c95-8d8a-b6ff4573cdbf', + '3fafe753-4ef0-40d0-ad11-0b6603a14ac3', + '86326958-46f1-464e-9fb0-240f479ca06d', + '9c890b8c-77ec-458e-b8a2-f50feb0ea344', + '2475aec9-2cea-4059-82ba-8347363cf0b8', + '619dbdf4-b8e0-4dbe-9876-9cdc9f809049', + 'ef9c390c-8b3e-4c4b-bbe6-d1ad086398c0', + '8c57f17a-29a0-49e0-945a-b9b5abc75bfd', + '1507ad69-7d74-44a3-8359-0e14f12e0a2b', + 'bfcc9ba0-e378-4d4f-a2da-1871e32be45f', + 'b5f2c454-37b3-4529-9db1-cd44f2fa26c4', + '82ef1e92-1507-4124-8b37-8d58ddbbbf91', + '75e3c0c2-b6a3-4100-9396-918fdbdf1018', + 'a93ebf02-38a0-4730-8ed9-969a7a799b55', + '75faec85-1031-4e87-9fc3-96ce68e29350', + 'e057a5cf-da57-48e3-a37b-db1e55239a60', + 'b5af67cb-d727-4430-93f9-d3c2759e0330', + '66db95df-7e88-45dc-ad9f-e9c6618171ca', + '12dbb585-3c54-44e6-8a0c-32f0fbc9deb0', + 'c4b182c5-fb92-4103-a513-dab4535d0168', + 'faf102ef-d5a4-4b2c-a0b3-cc9cef116c86', + '14d2f648-551b-4d76-bcff-5629addbdd4a', + '32fe36df-5b9b-4121-8674-47cf34ba9af8', + '888c25a8-3f64-406a-98d2-d9f6dab4c154', + '91417251-bf6d-4147-aa0f-b8ef85193d79', + '627d448b-8d66-4b6a-9123-84f60a5ffc6f', + 'a59480ee-af9c-49d3-a366-72e23a53abe6', + '0f9cc96f-5fb9-40e7-9bd2-51537246a30f', + 'e02520be-da87-4aed-b10a-dbf4aed85bcd', + 'c4140981-c84a-4591-bd00-b5de8a94b817', + '6cd8c14c-1ee9-4807-9c09-280975e82152', + 'f22d70d6-8164-4daa-a519-79740b4b5f76', + '8a477007-fda2-47ef-aa16-2997f8fdb84b', + 'f3016aa0-7d78-451c-af83-54ef2125e3ec', + 'ddef9079-686f-4e8c-a051-2e154fa92a89', + '260ae74c-89d5-4be2-a7f6-e9f3908f305e', + '14502920-775c-4541-86a1-4538ca7764d3', + '90a607d0-aed9-4c31-a8a2-8496d39d6599', + '83a66bba-6a41-4e64-a7b5-039ee8bd30b9', + '2ed108a7-0796-488e-b712-543517262f33', + '29fc338d-2113-4006-b6ff-cea1682cd533', + '1e87bad6-7e23-481c-be5d-138aecffb69b', + '5b40a43a-0eab-4e9e-999a-bba234510937', + 'd94d35c6-4445-455e-bd6c-4895e81766d6', + 'ad8f5298-c1b0-4db6-8692-3e6f1ba248d2', + '3450ff6c-672a-4cb8-ada7-f3087b3abb21', + '65d47305-1552-4b6b-9769-2dfdddd6c0bb', + '2c9bb970-024b-4264-b757-3836beb97b7f', + '07eb7b9e-b087-46b0-b9c7-73566fa46e26', + '33fbd770-488d-47e2-8f96-5ffb9fc44e31', + '2e7373b8-d6d9-42bc-b346-3713338b1c0d', + '60b106c9-be36-41ba-bcb9-ff10b52f9452', + '15fe1e07-ee3b-4bc1-a093-3cbfbf58c16c', + '34743c0d-5d22-4124-bd7b-acbeb8f97b7b', + 'ccc1429a-ca38-43d8-83a9-24689aa65fe7', + '235b92e6-79c9-4e0b-8048-2244c4ea2b89', + 'd7fa1c78-27e2-41ab-aace-41bca71047df', + '6eea654a-47cd-44ab-8e3b-d58e9aa6581f', + 'f8fe22ee-ea42-415a-b7f6-bd5771f00ad7', + '82adb209-a389-4e4d-ac86-274cad9ed558', + 'b2821ccd-3b8e-41a7-ad4c-f3e3681567c9', + '642dae8b-b31e-4985-adea-fe9d73d14aaa', + 'a169d3aa-3cdc-4bed-a173-3c7b14533c8b', + 'a75cc57c-9357-4616-82ee-d66c88bc7457', + '5a3ee0f8-722d-4c33-b1d2-980170ccb0e7', + '346c9565-408a-46e7-a3d1-962c8dc939a8', + '2c34dd30-a560-4027-8661-e9ce18a4c1a5', + 'ffcc6c1e-99c9-4182-84a0-38c446c53c2c', + '05c7338b-28a7-4d11-98ff-5f23f4e0367b', + 'f83d3521-46b1-4d9b-a175-fdfff0a38ac1', + 'bb819377-4d54-408b-9411-8f04018aba02', + '7b0e14f5-6ad2-428c-b723-ef7564952c47', + '35ab4f71-a488-4e6e-b9d4-285d7b2b426a', + '0fda5d86-25af-4150-a299-ef35270632c5', + 'd90bf455-fc93-4bd1-91a3-a055b784bb37', + '2fa123b0-b260-4166-ab2a-bae912c85220', + '101ff19d-6778-4ea0-a4b3-7d48f7910b56', + 'e3aaaa30-ce30-475f-8f78-fde88863f2a4', + '7f2c1e8d-b107-4053-b9fe-c9fc2af45968', + '693fd3e9-8633-4777-bff0-7a2086ad3a38', + '8eb81d70-a8b8-47c5-b15f-1900c4c47590', + 'c9c4529e-0f81-431f-8f95-5704a5aeccb2', + 'a5f66fe8-3d22-4e9f-aed6-18f15dcec515', + '424faeaf-aa7b-401b-a01e-4d1d605d7236', + '9019c615-e62d-44c5-8050-80d12e0beca5', + 'd1a716d3-1a81-486c-ba56-3905211edcc1', + '73e33e39-8a8f-4f2a-a3f9-cff190d057f7', + '58688401-8e78-4134-aafb-076dff5d2ad4', + '418217b4-52d1-4aac-82ab-9f8969363e41', + '56e288b1-1dfe-4d71-a74b-98d2c821c75c', + 'fd2d20f9-df85-4269-a720-90bdfd48f8c4', + '52fe7ba3-a131-4b60-acc9-332ebee6d8d4', + '020fe814-5bc2-4355-8d3a-e6b6403effc3', + '4b738a07-7211-40ad-8f19-93fc1001e10c', + '45ed75fa-80ba-4c3f-b4a4-79bf5ca0a0ce', + 'd4e25052-ffc8-4367-978c-cc12a46b8363', + 'a76602f3-7e60-4772-8338-e97a4c5ea93d', + '4052a34c-1259-43e2-a769-32e31cf6bfaa', + '1c3a7fc5-ab78-4386-b17c-85255597791d', + '7f452190-055e-47a8-8042-d723f5c0a3f1', + 'f483dfe5-1d6d-4d86-a4be-247f0dd8fec4', + 'aca6d338-0dd2-4c1c-9833-c3e22e21647d', + '4718c8cc-74aa-491d-9d96-e48facc41b55', + '5ef421e6-fc6d-4285-a0fd-90019c38b231', + 'af16181e-4d54-4c4a-9c59-774c650b4965', + '0802dcbb-0130-43bc-ba6f-453854bafb3e', + 'f7d4ada3-aca2-4968-a76c-4c544836518e', + '25eed791-1ecd-4418-bd3f-0912687d51ce', + 'e3c5dd34-b2eb-4655-b287-f78907364c31', + 'a2cb9e0e-e605-47ee-a925-deda970b2a17', + '61194d2d-ce9f-4a2e-b82a-b00be78f888b', + 'd9e59b38-0312-4a8a-b79a-ec1489538203', + '4a8523b4-8616-4f09-9dfe-8832bbd80fef', + '4397e60f-1d3b-4c83-bad5-0fbc1e20a487', + '45dccbc8-f68a-4616-b5ca-c52a3363b680', + '3b3807a3-df7d-44f4-b144-76fb902d6af2', + 'd3c82c58-bd1a-46b1-8e5a-026ef984e60e', + '1757b6c6-e2ca-417f-84cd-08079b2957ed', + 'fee7e6fc-8f10-46e5-96b1-20219f92bd6b', + '656a34a6-11d4-4af3-9975-cfe77d99ed56', + '25864c23-4dba-4a82-a5ef-e6609a66f1cc', + 'b4d817d9-1be2-415d-8386-0a13fc263b90', + '66881121-712d-451f-8e8b-14716155b5bb', + '03a7d3e0-6750-4dc8-a315-2c2282cdb7f9', + '39e52b41-8399-4820-b524-9796942cf3ca', + 'eb17c65e-92a5-474b-b54a-93027055e29b', + '2fac6dd5-14c1-4477-b9b0-cea2e5da388f', + 'f18bfad8-bf61-4784-a9b7-7800a7aba82e', + 'f3fc42af-aaf1-4987-b3c6-34f152a27e0c', + 'e2a4d85b-894a-4e7a-8e9c-c849e972e3be', + '6ef3dced-37a3-47f6-9c81-3bfaf2cc21d5', + 'a73613c5-8482-4451-b541-1f29f5b87845', + 'ec0771d6-7915-43d5-bc56-77be096432c7', + '50b8a513-0de9-4fbd-9f46-34e03ea8b1b4', + '14c05822-3692-4472-ad42-95c56d216554', + '6f96a484-dba0-41e1-921e-c093e364216d', + 'c165daf5-5106-4b3a-8ef1-a9106ecb551e', + '3596bdbb-7c8a-4067-bf87-1636a062a401', + '61c5d94e-4840-4860-9e20-156df9f5e81d', + 'ad5b93fe-113c-435c-b875-344f67a9ebdf', + '5d77f8b5-dcfc-41b1-9ddf-f5627c5d588d', + '9ba7f886-51d2-46b8-aa1d-510c65cddba3', + 'b144a90b-1848-4fae-98a2-a1bad1c58161', + '4a1875d8-80c1-4dbf-aad8-0719da050697', + 'af895e5f-e649-472a-898e-a7b6ee575b5f', + '9da9b122-329a-4593-bd45-34b9bf8154c8', + '6a34a374-0db6-45af-b052-b8513d2bd47c', + '116e37a6-ca0a-45be-8945-0602918bec8e', + '45d120e8-65a0-4120-a413-719ed1891cbe', + '95f23779-67f3-46bd-8a7e-4760a39373c7', + 'd5665968-23bc-42d7-a56a-1bc021e87f45', + '57dd859f-1e2f-49a5-8604-02e328771d85', + 'ccac0df8-0dd2-4978-ad74-b888269b7570', + '389f5341-ce5b-4150-a538-db2aea57776b', + 'dd15411f-6fa5-435b-9c84-425ed2672b5b', + '19fe9597-66f0-4429-ad80-7d0c1b06e1d2', + 'd1201b88-bde1-46cb-8359-618ee71e9ac1', + '02138825-265d-4b33-ae5e-5bcc760b7fdb', + '9e6d0e3e-8ac6-4a7e-96ba-731ede624553', + '2ea7f3d5-6551-4686-8413-a505f419f234', + 'a007afc5-362d-4867-b3dd-702ecde9ce4f', + '15247dc2-0821-4bc7-a083-05dab7827405', + '3c7f2954-0ac8-4893-aac9-2d9b5805fe82', + '4a1959e3-ab4e-4a75-8bf8-daa5e0b87a8d', + '09aea2e2-a5fd-40a8-bb58-bb3f37bd0a8d', + '3c9526b0-9d10-4bab-ac37-f107244cbc91', + 'dc0b1028-a46f-46b8-ba97-cb0cbf36597c', + '9e39b77c-7aae-4ac4-b1b7-1230713a43a3', + '380e1a3d-8fee-4d9e-b710-d4eba6908428', + 'd182f2dc-3dcb-4c05-b324-5068992de6f8', + '518df5fd-d989-455c-b93b-d8328d0b2719', + '5b5be2bc-4bc7-4fd9-9230-d5eea30fade4', + '02a2c910-f4e4-4355-bc42-301ec198011b', + 'abbcf3bb-bcf7-4ef9-bd8d-32967e2be2bf', + '4b754509-0120-4c24-95b7-728d4fcb88b3', + 'bbfe581f-b531-461e-8eed-a9a373418f63', + '39800864-a740-4447-9077-6a081cb54bfd', + '69081a90-e959-4a39-81f4-5d8299b31a97', + 'a9465b37-a570-43de-9915-e99a8671e93d', + '91cbe420-63b3-4eda-9894-d9b3455c9546', + '5284663f-0ed4-410b-8754-81110eeeca02', + '4e339cc4-bdc9-4296-afb9-1f9914e751f8', + '77d23eeb-8dce-4cae-a0fa-9204929b22d9', + 'c5935c65-c15b-44c3-b78b-1de2fb78b14f', + 'fa636bdd-e0a4-425d-99fe-ffb246d7db95', + '7727ddce-9f88-442e-8c1d-96696b9e9ed1', + 'd25ead47-3d4c-4c43-9155-b6e8f2604d92', + 'a28c2b3f-a777-4fb7-b25c-8bb6d6438934', + '0d99124d-8b12-435c-a178-e9860470aed6', + '116fe4d9-bc44-4046-905a-4a63ce15acf1', + 'f83b74f0-b2f8-4311-9433-2240dc9d7445', + '3a592bfb-5a3c-408c-99be-cb3bfac9f829', + '9d9b4e20-ad96-4392-99c4-93555399fc5f', + '1a4ac0ad-d717-4284-8a9c-524145cd5f00', + 'cd1b574b-cdeb-46ae-9241-f10768d718e2', + '14ac646b-1e54-440b-bf0c-c1f50043e6f0', + 'ffe4312d-fe95-459f-b5d9-a2eafe725242', + '8a9e24fa-c11f-4233-96c7-3a049414a92f', + '2127ad64-bf8e-4082-a840-75b3200ef7ae', + '711ec6f0-1d87-4e0e-b444-bf52b4595050', + '4bc0b824-c4f3-4793-9c76-fc5b18893cf8' + ) + and d.address_id = a.id + and a.us_post_region_cities_id = v.uprc_id + and v.uprc_id = o.us_post_region_cities_id + and o.rate_area_id = ra.id +); + +-- insert missing rateArea to oconusRateArea mappings for 18 unaccounted duty locations - B-21608 +INSERT INTO re_oconus_rate_areas (id,rate_area_id,country_id,us_post_region_cities_id,created_at,updated_at,active) VALUES + ('f0b20201-193a-4de5-8f02-7308131787d5'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'e88c70c6-61a6-4b0d-b64a-ee3b16c99199'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('a9c5824f-c099-49a1-aada-be8200c68599'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'b030c225-ad1f-4062-8da5-22d9523a0b46'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('4d7eef69-59f4-4e22-a011-44df6b77d723'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'874fb615-51a3-46f7-90d0-53837b491cc8'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('fdaaf92e-415e-4b88-ad24-10f564eacc90'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'885a18b9-5fed-4a5d-a62b-3f4e6ca0f3c5'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('f34e2068-6cbb-4fb7-b76a-c2d63cc78bd1'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'b7dfe9ac-7081-4c52-a80b-cc8d79a185b4'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('b9f7071d-2db2-4c8b-b401-c642ca6c9c96'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'5706dc1f-0343-49b4-ad9d-aafc20015404'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('300f1d37-f387-41a0-9a06-fdaf4628e7ae'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'42fbf978-5478-4a2f-841a-049de1ccceab'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('fff4d0dd-e180-476b-91ba-331393ef44b8'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'abe35bbf-05af-4a2a-bc75-0a08e2e4da6b'::uuid,'2024-11-19 13:52:01.200682','2024-11-19 13:52:01.200682',false), + ('e4bc9404-5466-4a41-993e-09474266afc3'::uuid,'5a27e806-21d4-4672-aa5e-29518f10c0aa'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'cc211f28-f894-43e4-908e-f3af2fbea535'::uuid,'2024-11-19 13:52:42.175627','2024-11-19 13:52:42.175627',true), + ('d4a51d90-3945-4ad3-9cba-a18d8d7b34d7'::uuid,'5a27e806-21d4-4672-aa5e-29518f10c0aa'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'121b6c21-464f-4069-9b2a-16955b57fc30'::uuid,'2024-11-19 13:52:42.175627','2024-11-19 13:52:42.175627',true); +INSERT INTO re_oconus_rate_areas (id,rate_area_id,country_id,us_post_region_cities_id,created_at,updated_at,active) VALUES + ('a5a60d63-d9a8-4bde-9081-f011784b2d31'::uuid,'5a27e806-21d4-4672-aa5e-29518f10c0aa'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'e2cb041d-95fa-47b7-8932-c59f1a31f1ac'::uuid,'2024-11-19 13:52:42.175627','2024-11-19 13:52:42.175627',true), + ('93842d74-1f3e-46cd-aca9-9f0dafbd20a1'::uuid,'5a27e806-21d4-4672-aa5e-29518f10c0aa'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'74f1cbd6-e278-4a20-94da-c7752900e743'::uuid,'2024-11-19 13:52:42.175627','2024-11-19 13:52:42.175627',true), + ('ca8aecda-4642-45c7-96ed-309c35c4b78f'::uuid,'b80a00d4-f829-4051-961a-b8945c62c37d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'bf5978ad-ca09-4e30-9891-b3e8d4754941'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('1bc0dbda-f0ce-4b76-a551-78dbaaa9e3ec'::uuid,'635e4b79-342c-4cfc-8069-39c408a2decd'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'be83670d-32a5-4c9c-9479-48204462c20a'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('f1a7ef90-cfa6-4e0c-92c3-f8d70c07ba4d'::uuid,'635e4b79-342c-4cfc-8069-39c408a2decd'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'dfc8d1c7-77ab-4227-87c8-618e1b876f51'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('9c5b4c4d-e05c-42ca-bd77-b61f5d8c7afc'::uuid,'635e4b79-342c-4cfc-8069-39c408a2decd'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'817a2d4e-980d-4a43-a151-ff01393b882d'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('27ec2576-78dd-4605-b1a8-0b9ca207fc26'::uuid,'635e4b79-342c-4cfc-8069-39c408a2decd'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'a7dad15e-7ce4-4f59-9509-242c7aa0a32b'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('12396ebc-59e9-430a-8475-759a38af6b7a'::uuid,'635e4b79-342c-4cfc-8069-39c408a2decd'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'e27c8487-78c5-4b21-8040-df93b5e7375a'::uuid,'2024-11-19 13:53:12.478276','2024-11-19 13:53:12.478276',true), + ('79563390-7962-485b-b20c-680c84f6693d'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'b38881d0-0606-44c1-a064-ef0253edb117'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('da82db8a-660b-4188-a1e7-4f10267475f3'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'d21e8533-7816-4467-9cd8-21587a94fc9f'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false); +INSERT INTO re_oconus_rate_areas (id,rate_area_id,country_id,us_post_region_cities_id,created_at,updated_at,active) VALUES + ('db33fcad-dd6b-4126-b2b3-267732446c19'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'70239ed6-8c72-4378-a312-deaa8375dddb'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('78ee3682-163a-4e2e-9ef1-a838a7a8c3fb'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'63769bda-d65c-46eb-ba57-9ddbabc30c86'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('d8f53f2b-2bd2-42fa-98e4-b7b292b41c97'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'130102ea-f9fd-4f0e-bd73-cfcc85887456'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('d0ca4dbb-5b22-4b56-9793-c536c37e37d4'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'8e9e96cc-33ae-4b08-a7fc-d71718b65b16'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('2e40d1fb-e427-481d-8bc6-4d671ae25325'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'68ad8373-4263-4309-9eca-369edf790ad6'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('6281967c-30a8-40be-92ea-1a287b9a6a39'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'5268f013-9b86-49e6-a444-528ebdd7a884'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('ce1899f0-2e44-4f6f-ae9b-c5d3a5c7beb0'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'789460b8-e419-4903-8d7e-cf9867b0ade5'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('a8df190f-d810-4b5b-878f-4eec089c1ed3'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'e5b4b47c-4f6e-458b-a379-e3b0ab621be2'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('dc606f1a-5671-48a1-9f86-2dd10b57d825'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'beb84a41-a103-479b-be1f-b2e9ef1ee628'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('1bf18f91-43c6-4d77-b5eb-9c864486166f'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'a13303d5-ac62-4017-8d90-54df5cdabb17'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false); +INSERT INTO re_oconus_rate_areas (id,rate_area_id,country_id,us_post_region_cities_id,created_at,updated_at,active) VALUES + ('0f4215bf-0f86-4ff2-a457-353ab29e4ebd'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'366364cf-5056-4a64-90d1-c2622c6a6ef4'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('b7a481d4-b86b-40fe-8ccb-af15e9e0fc63'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'5e599c21-c87c-44c7-979b-174d421e8168'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('e0684af6-b647-4d83-9ddb-87625dac1293'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'a4c6b412-ff96-4f70-9fcb-b5e831dc0fec'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('10ad028f-66ae-4f6a-9beb-fdf88928a9f4'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'3d781b7f-5c76-465d-b6f7-350e697008de'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('2ddd300f-bd46-4f33-b132-b9479df18b56'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'55de46ce-abca-4c4b-b828-14791a1cb330'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('9a8d2146-cd56-40b9-9a1a-2d27a20fd4fd'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'e9422bc8-9ea3-43db-b3ae-68c52204fe94'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('d5639dd4-a25d-4d41-bdf2-65047c4ec183'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'6d4a3a08-109d-496f-9df7-a9991c82fcb7'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('115b48cb-7162-4de1-abb1-150f019d5b58'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'d0cbe916-a82d-4d1d-a4fb-6cc480cd604d'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('7228cc3e-fc07-4bf7-8071-f3851ccad0d0'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'aae2e6ff-3737-4d04-a825-26b784de197c'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false), + ('c5f3a7b8-e852-40c7-aa49-b4880924de95'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'91948b7f-d890-488d-a496-f1cf6e71faad'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false); +INSERT INTO re_oconus_rate_areas (id,rate_area_id,country_id,us_post_region_cities_id,created_at,updated_at,active) VALUES + ('3852f493-e648-4648-8846-448ca7eb90f6'::uuid,'3ec11db4-f821-409f-84ad-07fc8e64d60d'::uuid,'791899e6-cd77-46f2-981b-176ecb8d7098'::uuid,'841722ca-4c24-4994-a037-46a16354eb8a'::uuid,'2024-11-20 12:25:37.471462','2024-11-20 12:25:37.471462',false); + +-- re_oconus_rate_area to gbloc_aors mappings +INSERT INTO gbloc_aors (id,jppso_regions_id,oconus_rate_area_id,department_indicator,shipment_type,is_active,created_at,updated_at) VALUES + ('b38f098d-e8a8-437a-a887-72b8ccb2661e'::uuid,'98281c1b-6161-4e74-a119-177b2a2fb176'::uuid,'ca8aecda-4642-45c7-96ed-309c35c4b78f'::uuid,NULL,NULL,true,'2024-11-20 12:40:12.949739','2024-11-20 12:40:12.949739'), + ('2b43f91c-16d7-468a-8d3c-6f8cd3454f41'::uuid,'615673a2-d393-4d46-95f9-705fbeb6bc79'::uuid,'e4bc9404-5466-4a41-993e-09474266afc3'::uuid,NULL,NULL,true,'2024-11-20 12:40:22.745108','2024-11-20 12:40:22.745108'), + ('d5a51fd6-7108-4475-a61c-0b00f6fe1855'::uuid,'615673a2-d393-4d46-95f9-705fbeb6bc79'::uuid,'d4a51d90-3945-4ad3-9cba-a18d8d7b34d7'::uuid,NULL,NULL,true,'2024-11-20 12:40:22.745108','2024-11-20 12:40:22.745108'), + ('49a6bb4c-a770-4c1b-9fcb-eb358c7592fe'::uuid,'615673a2-d393-4d46-95f9-705fbeb6bc79'::uuid,'a5a60d63-d9a8-4bde-9081-f011784b2d31'::uuid,NULL,NULL,true,'2024-11-20 12:40:22.745108','2024-11-20 12:40:22.745108'), + ('863a25c7-dbd2-433e-8561-970a33abc0de'::uuid,'615673a2-d393-4d46-95f9-705fbeb6bc79'::uuid,'93842d74-1f3e-46cd-aca9-9f0dafbd20a1'::uuid,NULL,NULL,true,'2024-11-20 12:40:22.745108','2024-11-20 12:40:22.745108'), + ('56661aa4-fa9c-413b-8ef8-72ae05b40c1d'::uuid,'98281c1b-6161-4e74-a119-177b2a2fb176'::uuid,'e4bc9404-5466-4a41-993e-09474266afc3'::uuid,'AIR_AND_SPACE_FORCE',NULL,true,'2024-11-20 12:40:26.472072','2024-11-20 12:40:26.472072'), + ('d9384d9f-9f5e-460f-973b-0f457dc87d79'::uuid,'98281c1b-6161-4e74-a119-177b2a2fb176'::uuid,'d4a51d90-3945-4ad3-9cba-a18d8d7b34d7'::uuid,'AIR_AND_SPACE_FORCE',NULL,true,'2024-11-20 12:40:26.472072','2024-11-20 12:40:26.472072'), + ('54f9fc52-0f4c-4024-aa2b-aff17c31fe5c'::uuid,'98281c1b-6161-4e74-a119-177b2a2fb176'::uuid,'a5a60d63-d9a8-4bde-9081-f011784b2d31'::uuid,'AIR_AND_SPACE_FORCE',NULL,true,'2024-11-20 12:40:26.472072','2024-11-20 12:40:26.472072'), + ('368e0357-94b1-4ea7-9a8b-98720b0f08fe'::uuid,'98281c1b-6161-4e74-a119-177b2a2fb176'::uuid,'93842d74-1f3e-46cd-aca9-9f0dafbd20a1'::uuid,'AIR_AND_SPACE_FORCE',NULL,true,'2024-11-20 12:40:26.472072','2024-11-20 12:40:26.472072'), + ('5697fb28-3f67-449f-bac2-48da92d26886'::uuid,'58510246-905b-4989-b16e-04806904134b'::uuid,'1bc0dbda-f0ce-4b76-a551-78dbaaa9e3ec'::uuid,NULL,NULL,true,'2024-11-20 12:40:29.700158','2024-11-20 12:40:29.700158'); +INSERT INTO gbloc_aors (id,jppso_regions_id,oconus_rate_area_id,department_indicator,shipment_type,is_active,created_at,updated_at) VALUES + ('a3db6d33-6a4c-4357-9735-bdf35295f6ce'::uuid,'58510246-905b-4989-b16e-04806904134b'::uuid,'f1a7ef90-cfa6-4e0c-92c3-f8d70c07ba4d'::uuid,NULL,NULL,true,'2024-11-20 12:40:29.700158','2024-11-20 12:40:29.700158'), + ('34938294-0921-4aa4-8e8c-97b40f747f57'::uuid,'58510246-905b-4989-b16e-04806904134b'::uuid,'9c5b4c4d-e05c-42ca-bd77-b61f5d8c7afc'::uuid,NULL,NULL,true,'2024-11-20 12:40:29.700158','2024-11-20 12:40:29.700158'), + ('8747b22c-85ba-4ecc-854a-368a4964b504'::uuid,'58510246-905b-4989-b16e-04806904134b'::uuid,'27ec2576-78dd-4605-b1a8-0b9ca207fc26'::uuid,NULL,NULL,true,'2024-11-20 12:40:29.700158','2024-11-20 12:40:29.700158'), + ('e9548498-d32d-4ac4-aa77-611686784a1c'::uuid,'58510246-905b-4989-b16e-04806904134b'::uuid,'12396ebc-59e9-430a-8475-759a38af6b7a'::uuid,NULL,NULL,true,'2024-11-20 12:40:29.700158','2024-11-20 12:40:29.700158'); + diff --git a/pkg/models/duty_location.go b/pkg/models/duty_location.go index 16716a2e3ef..57feab234c1 100644 --- a/pkg/models/duty_location.go +++ b/pkg/models/duty_location.go @@ -113,27 +113,120 @@ func FindDutyLocationsExcludingStates(tx *pop.Connection, search string, exclusi } sql_builder := strings.Builder{} - sql_builder.WriteString(`with names as ( - (select id as duty_location_id, name, similarity(name, $1) as sim - from duty_locations - where name % $1 - order by sim desc - limit 5) + sql_builder.WriteString(`with names as + ( + ( + -- search against duty_locations table + ( + select + id as duty_location_id, + name, + similarity(name, $1) as sim + from + duty_locations + where + name % $1 + order by sim desc limit 5 + ) + -- exclude OCONUS locations that are not active + except + ( + select + d.id as duty_location_id, + d.name, + similarity(d.name, $1) as sim + from + duty_locations d, + addresses a, + re_oconus_rate_areas o, + re_rate_areas r + where d.name % $1 + and d.address_id = a.id + and a.us_post_region_cities_id = o.us_post_region_cities_id + and o.rate_area_id = r.id + and o.active = false + ) + ) union - (select duty_location_id, name, similarity(name, $1) as sim - from duty_location_names - where name % $1 - order by sim desc - limit 5) + ( + -- search against duty_location_names table for alternative names + ( + select + duty_location_id, + name, + similarity(name, $1) as sim + from + duty_location_names + where + name % $1 + order by sim desc limit 5 + ) + -- exclude OCONUS locations that are not active + except + ( + select + dn.duty_location_id, + dn.name, + similarity(dn.name, $1) as sim + from + duty_location_names dn, + duty_locations d, + addresses a, + re_oconus_rate_areas o, + re_rate_areas r + where + dn.name % $1 + and dn.duty_location_id = d.id + and d.address_id = a.id + and a.us_post_region_cities_id = o.us_post_region_cities_id + and o.rate_area_id = r.id + and o.active = false + order by sim desc limit 5 + ) + ) union - (select dl.id as duty_location_id, dl.name as name, 1 as sim - from duty_locations as dl - inner join addresses a2 on dl.address_id = a2.id and dl.affiliation is null - where a2.postal_code ILIKE $1 - limit 5) + ( + -- search against duty_locations table if postal code + ( + select + dl.id as duty_location_id, + dl.name as name, + 1 as sim + from + duty_locations as dl + inner join addresses a2 on dl.address_id = a2.id + and dl.affiliation is null + where + a2.postal_code ILIKE $1 + limit 5 + ) + -- exclude OCONUS locations that are not active + except + ( + select + dl.id as duty_location_id, + dl.name as name, + 1 as sim + from + duty_locations dl, + addresses a, + re_oconus_rate_areas o, + re_rate_areas r + where + dl.address_id = a.id + and a.us_post_region_cities_id = o.us_post_region_cities_id + and o.rate_area_id = r.id + and o.active = false + and a.postal_code ILIKE $1 + and dl.affiliation is null + limit 5 + ) ) - select dl.* - from names n + ) + select + dl.* + from + names n inner join duty_locations dl on n.duty_location_id = dl.id`) // apply filter to exclude specific states if provided diff --git a/pkg/models/duty_location_test.go b/pkg/models/duty_location_test.go index 24f96af44ad..a368efec9ac 100644 --- a/pkg/models/duty_location_test.go +++ b/pkg/models/duty_location_test.go @@ -1,8 +1,12 @@ package models_test import ( + "fmt" + "slices" + "github.com/gofrs/uuid" + "github.com/transcom/mymove/pkg/appcontext" "github.com/transcom/mymove/pkg/factory" "github.com/transcom/mymove/pkg/models" "github.com/transcom/mymove/pkg/services/address" @@ -210,3 +214,365 @@ func (suite *ModelSuite) Test_FetchDutyLocationWithTransportationOffice() { suite.Nil(dutyLocationFromDB.TransportationOfficeID) }) } + +func (suite *ModelSuite) Test_SearchDutyLocations_Exclude_Not_Active_Oconus() { + createContract := func(appCtx appcontext.AppContext, contractCode string, contractName string) (*models.ReContract, error) { + // See if contract code already exists. + exists, err := appCtx.DB().Where("code = ?", contractCode).Exists(&models.ReContract{}) + if err != nil { + return nil, fmt.Errorf("could not determine if contract code [%s] existed: %w", contractCode, err) + } + if exists { + return nil, fmt.Errorf("the provided contract code [%s] already exists", contractCode) + } + + // Contract code is new; insert it. + contract := models.ReContract{ + Code: contractCode, + Name: contractName, + } + verrs, err := appCtx.DB().ValidateAndSave(&contract) + if verrs.HasAny() { + return nil, fmt.Errorf("validation errors when saving contract [%+v]: %w", contract, verrs) + } + if err != nil { + return nil, fmt.Errorf("could not save contract [%+v]: %w", contract, err) + } + return &contract, nil + } + + setupDataForOconusSearchCounselingOffice := func(contract models.ReContract, postalCode string, gbloc string, dutyLocationName string, transportationName string, isOconusRateAreaActive bool) (models.ReRateArea, models.OconusRateArea, models.UsPostRegionCity, models.DutyLocation) { + rateAreaCode := uuid.Must(uuid.NewV4()).String()[0:5] + rateArea := models.ReRateArea{ + ID: uuid.Must(uuid.NewV4()), + ContractID: contract.ID, + IsOconus: true, + Code: rateAreaCode, + Name: fmt.Sprintf("Alaska-%s", rateAreaCode), + Contract: contract, + } + verrs, err := suite.DB().ValidateAndCreate(&rateArea) + if verrs.HasAny() { + suite.Fail(verrs.Error()) + } + if err != nil { + suite.Fail(err.Error()) + } + + us_country, err := models.FetchCountryByCode(suite.DB(), "US") + suite.NotNil(us_country) + suite.Nil(err) + + usprc, err := models.FindByZipCode(suite.AppContextForTest().DB(), postalCode) + suite.NotNil(usprc) + suite.FatalNoError(err) + + oconusRateArea := models.OconusRateArea{ + ID: uuid.Must(uuid.NewV4()), + RateAreaId: rateArea.ID, + CountryId: us_country.ID, + UsPostRegionCityId: usprc.ID, + Active: isOconusRateAreaActive, + } + verrs, err = suite.DB().ValidateAndCreate(&oconusRateArea) + if verrs.HasAny() { + suite.Fail(verrs.Error()) + } + if err != nil { + suite.Fail(err.Error()) + } + + address := models.Address{ + StreetAddress1: "n/a", + City: "SomeCity", + State: "AK", + PostalCode: postalCode, + County: "SomeCounty", + IsOconus: models.BoolPointer(true), + UsPostRegionCityId: &usprc.ID, + CountryId: models.UUIDPointer(us_country.ID), + } + suite.MustSave(&address) + + origDutyLocation := factory.BuildDutyLocation(suite.DB(), []factory.Customization{ + { + Model: models.DutyLocation{ + Name: dutyLocationName, + AddressID: address.ID, + ProvidesServicesCounseling: true, + }, + }, + { + Model: models.TransportationOffice{ + Name: transportationName, + Gbloc: gbloc, + ProvidesCloseout: true, + }, + }, + }, nil) + suite.MustSave(&origDutyLocation) + + found_duty_location, _ := models.FetchDutyLocation(suite.DB(), origDutyLocation.ID) + + return rateArea, oconusRateArea, *usprc, found_duty_location + } + + const fairbanksAlaskaPostalCode = "99790" + const anchorageAlaskaPostalCode = "99502" + testContractName := "Test_search_duty_location" + testContractCode := "Test_search_duty_location_Code" + testGbloc := "ABCD" + testTransportationName := "TEST - PPO" + testDutyLocationName := "TEST Duty Location" + testTransportationName2 := "TEST - PPO 2" + testDutyLocationName2 := "TEST Duty Location 2" + + suite.Run("one active onconus rateArea duty location and one not active oconus rate area duty location should return 1", func() { + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // active duty location + _, oconusRateArea, _, dutyLocation := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, true) + + // not active duty location + _, oconusRateArea2, _, _ := setupDataForOconusSearchCounselingOffice(*contract, anchorageAlaskaPostalCode, testGbloc, testDutyLocationName2, testTransportationName2, false) + + suite.True(oconusRateArea.Active) + suite.False(oconusRateArea2.Active) + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations test", dutyLocations: []string{testDutyLocationName}}, + } + + expectedDutyLocationNames := []string{dutyLocation.Name} + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(1, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + for _, o := range dutyLocations { + suite.True(slices.Contains(expectedDutyLocationNames, o.Name)) + } + } + }) + + suite.Run("two active onconus rateArea duty locations should return 2", func() { + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // active duty location + _, oconusRateArea, _, dutyLocation1 := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, true) + + // active duty location + _, oconusRateArea2, _, dutyLocation2 := setupDataForOconusSearchCounselingOffice(*contract, anchorageAlaskaPostalCode, testGbloc, testDutyLocationName2, testTransportationName2, true) + + suite.True(oconusRateArea.Active) + suite.True(oconusRateArea2.Active) + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations test", dutyLocations: []string{testDutyLocationName}}, + } + + expectedDutyLocationNames := []string{dutyLocation1.Name, dutyLocation2.Name} + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(2, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + for _, o := range dutyLocations { + suite.True(slices.Contains(expectedDutyLocationNames, o.Name)) + } + } + }) + + suite.Run("two inactive onconus rateArea duty locations should return 0", func() { + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // active duty location + _, oconusRateArea, _, dutyLocation1 := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, false) + + // active duty location + _, oconusRateArea2, _, dutyLocation2 := setupDataForOconusSearchCounselingOffice(*contract, anchorageAlaskaPostalCode, testGbloc, testDutyLocationName2, testTransportationName2, false) + + suite.False(oconusRateArea.Active) + suite.False(oconusRateArea2.Active) + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations test", dutyLocations: []string{testDutyLocationName}}, + } + + expectedDutyLocationNames := []string{dutyLocation1.Name, dutyLocation2.Name} + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(0, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + for _, o := range dutyLocations { + suite.True(slices.Contains(expectedDutyLocationNames, o.Name)) + } + } + }) + + suite.Run("match on alternative name but exclude", func() { + alternativeDutyLocationName := "Foobar" + + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // not active duty location + _, oconusRateArea, _, dutyLocation1 := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, false) + + suite.False(oconusRateArea.Active) + + dutyLocationName := models.DutyLocationName{ + Name: alternativeDutyLocationName, + DutyLocationID: dutyLocation1.ID, + DutyLocation: dutyLocation1, + } + verrs, err := suite.DB().ValidateAndCreate(&dutyLocationName) + if verrs.HasAny() { + suite.Fail(verrs.Error()) + } + if err != nil { + suite.Fail(err.Error()) + } + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations", dutyLocations: []string{alternativeDutyLocationName}}, //search on alt name + } + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(0, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + } + }) + + suite.Run("match on alternative name when active oconus rateArea", func() { + alternativeDutyLocationName := "Foobar" + + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // active duty location + _, oconusRateArea, _, dutyLocation1 := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, true) + + suite.True(oconusRateArea.Active) + + dutyLocationName := models.DutyLocationName{ + Name: alternativeDutyLocationName, + DutyLocationID: dutyLocation1.ID, + DutyLocation: dutyLocation1, + } + verrs, err := suite.DB().ValidateAndCreate(&dutyLocationName) + if verrs.HasAny() { + suite.Fail(verrs.Error()) + } + if err != nil { + suite.Fail(err.Error()) + } + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations", dutyLocations: []string{alternativeDutyLocationName}}, //search on alt name + } + + expectedDutyLocationNames := []string{dutyLocation1.Name} + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(1, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + for _, o := range dutyLocations { + suite.True(slices.Contains(expectedDutyLocationNames, o.Name)) + } + } + }) + + suite.Run("one active and one inactive onconus rateArea duty locations - search by zip - return match", func() { + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // active duty location + _, oconusRateArea, _, dutyLocation1 := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, true) + + // not active duty location + _, oconusRateArea2, _, _ := setupDataForOconusSearchCounselingOffice(*contract, anchorageAlaskaPostalCode, testGbloc, testDutyLocationName2, testTransportationName2, false) + + suite.True(oconusRateArea.Active) + suite.False(oconusRateArea2.Active) + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations test", dutyLocations: []string{ + fairbanksAlaskaPostalCode, anchorageAlaskaPostalCode}}, //search by zip + } + + expectedDutyLocationNames := []string{dutyLocation1.Name} + + for i, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + if i == 0 { + suite.Require().Equal(1, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + for _, o := range dutyLocations { + suite.True(slices.Contains(expectedDutyLocationNames, o.Name)) + } + } else { + suite.Require().Equal(0, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + } + } + }) + + suite.Run("two non active onconus rateArea duty locations - search by zip - return none", func() { + contract, err := createContract(suite.AppContextForTest(), testContractCode, testContractName) + suite.NotNil(contract) + suite.FatalNoError(err) + + // not active duty location + _, oconusRateArea, _, _ := setupDataForOconusSearchCounselingOffice(*contract, fairbanksAlaskaPostalCode, testGbloc, testDutyLocationName, testTransportationName, false) + + // not active duty location + _, oconusRateArea2, _, _ := setupDataForOconusSearchCounselingOffice(*contract, anchorageAlaskaPostalCode, testGbloc, testDutyLocationName2, testTransportationName2, false) + + suite.False(oconusRateArea.Active) + suite.False(oconusRateArea2.Active) + + tests := []struct { + query string + dutyLocations []string + }{ + {query: "search oconus rate area duty locations test", dutyLocations: []string{ + fairbanksAlaskaPostalCode, anchorageAlaskaPostalCode}}, //search by zip + } + + for _, ts := range tests { + dutyLocations, err := models.FindDutyLocationsExcludingStates(suite.DB(), ts.query, []string{}) + suite.NoError(err) + suite.Require().Equal(0, len(dutyLocations), "Wrong number of duty locations returned from query: %s", ts.query) + } + }) +}