From f7e1075f17007e59438b023c13b65af9f517c5c8 Mon Sep 17 00:00:00 2001 From: Sahil Malhotra Date: Fri, 26 Jun 2026 14:43:28 -0400 Subject: [PATCH] add ppa support --- EnvironmentVariables.md | 137 ++++++++++++++++++++- REMS.code-workspace | 3 + Verify-REMS-Integration-Prototype-Works.md | 42 +++++++ docker-compose-dev.yml | 71 ++++++++++- docker-compose-local-build.yml | 56 ++++++++- docker-compose.yml | 60 ++++++++- mongo-init.js | 9 ++ 7 files changed, 366 insertions(+), 12 deletions(-) diff --git a/EnvironmentVariables.md b/EnvironmentVariables.md index f82d286..a9b8f21 100644 --- a/EnvironmentVariables.md +++ b/EnvironmentVariables.md @@ -4,6 +4,15 @@ +## Local Product Availability defaults + +The local Docker topology uses two PIMS pharmacy instances for NCPDP Pharmacy Product Availability testing: + +- `Pharmacy123` / PIMS Pharmacy A: frontend `http://localhost:5050`, backend `http://localhost:5051`, NCPDP SCRIPT/PPA endpoint `http://localhost:5051/ncpdp/script`. +- `Pharmacy456` / PIMS Pharmacy B: frontend `http://localhost:5150`, backend `http://localhost:5151`, NCPDP SCRIPT/PPA endpoint `http://localhost:5151/ncpdp/script`. + +Request Generator defaults to direct PPA lookup with locator mode enabled (`VITE_PPA_LOCATOR_MODE=true`). When `VITE_USE_PHARMACY_INTERMEDIARY=true`, NCPDP NewRx and PPA JSON requests both go through `VITE_PHARMACY_INTERMEDIARY`, while the pharmacy table still supplies `Header.To` values for intermediary routing. The default equivalence map searches generic Pexidartinib (`99999-407-20`) when brand Turalio (`65597-407-20`) is unavailable. The selected product NDC is then used for REMS routing, with brand Turalio routed to REMS Admin 1 and generic Pexidartinib routed to REMS Admin 2. + - mcode/rems-setup - .env @@ -18,6 +27,12 @@ - `oauth_token` - request-generator - `VITE_EHR_SERVER_TO_BE_SENT_TO_REMS_ADMIN_FOR_PREFETCH` + - `VITE_PPA_LOCATOR_MODE` + - `VITE_PPA_SUBSTITUTION_ALLOWED` + - `VITE_PPA_ENDPOINTS` + - `VITE_PPA_DEFAULT_STATE` + - `VITE_PPA_DEFAULT_POSTAL_CODE` + - `VITE_PPA_GENERIC_CANDIDATES` - rems-administrator - `VSAC_API_KEY` - `MONGO_DB_NAME` @@ -28,7 +43,56 @@ - `MONGO_INITDB_ROOT_USERNAME` - `MONGO_INITDB_ROOT_PASSWORD` - pims + - `PORT` + - `BACKEND_PORT` + - `REACT_APP_PIMS_BACKEND_PORT` + - `PHARMACY_ID` + - `PHARMACY_NAME` - `MONGO_URL` + - `MONGO_USERNAME` + - `MONGO_PASSWORD` + - `AUTH_SOURCE` + - `EHR_RXFILL_URL` + - `EHR_NCPDP_URL` + - `INTERMEDIARY_FHIR_URL` + - `INTERMEDIARY_URL` + - `REMS_ADMIN_FHIR_URL` + - `REMS_ADMIN_NCPDP` + - `REMS_ADMIN_2_FHIR_URL` + - `REMS_ADMIN_2_NCPDP` + - `PHARMACY_INVENTORY_JSON` + - pims2 + - `PORT` + - `BACKEND_PORT` + - `REACT_APP_PIMS_BACKEND_PORT` + - `PHARMACY_ID` + - `PHARMACY_NAME` + - `MONGO_URL` + - `MONGO_USERNAME` + - `MONGO_PASSWORD` + - `AUTH_SOURCE` + - `EHR_RXFILL_URL` + - `EHR_NCPDP_URL` + - `INTERMEDIARY_FHIR_URL` + - `INTERMEDIARY_URL` + - `REMS_ADMIN_FHIR_URL` + - `REMS_ADMIN_NCPDP` + - `REMS_ADMIN_2_FHIR_URL` + - `REMS_ADMIN_2_NCPDP` + - `PHARMACY_INVENTORY_JSON` + - rems-directory + - `SERVER_HOST` + - `SERVER_PORT` + - `REMS_ADMIN_1_CDS_URL` + - `REMS_ADMIN_1_FHIR_URL` + - `REMS_ADMIN_2_CDS_URL` + - `REMS_ADMIN_2_FHIR_URL` + - `SPL_ZIP_PATH` + - rems-intermediary + - `EHR_BASE_URL` + - `REMS_ADMIN_NCPDP_PATH` + - `NCPDP_SCRIPT_FORWARD_URL` + - `PPA_PHARMACY_ENDPOINTS` - mcode/rems-admin @@ -117,6 +181,14 @@ - `VITE_PASSWORD` - `VITE_PATIENT_FHIR_QUERY` - `VITE_PIMS_SERVER` + - `VITE_USE_PHARMACY_INTERMEDIARY` + - `VITE_PHARMACY_INTERMEDIARY` + - `VITE_PPA_LOCATOR_MODE` + - `VITE_PPA_SUBSTITUTION_ALLOWED` + - `VITE_PPA_ENDPOINTS` + - `VITE_PPA_DEFAULT_STATE` + - `VITE_PPA_DEFAULT_POSTAL_CODE` + - `VITE_PPA_GENERIC_CANDIDATES` - `VITE_PUBLIC_KEYS` - `VITE_REALM` - `VITE_RESPONSE_EXPIRATION_DAYS` @@ -124,7 +196,7 @@ - `VITE_URL` - `VITE_URL_FILTER` - `VITE_USER` - - `VITE_USE_INTERMEDIARY` + - `VITE_USE_PRESCRIBER_INTERMEDIARY` - `VITE_INTERMEDIARY` - `HTTPS` - `HTTPS_CERT_PATH` @@ -138,19 +210,29 @@ - `ALLOWED_ORIGIN` - `AUTH_SOURCE` - `BACKEND_PORT` + - `PHARMACY_ID` + - `PHARMACY_NAME` + - `PHARMACY_INVENTORY_JSON` - `EHR_RXFILL_URL` - `HTTPS_CERT_PATH` - `HTTPS_KEY_PATH` - `INTERMEDIARY_FHIR_URL` + - `INTERMEDIARY_URL` - `MONGO_PASSWORD` - `MONGO_URL` - `MONGO_USERNAME` - `USE_HTTPS` - `USE_INTERMEDIARY` + - `REMS_ADMIN_FHIR_URL` - `REMS_ADMIN_NCPDP` + - `REMS_ADMIN_2_FHIR_URL` + - `REMS_ADMIN_2_NCPDP` + - `EHR_NCPDP_URL` - frontend/.env - `PORT` - `REACT_APP_PIMS_BACKEND_PORT` + - `REACT_APP_PIMS_BACKEND_URL` + - `VITE_CACHE_DIR` - pm2.config.js - `NODE_ENV` @@ -173,12 +255,24 @@ - `VITE_CLIENT` - `REMS_ADMIN_HOOK_PATH` - `REMS_ADMIN_FHIR_PATH` + - `REMS_ADMIN_NCPDP_PATH` - `SMART_ENDPOINT` - `FRONTEND_VITE_AUTH` - `VITE_SCOPE_ID` - `DIRECTORY_API_PATH` - `DIRECTORY_SPL_PATH` - `NCPDP_SCRIPT_FORWARD_URL` + - `PPA_PHARMACY_ENDPOINTS` + +- mcode/rems-directory + - .env + - `SERVER_PORT` + - `SERVER_HOST` + - `SPL_ZIP_PATH` + - `REMS_ADMIN_1_CDS_URL` + - `REMS_ADMIN_1_FHIR_URL` + - `REMS_ADMIN_2_CDS_URL` + - `REMS_ADMIN_2_FHIR_URL` ## Repositories that use environment variables @@ -249,6 +343,13 @@ - `VITE_LAUNCH_URL` - `VITE_PATIENT_FHIR_QUERY` - `VITE_PIMS_SERVER` + - `VITE_USE_PHARMACY_INTERMEDIARY` + - `VITE_PHARMACY_INTERMEDIARY` + - `VITE_PPA_LOCATOR_MODE` + - `VITE_PPA_SUBSTITUTION_ALLOWED` + - `VITE_PPA_ENDPOINTS` + - `VITE_PPA_DEFAULT_STATE` + - `VITE_PPA_DEFAULT_POSTAL_CODE` - `VITE_RESPONSE_EXPIRATION_DAYS` - `VITE_CLIENT_SCOPES` - `VITE_SMART_LAUNCH_URL` @@ -256,6 +357,8 @@ - `VITE_HOOK_TO_SEND` - `VITE_URL_FILTER` - `VITE_DISABLE_MEDICATION_STATUS` + - src/util/ppaProductEquivalents.js + - `VITE_PPA_GENERIC_CANDIDATES` - src/util/auth.js - `VITE_AUTH` - `VITE_CLIENT` @@ -294,12 +397,38 @@ - `EHR_RXFILL_URL` - `USE_INTERMEDIARY` - `INTERMEDIARY_FHIR_URL` + - `PHARMACY_NAME` + - `REMS_ADMIN_NCPDP` + - backend/src/lib/ppaInventory.js + - `PHARMACY_ID` + - `PHARMACY_NAME` + - `PHARMACY_INVENTORY_JSON` + - backend/src/lib/pharmacyConfig.js + - `USE_INTERMEDIARY` + - `INTERMEDIARY_URL` + - `REMS_ADMIN_NCPDP` + - `EHR_NCPDP_URL` - backend/src/database/data.js - `REMS_ADMIN_FHIR_URL` + - `REMS_ADMIN_NCPDP` + - `REMS_ADMIN_2_FHIR_URL` + - `REMS_ADMIN_2_NCPDP` - frontend/src/App.tsx - `REACT_APP_PIMS_BACKEND_PORT` - `REACT_APP_PIMS_BACKEND_URL` - - `REMS_ADMIN_NCPDP` + - frontend/vite.config.ts + - `PORT` + - `VITE_CACHE_DIR` + +- mcode/rems-directory + - src/server.ts + - `SERVER_HOST` + - `SERVER_PORT` + - src/data.ts + - `REMS_ADMIN_1_CDS_URL` + - `REMS_ADMIN_1_FHIR_URL` + - `REMS_ADMIN_2_CDS_URL` + - `REMS_ADMIN_2_FHIR_URL` - mcode/rems-smart-on-fhir - src/views/Patient/MedReqDropDown/MedReqDropDown.tsx @@ -337,12 +466,14 @@ - `WHITELIST` - `REMS_ADMIN_HOOK_PATH` - `REMS_ADMIN_FHIR_PATH` + - `REMS_ADMIN_NCPDP_PATH` - `SMART_ENDPOINT` - `FRONTEND_VITE_AUTH` - `VITE_SCOPE_ID` - `DIRECTORY_API_PATH` - `DIRECTORY_SPL_PATH` - `NCPDP_SCRIPT_FORWARD_URL` + - `PPA_PHARMACY_ENDPOINTS` - src/server.ts - `HTTPS_CERT_PATH` - `HTTPS_KEY_PATH` @@ -351,4 +482,4 @@ - `VITE_AUTH` - `VITE_USER` - `VITE_PASSWORD` - - `VITE_CLIENT` \ No newline at end of file + - `VITE_CLIENT` diff --git a/REMS.code-workspace b/REMS.code-workspace index 7bc3ba6..9c69d37 100644 --- a/REMS.code-workspace +++ b/REMS.code-workspace @@ -26,6 +26,9 @@ }, { "path": "../cql-to-fhir-library" + }, + { + "path": "../fhir-medication-rems-ig" } ], "launch": { diff --git a/Verify-REMS-Integration-Prototype-Works.md b/Verify-REMS-Integration-Prototype-Works.md index b9d61c9..aa51906 100644 --- a/Verify-REMS-Integration-Prototype-Works.md +++ b/Verify-REMS-Integration-Prototype-Works.md @@ -37,4 +37,46 @@ 22. Return to the SMART on FHIR App launched in step 17, assume the prescriber role, and click **Check Pharmacy** to view the prescription status. 23. Repeat step 20 to submit followup/monitoring requests via the **Patient Status Update Form**, on an as need basis. These forms can be submitted multiple times in the prototype, with each submission appearing as a distinct ETASU element. +## Verify Product Availability and Generic REMS Routing + +The local Docker topology starts two pharmacy systems: + +- PIMS Pharmacy A: , backend NCPDP endpoint `http://localhost:5051/ncpdp/script` +- PIMS Pharmacy B: , backend NCPDP endpoint `http://localhost:5151/ncpdp/script` + +The default inventory is configured so brand Turalio (`65597-407-20`) is unavailable at Pharmacy A, while generic Pexidartinib (`99999-407-20`) is available at Pharmacy B. Brand Turalio routes to REMS Admin 1; generic Pexidartinib routes to REMS Admin 2. + +1. Start from the EHR UI at as the prescriber. +2. If you have used this browser with older settings, click **Settings**, click **Reset Settings**, then click **Save Settings**. This clears stale endpoint settings from browser local storage. +3. In **Settings**, verify these Product Availability settings: + - **Use Product Locator Across Pharmacies** is checked. + - **Allow Product Substitution in Availability Lookup** is checked. + - **Use Pharmacy Intermediary** is unchecked for the direct-pharmacy test. + - The **PPA Pharmacy Endpoints** table has enabled rows for `Pharmacy123` and `Pharmacy456`, and both URL columns use `/ncpdp/script`. +4. Return to the request screen. +5. Click **Select a Patient** and choose **John Snow**. +6. In the medication request dropdown, choose **Turalio 200 MG Oral Capsule**. +7. Click **Select**. +8. Click **Check Availability**. +9. Verify the availability result shows `KA: Pexidartinib Hydrochloride 200 MG Oral Capsule available at PIMS Pharmacy B`. +10. Verify the result list includes `PIMS Pharmacy A: Turalio 200 MG Oral Capsule - BJ` and `PIMS Pharmacy B: Turalio 200 MG Oral Capsule -> Pexidartinib Hydrochloride 200 MG Oral Capsule - KA`. +11. Click **Sign Order**. This creates the REMS case for the selected product. If the selected product is generic Pexidartinib, the case should be created at REMS Admin 2. +12. Click **Send Rx to Pharmacy**. +13. Open PIMS Pharmacy B at . +14. Click **Doctor Orders** and verify the new order appears in Pharmacy B, not Pharmacy A. +15. Verify the order medication display and NDC are the selected generic Pexidartinib product and its REMS routing/status comes from REMS Admin 2. +16. Click **View ETASU** and verify the modal shows the selected generic product's REMS requirements instead of a failed GuidanceResponse. +17. Continue the pharmacist workflow using **Verify ETASU**, **Verify Order**, and **Mark as Picked Up** as needed. + +### Optional Intermediary Product Availability Check + +1. Return to the EHR UI at . +2. Open **Settings**. +3. Check **Use Pharmacy Intermediary**. +4. Confirm **Pharmacy Intermediary URL (NCPDP Endpoint)** is `http://localhost:3003/ncpdp/script`. +5. Click **Save Settings**. +6. Repeat the direct test steps from selecting John Snow through **Check Availability**. +7. Verify the same `KA` generic availability result from PIMS Pharmacy B. Request Generator still uses the pharmacy endpoint table to populate `Header.To`, and the intermediary forwards by that value. +8. Click **Send Rx to Pharmacy** and verify the order still arrives at PIMS Pharmacy B. + Congratulations! The REMS Integration prototype is fully installed and ready for you to use! diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 9e04c3b..7a5cd23 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -62,6 +62,12 @@ services: container_name: rems_dev_request-generator environment: - REACT_APP_EHR_SERVER_TO_BE_SENT_TO_REMS_ADMIN_FOR_PREFETCH=http://host.docker.internal:8080/test-ehr/r4 + - VITE_PPA_LOCATOR_MODE=true + - VITE_PPA_SUBSTITUTION_ALLOWED=true + - VITE_PPA_ENDPOINTS=[{"enabled":true,"id":"Pharmacy123","name":"PIMS Pharmacy A","url":"http://localhost:5051/ncpdp/script","scriptUrl":"http://localhost:5051/ncpdp/script"},{"enabled":true,"id":"Pharmacy456","name":"PIMS Pharmacy B","url":"http://localhost:5151/ncpdp/script","scriptUrl":"http://localhost:5151/ncpdp/script"}] + - VITE_PPA_DEFAULT_STATE=MA + - VITE_PPA_DEFAULT_POSTAL_CODE= + - VITE_PPA_GENERIC_CANDIDATES=[{"baseNdc":"65597-407-20","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule"}] ports: - "3000:3000" - "3001:3001" @@ -95,6 +101,8 @@ services: - "3323:3323" - "3324:3324" environment: + SERVER_HOST: 0.0.0.0 + SERVER_PORT: 3323 REMS_ADMIN_1_CDS_URL: http://rems-administrator:8090/ REMS_ADMIN_1_FHIR_URL: http://rems-administrator:8090/ REMS_ADMIN_2_CDS_URL: http://rems-administrator2:8095/ @@ -152,9 +160,9 @@ services: RESOURCE_SERVER: 'http://localhost:8095/' DOCKERED_EHR_CONTAINER_NAME: 'test-ehr' volumes: - - rems_dev_rems-admin2-sync:/rems-admin2:nocopy # nocopy is important - - rems_dev_rems-admin2-nodeModules:/rems-admin2/node_modules - - rems_dev_rems-admin2-logs:/rems-admin2/logs + - rems_dev_rems-admin2-sync:/rems-admin:nocopy # nocopy is important + - rems_dev_rems-admin2-nodeModules:/rems-admin/node_modules + - rems_dev_rems-admin2-logs:/rems-admin/logs depends_on: pims_remsadmin_mongo: condition: service_healthy @@ -168,11 +176,24 @@ services: - "5050:5050" - "5051:5051" environment: + PORT: 5050 + BACKEND_PORT: 5051 + REACT_APP_PIMS_BACKEND_PORT: 5051 + PHARMACY_ID: Pharmacy123 + PHARMACY_NAME: PIMS Pharmacy A REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims + MONGO_USERNAME: pims-user + MONGO_PASSWORD: pims-pass + AUTH_SOURCE: pims EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":false,"remsAdminHint":"REMS Prototype Admin 2"}]' volumes: - rems_dev_pims-sync:/home/node/app:nocopy - rems_dev_pims-nodeModules:/home/node/app/frontend/node_modules @@ -182,6 +203,42 @@ services: pims_remsadmin_mongo: condition: service_healthy + pims2: + build: + context: ../pims + dockerfile: Dockerfile.dev + container_name: rems_dev_pims2 + ports: + - "5150:5150" + - "5151:5151" + environment: + PORT: 5150 + BACKEND_PORT: 5151 + REACT_APP_PIMS_BACKEND_PORT: 5151 + PHARMACY_ID: Pharmacy456 + PHARMACY_NAME: PIMS Pharmacy B + REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 + MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims2 + MONGO_USERNAME: pims2-user + MONGO_PASSWORD: pims2-pass + AUTH_SOURCE: pims2 + EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script + INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 + REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":120,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"remsAdminHint":"REMS Prototype Admin 2"}]' + volumes: + - rems_dev_pims-sync:/home/node/app:nocopy + - rems_dev_pims2-nodeModules:/home/node/app/frontend/node_modules + - rems_dev_pims2-backend-nodeModules:/home/node/app/backend/node_modules + - rems_dev_pims2-backend-dist:/home/node/app/backend/dist + depends_on: + pims_remsadmin_mongo: + condition: service_healthy + rems-intermediary: build: context: '../rems-intermediary' @@ -192,8 +249,12 @@ services: MONGO_URL: mongodb://intermediary-user:pass@pims_remsadmin_mongo:27017 REMS_ADMIN_HOOK_PATH: http://rems-administrator:8090/cds-services/rems- REMS_ADMIN_FHIR_PATH: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_NCPDP_PATH: http://rems-administrator:8090 DIRECTORY_SERVICE_URL: http://rems-directory:3323 SPL_ZIP_FILE_NAME: TESTDATA_Docker_rems_document_and_rems_indexing_spl_files.zip + EHR_BASE_URL: http://test-ehr:8080/test-ehr + NCPDP_SCRIPT_FORWARD_URL: http://pims:5051/ncpdp/script + PPA_PHARMACY_ENDPOINTS: '[{"id":"Pharmacy123","url":"http://pims:5051/ncpdp/script","scriptUrl":"http://pims:5051/ncpdp/script"},{"id":"Pharmacy456","url":"http://pims2:5151/ncpdp/script","scriptUrl":"http://pims2:5151/ncpdp/script"}]' ports: - "3003:3003" - "9080:9080" @@ -238,6 +299,9 @@ volumes: rems_dev_pims-nodeModules: rems_dev_pims-backend-nodeModules: rems_dev_pims-backend-dist: + rems_dev_pims2-nodeModules: + rems_dev_pims2-backend-nodeModules: + rems_dev_pims2-backend-dist: rems_dev_rems-admin-nodeModules: rems_dev_rems-admin-logs: rems_dev_rems-admin2-nodeModules: @@ -246,4 +310,3 @@ volumes: rems_dev_rems-directory-nodeModules: rems_dev_rems-intermediary-nodeModules: rems_dev_rems-intermediary-logs: - diff --git a/docker-compose-local-build.yml b/docker-compose-local-build.yml index 0b45397..5739e21 100644 --- a/docker-compose-local-build.yml +++ b/docker-compose-local-build.yml @@ -54,6 +54,12 @@ services: container_name: rems_dev_request-generator environment: - REACT_APP_EHR_SERVER_TO_BE_SENT_TO_REMS_ADMIN_FOR_PREFETCH=http://host.docker.internal:8080/test-ehr/r4 + - VITE_PPA_LOCATOR_MODE=true + - VITE_PPA_SUBSTITUTION_ALLOWED=true + - VITE_PPA_ENDPOINTS=[{"enabled":true,"id":"Pharmacy123","name":"PIMS Pharmacy A","url":"http://localhost:5051/ncpdp/script","scriptUrl":"http://localhost:5051/ncpdp/script"},{"enabled":true,"id":"Pharmacy456","name":"PIMS Pharmacy B","url":"http://localhost:5151/ncpdp/script","scriptUrl":"http://localhost:5151/ncpdp/script"}] + - VITE_PPA_DEFAULT_STATE=MA + - VITE_PPA_DEFAULT_POSTAL_CODE= + - VITE_PPA_GENERIC_CANDIDATES=[{"baseNdc":"65597-407-20","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule"}] ports: - "3000:3000" - "3001:3001" @@ -76,6 +82,8 @@ services: - "3323:3323" - "3324:4424" environment: + SERVER_HOST: 0.0.0.0 + SERVER_PORT: 3323 REMS_ADMIN_1_CDS_URL: http://rems-administrator:8090/ REMS_ADMIN_1_FHIR_URL: http://rems-administrator:8090/ REMS_ADMIN_2_CDS_URL: http://rems-administrator2:8095/ @@ -135,11 +143,54 @@ services: - "5050:5050" - "5051:5051" environment: + PORT: 5050 + BACKEND_PORT: 5051 + REACT_APP_PIMS_BACKEND_PORT: 5051 + PHARMACY_ID: Pharmacy123 + PHARMACY_NAME: PIMS Pharmacy A REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims + MONGO_USERNAME: pims-user + MONGO_PASSWORD: pims-pass + AUTH_SOURCE: pims EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":false,"remsAdminHint":"REMS Prototype Admin 2"}]' + depends_on: + pims_remsadmin_mongo: + condition: service_healthy + + pims2: + build: + context: ../pims + container_name: rems_dev_pims2 + ports: + - "5150:5150" + - "5151:5151" + environment: + PORT: 5150 + BACKEND_PORT: 5151 + REACT_APP_PIMS_BACKEND_PORT: 5151 + PHARMACY_ID: Pharmacy456 + PHARMACY_NAME: PIMS Pharmacy B + REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 + MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims2 + MONGO_USERNAME: pims2-user + MONGO_PASSWORD: pims2-pass + AUTH_SOURCE: pims2 + EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script + INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 + REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":120,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"remsAdminHint":"REMS Prototype Admin 2"}]' depends_on: pims_remsadmin_mongo: condition: service_healthy @@ -153,8 +204,12 @@ services: MONGO_URL: mongodb://intermediary-user:pass@pims_remsadmin_mongo:27017 REMS_ADMIN_HOOK_PATH: http://rems-administrator:8090/cds-services/rems- REMS_ADMIN_FHIR_PATH: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_NCPDP_PATH: http://rems-administrator:8090 DIRECTORY_SERVICE_URL: http://rems-directory:3323 SPL_ZIP_FILE_NAME: TESTDATA_Docker_rems_document_and_rems_indexing_spl_files.zip + EHR_BASE_URL: http://test-ehr:8080/test-ehr + NCPDP_SCRIPT_FORWARD_URL: http://pims:5051/ncpdp/script + PPA_PHARMACY_ENDPOINTS: '[{"id":"Pharmacy123","url":"http://pims:5051/ncpdp/script","scriptUrl":"http://pims:5051/ncpdp/script"},{"id":"Pharmacy456","url":"http://pims2:5151/ncpdp/script","scriptUrl":"http://pims2:5151/ncpdp/script"}]' ports: - "3003:3003" - "9080:9080" @@ -165,4 +220,3 @@ services: volumes: rems_dev_keycloak-data: rems_dev_pims_remsadmin_mongo: - diff --git a/docker-compose.yml b/docker-compose.yml index ec9d79d..e90d408 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,12 @@ services: container_name: rems_prod_request-generator environment: - REACT_APP_EHR_SERVER_TO_BE_SENT_TO_REMS_ADMIN_FOR_PREFETCH=http://host.docker.internal:8080/test-ehr/r4 + - VITE_PPA_LOCATOR_MODE=true + - VITE_PPA_SUBSTITUTION_ALLOWED=true + - VITE_PPA_ENDPOINTS=[{"enabled":true,"id":"Pharmacy123","name":"PIMS Pharmacy A","url":"http://localhost:5051/ncpdp/script","scriptUrl":"http://localhost:5051/ncpdp/script"},{"enabled":true,"id":"Pharmacy456","name":"PIMS Pharmacy B","url":"http://localhost:5151/ncpdp/script","scriptUrl":"http://localhost:5151/ncpdp/script"}] + - VITE_PPA_DEFAULT_STATE=MA + - VITE_PPA_DEFAULT_POSTAL_CODE= + - VITE_PPA_GENERIC_CANDIDATES=[{"baseNdc":"65597-407-20","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule"}] ports: # Port binding to host from docker container - "3000:3000" # Bind port 3000 of host to 3000 of container - "3001:3001" @@ -44,12 +50,13 @@ services: - "4040:4040" rems-directory: - build: - image: codexrems/rems-directory:1.3 + image: codexrems/rems-directory:1.3 container_name: rems_prod_rems-directory ports: - "3323:3323" environment: + SERVER_HOST: 0.0.0.0 + SERVER_PORT: 3323 REMS_ADMIN_1_CDS_URL: http://rems-administrator:8090/ REMS_ADMIN_1_FHIR_URL: http://rems-administrator:8090/ REMS_ADMIN_2_CDS_URL: http://rems-administrator2:8095/ @@ -117,10 +124,24 @@ services: image: codexrems/pims:1.2 container_name: rems_prod_pims environment: + PORT: 5050 + BACKEND_PORT: 5051 + REACT_APP_PIMS_BACKEND_PORT: 5051 + PHARMACY_ID: Pharmacy123 + PHARMACY_NAME: PIMS Pharmacy A REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims + MONGO_USERNAME: pims-user + MONGO_PASSWORD: pims-pass + AUTH_SOURCE: pims EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 + REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy123","pharmacyName":"PIMS Pharmacy A","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":false,"remsAdminHint":"REMS Prototype Admin 2"}]' ports: - "5050:5050" - "5051:5051" @@ -128,6 +149,35 @@ services: pims_remsadmin_mongo: condition: service_healthy + pims2: + image: codexrems/pims:1.2 + container_name: rems_prod_pims2 + environment: + PORT: 5150 + BACKEND_PORT: 5151 + REACT_APP_PIMS_BACKEND_PORT: 5151 + PHARMACY_ID: Pharmacy456 + PHARMACY_NAME: PIMS Pharmacy B + REMS_ADMIN_FHIR_URL: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_2_FHIR_URL: http://rems-administrator2:8095/4_0_0 + MONGO_URL: mongodb://pims_remsadmin_mongo:27017/pims2 + MONGO_USERNAME: pims2-user + MONGO_PASSWORD: pims2-pass + AUTH_SOURCE: pims2 + EHR_RXFILL_URL: http://test-ehr:8080/test-ehr/ncpdp/script + EHR_NCPDP_URL: http://test-ehr:8080/test-ehr/ncpdp/script + INTERMEDIARY_FHIR_URL: http://rems-intermediary:3003/4_0_0 + REMS_ADMIN_NCPDP: http://rems-administrator:8090/ncpdp/script + REMS_ADMIN_2_NCPDP: http://rems-administrator2:8095/ncpdp/script + INTERMEDIARY_URL: http://rems-intermediary:3003 + PHARMACY_INVENTORY_JSON: '[{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"65597-407-20","display":"Turalio 200 MG Oral Capsule","quantityOnHand":0,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"availabilityDate":"2026-07-01T14:30:00.0Z","remsAdminHint":"REMS Prototype Admin 1"},{"pharmacyId":"Pharmacy456","pharmacyName":"PIMS Pharmacy B","ndc":"99999-407-20","display":"Pexidartinib Hydrochloride 200 MG Oral Capsule","quantityOnHand":120,"quantityUnitCode":"C48480","equivalentGroup":"pexidartinib-200mg-capsule","obtainable":true,"remsAdminHint":"REMS Prototype Admin 2"}]' + ports: + - "5150:5150" + - "5151:5151" + depends_on: + pims_remsadmin_mongo: + condition: service_healthy + # add in once intermediary once ci/cd pipeline task is completed and published images exist rems-intermediary: image: codexrems/rems-intermediary:1.2 @@ -137,8 +187,12 @@ services: MONGO_URL: mongodb://intermediary-user:pass@pims_remsadmin_mongo:27017 REMS_ADMIN_HOOK_PATH: http://rems-administrator:8090/cds-services/rems- REMS_ADMIN_FHIR_PATH: http://rems-administrator:8090/4_0_0 + REMS_ADMIN_NCPDP_PATH: http://rems-administrator:8090 DIRECTORY_SERVICE_URL: http://rems-directory:3323 SPL_ZIP_FILE_NAME: TESTDATA_Docker_rems_document_and_rems_indexing_spl_files.zip + EHR_BASE_URL: http://test-ehr:8080/test-ehr + NCPDP_SCRIPT_FORWARD_URL: http://pims:5051/ncpdp/script + PPA_PHARMACY_ENDPOINTS: '[{"id":"Pharmacy123","url":"http://pims:5051/ncpdp/script","scriptUrl":"http://pims:5051/ncpdp/script"},{"id":"Pharmacy456","url":"http://pims2:5151/ncpdp/script","scriptUrl":"http://pims2:5151/ncpdp/script"}]' ports: - "3003:3003" - "9080:9080" @@ -149,5 +203,3 @@ services: volumes: rems_prod_keycloak-data: rems_prod_pims_remsadmin_mongo: - - diff --git a/mongo-init.js b/mongo-init.js index 904dced..9896e50 100644 --- a/mongo-init.js +++ b/mongo-init.js @@ -1,5 +1,6 @@ // Create Databases const dbPims = db.getSiblingDB('pims'); +const dbPims2 = db.getSiblingDB('pims2'); const dbRemsAdmin = db.getSiblingDB('remsadmin'); const dbRemsAdmin2 = db.getSiblingDB('remsadmin2'); @@ -33,9 +34,17 @@ dbPims.createUser({ user: "pims-user", ] }) +dbPims2.createUser({ user: "pims2-user", + pwd: "pims2-pass", + roles: [ + { role: "readWrite", db: "pims2" } + ] +}) + // Create Collections dbPims.createCollection('pims-tmp'); +dbPims2.createCollection('pims2-tmp'); dbRemsAdmin.createCollection('remsadmin-tmp'); dbRemsAdmin2.createCollection('remsadmin2-tmp'); dbRemsIntermediary.createCollection('remsintermediary-tmp');