diff --git a/.gitignore b/.gitignore index d784edfa..d1928c30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ build .gradle +logs/ +sample-hip/generated/ +src/main/resources/Predator_HIP.png ### IntelliJ IDEA ### .idea/ diff --git a/Dockerfile b/Dockerfile index 01831530..62388fd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,16 @@ -FROM maven:3.8.7-eclipse-temurin-17-focal -VOLUME /tmp +FROM gradle:8.5-jdk17 AS build WORKDIR /app -RUN apt-get install -y curl -RUN curl -L https://services.gradle.org/distributions/gradle-8.5-bin.zip -o gradle-8.6-bin.zip -RUN apt-get update -RUN apt-get install -y unzip -RUN unzip gradle-8.6-bin.zip -ENV GRADLE_HOME=/app/gradle-8.5 -ENV PATH=$PATH:$GRADLE_HOME/bin +COPY build.gradle settings.gradle gradlew gradle/ ./ +RUN gradle dependencies --no-daemon || true + COPY . . -RUN gradle build -x test +RUN gradle build -x test --no-daemon -EXPOSE 8082 +FROM eclipse-temurin:17-jdk-jammy +WORKDIR /app -ENTRYPOINT java -jar /app/build/libs/*-SNAPSHOT.jar --spring.data.mongodb.host=mongodb \ No newline at end of file +COPY --from=build /app/build/libs/*-SNAPSHOT.jar app.jar + +EXPOSE 8082 +ENTRYPOINT ["java", "-jar", "app.jar", "--spring.data.mongodb.host=mongodb"] \ No newline at end of file diff --git a/fhir-mapper/.gitignore b/FHIR-Mapper/.gitignore similarity index 100% rename from fhir-mapper/.gitignore rename to FHIR-Mapper/.gitignore diff --git a/fhir-mapper/Dockerfile b/FHIR-Mapper/Dockerfile similarity index 77% rename from fhir-mapper/Dockerfile rename to FHIR-Mapper/Dockerfile index 21d72851..ee977c34 100644 --- a/fhir-mapper/Dockerfile +++ b/FHIR-Mapper/Dockerfile @@ -2,12 +2,12 @@ FROM gradle:8.5-jdk17 AS builder WORKDIR /app COPY build.gradle settings.gradle ./ -RUN gradle dependencies --no-daemon +RUN gradle buildEnvironment --no-daemon COPY . . RUN gradle build --no-daemon -x test -FROM eclipse-temurin:17-jdk-focal +FROM eclipse-temurin:17-jre-focal WORKDIR /app COPY --from=builder /app/build/libs/*-SNAPSHOT.jar fhir.jar diff --git a/fhir-mapper/README.md b/FHIR-Mapper/README.md similarity index 51% rename from fhir-mapper/README.md rename to FHIR-Mapper/README.md index d03090f8..3574fb14 100644 --- a/fhir-mapper/README.md +++ b/FHIR-Mapper/README.md @@ -34,182 +34,196 @@ Recommended RAM: Systems with more than 8 GB RAM - The HI type is primarily defined based on the data being collected. However the type of interaction should also be considered. - If the data which is collected is not defined in the structured field for any HI-type you can create a pdf and attach to the particular bundle in the documents. -| Name | Definition | -|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| DiagnosticReportRecord | The Clinical Artifact represents diagnostic reports including Radiology and Laboratory reports that can be shared across the health ecosystem. | -| DischargeSummaryRecord | Clinical document used to represent the discharge summary record for ABDM HDE data set. | -| HealthDocumentRecord | The Clinical Artifact represents the unstructured historical health records as a single or multiple Health Record Documents generally uploaded by the patients through the Health Locker and can be shared across the health ecosystem. | -| ImmunizationRecord | The Clinical Artifact represents the Immunization records with any additional documents such as vaccine certificate, the next immunization recommendations, etc. This can be further shared across the health ecosystem. | -| OPConsultRecord | The Clinical Artifact represents the outpatient visit consultation note which may include clinical information on any OP examinations, procedures along with medication administered, and advice that can be shared across the health ecosystem. | -| PrescriptionRecord | The Clinical Artifact represents the medication advice to the patient in compliance with the Pharmacy Council of India (PCI) guidelines, which can be shared across the health ecosystem. | -| WellnessRecord | The Clinical Artifact represents regular wellness information of patients typically through the Patient Health Record (PHR) application covering clinical information such as vitals, physical examination, general wellness, women wellness, etc., that can be shared across the health ecosystem. | +| Name | Definition | +|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DiagnosticReportRecord | The Clinical Artifact represents diagnostic reports including Radiology and Laboratory reports that can be shared across the health ecosystem. | +| DischargeSummaryRecord | Clinical document used to represent the discharge summary record for ABDM HDE data set. | +| HealthDocumentRecord | The Clinical Artifact represents the unstructured historical health records as a single or multiple Health Record Documents generally uploaded by the patients through the Health Locker and can be shared across the health ecosystem. | +| ImmunizationRecord | The Clinical Artifact represents the Immunization records with any additional documents such as vaccine certificate, the next immunization recommendations, etc. This can be further shared across the health ecosystem. | +| OPConsultRecord | The Clinical Artifact represents the outpatient visit consultation note which may include clinical information on any OP examinations, procedures along with medication administered, and advice that can be shared across the health ecosystem. | +| PrescriptionRecord | The Clinical Artifact represents the medication advice to the patient in compliance with the Pharmacy Council of India (PCI) guidelines, which can be shared across the health ecosystem. | +| WellnessRecord | The Clinical Artifact represents regular wellness information of patients typically through the Patient Health Record (PHR) application covering clinical information such as vitals, physical examination, general wellness, women wellness, etc., that can be shared across the health ecosystem. | +| InvoiceRecord | The billing artifact represents the invoice details such as pharmacy invoice, consultation invoice etc. along with the support for scanned documents attached for the patient which can be shared across the health ecosystem. | +--- ### APIs for generating the FHIR bundle -- For Swagger-ui, check [here](https://wrapper-sbx.abdm.gov.in/swagger/fhir) -#### DiagnosticReportRecord +- For Swagger-ui, check [here](https://venuajitesh.github.io/FHIR-Mapper/) + +
+ ๐Ÿ“„ DiagnosticReportRecord + - for the DiagnosticReportRecord bundle you need to - * `POST` Request `/v1/bundle/diagnostic-report` - ``` - { - "bundleType":"DiagnosticReportRecord", //mandatory - "careContextReference":"visist 21-03-2024", //mandatory - "authoredOn":"2006-04-22", //mandatory - "patient":{ //mandatory - "name":"Venu Ajitesh", //mandatory - "patientReference":"ajitesh6x", //mandatory - "gender":"male", - "birthDate":"2001-04-27" - }, - "practitioners":[{ //mandatory - "name":"Dr.Venu Ajitesh", //mandatory - "practitionerId":"Predator" - }], - "organisation":{ - "facilityName":"Predator_HIP", //mandatory - "facilityId":"Predator_HIP" - }, - "encounter":"Ambula", - "diagnostics":[{ - "serviceName":"BloodTest", //mandatory - "serviceCategory":"Hematography", //mandatory - "result":[{ //you can pass either result or valueQuantity not both - "observation":"Height", //mandatory - "result":"Normal", - "valueQuantity": { - "unit": "CM", - "value": 170 - } - }], - "conclusion":"Normal", //mandatory - "presentedForm":{ - "contentType":"application/pdf", - "data":"Base64 data of the pdf" - } - }], - "documents":[{ - "type":"diagnosticReport", //mandatory - "contentType":"application/pdf", //mandatory - "data":"Base64 data of the pdf" //mandatory - }] - } - ``` -#### DischargeSummaryRecord - - for the DischargeSummaryRecord bundle you need to - * `POST` Request `/v1/bundle/discharge-summary` - ``` + * `POST` Request `/v1/bundle/diagnostic-report` + + ``` { - "bundleType":"DischargeSummaryRecord", //mandatory - "careContextReference":"visist 21-03-2024", //mandatory - "patient":{ //mandatory - "name":"Venu Ajitesh", //mandatory - "patientReference":"ajitesh6x", //mandatory - "gender":"male", - "birthDate":"2001-04-27" + "bundleType": "DiagnosticReportRecord", + "careContextReference": "visist 21-03-2024", + "authoredOn": "2006-04-22", + "patient": { + "name": "Venu Ajitesh", + "patientReference": "ajitesh6x", + "gender": "male", + "birthDate": "2001-04-27" }, - "practitioners":[{ //mandatory - "name":"Dr.Venu Ajitesh", //mandatory - "practitionerId":"Predator" + "practitioners": [{ + "name": "Dr.Venu Ajitesh", + "practitionerId": "Predator" }], - "organisation":{ //mandatory - "facilityName":"Predator_HIP", //mandatory - "facilityId":"Predator_HIP" + "organisation": { + "facilityName": "Predator_HIP", + "facilityId": "Predator_HIP" }, - "chiefComplaints":[ - { - "complaint":"Sugar", //mandatory - "recordedDate":"2024-05-20", //mandatory - "dateRange":{ - "from":"2018-04-27", - "to":"2018-05-26" - } - } - ], - "physicalExaminations":[ - { - "observation":"Height", //mandatory - "result":"Normal", //you can pass either result or valueQuantity not both - "valueQuantity": { - "unit": "CM", - "value": 170 - } - } - ], - "allergies":[ - "Walnuts" - ], - "medicalHistories":[ - { - "complaint":"Sugar", //mandatory - "recordedDate":"2024-05-20", //mandatory - "dateRange":{ - "from":"2018-04-27", - "to":"2018-05-26" - } - } - ], - "familyHistories":[ - { - "relationship":"Friend", //mandatory - "observation":"Toxic" //mandatory + "encounter": "Ambula", + "diagnostics": [{ + "serviceName": "BloodTest", + "serviceCategory": "Hematography", + "result": [{ + "observation": "Height", + "result": "Normal", + "valueQuantity": { + "unit": "CM", + "value": 170 } - ], - "authoredOn":"2024-02-03", //mandatory - "medications":[ - { - "medicine":"Aspirin 75 mg oral tablet", //mandatory - "dosage":"1-0-1", //mandatory - "timing":"2-5-d", - "route":"Oral", - "method":"swallow", - "additionalInstructions":"Take them after food", - "reason": "fever" + }], + "conclusion": "Normal", + "presentedForm": { + "contentType": "application/pdf", + "data": "Base64 data of the pdf" } - ,{ - "medicine":"Disprin", //mandatory - "dosage":"0-0-1", //mandatory - "timing":"1-2-d", - "route":"Syrup", - "method":"drink", - "additionalInstructions":"Take them before food", - "reason": "Cough" + }], + "documents": [{ + "type": "diagnosticReport", + "contentType": "application/pdf", + "data": "Base64 data of the pdf" + }] + } ``` +
+ +
+ ๐Ÿฅ DischargeSummaryRecord + +- For the DischargeSummaryRecord bundle you need to + * `POST` Request `/v1/bundle/discharge-summary` + + ``` + { + "bundleType":"DischargeSummaryRecord", //mandatory + "careContextReference":"visist 21-03-2024", //mandatory + "patient":{ //mandatory + "name":"Venu Ajitesh", //mandatory + "patientReference":"ajitesh6x", //mandatory + "gender":"male", + "birthDate":"2001-04-27" + }, + "practitioners":[{ //mandatory + "name":"Dr.Venu Ajitesh", //mandatory + "practitionerId":"Predator" + }], + "organisation":{ //mandatory + "facilityName":"Predator_HIP", //mandatory + "facilityId":"Predator_HIP" + }, + "chiefComplaints":[ + { + "complaint":"Sugar", //mandatory + "recordedDate":"2024-05-20", //mandatory + "dateRange":{ + "from":"2018-04-27", + "to":"2018-05-26" + } } - ], - "diagnostics":[{ - "serviceName":"BloodTest", //mandatory - "serviceCategory":"Hematography", //mandatory - "result":[{ - "observation":"Height", //mandatory - "result":"Normal", //you can pass either result or valueQuantity not both - "valueQuantity": { - "unit": "CM", - "value": 170 - } - }], - "conclusion":"Normal", //mandatory - "presentedForm":{ - "contentType":"application/pdf", - "data":"Base64 data of the pdf" + ], + "physicalExaminations":[ + { + "observation":"Height", //mandatory + "result":"Normal", //you can pass either result or valueQuantity not both + "valueQuantity": { + "unit": "CM", + "value": 170 } - }], - - "procedures":[ - { - "date":"2001-04-20", //mandatory - "status":"INPROGRESS", //mandatory - "procedureReason":"Severe", //mandatory - "outcome":"Healthy", - "procedureName":"Operation" //mandatory + } + ], + "allergies":[ + "Walnuts" + ], + "medicalHistories":[ + { + "complaint":"Sugar", //mandatory + "recordedDate":"2024-05-20", //mandatory + "dateRange":{ + "from":"2018-04-27", + "to":"2018-05-26" + } + } + ], + "familyHistories":[ + { + "relationship":"Friend", //mandatory + "observation":"Toxic" //mandatory + } + ], + "authoredOn":"2024-02-03", //mandatory + "medications":[ + { + "medicine":"Aspirin 75 mg oral tablet", //mandatory + "dosage":"1-0-1", //mandatory + "timing":"2-5-d", + "route":"Oral", + "method":"swallow", + "additionalInstructions":"Take them after food", + "reason": "fever" + } + ,{ + "medicine":"Disprin", //mandatory + "dosage":"0-0-1", //mandatory + "timing":"1-2-d", + "route":"Syrup", + "method":"drink", + "additionalInstructions":"Take them before food", + "reason": "Cough" + } + ], + "diagnostics":[{ + "serviceName":"BloodTest", //mandatory + "serviceCategory":"Hematography", //mandatory + "result":[{ + "observation":"Height", //mandatory + "result":"Normal", //you can pass either result or valueQuantity not both + "valueQuantity": { + "unit": "CM", + "value": 170 + } + }], + "conclusion":"Normal", //mandatory + "presentedForm":{ + "contentType":"application/pdf", + "data":"Base64 data of the pdf" } - ], + }], + + "procedures":[ + { + "date":"2001-04-20", //mandatory + "status":"INPROGRESS", //mandatory + "procedureReason":"Severe", //mandatory + "outcome":"Healthy", + "procedureName":"Operation" //mandatory + } + ], + + "documents":[{ + "type":"Discharge record", //mandatory + "contentType":"application/pdf", //mandatory + "data":"Base64 data of the pdf" //mandatory + }] + } + ``` +
+ +
+ ๐Ÿ“‘ HealthDocumentRecord - "documents":[{ - "type":"Discharge record", //mandatory - "contentType":"application/pdf", //mandatory - "data":"Base64 data of the pdf" //mandatory - }] - } - ``` -#### HealthDocumentRecord - for the HealthDocumentRecord bundle you need to * `POST` Request `/v1/bundle/health-document` ``` @@ -239,7 +253,10 @@ Recommended RAM: Systems with more than 8 GB RAM }] } ``` -#### ImmunizationRecord +
+
+ ๐Ÿ’‰ ImmunizationRecord + - for the ImmunizationRecord bundle you need to * `POST` Request `/v1/bundle/immunization` ``` @@ -275,7 +292,10 @@ Recommended RAM: Systems with more than 8 GB RAM }] } ``` -#### OPConsultRecord +
+
+ ๐Ÿ‘จโ€โš•๏ธ OPConsultRecord + - for the OPConsultRecord bundle you need to * `POST` Request `/v1/bundle/op-consultation` ``` @@ -403,7 +423,10 @@ Recommended RAM: Systems with more than 8 GB RAM }] } ``` -#### PrescriptionRecord +
+
+ ๐Ÿ’Š PrescriptionRecord + - for the PrescriptionRecord bundle you need to * `POST` Request `/v1/bundle/prescription` ``` @@ -453,7 +476,10 @@ Recommended RAM: Systems with more than 8 GB RAM }] } ``` -#### WellnessRecord +
+
+ ๐ŸŒฟ WellnessRecord + - for the WellnessRecord bundle you need to * `POST` Request `/v1/bundle/wellness-record` ``` @@ -551,7 +577,134 @@ Recommended RAM: Systems with more than 8 GB RAM }] } ``` -#### Error response in 400 BadRequest +
+
+ ๐Ÿงพ InvoiceRecord + + - for the InvoiceRecord bundle you need to + * `POST` Request `/v1/bundle/invoice` + ``` + { + "bundleType": "Invoice", + "careContextReference": "visit-{{$isoTimestamp}}", + "invoiceDate": "2024-05-01T06:33:37.361Z", + "status": "issued", + "encounter": "", + "patient": { + "name": "Venu Ajitesh", + "patientReference": "ajitesh6x", + "gender": "male", + "birthDate": "1940-04-27" + }, + "practitioners": [ + { + "name": "Dr.Venu Ajitesh", + "practitionerId": "Predator" + } + ], + "organisation": { + "facilityName": "Predator_HIP", + "facilityId": "Predator_HIP" + }, + "invoice": { + "id": "INV-12345", // Required + "status": "issued", // Required - issued | balanced | cancelled | draft | entered-in-error + "type": "Pharmacy", // Required - Consultation | Pharmacy | IPD | OPD | Others + "date": "2025-08-12T10:30:00+05:30", // Required + "totalNet": 2000.00, // Required + "totalGross": 2200.00, // Required + "currency": "INR", // Required + "paymentTerms": "Due in 15 days", // Optional + "note": "Surgery + post-op medicines" // Optional + }, + "chargeItems": [ // Required - at least one + { + "id": "CHG-002", + "productType": "medication", // medication | device | substance + "chargeType": "Pharmacy", + "status": "billed", // planned | billable | not-billable | aborted | billed | entered-in-error | unknown + "description": "Amoxicillin 500mg", + "quantity": 14, + "price": [ + { + "priceType": "base", // base | surcharge | deduction | discount | SGST | CGST | informational + "amount": "100" + } + ], + "medication": { // Only for type=medication + "medicineName": "AMOX500", + "manufacturer": "ABC Pharma", + "medicationForm": "tablet", + "lotNumber": "ABC123", + "expiryDate": "{{$isoTimestamp}}" + } + }, + { + "id": "CHG-003", + "productType": "device", // medication | device | substance + "chargeType": "OPD", + "status": "billed", + "description": "Surgical Gloves", + "quantity": 5, + "price": [ + { + "priceType": "base", // base | surcharge | deduction | discount | SGST | CGST | informational + "amount": "200" + } + ], + "device": { // Only for type=device + "udiCarrier": "UDI-GLV-001", + "manufacturer": "MedGlove Inc.", + "modelNumber": "MG-GLV-SRG", + "lotNumber": "194847-0", + "serialNumber": "SN-98347", + "manufactureDate": "2025-01-10", + "expirationDate": "2028-01-10", + "status": "active", + "safety": [ + "Latex Free", + "Sterile" + ], + "deviceName": "Surgical Gloves", + "note": "Used for major surgery" + } + }, + { + "id": "CHG-004", + "productType": "substance", // medication | device | substance + "chargeType": "IPD", + "status": "billed", + "description": "Lab Reagent Kit", + "quantity": 1, + "price": [ + { + "priceType": "base", // base | surcharge | deduction | discount | SGST | CGST | informational + "amount": "300" + } + ], + "substance": { // Only for type=substance + "id": "", + "code": "LAB-REAGENT-001", + "category": "chemical", + "description": "Used to treat infections", + "expiry": "{{$isoTimestamp}}", + "quantity": "2.0" + } + } + ], + "payment": { + "method": "upi", // Optional + "status":"active", // Optional + "paymentDate":"", /// Optional + "paidAmount": 2200.00, // Optional + "transactionId": "TXN-98765" // Optional + }, + } + ``` +
+ +--- +### Error response in 400 BadRequest - There are two kinds of error * Validation errors : The errors are thrown when mandatory fields are missing ``` @@ -576,6 +729,7 @@ Recommended RAM: Systems with more than 8 GB RAM } } ``` +--- ### Things To Consider - If the FHIR bundle is generated the HttpStatus will be `201 created` - The authoredOn will accept date in the format of string in format : `yyyy-MM-dd` or `yyyy-MM-dd'T'HH:mm:ss.SSSX` - UTC iso time format \ No newline at end of file diff --git a/fhir-mapper/build.gradle b/FHIR-Mapper/build.gradle similarity index 100% rename from fhir-mapper/build.gradle rename to FHIR-Mapper/build.gradle diff --git a/fhir-mapper/docker-compose-fhir.yaml b/FHIR-Mapper/docker-compose-fhir.yaml similarity index 70% rename from fhir-mapper/docker-compose-fhir.yaml rename to FHIR-Mapper/docker-compose-fhir.yaml index 150f5982..981ca379 100644 --- a/fhir-mapper/docker-compose-fhir.yaml +++ b/FHIR-Mapper/docker-compose-fhir.yaml @@ -4,13 +4,16 @@ services: build: context: . dockerfile: Dockerfile - image: fhir-mapper + image: fhir-mapper:latest ports: - '8085:8085' networks: - docker_network extra_hosts: - "host.docker.internal:host-gateway" + restart: unless-stopped + environment: + JAVA_OPTS: "-Xms256m -Xmx512m" networks: docker_network: diff --git a/fhir-mapper/fhir-mapper.yaml b/FHIR-Mapper/docs/fhir-mapper.yaml similarity index 53% rename from fhir-mapper/fhir-mapper.yaml rename to FHIR-Mapper/docs/fhir-mapper.yaml index bda9b9a0..7c5a640b 100644 --- a/fhir-mapper/fhir-mapper.yaml +++ b/FHIR-Mapper/docs/fhir-mapper.yaml @@ -189,6 +189,491 @@ paths: responses: '201': description: Successfully created + '400': + description: Bad Request + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ValidationErrorResponse' + - $ref: '#/components/schemas/GenericErrorResponse' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponse' + /invoice: + post: + tags: + - Billing + summary: Create an Invoice Bundle + description: Submits an invoice bundle containing patient, practitioner, organization, charge items, and payment details. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InvoiceBundleRequest' + example: + bundleType: Invoice + careContextReference: visit-2025-08-20T10:00:00Z + invoiceDate: 2025-08-12T10:30:00+05:30 + status: issued + encounter: "" + patient: + name: Venu Ajitesh + patientReference: ajitesh6x + gender: male + birthDate: 1940-04-27 + practitioners: + - name: Dr.Venu Ajitesh + practitionerId: Predator + organisation: + facilityName: Predator_HIP + facilityId: Predator_HIP + invoice: + id: INV-12345 + status: issued + type: Pharmacy + date: 2025-08-12T10:30:00+05:30 + totalNet: 2000.00 + totalGross: 2200.00 + currency: INR + paymentTerms: Due in 15 days + note: Surgery + post-op medicines + chargeItems: + - id: CHG-002 + productType: medication + chargeType: Pharmacy + status: billed + description: Amoxicillin 500mg + quantity: 14 + price: + - priceType: base + amount: 100 + medication: + medicineName: AMOX500 + manufacturer: ABC Pharma + medicationForm: tablet + lotNumber: ABC123 + expiryDate: 2026-05-01 + - id: CHG-003 + productType: device + chargeType: OPD + status: billed + description: Surgical Gloves + quantity: 5 + price: + - priceType: base + amount: 200 + device: + udiCarrier: UDI-GLV-001 + manufacturer: MedGlove Inc. + modelNumber: MG-GLV-SRG + lotNumber: 194847-0 + serialNumber: SN-98347 + manufactureDate: 2025-01-10 + expirationDate: 2028-01-10 + status: active + safety: + - Latex Free + - Sterile + deviceName: Surgical Gloves + note: Used for major surgery + - id: CHG-004 + productType: substance + chargeType: IPD + status: billed + description: Lab Reagent Kit + quantity: 1 + price: + - priceType: base + amount: 300 + substance: + id: SUB-001 + code: LAB-REAGENT-001 + category: chemical + description: Used to treat infections + expiry: 2026-05-01 + quantity: 2.0 + payment: + method: upi + status: active + paymentDate: 2025-08-12T11:00:00+05:30 + paidAmount: 2200.00 + transactionId: TXN-98765 + responses: + '201': + description: Successfully created + content: + application/json: + example: + resourceType: Bundle + id: 81ab25d0-82a0-41b5-b3a6-bff89356bce0 + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.777Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/DocumentBundle' + security: + - system: 'http://terminology.hl7.org/CodeSystem/v3-Confidentiality' + code: V + display: very restricted + identifier: + system: 'https://ABDM_WRAPPER/bundle' + value: 'visit-2025-08-19T22:19:11.395Z' + type: document + timestamp: '2025-08-19T22:19:11.774Z' + entry: + - fullUrl: Composition/0f545f1a-64b5-437a-824e-ebb22b1bf720 + resource: + resourceType: Composition + id: 0f545f1a-64b5-437a-824e-ebb22b1bf720 + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.921Z' + identifier: + system: 'https://ABDM_WRAPPER/bundle' + value: 0f545f1a-64b5-437a-824e-ebb22b1bf720 + status: final + type: + coding: + - system: 'http://snomed.info/sct' + code: Invoice Record + display: Invoice Record + subject: + reference: Patient/94ecc23e-c798-4023-bcb2-15cd687166c4 + type: Patient + display: Venu Ajitesh + date: '2024-05-01T12:03:37+05:30' + author: + - reference: Practitioner/Predator + type: Practitioner + display: Dr.Venu Ajitesh + title: Invoice Record + custodian: + reference: Organisation/ec12d2da-22f2-4b05-9cd6-5c66efa0853f + type: Organisation + section: + - title: Invoice + code: + coding: + - system: 'http://snomed.info/sct' + code: Invoice Record + display: Invoice Record + text: Invoice Record + entry: + - reference: Invoice/INV-12345 + type: Invoice + - reference: ChargeItem/CHG-002 + type: ChargeItem + - reference: ChargeItem/CHG-003 + type: ChargeItem + - reference: ChargeItem/CHG-004 + type: ChargeItem + - reference: Device/UDI-GLV-001 + type: Device + - reference: Substance/a54eb8ca-a9bd-4147-90d5-51eb953b2965 + type: Substance + - reference: Medication/1882f644-ee31-497d-b9ab-3c8350584659 + type: Medication + - reference: PaymentReconciliation/b2fb26bb-b286-4487-bc9c-512f564220f0 + type: PaymentReconciliation + - fullUrl: Patient/94ecc23e-c798-4023-bcb2-15cd687166c4 + resource: + resourceType: Patient + id: 94ecc23e-c798-4023-bcb2-15cd687166c4 + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.778Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/Patient' + identifier: + - type: + coding: + - system: 'http://terminology.hl7.org/CodeSystem/v2-0203' + code: MR + display: Medical record number + system: 'https://healthid.abdm.gov.in' + value: ajitesh6x + name: + - text: Venu Ajitesh + gender: male + birthDate: '1940-04-27' + - fullUrl: Practitioner/Predator + resource: + resourceType: Practitioner + id: Predator + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.795Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/Practitioner' + identifier: + - type: + coding: + - system: 'http://terminology.hl7.org/CodeSystem/v2-0203' + code: MR + display: Medical record number + system: 'https://doctor.abdm.gov.in' + value: Predator + name: + - text: Dr.Venu Ajitesh + - fullUrl: Organisation/ec12d2da-22f2-4b05-9cd6-5c66efa0853f + resource: + resourceType: Organization + id: ec12d2da-22f2-4b05-9cd6-5c66efa0853f + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.797Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/Organization' + identifier: + - type: + coding: + - system: 'http://terminology.hl7.org/CodeSystem/v2-0203' + code: PRN + display: Provider number + system: 'https://facility.abdm.gov.in' + value: Predator_HIP + name: Predator_HIP + - fullUrl: Encounter/871368c4-1701-4ea6-bef1-aa590218eba5 + resource: + resourceType: Encounter + id: 871368c4-1701-4ea6-bef1-aa590218eba5 + meta: + lastUpdated: '2025-08-19T22:19:11.808Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/Encounter' + status: in-progress + class: + system: 'http://terminology.hl7.org/CodeSystem/v3-Confidentiality' + code: AMB + display: Ambulatory + subject: + reference: Patient/94ecc23e-c798-4023-bcb2-15cd687166c4 + display: Venu Ajitesh + period: + start: '2024-05-01T06:33:37Z' + - fullUrl: Manufacturer/e9f1c715-19a3-463b-ae5b-cafe2d1466ab + resource: + resourceType: Organization + id: e9f1c715-19a3-463b-ae5b-cafe2d1466ab + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.873Z' + profile: + - 'https://nrces.in/ndhm/fhir/r4/StructureDefinition/Organization' + identifier: + - type: + coding: + - system: 'http://terminology.hl7.org/CodeSystem/v2-0203' + code: PRN + display: Provider number + system: 'https://facility.abdm.gov.in' + value: 3ac2e25a-490c-424d-a19c-e541114f8f7e + name: ABC Pharma + - fullUrl: Invoice/INV-12345 + resource: + resourceType: Invoice + id: INV-12345 + status: issued + type: + text: Pharmacy + subject: + reference: Patient/94ecc23e-c798-4023-bcb2-15cd687166c4 + display: Venu Ajitesh + date: '2024-05-01T12:03:37+05:30' + issuer: + reference: Organisation/ec12d2da-22f2-4b05-9cd6-5c66efa0853f + display: Predator_HIP + lineItem: + - chargeItemReference: + reference: ChargeItem/CHG-002 + priceComponent: + - type: base + code: + coding: + - system: 'http://hl7.org/fhir/invoice-priceComponentType' + code: base + display: base + text: base + amount: + value: 100 + currency: INR + - chargeItemReference: + reference: ChargeItem/CHG-003 + priceComponent: + - type: base + code: + coding: + - system: 'http://hl7.org/fhir/invoice-priceComponentType' + code: base + display: base + text: base + amount: + value: 200 + currency: INR + - chargeItemReference: + reference: ChargeItem/CHG-004 + priceComponent: + - type: base + code: + coding: + - system: 'http://hl7.org/fhir/invoice-priceComponentType' + code: base + display: base + text: base + amount: + value: 300 + currency: INR + totalNet: + value: 2000 + currency: INR + totalGross: + value: 2200 + currency: INR + paymentTerms: Due in 15 days + note: + - text: Surgery + post-op medicines + - fullUrl: ChargeItem/CHG-002 + resource: + resourceType: ChargeItem + id: CHG-002 + identifier: + - value: medication + status: billed + code: + coding: + - system: 'https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-billing-codes' + code: '01' + display: Pharmacy + text: Pharmacy + quantity: + value: 14 + unit: pcs + productReference: + reference: Medication/1882f644-ee31-497d-b9ab-3c8350584659 + note: + - text: Amoxicillin 500mg + - fullUrl: ChargeItem/CHG-003 + resource: + resourceType: ChargeItem + id: CHG-003 + identifier: + - value: device + status: billed + code: + coding: + - system: 'https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-billing-codes' + code: '03' + display: OPD + text: OPD + quantity: + value: 5 + unit: pcs + productReference: + reference: Device/UDI-GLV-001 + note: + - text: Surgical Gloves + - fullUrl: ChargeItem/CHG-004 + resource: + resourceType: ChargeItem + id: CHG-004 + identifier: + - value: substance + status: billed + code: + coding: + - system: 'https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-billing-codes' + code: '02' + display: IPD + text: IPD + quantity: + value: 1 + unit: pcs + productReference: + reference: Substance/a54eb8ca-a9bd-4147-90d5-51eb953b2965 + note: + - text: Lab Reagent Kit + - fullUrl: Device/UDI-GLV-001 + resource: + resourceType: Device + id: UDI-GLV-001 + udiCarrier: + - deviceIdentifier: UDI-GLV-001 + status: active + manufacturer: MedGlove Inc. + manufactureDate: '2025-01-10T00:00:00+05:30' + expirationDate: '2028-01-10T00:00:00+05:30' + lotNumber: 194847-0 + serialNumber: SN-98347 + deviceName: + - name: Surgical Gloves + type: user-friendly-name + modelNumber: MG-GLV-SRG + note: + - text: Used for major surgery + safety: + - text: Latex Free + - text: Sterile + - fullUrl: Substance/a54eb8ca-a9bd-4147-90d5-51eb953b2965 + resource: + resourceType: Substance + id: a54eb8ca-a9bd-4147-90d5-51eb953b2965 + category: + - text: chemical + code: + text: LAB-REAGENT-001 + description: Used to treat infections + instance: + - expiry: '2025-08-20T03:49:11+05:30' + quantity: + value: 2 + - fullUrl: Medication/1882f644-ee31-497d-b9ab-3c8350584659 + resource: + resourceType: Medication + id: 1882f644-ee31-497d-b9ab-3c8350584659 + meta: + versionId: '1' + lastUpdated: '2025-08-19T22:19:11.878Z' + code: + coding: + - system: 'http://snomed.info/sct' + code: '261665006' + display: AMOX500 + text: AMOX500 + manufacturer: + reference: Manufacturer/e9f1c715-19a3-463b-ae5b-cafe2d1466ab + form: + coding: + - system: 'http://snomed.info/sct' + code: '385055001' + display: tablet + text: tablet + batch: + lotNumber: ABC123 + expirationDate: '2025-08-20T03:49:11+05:30' + - fullUrl: PaymentReconciliation/b2fb26bb-b286-4487-bc9c-512f564220f0 + resource: + resourceType: PaymentReconciliation + id: b2fb26bb-b286-4487-bc9c-512f564220f0 + status: active + paymentAmount: + value: 2200 + currency: INR + paymentIdentifier: + value: TXN-98765 + detail: + - type: + coding: + - system: 'http://terminology.hl7.org/CodeSystem/payment-type' + code: upi + display: upi + + + '400': description: Bad Request content: @@ -1145,6 +1630,228 @@ components: type: OP record contentType: application/pdf data: xyzadybcljbabvlalbfdbvubujzbj + InvoiceBundleRequest: + type: object + required: + - bundleType + - careContextReference + - invoiceDate + - status + - patient + - organisation + - invoice + - chargeItems + properties: + bundleType: + type: string + example: Invoice + careContextReference: + type: string + invoiceDate: + type: string + format: date-time + status: + type: string + enum: [issued, balanced, cancelled, draft, entered-in-error] + encounter: + type: string + patient: + $ref: '#/components/schemas/Patient' + practitioners: + type: array + items: + $ref: '#/components/schemas/Practitioner' + organisation: + $ref: '#/components/schemas/Organisation' + invoice: + $ref: '#/components/schemas/Invoice' + chargeItems: + type: array + items: + $ref: '#/components/schemas/ChargeItem' + payment: + $ref: '#/components/schemas/Payment' + + + + Invoice: + type: object + required: + - status + - type + - totalNet + - totalGross + - currency + - date + properties: + id: + type: string + status: + type: string + enum: [issued, balanced, cancelled, draft, entered-in-error] + type: + type: string + enum: [Consultation, Pharmacy, IPD, OPD, Others] + date: + type: string + format: date-time + totalNet: + type: number + format: double + totalGross: + type: number + format: double + currency: + type: string + paymentTerms: + type: string + note: + type: string + + ChargeItem: + type: object + required: + - productType + - chargeType + - status + - quantity + - price + - description + properties: + id: + type: string + productType: + type: string + enum: [medication, device, substance] + chargeType: + type: string + status: + type: string + enum: [planned, billable, not-billable, aborted, billed, entered-in-error, unknown] + description: + type: string + quantity: + type: integer + price: + type: array + items: + $ref: '#/components/schemas/Price' + medication: + $ref: '#/components/schemas/InvoiceMedication' + device: + $ref: '#/components/schemas/Device' + substance: + $ref: '#/components/schemas/Substance' + + Price: + type: object + required: + - proceType + - amount + properties: + priceType: + type: string + enum: [base, surcharge, deduction, discount, SGST, CGST, informational] + amount: + type: number + format: double + + InvoiceMedication: + type: object + required: + - medicineName + properties: + medicineName: + type: string + manufacturer: + type: string + medicationForm: + type: string + lotNumber: + type: string + expiryDate: + type: string + format: date-time + + Device: + type: object + required: + - status + - deviceName + properties: + udiCarrier: + type: string + manufacturer: + type: string + modelNumber: + type: string + lotNumber: + type: string + serialNumber: + type: string + manufactureDate: + type: string + format: date + expirationDate: + type: string + format: date + status: + type: string + enum: [active, inactive, entered-in-error, unknown] + safety: + type: array + items: + type: string + deviceName: + type: string + note: + type: string + + Substance: + type: object + required: + - code + - category + - description + - quantity + properties: + id: + type: string + code: + type: string + category: + type: string + description: + type: string + expiry: + type: string + format: date-time + quantity: + type: number + format: double + + Payment: + type: object + required: + - method + - status + - paymentAmount + properties: + method: + type: string + example: upi + status: + type: string + enum: [active, cancelled, draft, entered-in-error, null] + paymentDate: + type: string + format: date-time + paidAmount: + type: number + format: double + transactionId: + type: string + ValidationErrorResponse: diff --git a/FHIR-Mapper/docs/index.html b/FHIR-Mapper/docs/index.html new file mode 100644 index 00000000..10b180f2 --- /dev/null +++ b/FHIR-Mapper/docs/index.html @@ -0,0 +1,257 @@ + + + + + + Swagger + + + + + +
+ + + + + + diff --git a/fhir-mapper/gradle/wrapper/gradle-wrapper.jar b/FHIR-Mapper/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from fhir-mapper/gradle/wrapper/gradle-wrapper.jar rename to FHIR-Mapper/gradle/wrapper/gradle-wrapper.jar diff --git a/fhir-mapper/gradle/wrapper/gradle-wrapper.properties b/FHIR-Mapper/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from fhir-mapper/gradle/wrapper/gradle-wrapper.properties rename to FHIR-Mapper/gradle/wrapper/gradle-wrapper.properties diff --git a/fhir-mapper/gradlew b/FHIR-Mapper/gradlew similarity index 100% rename from fhir-mapper/gradlew rename to FHIR-Mapper/gradlew diff --git a/fhir-mapper/gradlew.bat b/FHIR-Mapper/gradlew.bat similarity index 100% rename from fhir-mapper/gradlew.bat rename to FHIR-Mapper/gradlew.bat diff --git a/FHIR-Mapper/postmanCollection/FHIR.postman_collection.json b/FHIR-Mapper/postmanCollection/FHIR.postman_collection.json new file mode 100644 index 00000000..a0d31870 --- /dev/null +++ b/FHIR-Mapper/postmanCollection/FHIR.postman_collection.json @@ -0,0 +1,370 @@ +{ + "info": { + "_postman_id": "6192a23b-5635-4954-9ba9-903e46159dfd", + "name": "FHIR", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "24014718" + }, + "item": [ + { + "name": "prescription", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var template = `", + "", + "", + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " {{#each response.entry}}", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " {{/each}}", + "
IDTypeStatusDateSubjectAuthorTitle
{{resource.id}}{{resource.resourceType}}{{resource.status}}{{resource.date}}{{resource.subject.reference}}{{resource.author.[0].reference}}{{resource.title}}
", + "`;", + "", + "function constructVisualizerPayload() {", + " return { response: pm.response.json() };", + "}", + "", + "pm.visualizer.set(template, constructVisualizerPayload());" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\": \"PrescriptionRecord\",\r\n \"careContextReference\": \"visit-{{$isoTimestamp}}\",\r\n \"authoredOn\": \"2024-05-01T06:33:37.361Z\",\r\n \"encounter\": \"\",\r\n \"patient\": {\r\n \"name\": \"Venu Ajitesh\",\r\n \"patientReference\": \"ajitesh6x\",\r\n \"gender\": \"male\",\r\n \"birthDate\": \"1940-04-27\"\r\n },\r\n \"practitioners\": [\r\n {\r\n \"name\": \"Dr.Venu Ajitesh\",\r\n \"practitionerId\": \"Predator\"\r\n }\r\n ],\r\n \"organisation\": {\r\n \"facilityName\": \"Predator_HIP\",\r\n \"facilityId\": \"Predator_HIP\"\r\n },\r\n \"prescriptions\": [\r\n {\r\n \"medicine\": \"Glucosamine 1 g oral tablet\",\r\n \"dosage\": \"1-0-1\",\r\n \"timing\": \"1-1-D\",\r\n \"route\": \"Oral\",\r\n \"method\": \"swallow\",\r\n \"additionalInstructions\": \"Take them after food\",\r\n \"reason\": \"fever\"\r\n },\r\n {\r\n \"medicine\": \"Acetaminophen 100 mg/mL oral solution\",\r\n \"dosage\": \"0-0-1\",\r\n \"timing\": \"1-2-MO\",\r\n \"route\": \"Syrup\",\r\n \"method\": \"drink\",\r\n \"additionalInstructions\": \"Take them before food\",\r\n \"reason\": \"Cough\"\r\n }\r\n ],\r\n \"documents\": [\r\n {\r\n \"type\": \"Prescription\",\r\n \"contentType\": \"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/prescription", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "prescription" + ] + } + }, + "response": [] + }, + { + "name": "OPConsultation", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\":\"OPConsultRecord\",\r\n \"careContextReference\":\"visist 21-03-2025\",\r\n \"visitDate\":\"2024-05-02T06:33:37.361Z\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"chiefComplaints\":[\r\n {\r\n \"complaint\":\"Dengue\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"physicalExaminations\":[\r\n {\r\n \"observation\":\"Heavy drinker\",\r\n \"result\":\"heavy\"\r\n // \"valueQuantity\": {\r\n\t\t\t// \t\t\"unit\": \"CM\",\r\n\t\t\t// \t\t\"value\": 170\r\n\t\t\t// }\r\n }\r\n ],\r\n \"allergies\":[\r\n \"\"\r\n ],\r\n \"medicalHistories\": \r\n [\r\n {\r\n \"complaint\":\"Typhoid fever\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"familyHistories\":[\r\n {\r\n \"relationship\":\"Friend\",\r\n \"observation\":\"Toxic\"\r\n }\r\n ],\r\n \"serviceRequests\":[\r\n {\r\n \"status\":\"ACTIVE\",\r\n \"details\":\"X-RAY\",\r\n \"specimen\":\"Lung cytologic material\"\r\n }\r\n ],\r\n \"medications\":\r\n [\r\n {\r\n \"medicine\":\"Nabilone 2 mg oral capsule\",\r\n \"dosage\":\"1-0-1\",\r\n \"timing\":\"2-5-D\",\r\n \"route\":\"Oral route\",\r\n \"method\":\"swallow\",\r\n \"additionalInstructions\":\"Take them after food\"\r\n }\r\n ,{\r\n \"medicine\":\"Nystatin 25000 unit/g vaginal cream\",\r\n \"dosage\":\"0-0-1\",\r\n \"timing\":\"1-2-D\",\r\n \"route\":\"Interstitial route (qualifier value)\",\r\n \"method\":\"drink\",\r\n \"additionalInstructions\":\"Take them before food\"\r\n }\r\n ],\r\n \"followups\":[\r\n {\r\n \"serviceType\":\"OPConsultation\",\r\n \"appointmentTime\":\"2024-05-20\",\r\n \"reason\":\"General\"\r\n }\r\n ],\r\n \"procedures\":[\r\n {\r\n \"date\":\"2001-04-20\",\r\n \"status\":\"INPROGRESS\",\r\n \"procedureReason\":\"Severe\",\r\n \"outcome\":\"Healthy\",\r\n \"procedureName\":\"Endodontic procedure\"\r\n }\r\n ],\r\n \"referrals\":[\r\n {\r\n \"status\":\"ACTIVE\",\r\n \"details\":\"Y-RAY\",\r\n \"specimen\":\"Pleural cytologic material\"\r\n }\r\n ],\r\n \"otherObservations\":[\r\n {\r\n \"observation\":\"Body weight\",\r\n // \"result\":\"Over weight\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"KG\",\r\n\t\t\t\t\t\"value\": 90\r\n\t\t\t\t}\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"OP record\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/op-consultation", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "op-consultation" + ] + } + }, + "response": [] + }, + { + "name": "health-document", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\":\"HealthDocumentRecord\",\r\n \"careContextReference\":\"visist 21-03-2024\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"authoredOn\":\"2024-05-03T06:33:37.361Z\",\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"encounter\":\"\",\r\n \"documents\":[{\r\n \"type\":\"health-document\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"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7Igi2NJ03WIdb8CPaOhwBlKEkoax7E5ZdLjP42F98TiJWKZ1T9XnPz8+/Kc1f/jRS/+d3B19aNHmf3r24eU/ho/Y+4/AKijvgugHu5+K373i9d+++9oPF/X9P6FV1H1lbmRzdHJlYW0gCmVuZG9iaiAKMiAwIG9iaiAKPDwgCi9UeXBlIC9QYWdlcyAKL0tpZHMgWyA4IDAgUiBdIAovQ291bnQgMSAKL01lZGlhQm94IDMgMCBSIAovQ3JvcEJveCA0IDAgUiAKPj4gCmVuZG9iaiAKMyAwIG9iaiAKWyAwIDAgNTk1IDg0MSBdIAplbmRvYmogCjQgMCBvYmogClsgMCAwIDU5NSA4NDEgXSAKZW5kb2JqIAo2IDAgb2JqIAo8PCAKL1Byb2NTZXQgNyAwIFIgCi9Gb250IDw8IAovOSA5IDAgUiAgCi9hIDEwIDAgUiAgCj4+IAovWE9iamVjdCA8PCAKL2ltZzAgMTEgMCBSICAKPj4gCj4+IAplbmRvYmogCjcgMCBvYmogClsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSAgXSAKZW5kb2JqIAo4IDAgb2JqIAo8PCAKL1R5cGUgL1BhZ2UgCi9QYXJlbnQgMiAwIFIgCi9SZXNvdXJjZXMgNiAwIFIgCi9Db250ZW50cyBbIDUgMCBSIF0gCj4+IAplbmRvYmogCjkgMCBvYmogCjw8IAovVHlwZSAvRm9udCAKL1N1YnR5cGUgL1RydWVUeXBlIAovQmFzZUZvbnQgL0FBQUFBQStBcmlhbCxCb2xkIAovRmlyc3RDaGFyIDMyIAovTGFzdENoYXIgMTIxIAovV2lkdGhzIDE0IDAgUiAKL0ZvbnREZXNjcmlwdG9yIDE2IDAgUiAKL1RvVW5pY29kZSAxNSAwIFIgCj4+IAplbmRvYmogCjEwIDAgb2JqIAo8PCAKL1R5cGUgL0ZvbnQgCi9TdWJ0eXBlIC9UcnVlVHlwZSAKL0Jhc2VGb250IC9BQUFBQUIrQXJpYWwgCi9GaXJzdENoYXIgMzIgCi9MYXN0Q2hhciAxMjIgCi9XaWR0aHMgMTkgMCBSIAovRm9udERlc2NyaXB0b3IgMjEgMCBSIAovVG9Vbmljb2RlIDIwIDAgUiAKPj4gCmVuZG9iaiAKMTEgMCBvYmog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CjY2NyAKMCAKNzIyIAo2NjcgCjYxMSAKNzIyIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAo1NTYgCjYxMSAKNTU2IAo2MTEgCjU1NiAKMzMzIAo2MTEgCjYxMSAKMjc4IAowIAo1NTYgCjI3OCAKODg5IAo2MTEgCjYxMSAKNjExIAowIAozODkgCjU1NiAKMzMzIAo2MTEgCjU1NiAKMCAKMCAKNTU2IApdIAplbmRvYmogCjE2IDAgb2JqIAo8PCAKL1R5cGUgL0ZvbnREZXNjcmlwdG9yIAovQXNjZW50IDkwNSAKL0NhcEhlaWdodCA1MDAgCi9EZXNjZW50IC0yMTIgCi9GbGFncyA0IAovRm9udEJCb3ggMTcgMCBSIAovRm9udE5hbWUgL0FBQUFBQStBcmlhbCxCb2xkIAovSXRhbGljQW5nbGUgMAovU3RlbVYgMCAKL1N0ZW1IIDAgCi9BdmdXaWR0aCA0NzkgCi9Gb250RmlsZTIgMTggMCBSIAovTGVhZGluZyAwIAovTWF4V2lkdGggMjYyOCAKL01pc3NpbmdXaWR0aCA0NzkgCi9YSGVpZ2h0IDAgCj4+IAplbmRvYmogCjE3IDAgb2JqIApbIC02MjggLTM3NiAyMDAwIDEwNTYgXSAKZW5kb2JqIAoxOSAwIG9iaiAKWyAKMjc4IAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAoyNzggCjMzMyAKMjc4IAoyNzggCjU1NiAKNTU2IAo1NTYgCjU1NiAKNTU2IAo1NTYgCjU1NiAKNTU2IAo1NTYgCjU1NiAKMjc4IAowIAowIAowIAowIAowIAowIAo2NjcgCjY2NyAKNzIyIAo3MjIgCjY2NyAKMCAKNzc4IAo3MjIgCjI3OCAKMCAKMCAKNTU2IAo4MzMgCjcyMiAKNzc4IAo2NjcgCjAgCjcyMiAKNjY3IAo2MTEgCjcyMiAKMCAKOTQ0IAowIAo2NjcgCjAgCjAgCjAgCjAgCjAgCjAgCjAgCjU1NiAKNTU2IAo1MDAgCjU1NiAKNTU2IAowIAo1NTYgCjU1NiAKMjIyIAoyMjIgCjAgCjIyMiAKODMzIAo1NTYgCjU1NiAKNTU2IAowIAozMzMgCjUwMCAKMjc4IAo1NTYgCjAgCjAgCjAgCjAgCjUwMCAKXSAKZW5kb2JqIAoyMSAwIG9iaiAKPDwgCi9UeXBlIC9Gb250RGVzY3JpcHRvciAKL0FzY2VudCA5MDUgCi9DYXBIZWlnaHQgNTAwIAovRGVzY2VudCAtMjEyIAovRmxhZ3MgNCAKL0ZvbnRCQm94IDIyIDAgUiAKL0ZvbnROYW1lIC9BQUFBQUIrQXJpYWwgCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwIAovU3RlbUggMCAKL0F2Z1dpZHRoIDQ0MSAKL0ZvbnRGaWxlMiAyMyAwIFIgCi9MZWFkaW5nIDAgCi9NYXhXaWR0aCAyNjY1IAovTWlzc2luZ1dpZHRoIDQ0MSAKL1hIZWlnaHQgMCAKPj4gCmVuZG9iaiAKMjIgMCBvYmogClsgLTY2NSAtMzI1IDIwMDAgMTA0MCBdIAplbmRvYmogCjI0IDAgb2JqIAooUG93ZXJlZCBCeSBDcnlzdGFsKSAKZW5kb2JqIAoyNSAwIG9iaiAKKENyeXN0YWwgUmVwb3J0cykgCmVuZG9iaiAKMjYgMCBvYmogCjw8IAovUHJvZHVjZXIgKFBvd2VyZWQgQnkgQ3J5c3RhbCkgIAovQ3JlYXRvciAoQ3J5c3RhbCBSZXBvcnRzKSAgCj4+IAplbmRvYmogCnhyZWYgCjAgMjcgCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNyAwMDAwMCBuIAowMDAwMDQyNDE0IDAwMDAwIG4gCjAwMDAwNDI1MTMgMDAwMDAgbiAKMDAwMDA0MjU0NyAwMDAwMCBuIAowMDAwMDAwMTk0IDAwMDAwIG4gCjAwMDAwNDI1ODEgMDAwMDAgbiAKMDAwMDA0MjY5MSAwMDAwMCBuIAowMDAwMDQyNzQ5IDAwMDAwIG4gCjAwMDAwNDI4NDEgMDAwMDAgbiAKMDAwMDA0MzAxOCAwMDAwMCBuIAowMDAwMDQzMTkxIDAwMDAwIG4gCjAwMDAwNTQ3MzUgMDAwMDAgbiAKMDAwMDA1NDc4OSAwMDAwMCBuIAowMDAwMDU1NjA0IDAwMDAwIG4gCjAwMDAwMDE0NzQgMDAwMDAgbiAKMDAwMDA1NTk5MCAwMDAwMCBuIAowMDAwMDU2MjY5IDAwMDAwIG4gCjAwMDAwMDIwOTUgMDAwMDAgbiAKMDAwMDA1NjMxMiAwMDAwMCBuIAowMDAwMDE4MTE3IDAwMDAwIG4gCjAwMDAwNTY3MTcgMDAwMDAgbiAKMDAwMDA1Njk5MSAwMDAwMCBuIAowMDAwMDE4Nzc5IDAwMDAwIG4gCjAwMDAwNTcwMzQgMDAwMDAgbiAKMDAwMDA1NzA3NCAwMDAwMCBuIAowMDAwMDU3MTExIDAwMDAwIG4gCnRyYWlsZXIgCjw8IAovU2l6ZSAyNyAKL1Jvb3QgMSAwIFIgCi9JbmZvIDI2IDAgUiAKPj4gCnN0YXJ0eHJlZiAKNTcxOTkgCiUlRU9GDQo=\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/health-document", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "health-document" + ] + } + }, + "response": [] + }, + { + "name": "diagnosticReport", + "protocolProfileBehavior": { + "disabledSystemHeaders": {} + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "// {\r\n// \"bundleType\": \"DiagnosticReportRecord\",\r\n// \"careContextReference\": \"visist 21-03-2024\",\r\n// \"visitDate\": \"2024-05-07T06:33:37.361Z\",\r\n// \"patient\": {\r\n// \"name\": \"Venu Ajitesh\",\r\n// \"patientReference\": \"ajitesh6x\",\r\n// \"gender\": \"male\",\r\n// \"birthDate\": \"1940-04-27\"\r\n// },\r\n// \"practitioners\": [\r\n// {\r\n// \"name\": \"Dr.Venu Ajitesh\",\r\n// \"practitionerId\": \"Predator\"\r\n// }\r\n// ],\r\n// \"organisation\": {\r\n// \"facilityName\": \"Predator_HIP\",\r\n// \"facilityId\": \"Predator_HIP\"\r\n// },\r\n// \"encounter\": \"Ambula\",\r\n// \"diagnostics\": [\r\n// {\r\n// \"serviceName\": \"BloodTest\",\r\n// \"authoredOn\":\"2024-11-23T21:34:38.989Z\",\r\n// \"serviceCategory\": \"Hematography\",\r\n// \"result\": [\r\n// {\r\n// \"observation\": \"Height\",\r\n// \"result\": \"Normal\",\r\n// \"valueQuantity\": {\r\n// \"unit\": \"CM\",\r\n// \"value\": 170\r\n// }\r\n// }\r\n// ],\r\n// \"conclusion\": \"Normal\",\r\n// \"presentedForm\":{\r\n// \"contentType\": \"application/pdf\",\r\n// \"data\": \"JVBERi0xLjMKJf////8K\"\r\n// }\r\n// }\r\n// ],\r\n// \"documents\":[{\r\n// \"type\": \"diagnosticReport\",\r\n// \"contentType\": \"application/pdf\",\r\n// \"data\": \"JVBERi0xLjMKJf////8K\"\r\n// }]\r\n// }\r\n{\r\n \"bundleType\": \"DiagnosticReportRecord\",\r\n \"careContextReference\": \"329998-1-1-1\",\r\n \"visitDate\": \"2024-05-28T17:04:50.539Z\",\r\n \"patient\": {\r\n \"name\": \"Himani Gupta\",\r\n \"patientReference\": \"329998\",\r\n \"gender\": \"Female\",\r\n \"birthDate\": \"1996-11-15\"\r\n },\r\n \"practitioners\": [\r\n {\r\n \"name\": \"xyz\",\r\n \"practitionerId\": \"8770092714\"\r\n }\r\n ],\r\n \"organisation\": {\r\n \"facilityName\": \"Ayela\",\r\n \"facilityId\": \"378608\"\r\n },\r\n \"encounter\": \"SICKLE\",\r\n \"diagnostics\": [\r\n {\r\n \"serviceName\": \"SICKLE\",\r\n \"authoredOn\": \"2024-05-28T17:04:50.539Z\",\r\n \"serviceCategory\": \"SICKLE\",\r\n \"result\": [\r\n {\r\n \"observation\": \"SICKLE\",\r\n \"result\": \"carrier\"\r\n }\r\n ],\r\n \"conclusion\": \"carrier\"\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/diagnostic-report", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "diagnostic-report" + ] + } + }, + "response": [] + }, + { + "name": "wellness-record", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\":\"WellnessRecord\",\r\n \"careContextReference\":\"visist 21-03-2025\",\r\n \"authoredOn\":\"2024-05-04T06:33:37.361Z\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"vitalSigns\":[\r\n {\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"bodyMeasurements\":[\r\n {\r\n \"observation\":\"BMI\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"physicalActivities\":[\r\n {\r\n \"observation\":\"Running\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"generalAssessments\":[\r\n {\r\n \"observation\":\"Physico\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\"womanHealths\":[\r\n {\r\n \"observation\":\"Crazy\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"lifeStyles\":[\r\n {\r\n \"observation\":\"Bad\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"otherObservations\":[\r\n {\r\n \"observation\":\"None\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"WellnessRecord\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\": \"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Mzc1Ci9YSGVpZ2h0IDUyOC4zMjAzMTMKL1N0ZW1WIDAKL0ZvbnRGaWxlMiAxNiAwIFIKPj4KZW5kb2JqCjE4IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9DSURGb250VHlwZTIKL0Jhc2VGb250IC9CWlpaWlorUm9ib3RvLVJlZ3VsYXIKL0NJRFN5c3RlbUluZm8gPDwKL1JlZ2lzdHJ5IChBZG9iZSkKL09yZGVyaW5nIChJZGVudGl0eSkKL1N1cHBsZW1lbnQgMAo+PgovRm9udERlc2NyaXB0b3IgMTcgMCBSCi9XIFswIFs5MDggNzEzLjM3ODkwNiA3MTMuMzc4OTA2IDY1Mi4zNDM3NSAyNDguMDQ2ODc1IDI0NC4xNDA2MjUgNTYzLjk2NDg0NCA4NzYuOTUzMTI1IDI0My4xNjQwNjMgNTUyLjI0NjA5NCA2MzYuNzE4NzUgNTcwLjMxMjUgNTUxLjI2OTUzMSA1MjMuNDM3NSA1NTAuNzgxMjUgNTMwLjI3MzQzOCAzMzguODY3MTg4IDI0My4xNjQwNjMgNTQzLjk0NTMxMyAzMjcuMTQ4NDM4IDU5My43NSA1MTYuMTEzMjgxIDU2Mi4wMTE3MTkgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDU2Mi4wMTE3MTkgNDg0LjM3NSA1NjIuMDExNzE5IDU2Mi4wMTE3MTkgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDg3My4wNDY4NzUgNjE2LjIxMDkzOCAyNzYuMzY3MTg4IDI0Mi4xODc1IDYzMC44NTkzNzUgMjYzLjY3MTg3NSAyNzEuOTcyNjU2IDU5Ni42Nzk2ODggNTY4LjM1OTM3NSA2NTYuMjUgNjUwLjg3ODkwNiAzNDcuNjU2MjUgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDU2MS41MjM0MzggNjg3Ljk4ODI4MSA2NDguNDM3NSA1NjEuNTIzNDM4IDYwMC41ODU5MzhdXQovQ0lEVG9HSURNYXAgL0lkZW50aXR5Cj4+CmVuZG9iagoxOSAwIG9iago8PAovTGVuZ3RoIDMzNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeJxdUstugzAQvPMVe0wPEQFDaCSEVKUXDn2otKeqB2IvEVIxliEH/r7G4yZV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hSaeRYM/OC1xOdwlOx480lpmEZzGvKwIYw3O7ev2dcIFETqTyfRBfUg7ItEpSQGFjhGF/hcOmQnjCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDI0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNjQ0OSAwMDAwMCBuIAowMDAwMDA2NTA2IDAwMDAwIG4gCjAwMDAwMDYzODcgMDAwMDAgbiAKMDAwMDAwNjM2NiAwMDAwMCBuIAowMDAwMDAwMzU5IDAwMDAwIG4gCjAwMDAwMDAyMTkgMDAwMDAgbiAKMDAwMDAwMDEwOSAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNTkgMDAwMDAgbiAKMDAwMDAwNDgxMCAwMDAwMCBuIAowMDAwMDA2MjE4IDAwMDAwIG4gCjAwMDAwMDMzMTcgMDAwMDAgbiAKMDAwMDAwMzIyOSAwMDAwMCBuIAowMDAwMDAzMjU1IDAwMDAwIG4gCjAwMDAwMDMyODEgMDAwMDAgbiAKMDAwMDAwNjU1MyAwMDAwMCBuIAowMDAwMDAzMzkzIDAwMDAwIG4gCjAwMDAwMDM2NjEgMDAwMDAgbiAKMDAwMDAwNDQwMCAwMDAwMCBuIAowMDAwMDE0MjAzIDAwMDAwIG4gCjAwMDAwMDQ5NTkgMDAwMDAgbiAKMDAwMDAwNTIyNiAwMDAwMCBuIAowMDAwMDA1ODM2IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMjQKL1Jvb3QgMyAwIFIKL0luZm8gMTIgMCBSCi9JRCBbPDdiOTliYmRjNzc5ZjAyYjc4MGViNDI1ZWU0ZjdmY2JmPiA8N2I5OWJiZGM3NzlmMDJiNzgwZWI0MjVlZTRmN2ZjYmY+XQo+PgpzdGFydHhyZWYKMjA3NzUKJSVFT0YK\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/wellness-record", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "wellness-record" + ] + } + }, + "response": [] + }, + { + "name": "immunization", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\":\"ImmunizationRecord\",\r\n \"careContextReference\":\"visit-{{$isoTimestamp}}\",\r\n \"authoredOn\":\"{{$isoTimestamp}}\",\r\n \"encounter\":\"\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"immunizations\":[{\r\n \"date\":\"2024-06-15\",\r\n \"vaccineName\":\"Paratyphoid vaccine\",\r\n \"lotNumber\":\"IN00004\",\r\n \"manufacturer\":\"NHA\",\r\n \"doseNumber\":\"3\"\r\n }],\r\n \"documents\":[{\r\n \"type\":\"immunization\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/immunization", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "immunization" + ] + } + }, + "response": [] + }, + { + "name": "discharge-summary", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\":\"DischargeSummaryRecord\",\r\n \"careContextReference\":\"visist 21-03-2024\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"carePlan\":{\r\n \"intent\":\"plan\",\r\n \"type\":\"Regular check up\",\r\n \"goal\":\"Reduce BP\",\r\n \"description\":\"Normal\",\r\n \"notes\":\"The patient has an HIGH BP, recommended to revisit on 29-10-2024\"\r\n },\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"chiefComplaints\":[\r\n {\r\n \"complaint\":\"Sugar\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"physicalExaminations\":[\r\n {\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"allergies\":[\r\n \"Walnuts\"\r\n ],\r\n \"medicalHistories\":[\r\n {\r\n \"complaint\":\"Sugar\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"familyHistories\":[\r\n {\r\n \"relationship\":\"Friend\",\r\n \"observation\":\"Toxic\"\r\n }\r\n ],\r\n \"authoredOn\":\"2024-05-06T06:33:37.361Z\",\r\n \"medications\":[\r\n {\r\n \"medicine\":\"Aspirin 75 mg oral tablet\",\r\n \"dosage\":\"1-0-1\",\r\n \"timing\":\"2-5-D\",\r\n \"route\":\"Oral\",\r\n \"method\":\"swallow\",\r\n \"additionalInstructions\":\"Take them after food\"\r\n }\r\n ,{\r\n \"medicine\":\"Disprin\",\r\n \"dosage\":\"0-0-1\",\r\n \"timing\":\"1-2-D\",\r\n \"route\":\"Syrup\",\r\n \"method\":\"drink\",\r\n \"additionalInstructions\":\"Take them before food\"\r\n }\r\n ],\r\n \"diagnostics\":[{\r\n \"serviceName\":\"BloodTest\",\r\n \"serviceCategory\":\"Hematography\",\r\n \"result\":[{\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }],\r\n \"authoredOn\":\"2024-05-08T06:33:37.361Z\",\r\n \"conclusion\":\"Normal\",\r\n \"presentedForm\":{\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }\r\n }],\r\n \"procedures\":[\r\n {\r\n \"date\":\"2001-04-20\",\r\n \"status\":\"INPROGRESS\",\r\n \"procedureReason\":\"Severe\",\r\n \"outcome\":\"Healthy\",\r\n \"procedureName\":\"Operation\"\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"OP record\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/discharge-summary", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "discharge-summary" + ] + } + }, + "response": [] + }, + { + "name": "Get SnomedCodes", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/snomed/Medications", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "snomed", + "Medications" + ] + } + }, + "response": [] + }, + { + "name": "Invoice", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"bundleType\": \"Invoice\",\r\n \"careContextReference\": \"visit-{{$isoTimestamp}}\",\r\n \"invoiceDate\": \"2024-05-01T06:33:37.361Z\",\r\n \"status\": \"issued\",\r\n \"encounter\": \"\",\r\n \"patient\": {\r\n \"name\": \"Venu Ajitesh\",\r\n \"patientReference\": \"ajitesh6x\",\r\n \"gender\": \"male\",\r\n \"birthDate\": \"1940-04-27\"\r\n },\r\n \"practitioners\": [\r\n {\r\n \"name\": \"Dr.Venu Ajitesh\",\r\n \"practitionerId\": \"Predator\"\r\n }\r\n ],\r\n \"organisation\": {\r\n \"facilityName\": \"Predator_HIP\",\r\n \"facilityId\": \"Predator_HIP\"\r\n },\r\n \"invoice\": {\r\n \"id\": \"INV-12345\", // Required\r\n \"status\": \"issued\", // Required - issued | balanced | cancelled\r\n \"type\": \"Pharmacy\", // Consultation | Pharmacy | IPD | OPD | Others\r\n \"date\": \"2025-08-12T10:30:00+05:30\", // Required\r\n \"totalNet\": 2000.00, // Required\r\n \"totalGross\": 2200.00, // Required\r\n \"currency\": \"INR\", // Required\r\n \"paymentTerms\": \"Due in 15 days\", // Optional\r\n \"note\": \"Surgery + post-op medicines\" // Optional\r\n },\r\n \"chargeItems\": [ // Required - at least one\r\n {\r\n \"id\": \"CHG-002\",\r\n \"productType\": \"medication\", // medication | device | substance\r\n \"chargeType\": \"Pharmacy\",\r\n \"status\": \"billed\",\r\n \"description\": \"Amoxicillin 500mg\",\r\n \"quantity\": 14,\r\n \"price\": [\r\n {\r\n \"priceType\": \"base\", // base | surcharge | deduction | discount | SGST | CGST | informational\r\n \"amount\": \"100\"\r\n }\r\n ],\r\n \"medication\": { // Only for type=medication\r\n \"medicineName\": \"AMOX500\",\r\n \"manufacturer\": \"ABC Pharma\",\r\n \"medicationForm\": \"tablet\",\r\n \"lotNumber\": \"ABC123\",\r\n \"expiryDate\": \"{{$isoTimestamp}}\"\r\n }\r\n },\r\n {\r\n \"id\": \"CHG-003\",\r\n \"productType\": \"device\", // medication | device | substance\r\n \"chargeType\": \"OPD\",\r\n \"status\": \"billed\",\r\n \"description\": \"Surgical Gloves\",\r\n \"quantity\": 5,\r\n \"price\": [\r\n {\r\n \"priceType\": \"base\", // base | surcharge | deduction | discount | SGST | CGST | informational\r\n \"amount\": \"200\"\r\n }\r\n ],\r\n \"device\": { // Only for type=device\r\n \"udiCarrier\": \"UDI-GLV-001\",\r\n \"manufacturer\": \"MedGlove Inc.\",\r\n \"modelNumber\": \"MG-GLV-SRG\",\r\n \"lotNumber\": \"194847-0\",\r\n \"serialNumber\": \"SN-98347\",\r\n \"manufactureDate\": \"2025-01-10\",\r\n \"expirationDate\": \"2028-01-10\",\r\n \"status\": \"active\",\r\n \"safety\": [\r\n \"Latex Free\",\r\n \"Sterile\"\r\n ],\r\n \"deviceName\": \"Surgical Gloves\",\r\n \"note\": \"Used for major surgery\"\r\n }\r\n },\r\n {\r\n \"id\": \"CHG-004\",\r\n \"productType\": \"substance\", // medication | device | substance\r\n \"chargeType\": \"IPD\",\r\n \"status\": \"billed\",\r\n \"description\": \"Lab Reagent Kit\",\r\n \"quantity\": 1,\r\n \"price\": [\r\n {\r\n \"priceType\": \"base\", // base | surcharge | deduction | discount | SGST | CGST | informational\r\n \"amount\": \"300\"\r\n }\r\n ],\r\n \"substance\": { // Only for type=substance\r\n \"id\": \"\",\r\n \"code\": \"LAB-REAGENT-001\",\r\n \"category\": \"chemical\",\r\n \"description\": \"Used to treat infections\",\r\n \"expiry\": \"{{$isoTimestamp}}\",\r\n \"quantity\": \"2.0\"\r\n }\r\n }\r\n ],\r\n \"payment\": {\r\n \"method\": \"upi\", // Optional\r\n \"status\":\"active\", // Optional\r\n \"paymentDate\":\"\", /// Optional\r\n \"paidAmount\": 2200.00, // Optional\r\n \"transactionId\": \"TXN-98765\" // Optional\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "localhost:8085/v1/bundle/invoice", + "host": [ + "localhost" + ], + "port": "8085", + "path": [ + "v1", + "bundle", + "invoice" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/fhir-mapper/settings.gradle b/FHIR-Mapper/settings.gradle similarity index 100% rename from fhir-mapper/settings.gradle rename to FHIR-Mapper/settings.gradle diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/FHIRApplication.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/FHIRApplication.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/FHIRApplication.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/FHIRApplication.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java similarity index 84% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java index a9d679c4..62ecfc14 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/Utils.java @@ -24,6 +24,10 @@ public static InstantType getCurrentTimeStamp() throws ParseException { } public static DateTimeType getFormattedDateTime(String dateTimeString) throws ParseException { + if (dateTimeString == null || dateTimeString.isEmpty()) { + log.error("DateTime string is null or empty"); + return null; + } dateTimeString = dateTimeString.trim(); if (dateTimeString.length() <= 10) { return new DateTimeType(dateTimeString); @@ -34,6 +38,10 @@ public static DateTimeType getFormattedDateTime(String dateTimeString) throws Pa } public static Date getFormattedDate(String dateTimeString) throws ParseException { + if (dateTimeString == null || dateTimeString.isEmpty()) { + log.error("DateTime string is null or empty"); + return null; + } dateTimeString = dateTimeString.trim(); return new DateTimeType(dateTimeString).getValue(); } diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java similarity index 98% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java index aa426e44..97a28368 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleCompositionIdentifier.java @@ -69,4 +69,6 @@ public class BundleCompositionIdentifier { public static final String BODY_MEASUREMENT = "Body Measurement"; public static final String VITAL_SIGNS = "Vital Signs"; public static final String DOCUMENT_REFERENCE = "Document Reference"; + + public static final String INVOICE_RECORD = "Invoice Record"; } diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleFieldIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleFieldIdentifier.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleFieldIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleFieldIdentifier.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleIdentifier.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleIdentifier.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java similarity index 85% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java index e1c012b9..3c114b19 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleResourceIdentifier.java @@ -33,4 +33,10 @@ public class BundleResourceIdentifier { public static final String VITAL_SIGNS = "VitalSigns"; public static final String MEDICATIONS = "Medications"; public static final String CARE_PLAN = "CarePlan"; + public static final String INVOICE = "Invoice"; + public static final String CHARGE_ITEM = "ChargeItem"; + public static final String SUBSTANCE = "Substance"; + public static final String DEVICE = "Device"; + public static final String MEDICATION = "Medication"; + public static final String INVOICE_PAYMENT_RECONCILIATION = "PaymentReconciliation"; } diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleUrlIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleUrlIdentifier.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleUrlIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/BundleUrlIdentifier.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ChargeItemStatus.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ChargeItemStatus.java new file mode 100644 index 00000000..d86c2602 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ChargeItemStatus.java @@ -0,0 +1,36 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ChargeItemStatus { + PLANNED("planned"), + BILLABLE("billable"), + NOT_BILLABLE("not-billable"), + ABORTED("aborted"), + BILLED("billed"), + ENTERED_IN_ERROR("entered-in-error"), + UNKNOWN("unknown"); + + private final String value; + + ChargeItemStatus(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static ChargeItemStatus fromValue(String value) { + for (ChargeItemStatus status : ChargeItemStatus.values()) { + if (status.value.equalsIgnoreCase(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown enum value: " + value); + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/DeviceStatus.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/DeviceStatus.java new file mode 100644 index 00000000..717dceb6 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/DeviceStatus.java @@ -0,0 +1,33 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum DeviceStatus { + ACTIVE("active"), + INACTIVE("inactive"), + ENTERED_IN_ERROR("entered-in-error"), + UNKNOWN("unknown"); + + private final String value; + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static DeviceStatus fromValue(String value) { + for (DeviceStatus status : DeviceStatus.values()) { + if (status.value.equalsIgnoreCase(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown DeviceStatus: " + value); + } +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ErrorCode.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ErrorCode.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ErrorCode.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ErrorCode.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePaymentStatus.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePaymentStatus.java new file mode 100644 index 00000000..d35e724e --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePaymentStatus.java @@ -0,0 +1,34 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum InvoicePaymentStatus { + ACTIVE("active"), + CANCELLED("cancelled"), + DRAFT("draft"), + ENTERED_IN_ERROR("entered-in-error"), + NULL("null"); + + private final String value; + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static InvoicePaymentStatus fromValue(String value) { + for (InvoicePaymentStatus status : InvoicePaymentStatus.values()) { + if (status.value.equalsIgnoreCase(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown value: " + value); + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePriceType.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePriceType.java new file mode 100644 index 00000000..2b75e922 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoicePriceType.java @@ -0,0 +1,52 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum InvoicePriceType { + BASE("base", "00", "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", "MRP"), + SURCHARGE( + "surcharge", "01", "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", "Rate"), + DEDUCTION( + "deduction", + "02", + "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", + "Discount"), + DISCOUNT( + "discount", + "02", + "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", + "Discount"), + CGST("CGST", "03", "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", "Tax"), + SGST("SGST", "04", "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", "Tax"), + INFORMATIONAL( + "informational", + "informational", + "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-price-components", + "informational"); + + private final String value; + private final String code; + private final String system; + private final String display; + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static InvoicePriceType fromValue(String value) { + for (InvoicePriceType type : values()) { + if (type.value.equalsIgnoreCase(value)) { + return type; + } + } + throw new IllegalArgumentException("Unknown value: " + value); + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceProductType.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceProductType.java new file mode 100644 index 00000000..0fec6d49 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceProductType.java @@ -0,0 +1,32 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum InvoiceProductType { + MEDICATION("medication"), + DEVICE("device"), + SUBSTANCE("substance"); + + private final String value; + + @JsonValue + public String getValue() { + return this.value; + } + + @JsonCreator + public static InvoiceProductType fromValue(String value) { + for (InvoiceProductType type : InvoiceProductType.values()) { + if (type.value.equalsIgnoreCase(value)) { + return type; + } + } + throw new IllegalArgumentException("Invalid InvoiceProductType: " + value); + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceStatus.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceStatus.java new file mode 100644 index 00000000..c35c663d --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/InvoiceStatus.java @@ -0,0 +1,32 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum InvoiceStatus { + ISSUED("issued"), + BALANCED("balanced"), + CANCELLED("cancelled"), + DRAFT("draft"), + ENTERED_IN_ERROR("entered-in-error"); + + private final String value; + + @JsonCreator + public static InvoiceStatus fromValue(String value) { + for (InvoiceStatus status : InvoiceStatus.values()) { + if (status.value.equalsIgnoreCase(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown InvoiceStatus: " + value); + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java similarity index 89% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java index d8eae526..5519a3ad 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/ResourceProfileIdentifier.java @@ -47,4 +47,10 @@ public class ResourceProfileIdentifier { "https://nrces.in/ndhm/fhir/r4/StructureDefinition/HealthDocumentRecord"; public static final String PROFILE_PRESCRIPTION_RECORD = "https://nrces.in/ndhm/fhir/r4/StructureDefinition/PrescriptionRecord"; + public static final String PROFILE_CHARGE_ITEM_BILLING_CODES = + "https://nrces.in/ndhm/fhir/r4/CodeSystem/ndhm-billing-codes"; + public static final String PROFILE_PRICE_COMPONENT_TYPE = + "http://hl7.org/fhir/invoice-priceComponentType"; + public static final String PROFILE_INVOICE_PAYMENT_TYPE = + "http://terminology.hl7.org/CodeSystem/payment-type"; } diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/SnomedCodeIdentifier.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/SnomedCodeIdentifier.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/SnomedCodeIdentifier.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/SnomedCodeIdentifier.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/TypeIdentifiers.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/TypeIdentifiers.java new file mode 100644 index 00000000..15768fda --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/TypeIdentifiers.java @@ -0,0 +1,7 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.common.constants; + +public class TypeIdentifiers { + public static final String TYPE_CHARGE_ITEM = "ChargeItem"; + public static final String TYPE_INVOICE = "Invoice"; +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/WellnessFieldIdentifiers.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/WellnessFieldIdentifiers.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/WellnessFieldIdentifiers.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/constants/WellnessFieldIdentifiers.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/BundleResponse.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/BundleResponse.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/BundleResponse.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/BundleResponse.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DateRange.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DateRange.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DateRange.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DateRange.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DocumentResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DocumentResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DocumentResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/DocumentResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ErrorResponse.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ErrorResponse.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ErrorResponse.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ErrorResponse.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FacadeError.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FacadeError.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FacadeError.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FacadeError.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FieldErrorsResponse.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FieldErrorsResponse.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FieldErrorsResponse.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/FieldErrorsResponse.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/OrganisationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/OrganisationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/OrganisationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/OrganisationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PatientResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PatientResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PatientResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PatientResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PractitionerResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PractitionerResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PractitionerResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/PractitionerResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/SnomedResponse.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/SnomedResponse.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/SnomedResponse.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/SnomedResponse.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ValidationErrorResponse.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ValidationErrorResponse.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ValidationErrorResponse.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/common/helpers/ValidationErrorResponse.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java similarity index 89% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java index f6b36a2a..00d013fa 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/BundleController.java @@ -28,6 +28,7 @@ public class BundleController { @Autowired DiagnosticReportConverter diagnosticReportConverter; @Autowired DischargeSummaryConverter dischargeSummaryConverter; @Autowired WellnessRecordConverter wellnessRecordConverter; + @Autowired InvoiceRequestConverter invoiceRequestConverter; @Autowired SnomedService snomedService; FhirContext ctx = FhirContext.forR4(); @@ -178,4 +179,25 @@ public ResponseEntity createWellnessBundle( .contentType(MediaType.APPLICATION_JSON) .body(ctx.newJsonParser().encodeResourceToString(bundleResponse.getBundle())); } + + /** + * @param invoiceBundleRequest which has all the invoice details like charge items, total amount, + * tax, etc. + * @return FHIR bundle if no error found + * @throws ParseException while parsing the string into date + */ + @PostMapping("/invoice") + public ResponseEntity createInvoiceBundle( + @Valid @RequestBody InvoiceBundleRequest invoiceBundleRequest) { + + BundleResponse bundleResponse = invoiceRequestConverter.makeInvoiceBundle(invoiceBundleRequest); + + if (Objects.nonNull(bundleResponse.getError())) + return ResponseEntity.badRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(FacadeError.builder().error(bundleResponse.getError()).build()); + return ResponseEntity.status(HttpStatus.CREATED) + .contentType(MediaType.APPLICATION_JSON) + .body(ctx.newJsonParser().encodeResourceToString(bundleResponse.getBundle())); + } } diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/SnomedController.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/SnomedController.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/SnomedController.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/controller/SnomedController.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DiagnosticReportConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DiagnosticReportConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DiagnosticReportConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DiagnosticReportConverter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DischargeSummaryConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DischargeSummaryConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DischargeSummaryConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/DischargeSummaryConverter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/HealthDocumentConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/HealthDocumentConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/HealthDocumentConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/HealthDocumentConverter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/ImmunizationConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/ImmunizationConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/ImmunizationConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/ImmunizationConverter.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/InvoiceRequestConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/InvoiceRequestConverter.java new file mode 100644 index 00000000..55eb2d44 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/InvoiceRequestConverter.java @@ -0,0 +1,242 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.converter; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleResourceIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleUrlIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.ErrorCode; +import com.nha.abdm.fhir.mapper.rest.common.helpers.BundleResponse; +import com.nha.abdm.fhir.mapper.rest.common.helpers.ErrorResponse; +import com.nha.abdm.fhir.mapper.rest.common.helpers.OrganisationResource; +import com.nha.abdm.fhir.mapper.rest.dto.compositions.MakeInvoiceComposition; +import com.nha.abdm.fhir.mapper.rest.dto.resources.*; +import com.nha.abdm.fhir.mapper.rest.dto.resources.invoice.*; +import com.nha.abdm.fhir.mapper.rest.exceptions.StreamUtils; +import com.nha.abdm.fhir.mapper.rest.requests.InvoiceBundleRequest; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.ChargeItemResource; +import java.text.ParseException; +import java.util.*; +import org.hl7.fhir.r4.model.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.InvalidDataAccessResourceUsageException; +import org.springframework.stereotype.Service; + +@Service +public class InvoiceRequestConverter { + private static final Logger log = LoggerFactory.getLogger(InvoiceRequestConverter.class); + private final MakePatientResource makePatientResource; + private final MakePractitionerResource makePractitionerResource; + private final MakeOrganisationResource makeOrganisationResource; + private final MakeBundleMetaResource makeBundleMetaResource; + private final MakeEncounterResource makeEncounterResource; + private final MakeInvoiceComposition makeInvoiceComposition; + private final MakeChargeItemResource makeChargeItemResource; + private final MakeInvoiceResource makeInvoiceResource; + private final MakeInvoiceDeviceResource makeInvoiceDeviceResource; + private final MakeInvoiceSubstanceResource makeInvoiceSubstanceResource; + private final MakeInvoiceMedicationResource makeInvoiceMedicationResource; + private final MakeInvoicePaymentResource makeInvoicePaymentResource; + + @Autowired + public InvoiceRequestConverter( + MakePatientResource makePatientResource, + MakePractitionerResource makePractitionerResource, + MakeOrganisationResource makeOrganisationResource, + MakeBundleMetaResource makeBundleMetaResource, + MakeEncounterResource makeEncounterResource, + MakeInvoiceComposition makeInvoiceComposition, + MakeChargeItemResource makeChargeItemResource, + MakeInvoiceResource makeInvoiceResource, + MakeInvoiceDeviceResource makeInvoiceDeviceResource, + MakeInvoiceSubstanceResource makeInvoiceSubstanceResource, + MakeInvoiceMedicationResource makeInvoiceMedicationResource, + MakeInvoicePaymentResource makeInvoicePaymentResource) { + this.makePatientResource = makePatientResource; + this.makePractitionerResource = makePractitionerResource; + this.makeOrganisationResource = makeOrganisationResource; + this.makeBundleMetaResource = makeBundleMetaResource; + this.makeEncounterResource = makeEncounterResource; + this.makeInvoiceComposition = makeInvoiceComposition; + this.makeChargeItemResource = makeChargeItemResource; + this.makeInvoiceResource = makeInvoiceResource; + this.makeInvoiceDeviceResource = makeInvoiceDeviceResource; + this.makeInvoiceSubstanceResource = makeInvoiceSubstanceResource; + this.makeInvoiceMedicationResource = makeInvoiceMedicationResource; + this.makeInvoicePaymentResource = makeInvoicePaymentResource; + } + + public BundleResponse makeInvoiceBundle(InvoiceBundleRequest invoiceBundleRequest) { + try { + Bundle bundle = new Bundle(); + bundle.setId(UUID.randomUUID().toString()); + bundle.setType(Bundle.BundleType.DOCUMENT); + bundle.setTimestampElement(Utils.getCurrentTimeStamp()); + bundle.setMeta(makeBundleMetaResource.getMeta()); + bundle.setIdentifier( + new Identifier() + .setSystem(BundleUrlIdentifier.WRAPPER_URL) + .setValue(invoiceBundleRequest.getCareContextReference())); + + Patient patient = makePatientResource.getPatient(invoiceBundleRequest.getPatient()); + + List practitionerList = + Optional.ofNullable(invoiceBundleRequest.getPractitioners()) + .orElse(Collections.emptyList()) + .stream() + .map(StreamUtils.wrapException(makePractitionerResource::getPractitioner)) + .toList(); + + Organization organization = + makeOrganisationResource.getOrganization(invoiceBundleRequest.getOrganisation()); + + Encounter encounter = + makeEncounterResource.getEncounter( + patient, + invoiceBundleRequest.getEncounter() != null + ? invoiceBundleRequest.getEncounter() + : null, + invoiceBundleRequest.getInvoiceDate()); + + List manufactureList = new ArrayList<>(); + List deviceList = new ArrayList<>(); + List substanceList = new ArrayList<>(); + List medicationList = new ArrayList<>(); + + List chargeItemList = + Optional.ofNullable(invoiceBundleRequest.getChargeItems()) + .orElse(Collections.emptyList()) + .stream() + .map( + item -> { + try { + return generateProductAndChargeItem( + item, + deviceList, + substanceList, + medicationList, + manufactureList, + invoiceBundleRequest); + } catch (ParseException e) { + throw new RuntimeException(e); + } + }) + .toList(); + + Invoice invoice = + makeInvoiceResource.buildInvoice( + invoiceBundleRequest, chargeItemList, patient, organization); + + PaymentReconciliation paymentReconciliation = null; + if (Objects.nonNull(invoiceBundleRequest.getPayment())) { + paymentReconciliation = + makeInvoicePaymentResource.buildInvoicePayment(invoiceBundleRequest); + } + + Composition composition = + makeInvoiceComposition.makeCompositionResource( + patient, + practitionerList, + organization, + invoice, + chargeItemList, + deviceList, + substanceList, + medicationList, + paymentReconciliation); + + List entries = new ArrayList<>(); + + addEntry(entries, BundleResourceIdentifier.COMPOSITION, composition); + addEntry(entries, BundleResourceIdentifier.PATIENT, patient); + practitionerList.forEach( + practitioner -> addEntry(entries, BundleResourceIdentifier.PRACTITIONER, practitioner)); + if (organization != null) + addEntry(entries, BundleResourceIdentifier.ORGANISATION, organization); + if (encounter != null) addEntry(entries, BundleResourceIdentifier.ENCOUNTER, encounter); + manufactureList.forEach( + manufacturer -> addEntry(entries, BundleResourceIdentifier.MANUFACTURER, manufacturer)); + addEntry(entries, BundleResourceIdentifier.INVOICE, invoice); + + chargeItemList.forEach( + chargeItem -> addEntry(entries, BundleResourceIdentifier.CHARGE_ITEM, chargeItem)); + deviceList.forEach(device -> addEntry(entries, BundleResourceIdentifier.DEVICE, device)); + substanceList.forEach( + substance -> addEntry(entries, BundleResourceIdentifier.SUBSTANCE, substance)); + medicationList.forEach( + medication -> addEntry(entries, BundleResourceIdentifier.MEDICATION, medication)); + if (paymentReconciliation != null) { + addEntry( + entries, + BundleResourceIdentifier.INVOICE_PAYMENT_RECONCILIATION, + paymentReconciliation); + } + + bundle.setEntry(entries); + + return BundleResponse.builder().bundle(bundle).build(); + + } catch (Exception e) { + if (e instanceof InvalidDataAccessResourceUsageException) { + log.error(e.getMessage()); + return BundleResponse.builder() + .error( + new ErrorResponse( + ErrorCode.DB_ERROR, + " JDBCException Generic SQL Related Error, kindly check logs.")) + .build(); + } + return BundleResponse.builder() + .error(ErrorResponse.builder().code("1000").message(e.getMessage()).build()) + .build(); + } + } + + private void addEntry( + List entries, String resourceType, Resource resource) { + entries.add( + new Bundle.BundleEntryComponent() + .setFullUrl(resourceType + "/" + resource.getId()) + .setResource(resource)); + } + + private ChargeItem generateProductAndChargeItem( + ChargeItemResource item, + List deviceList, + List substanceList, + List medicationList, + List manufactureList, + InvoiceBundleRequest invoiceBundleRequest) + throws ParseException { + if (item.getProductType().getValue().equalsIgnoreCase(BundleResourceIdentifier.DEVICE)) { + Device device = makeInvoiceDeviceResource.getDevice(item.getDevice()); + deviceList.add(device); + return makeChargeItemResource.getChargeItems(item, device.getId()); + } else if (item.getProductType() + .getValue() + .equalsIgnoreCase(BundleResourceIdentifier.SUBSTANCE)) { + Substance substance = makeInvoiceSubstanceResource.getSubstance(item.getSubstance()); + substanceList.add(substance); + return makeChargeItemResource.getChargeItems(item, substance.getId()); + } else if (item.getProductType() + .getValue() + .equalsIgnoreCase(BundleResourceIdentifier.MEDICATION)) { + Organization manufacturer = new Organization(); + if (Objects.nonNull(item.getMedication().getManufacturer())) { + manufacturer = + makeOrganisationResource.getOrganization( + OrganisationResource.builder() + .facilityName(item.getMedication().getManufacturer()) + .build()); + manufactureList.add(manufacturer); + } + Medication medication = + makeInvoiceMedicationResource.getMedication(item.getMedication(), manufacturer); + medicationList.add(medication); + return makeChargeItemResource.getChargeItems(item, medication.getId()); + } else { + throw new IllegalArgumentException("Unknown product type: " + item.getProductType()); + } + } +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java similarity index 99% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java index 7ccc8e39..5e40ee4e 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/OPConsultationConverter.java @@ -455,12 +455,10 @@ private List makeMedicalHistoryList( private List makeAllergiesList( Patient patient, List practitionerList, - OPConsultationRequest opConsultationRequest) - throws ParseException { - return Optional.ofNullable(opConsultationRequest.getAllergies()) - .orElse(Collections.emptyList()) - .stream() - .filter(allergy -> allergy.isBlank() && allergy.isEmpty()) + OPConsultationRequest opConsultationRequest) { + + return Optional.ofNullable(opConsultationRequest.getAllergies()).orElse(List.of()).stream() + .filter(allergy -> allergy != null && !allergy.isBlank()) .map( StreamUtils.wrapException( allergy -> diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/PrescriptionConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/PrescriptionConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/PrescriptionConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/PrescriptionConverter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/WellnessRecordConverter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/WellnessRecordConverter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/WellnessRecordConverter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/converter/WellnessRecordConverter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java similarity index 93% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java index 5e7816ae..d6a3cfd9 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/config/DbLoader.java @@ -102,6 +102,8 @@ private TypeReference getTypeReference(String entityName) { case "SnomedObservation" -> new TypeReference>() {}; case "SnomedSpecimen" -> new TypeReference>() {}; case "SnomedVaccine" -> new TypeReference>() {}; + case "TypeChargeItem" -> new TypeReference>() {}; + case "TypeInvoice" -> new TypeReference>() {}; default -> throw new IllegalArgumentException("Unknown entity name: " + entityName); }; } @@ -129,6 +131,10 @@ public void addIndexesTransactional(String entityName) { "CREATE INDEX " + indexName + " ON " + tableName + " (\"code\", \"display\");"; case "SnomedVaccine" -> "CREATE INDEX " + indexName + " ON " + tableName + " (\"code\", \"display\");"; + case "TypeChargeItem" -> + "CREATE INDEX " + indexName + " ON " + tableName + " (\"code\", \"display\");"; + case "TypeInvoice" -> + "CREATE INDEX " + indexName + " ON " + tableName + " (\"code\", \"display\");"; default -> null; }; diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedConditionProcedureRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedConditionProcedureRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedConditionProcedureRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedConditionProcedureRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedDiagnosticRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedDiagnosticRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedDiagnosticRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedDiagnosticRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedEncounterRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedEncounterRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedEncounterRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedEncounterRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRouteRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRouteRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRouteRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedMedicineRouteRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedObservationRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedObservationRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedObservationRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedObservationRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedSpecimenRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedSpecimenRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedSpecimenRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedSpecimenRepo.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedVaccineRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedVaccineRepo.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedVaccineRepo.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/SnomedVaccineRepo.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeChargeItemRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeChargeItemRepo.java new file mode 100644 index 00000000..1a8a356b --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeChargeItemRepo.java @@ -0,0 +1,18 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.database.h2.repositories; + +import com.nha.abdm.fhir.mapper.rest.database.h2.tables.TypeChargeItem; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface TypeChargeItemRepo extends JpaRepository { + @Query( + value = + "SELECT * FROM \"type_charge_item\" sp WHERE sp.\"display\" ILIKE CONCAT('%', :display, '%') LIMIT 20", + nativeQuery = true) + List findByDisplay(@Param("display") String display); +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeInvoiceRepo.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeInvoiceRepo.java new file mode 100644 index 00000000..8bc3272c --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/repositories/TypeInvoiceRepo.java @@ -0,0 +1,18 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.database.h2.repositories; + +import com.nha.abdm.fhir.mapper.rest.database.h2.tables.TypeInvoice; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface TypeInvoiceRepo extends JpaRepository { + @Query( + value = + "SELECT * FROM \"type_invoice\" sp WHERE sp.\"display\" ILIKE CONCAT('%', :display, '%') LIMIT 20", + nativeQuery = true) + List findByDisplay(@Param("display") String display); +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/Displayable.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/Displayable.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/Displayable.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/Displayable.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/SnomedService.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/SnomedService.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/SnomedService.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/services/SnomedService.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedConditionProcedure.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedConditionProcedure.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedConditionProcedure.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedConditionProcedure.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedDiagnostic.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedDiagnostic.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedDiagnostic.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedDiagnostic.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedEncounter.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedEncounter.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedEncounter.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedEncounter.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicine.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicine.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicine.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicine.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicineRoute.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicineRoute.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicineRoute.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedMedicineRoute.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedObservation.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedObservation.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedObservation.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedObservation.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedSpecimen.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedSpecimen.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedSpecimen.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedSpecimen.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedVaccine.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedVaccine.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedVaccine.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/SnomedVaccine.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeChargeItem.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeChargeItem.java new file mode 100644 index 00000000..696a1f7e --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeChargeItem.java @@ -0,0 +1,26 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.database.h2.tables; + +import com.nha.abdm.fhir.mapper.rest.common.constants.TypeIdentifiers; +import com.nha.abdm.fhir.mapper.rest.database.h2.services.Displayable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "type_charge_item") +@Builder +public class TypeChargeItem implements Displayable { + @Id public String code; + + public String display; + + public final String type = TypeIdentifiers.TYPE_CHARGE_ITEM; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeInvoice.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeInvoice.java new file mode 100644 index 00000000..3d7e5060 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/database/h2/tables/TypeInvoice.java @@ -0,0 +1,26 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.database.h2.tables; + +import com.nha.abdm.fhir.mapper.rest.common.constants.TypeIdentifiers; +import com.nha.abdm.fhir.mapper.rest.database.h2.services.Displayable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "type_invoice") +@Builder +public class TypeInvoice implements Displayable { + @Id public String code; + + public String display; + + public final String type = TypeIdentifiers.TYPE_INVOICE; +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDiagnosticComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDiagnosticComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDiagnosticComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDiagnosticComposition.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDischargeComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDischargeComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDischargeComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeDischargeComposition.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeHealthDocumentComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeHealthDocumentComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeHealthDocumentComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeHealthDocumentComposition.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeImmunizationComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeImmunizationComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeImmunizationComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeImmunizationComposition.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeInvoiceComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeInvoiceComposition.java new file mode 100644 index 00000000..4ef92ea6 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeInvoiceComposition.java @@ -0,0 +1,136 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.compositions; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleCompositionIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleResourceIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleUrlIdentifier; +import java.text.ParseException; +import java.util.List; +import java.util.UUID; +import org.hl7.fhir.r4.model.*; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoiceComposition { + + public Composition makeCompositionResource( + Patient patient, + List practitionerList, + Organization organization, + Invoice invoice, + List chargeItemList, + List deviceList, + List substanceList, + List medicationList, + PaymentReconciliation paymentReconciliation) + throws ParseException { + + Composition composition = new Composition(); + + composition.setMeta( + new Meta().setVersionId("1").setLastUpdatedElement(Utils.getCurrentTimeStamp())); + + composition + .setType( + new CodeableConcept() + .addCoding( + new Coding() + .setSystem(BundleUrlIdentifier.SNOMED_URL) + .setCode(BundleCompositionIdentifier.INVOICE_RECORD) + .setDisplay(BundleCompositionIdentifier.INVOICE_RECORD))) + .setTitle(BundleCompositionIdentifier.INVOICE_RECORD); + + if (organization != null) { + composition.setCustodian(ref(BundleResourceIdentifier.ORGANISATION, organization.getId())); + } + + if (practitionerList != null && !practitionerList.isEmpty()) { + composition.setAuthor( + practitionerList.stream() + .map( + p -> + ref( + BundleResourceIdentifier.PRACTITIONER, + p.getId(), + p.getName().get(0).getText())) + .toList()); + } + + if (patient != null) { + composition.setSubject( + ref( + BundleResourceIdentifier.PATIENT, + patient.getId(), + patient.getName().get(0).getText())); + } + + if (invoice != null) { + composition.setDateElement(invoice.getDateElement()); + } + + Composition.SectionComponent invoiceSection = + new Composition.SectionComponent() + .setTitle(BundleResourceIdentifier.INVOICE) + .setCode( + new CodeableConcept() + .setText(BundleCompositionIdentifier.INVOICE_RECORD) + .addCoding( + new Coding() + .setCode(BundleCompositionIdentifier.INVOICE_RECORD) + .setDisplay(BundleCompositionIdentifier.INVOICE_RECORD) + .setSystem(BundleUrlIdentifier.SNOMED_URL))); + + if (invoice != null) { + invoiceSection.addEntry(ref(BundleResourceIdentifier.INVOICE, invoice.getId())); + } + + if (chargeItemList != null && !chargeItemList.isEmpty()) { + chargeItemList.forEach( + item -> invoiceSection.addEntry(ref(BundleResourceIdentifier.CHARGE_ITEM, item.getId()))); + } + + if (deviceList != null && !deviceList.isEmpty()) { + deviceList.forEach( + device -> invoiceSection.addEntry(ref(BundleResourceIdentifier.DEVICE, device.getId()))); + } + + if (substanceList != null && !substanceList.isEmpty()) { + substanceList.forEach( + substance -> + invoiceSection.addEntry(ref(BundleResourceIdentifier.SUBSTANCE, substance.getId()))); + } + + if (medicationList != null && !medicationList.isEmpty()) { + medicationList.forEach( + medication -> + invoiceSection.addEntry( + ref(BundleResourceIdentifier.MEDICATION, medication.getId()))); + } + + if (paymentReconciliation != null) { + invoiceSection.addEntry( + ref( + BundleResourceIdentifier.INVOICE_PAYMENT_RECONCILIATION, + paymentReconciliation.getId())); + } + + composition.addSection(invoiceSection); + + composition.setStatus(Composition.CompositionStatus.FINAL); + String compositionId = UUID.randomUUID().toString(); + composition.setIdentifier( + new Identifier().setSystem(BundleUrlIdentifier.WRAPPER_URL).setValue(compositionId)); + composition.setId(compositionId); + + return composition; + } + + private Reference ref(String resourceType, String id) { + return new Reference().setReference(resourceType + "/" + id).setType(resourceType); + } + + private Reference ref(String resourceType, String id, String display) { + return ref(resourceType, id).setDisplay(display); + } +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java similarity index 93% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java index 252510ad..b8646ab2 100644 --- a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeOpComposition.java @@ -111,7 +111,7 @@ private List makeCompositionSection( List otherObservationList, List documentReferenceList) { List sectionComponentList = new ArrayList<>(); - if (Objects.nonNull(chiefComplaintList)) { + if (chiefComplaintList != null && !chiefComplaintList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -129,7 +129,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(physicalObservationList)) { + if (Objects.nonNull(physicalObservationList) && !physicalObservationList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -149,7 +149,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(allergieList)) { + if (Objects.nonNull(allergieList) && !allergieList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -169,7 +169,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(medicalHistoryList)) { + if (Objects.nonNull(medicalHistoryList) && !medicalHistoryList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -187,7 +187,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(familyMemberHistoryList)) { + if (Objects.nonNull(familyMemberHistoryList) && !familyMemberHistoryList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -205,7 +205,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(investigationAdviceList)) { + if (Objects.nonNull(investigationAdviceList) && !investigationAdviceList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -223,7 +223,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(medicationList)) { + if (Objects.nonNull(medicationList) && !medicationList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -236,11 +236,12 @@ private List makeCompositionSection( for (MedicationRequest medication : medicationList) { sectionComponent.addEntry( new Reference() - .setReference(BundleResourceIdentifier.FAMILY_HISTORY + "/" + medication.getId())); + .setReference( + BundleResourceIdentifier.MEDICATION_REQUEST + "/" + medication.getId())); } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(followupList)) { + if (Objects.nonNull(followupList) && !followupList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -257,7 +258,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(procedureList)) { + if (Objects.nonNull(procedureList) && !procedureList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -274,7 +275,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(referralList)) { + if (Objects.nonNull(referralList) && !referralList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -291,7 +292,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(otherObservationList)) { + if (Objects.nonNull(otherObservationList) && !otherObservationList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() @@ -309,7 +310,7 @@ private List makeCompositionSection( } sectionComponentList.add(sectionComponent); } - if (Objects.nonNull(documentReferenceList)) { + if (Objects.nonNull(documentReferenceList) && !documentReferenceList.isEmpty()) { Composition.SectionComponent sectionComponent = new Composition.SectionComponent(); sectionComponent.setCode( new CodeableConcept() diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakePrescriptionComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakePrescriptionComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakePrescriptionComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakePrescriptionComposition.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeWellnessComposition.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeWellnessComposition.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeWellnessComposition.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/compositions/MakeWellnessComposition.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeAllergyToleranceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeAllergyToleranceResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeAllergyToleranceResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeAllergyToleranceResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeBundleMetaResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeBundleMetaResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeBundleMetaResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeBundleMetaResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeCarePlanResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeCarePlanResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeCarePlanResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeCarePlanResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeConditionResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeConditionResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeConditionResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeConditionResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDiagnosticLabResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDiagnosticLabResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDiagnosticLabResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDiagnosticLabResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDocumentResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDocumentResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDocumentResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeDocumentResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeEncounterResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeEncounterResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeEncounterResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeEncounterResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeFamilyMemberResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeFamilyMemberResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeFamilyMemberResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeFamilyMemberResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeImmunizationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeImmunizationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeImmunizationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeImmunizationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeMedicationRequestResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeMedicationRequestResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeMedicationRequestResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeMedicationRequestResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeObservationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeObservationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeObservationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeObservationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeOrganisationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeOrganisationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeOrganisationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeOrganisationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePatientResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePatientResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePatientResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePatientResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePractitionerResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePractitionerResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePractitionerResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakePractitionerResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeProcedureResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeProcedureResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeProcedureResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeProcedureResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeServiceRequestResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeServiceRequestResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeServiceRequestResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeServiceRequestResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeWellnessObservationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeWellnessObservationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeWellnessObservationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/MakeWellnessObservationResource.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeChargeItemResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeChargeItemResource.java new file mode 100644 index 00000000..2d344d85 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeChargeItemResource.java @@ -0,0 +1,82 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleResourceIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.ResourceProfileIdentifier; +import com.nha.abdm.fhir.mapper.rest.database.h2.repositories.TypeChargeItemRepo; +import com.nha.abdm.fhir.mapper.rest.database.h2.tables.TypeChargeItem; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.ChargeItemResource; +import java.util.Objects; +import java.util.UUID; +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MakeChargeItemResource { + @Autowired private TypeChargeItemRepo typeChargeItemRepo; + + public ChargeItem getChargeItems(ChargeItemResource resource, String baseUrl) { + if (resource == null) { + return null; + } + + ChargeItem chargeItem = new ChargeItem(); + + if (StringUtils.isNotBlank(resource.getId())) { + chargeItem.setId(resource.getId()); + } else { + chargeItem.setId(UUID.randomUUID().toString()); + } + + if (StringUtils.isNotBlank(resource.getStatus().getValue())) { + try { + chargeItem.setStatus( + ChargeItem.ChargeItemStatus.valueOf(resource.getStatus().getValue().toUpperCase())); + } catch (IllegalArgumentException e) { + chargeItem.setStatus(ChargeItem.ChargeItemStatus.NULL); + } + } + + if (StringUtils.isNotBlank(resource.getProductType().getValue())) { + chargeItem.addIdentifier(new Identifier().setValue(resource.getProductType().getValue())); + } + + if (StringUtils.isNotBlank(resource.getChargeType())) { + CodeableConcept codeConcept = new CodeableConcept().setText(resource.getChargeType()); + + TypeChargeItem typeChargeItem = + typeChargeItemRepo.findByDisplay(resource.getChargeType()).stream() + .findFirst() + .orElse(null); + + if (typeChargeItem != null) { + codeConcept.addCoding( + new Coding() + .setCode(typeChargeItem.getCode()) + .setSystem(ResourceProfileIdentifier.PROFILE_CHARGE_ITEM_BILLING_CODES) + .setDisplay(typeChargeItem.getDisplay())); + } + chargeItem.setCode(codeConcept); + } + + if (StringUtils.isNotBlank(resource.getDescription())) { + chargeItem.addNote(new Annotation().setText(resource.getDescription())); + } + + if (resource.getQuantity() != null && resource.getQuantity() > 0) { + chargeItem.setQuantity(new Quantity().setValue(resource.getQuantity()).setUnit("pcs")); + } + + if (Objects.nonNull(resource.getMedication())) { + chargeItem.setProduct(new Reference(BundleResourceIdentifier.MEDICATION + "/" + baseUrl)); + } else if (Objects.nonNull(resource.getDevice())) { + chargeItem.setProduct(new Reference(BundleResourceIdentifier.DEVICE + "/" + baseUrl)); + } else if (Objects.nonNull(resource.getSubstance())) { + chargeItem.setProduct(new Reference(BundleResourceIdentifier.SUBSTANCE + "/" + baseUrl)); + } + + return chargeItem; + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceDeviceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceDeviceResource.java new file mode 100644 index 00000000..87049631 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceDeviceResource.java @@ -0,0 +1,97 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoiceDeviceResource; +import java.text.ParseException; +import java.util.List; +import java.util.UUID; +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.Annotation; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Device; +import org.hl7.fhir.r4.model.Identifier; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoiceDeviceResource { + + public Device getDevice(InvoiceDeviceResource deviceResource) throws ParseException { + if (deviceResource == null) { + return null; + } + + Device device = new Device(); + + device.setId( + StringUtils.isNotBlank(deviceResource.getUdiCarrier()) + ? deviceResource.getUdiCarrier() + : UUID.randomUUID().toString()); + + if (StringUtils.isNotBlank(deviceResource.getDeviceName())) { + device.setDeviceName( + List.of( + new Device.DeviceDeviceNameComponent() + .setName(deviceResource.getDeviceName()) + .setType(Device.DeviceNameType.USERFRIENDLYNAME))); + } + + if (StringUtils.isNotBlank(deviceResource.getUdiCarrier())) { + device.setUdiCarrier( + List.of( + new Device.DeviceUdiCarrierComponent() + .setDeviceIdentifier(deviceResource.getUdiCarrier()))); + } + + if (StringUtils.isNotBlank(deviceResource.getManufacturer())) { + device.setManufacturer(deviceResource.getManufacturer()); + } + + if (StringUtils.isNotBlank(deviceResource.getSerialNumber())) { + device.setSerialNumber(deviceResource.getSerialNumber()); + } + if (StringUtils.isNotBlank(deviceResource.getLotNumber())) { + device.setLotNumber(deviceResource.getLotNumber()); + } + if (StringUtils.isNotBlank(deviceResource.getModelNumber())) { + device.setModelNumber(deviceResource.getModelNumber()); + } + + if (StringUtils.isNotBlank(deviceResource.getType())) { + device.setType(new CodeableConcept().setText(deviceResource.getType())); + } + + device.setManufactureDate(Utils.getFormattedDate(deviceResource.getManufactureDate())); + device.setExpirationDate(Utils.getFormattedDate(deviceResource.getExpirationDate())); + + if (StringUtils.isNotBlank(deviceResource.getStatus().getValue())) { + try { + device.setStatus(Device.FHIRDeviceStatus.fromCode(deviceResource.getStatus().getValue())); + } catch (Exception e) { + device.setStatus(Device.FHIRDeviceStatus.UNKNOWN); + } + } + + if (deviceResource.getSafety() != null && !deviceResource.getSafety().isEmpty()) { + List safetyConcepts = + deviceResource.getSafety().stream() + .filter(StringUtils::isNotBlank) + .map(s -> new CodeableConcept().setText(s)) + .toList(); + device.setSafety(safetyConcepts); + } + + if (StringUtils.isNotBlank(deviceResource.getNote())) { + device.setNote(List.of(new Annotation().setText(deviceResource.getNote()))); + } + + return device; + } + + /** Helper to safely add identifiers */ + private void addIdentifierIfPresent(Device device, String system, String value) { + if (StringUtils.isNotBlank(value)) { + device.addIdentifier(new Identifier().setSystem(system).setValue(value)); + } + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceMedicationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceMedicationResource.java new file mode 100644 index 00000000..9084b918 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceMedicationResource.java @@ -0,0 +1,62 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleResourceIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleUrlIdentifier; +import com.nha.abdm.fhir.mapper.rest.database.h2.services.SnomedService; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoiceMedicationResource; +import java.text.ParseException; +import java.util.Collections; +import java.util.UUID; +import lombok.extern.slf4j.Slf4j; +import org.hl7.fhir.r4.model.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class MakeInvoiceMedicationResource { + @Autowired SnomedService snomedService; + + public Medication getMedication( + InvoiceMedicationResource medicationResource, Organization manufacturer) + throws ParseException { + + Medication medication = new Medication(); + medication.setId(UUID.randomUUID().toString()); + medication.setMeta( + new Meta().setVersionId("1").setLastUpdatedElement(Utils.getCurrentTimeStamp())); + + medication.setCode( + createCodeableConcept( + snomedService.getSnomedMedicineCode(medicationResource.getMedicineName()).getCode(), + medicationResource.getMedicineName())); + + medication.setForm( + createCodeableConcept( + snomedService + .getSnomedMedicineRouteCode(medicationResource.getMedicationForm()) + .getCode(), + medicationResource.getMedicationForm())); + + medication.setManufacturer( + new Reference() + .setReference(BundleResourceIdentifier.MANUFACTURER + "/" + manufacturer.getId())); + + medication.setBatch( + new Medication.MedicationBatchComponent() + .setLotNumber(medicationResource.getLotNumber()) + .setExpirationDate(Utils.getFormattedDate(medicationResource.getExpiryDate()))); + + return medication; + } + + /** Utility method to create CodeableConcept with SNOMED coding. */ + private CodeableConcept createCodeableConcept(String code, String display) { + return new CodeableConcept() + .setCoding( + Collections.singletonList(new Coding(BundleUrlIdentifier.SNOMED_URL, code, display))) + .setText(display); + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePaymentResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePaymentResource.java new file mode 100644 index 00000000..9aeaa151 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePaymentResource.java @@ -0,0 +1,63 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.common.constants.ResourceProfileIdentifier; +import com.nha.abdm.fhir.mapper.rest.requests.InvoiceBundleRequest; +import java.text.ParseException; +import java.util.UUID; +import org.hl7.fhir.r4.model.*; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoicePaymentResource { + public PaymentReconciliation buildInvoicePayment(InvoiceBundleRequest invoiceBundleRequest) + throws ParseException { + + if (invoiceBundleRequest == null || invoiceBundleRequest.getPayment() == null) { + return null; + } + + var paymentReq = invoiceBundleRequest.getPayment(); + var invoiceReq = invoiceBundleRequest.getInvoice(); + + PaymentReconciliation paymentReconciliation = new PaymentReconciliation(); + paymentReconciliation.setId(UUID.randomUUID().toString()); + + if (paymentReq.getStatus() != null) { + paymentReconciliation.setStatus( + PaymentReconciliation.PaymentReconciliationStatus.fromCode( + paymentReq.getStatus().getValue())); + } + + if (paymentReq.getPaymentDate() != null) { + paymentReconciliation.setPaymentDate(Utils.getFormattedDate(paymentReq.getPaymentDate())); + } + + if (paymentReq.getPaidAmount() != null && paymentReq.getPaidAmount().doubleValue() > 0) { + paymentReconciliation.setPaymentAmount( + new Money() + .setValue(paymentReq.getPaidAmount()) + .setCurrency(invoiceReq != null ? invoiceReq.getCurrency() : "INR")); + } + + if (paymentReq.getTransactionId() != null && !paymentReq.getTransactionId().isBlank()) { + paymentReconciliation.setPaymentIdentifier( + new Identifier().setValue(paymentReq.getTransactionId())); + } + if (paymentReq.getMethod() != null && !paymentReq.getMethod().isBlank()) { + PaymentReconciliation.DetailsComponent detail = new PaymentReconciliation.DetailsComponent(); + detail.setType( + new CodeableConcept() + .addCoding( + new Coding() + .setSystem(ResourceProfileIdentifier.PROFILE_INVOICE_PAYMENT_TYPE) + .setCode(paymentReq.getMethod()) + .setDisplay(paymentReq.getMethod()))); + + paymentReconciliation.addDetail(detail); + } + + return paymentReconciliation; + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePriceComponent.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePriceComponent.java new file mode 100644 index 00000000..97385703 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoicePriceComponent.java @@ -0,0 +1,72 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.rest.common.constants.ResourceProfileIdentifier; +import com.nha.abdm.fhir.mapper.rest.requests.InvoiceBundleRequest; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.ChargeItemResource; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoicePrice; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; +import org.hl7.fhir.r4.model.*; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoicePriceComponent { + + public List makeInvoicePriceComponents( + ChargeItemResource chargeItemResource, InvoiceBundleRequest invoiceBundleRequest) { + + if (chargeItemResource == null + || chargeItemResource.getPrice() == null + || chargeItemResource.getPrice().isEmpty() + || invoiceBundleRequest == null + || invoiceBundleRequest.getInvoice() == null + || invoiceBundleRequest.getInvoice().getCurrency() == null) { + return List.of(); + } + + String currency = invoiceBundleRequest.getInvoice().getCurrency(); + + return chargeItemResource.getPrice().stream() + .filter(Objects::nonNull) + .map(price -> buildPriceComponent(price, currency)) + .toList(); + } + + private Invoice.InvoiceLineItemPriceComponentComponent buildPriceComponent( + InvoicePrice price, String currency) { + + Invoice.InvoiceLineItemPriceComponentComponent priceComponent = + new Invoice.InvoiceLineItemPriceComponentComponent(); + + Invoice.InvoicePriceComponentType type = Invoice.InvoicePriceComponentType.INFORMATIONAL; + if (price.getPriceType() != null && !price.getPriceType().getValue().isBlank()) { + try { + type = Invoice.InvoicePriceComponentType.fromCode(price.getPriceType().getValue()); + } catch (Exception ignored) { + + } + } + priceComponent.setType(type); + + if (price.getPriceType() != null && !price.getPriceType().getValue().isBlank()) { + CodeableConcept codeConcept = + new CodeableConcept() + .addCoding( + new Coding() + .setSystem(ResourceProfileIdentifier.PROFILE_PRICE_COMPONENT_TYPE) + .setCode(price.getPriceType().getCode()) + .setDisplay(price.getPriceType().getDisplay())) + .setText(price.getPriceType().getValue()); + priceComponent.setCode(codeConcept); + } + + if (Objects.nonNull(price.getAmount()) && price.getAmount() > 0) { + Money money = + new Money().setCurrency(currency).setValue(BigDecimal.valueOf(price.getAmount())); + priceComponent.setAmount(money); + } + return priceComponent; + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceResource.java new file mode 100644 index 00000000..09ce426b --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceResource.java @@ -0,0 +1,160 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.common.constants.BundleResourceIdentifier; +import com.nha.abdm.fhir.mapper.rest.common.constants.ResourceProfileIdentifier; +import com.nha.abdm.fhir.mapper.rest.database.h2.repositories.TypeInvoiceRepo; +import com.nha.abdm.fhir.mapper.rest.database.h2.tables.TypeInvoice; +import com.nha.abdm.fhir.mapper.rest.requests.InvoiceBundleRequest; +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoiceResource { + + private final MakeInvoicePriceComponent makeInvoicePriceComponent; + private final TypeInvoiceRepo typeInvoiceRepo; + + @Autowired + public MakeInvoiceResource( + MakeInvoicePriceComponent makeInvoicePriceComponent, TypeInvoiceRepo typeInvoiceRepo) { + this.makeInvoicePriceComponent = makeInvoicePriceComponent; + this.typeInvoiceRepo = typeInvoiceRepo; + } + + public Invoice buildInvoice( + InvoiceBundleRequest invoiceBundleRequest, + List chargeItems, + Patient patient, + Organization organisation) + throws ParseException { + + Invoice invoice = new Invoice(); + + if (invoiceBundleRequest.getInvoice() != null + && StringUtils.isNotBlank(invoiceBundleRequest.getInvoice().getId())) { + invoice.setId(invoiceBundleRequest.getInvoice().getId()); + } else { + invoice.setId(UUID.randomUUID().toString()); + } + + if (StringUtils.isNotBlank(invoiceBundleRequest.getStatus().getValue())) { + invoice.setStatus( + Invoice.InvoiceStatus.fromCode(invoiceBundleRequest.getStatus().getValue())); + } + + if (StringUtils.isNotBlank(invoiceBundleRequest.getInvoiceDate())) { + invoice.setDate(Utils.getFormattedDate(invoiceBundleRequest.getInvoiceDate())); + } + + if (patient != null && patient.hasId()) { + Reference patientRef = + new Reference(BundleResourceIdentifier.PATIENT + "/" + patient.getId()); + if (patient.hasName() && patient.getNameFirstRep().hasText()) { + patientRef.setDisplay(patient.getNameFirstRep().getText()); + } + invoice.setSubject(patientRef); + } + + if (organisation != null && organisation.hasId()) { + Reference orgRef = + new Reference(BundleResourceIdentifier.ORGANISATION + "/" + organisation.getId()); + if (StringUtils.isNotBlank(organisation.getName())) { + orgRef.setDisplay(organisation.getName()); + } + invoice.setIssuer(orgRef); + } + + if (invoiceBundleRequest.getInvoice() != null + && StringUtils.isNotBlank(invoiceBundleRequest.getInvoice().getType())) { + CodeableConcept codeConcept = new CodeableConcept(); + codeConcept.setText(invoiceBundleRequest.getInvoice().getType()); + + TypeInvoice typeInvoice = + typeInvoiceRepo.findByDisplay(invoiceBundleRequest.getInvoice().getType()).stream() + .findFirst() + .orElse(null); + + if (typeInvoice != null && StringUtils.isNotBlank(typeInvoice.getCode())) { + codeConcept.addCoding( + new Coding() + .setCode(typeInvoice.getCode()) + .setSystem(ResourceProfileIdentifier.PROFILE_CHARGE_ITEM_BILLING_CODES) + .setDisplay(typeInvoice.getDisplay())); + } + invoice.setType(codeConcept); + } + + if (invoiceBundleRequest.getInvoice() != null + && StringUtils.isNotBlank(invoiceBundleRequest.getInvoice().getPaymentTerms())) { + invoice.setPaymentTerms(invoiceBundleRequest.getInvoice().getPaymentTerms()); + } + + Map chargeItemMap = + chargeItems == null + ? Collections.emptyMap() + : chargeItems.stream() + .filter(Objects::nonNull) + .filter( + item -> + item.getIdElement() != null + && StringUtils.isNotBlank(item.getIdElement().getIdPart())) + .collect(Collectors.toMap(item -> item.getIdElement().getIdPart(), item -> item)); + + List lineItems = + invoiceBundleRequest.getChargeItems() == null + ? List.of() + : invoiceBundleRequest.getChargeItems().stream() + .filter(Objects::nonNull) + .filter( + item -> + StringUtils.isNotBlank(item.getId()) + && chargeItemMap.containsKey(item.getId())) + .map( + item -> { + Invoice.InvoiceLineItemComponent lineItem = + new Invoice.InvoiceLineItemComponent(); + lineItem.setChargeItem( + new Reference(BundleResourceIdentifier.CHARGE_ITEM + "/" + item.getId())); + makeInvoicePriceComponent + .makeInvoicePriceComponents(item, invoiceBundleRequest) + .forEach(lineItem::addPriceComponent); + return lineItem; + }) + .toList(); + + if (!lineItems.isEmpty()) { + invoice.setLineItem(lineItems); + } + + if (invoiceBundleRequest.getInvoice() != null) { + if (invoiceBundleRequest.getInvoice().getTotalGross() != null) { + invoice.setTotalGross( + new Money() + .setValue(invoiceBundleRequest.getInvoice().getTotalGross()) + .setCurrency(invoiceBundleRequest.getInvoice().getCurrency())); + } + + if (invoiceBundleRequest.getInvoice().getTotalNet() != null) { + invoice.setTotalNet( + new Money() + .setValue(invoiceBundleRequest.getInvoice().getTotalNet()) + .setCurrency(invoiceBundleRequest.getInvoice().getCurrency())); + } + + if (StringUtils.isNotBlank(invoiceBundleRequest.getInvoice().getNote())) { + invoice.setNote( + Collections.singletonList( + new Annotation().setText(invoiceBundleRequest.getInvoice().getNote()))); + } + } + + return invoice; + } +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceSubstanceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceSubstanceResource.java new file mode 100644 index 00000000..6fca2ca2 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/dto/resources/invoice/MakeInvoiceSubstanceResource.java @@ -0,0 +1,54 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.dto.resources.invoice; + +import com.nha.abdm.fhir.mapper.Utils; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoiceSubstanceResource; +import java.text.ParseException; +import java.util.Collections; +import java.util.UUID; +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Quantity; +import org.hl7.fhir.r4.model.Substance; +import org.springframework.stereotype.Service; + +@Service +public class MakeInvoiceSubstanceResource { + + public Substance getSubstance(InvoiceSubstanceResource substanceResource) throws ParseException { + Substance substance = new Substance(); + + String id = StringUtils.defaultIfBlank(substanceResource.getId(), UUID.randomUUID().toString()); + substance.setId(id); + + if (StringUtils.isNotBlank(substanceResource.getCode())) { + substance.setCode(new CodeableConcept().setText(substanceResource.getCode())); + } + + if (StringUtils.isNotBlank(substanceResource.getDescription())) { + substance.setDescription(substanceResource.getDescription()); + } + + if (StringUtils.isNotBlank(substanceResource.getCategory())) { + substance.setCategory( + Collections.singletonList( + new CodeableConcept().setText(substanceResource.getCategory()))); + } + + Substance.SubstanceInstanceComponent instance = new Substance.SubstanceInstanceComponent(); + + if (substanceResource.getQuantity() > 0) { + instance.setQuantity(new Quantity().setValue(substanceResource.getQuantity())); + } + + if (StringUtils.isNotBlank(substanceResource.getExpiry())) { + instance.setExpiry(Utils.getFormattedDate(substanceResource.getExpiry())); + } + + if (instance.hasQuantity() || instance.hasExpiry()) { + substance.setInstance(Collections.singletonList(instance)); + } + + return substance; + } +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/GlobalExceptionHandler.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/GlobalExceptionHandler.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/GlobalExceptionHandler.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/GlobalExceptionHandler.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFields.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFields.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFields.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFields.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFieldsValidator.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFieldsValidator.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFieldsValidator.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/NotBlankFieldsValidator.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/StreamUtils.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/StreamUtils.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/StreamUtils.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/exceptions/StreamUtils.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DiagnosticReportRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DiagnosticReportRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DiagnosticReportRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DiagnosticReportRequest.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DischargeSummaryRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DischargeSummaryRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DischargeSummaryRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/DischargeSummaryRequest.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/HealthDocumentRecord.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/HealthDocumentRecord.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/HealthDocumentRecord.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/HealthDocumentRecord.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/ImmunizationRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/ImmunizationRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/ImmunizationRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/ImmunizationRequest.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/InvoiceBundleRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/InvoiceBundleRequest.java new file mode 100644 index 00000000..0a27dfcb --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/InvoiceBundleRequest.java @@ -0,0 +1,57 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests; + +import com.nha.abdm.fhir.mapper.rest.common.constants.InvoiceStatus; +import com.nha.abdm.fhir.mapper.rest.common.helpers.OrganisationResource; +import com.nha.abdm.fhir.mapper.rest.common.helpers.PatientResource; +import com.nha.abdm.fhir.mapper.rest.common.helpers.PractitionerResource; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.ChargeItemResource; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoicePaymentResource; +import com.nha.abdm.fhir.mapper.rest.requests.helpers.InvoiceResource; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceBundleRequest { + @Pattern(regexp = "Invoice") + @NotBlank(message = "BundleType is mandatory and must not be empty : 'Invoice'") + private String bundleType; + + @NotBlank(message = "careContextReference is mandatory and must not be empty") + private String careContextReference; + + @Pattern( + regexp = "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)?$", + message = "Value must match either yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ss.SSSZ") + @NotNull(message = "authoredOn is mandatory timestamp") private String invoiceDate; + + private String encounter; + + @Valid + @NotNull(message = "Patient demographic details are mandatory and must not be empty") private PatientResource patient; + + @Valid + @NotNull(message = "practitioners are mandatory and must not be empty") private List practitioners; + + @Valid + @NotNull(message = "organisation is mandatory") private OrganisationResource organisation; + + @NotNull(message = "invoice is mandatory") private InvoiceResource invoice; + + @NotNull(message = "status is mandatory") private InvoiceStatus status; + + @Valid + @NotNull(message = "chargeItems are mandatory and must not be empty") private List chargeItems; + + @Valid private InvoicePaymentResource payment; +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/OPConsultationRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/OPConsultationRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/OPConsultationRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/OPConsultationRequest.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/PrescriptionRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/PrescriptionRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/PrescriptionRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/PrescriptionRequest.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/WellnessRecordRequest.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/WellnessRecordRequest.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/WellnessRecordRequest.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/WellnessRecordRequest.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/CarePlanResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/CarePlanResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/CarePlanResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/CarePlanResource.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChargeItemResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChargeItemResource.java new file mode 100644 index 00000000..af8dd7c2 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChargeItemResource.java @@ -0,0 +1,33 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import com.nha.abdm.fhir.mapper.rest.common.constants.ChargeItemStatus; +import com.nha.abdm.fhir.mapper.rest.common.constants.InvoiceProductType; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ChargeItemResource { + private String id; + + @NotNull(message = "productType is mandatory and must not be empty") private InvoiceProductType productType; + + private String chargeType; + private ChargeItemStatus status; + private String description; + + @NotNull(message = "chargeItem quantity is mandatory and must not be empty") private Integer quantity; + + @Valid private List price; + @Valid private InvoiceMedicationResource medication; + @Valid private InvoiceDeviceResource device; + @Valid private InvoiceSubstanceResource substance; +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChiefComplaintResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChiefComplaintResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChiefComplaintResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ChiefComplaintResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticPresentedForm.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticPresentedForm.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticPresentedForm.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticPresentedForm.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/DiagnosticResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FamilyObservationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FamilyObservationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FamilyObservationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FamilyObservationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FollowupResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FollowupResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FollowupResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/FollowupResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ImmunizationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ImmunizationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ImmunizationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ImmunizationResource.java diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceDeviceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceDeviceResource.java new file mode 100644 index 00000000..17ade7f7 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceDeviceResource.java @@ -0,0 +1,30 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import com.nha.abdm.fhir.mapper.rest.common.constants.DeviceStatus; +import jakarta.validation.constraints.NotNull; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceDeviceResource { + @NotNull(message = "deviceName is mandatory and must not be empty") private String deviceName; + + private String udiCarrier; + private String manufacturer; + private String lotNumber; + private String serialNumber; + private String modelNumber; + private String type; + private String manufactureDate; + private String expirationDate; + private DeviceStatus status; + private String note; + private List safety; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceMedicationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceMedicationResource.java new file mode 100644 index 00000000..95cff0db --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceMedicationResource.java @@ -0,0 +1,21 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceMedicationResource { + @NotNull(message = "medicineName is mandatory and must not be empty") private String medicineName; + + private String manufacturer; + private String medicationForm; + private String lotNumber; + private String expiryDate; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePaymentResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePaymentResource.java new file mode 100644 index 00000000..2c236668 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePaymentResource.java @@ -0,0 +1,27 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import com.nha.abdm.fhir.mapper.rest.common.constants.InvoicePaymentStatus; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoicePaymentResource { + @NotBlank(message = "method is mandatory and must not be empty") + private String method; + + private String paymentDate; + private InvoicePaymentStatus status; + + @NotNull(message = "paidAmount is mandatory and must not be empty") private BigDecimal paidAmount; + + private String transactionId; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePrice.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePrice.java new file mode 100644 index 00000000..f637c9f9 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoicePrice.java @@ -0,0 +1,19 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import com.nha.abdm.fhir.mapper.rest.common.constants.InvoicePriceType; +import com.nha.abdm.fhir.mapper.rest.exceptions.NotBlankFields; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@NotBlankFields +public class InvoicePrice { + private InvoicePriceType priceType; + private double amount; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceResource.java new file mode 100644 index 00000000..7542841c --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceResource.java @@ -0,0 +1,24 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceResource { + private String id; + private String status; + private String type; + private String date; + private BigDecimal totalNet; + private BigDecimal totalGross; + private String currency; + private String paymentTerms; + private String note; +} diff --git a/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceSubstanceResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceSubstanceResource.java new file mode 100644 index 00000000..374c5824 --- /dev/null +++ b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/InvoiceSubstanceResource.java @@ -0,0 +1,24 @@ +/* (C) 2025 */ +package com.nha.abdm.fhir.mapper.rest.requests.helpers; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceSubstanceResource { + private String id; + + @NotNull(message = "code is mandatory and must not be empty, ex: LAB-REAGENT-001") private String code; + + @NotNull(message = "category is mandatory and must not be empty, ex: Chemical") private String category; + + private String description; + private String expiry; + private double quantity; +} diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ObservationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ObservationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ObservationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ObservationResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/PrescriptionResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/PrescriptionResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/PrescriptionResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/PrescriptionResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ProcedureResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ProcedureResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ProcedureResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ProcedureResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ServiceRequestResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ServiceRequestResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ServiceRequestResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ServiceRequestResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ValueQuantityResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ValueQuantityResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ValueQuantityResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/ValueQuantityResource.java diff --git a/fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/WellnessObservationResource.java b/FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/WellnessObservationResource.java similarity index 100% rename from fhir-mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/WellnessObservationResource.java rename to FHIR-Mapper/src/main/java/com/nha/abdm/fhir/mapper/rest/requests/helpers/WellnessObservationResource.java diff --git a/fhir-mapper/src/main/resources/application.properties b/FHIR-Mapper/src/main/resources/application.properties similarity index 62% rename from fhir-mapper/src/main/resources/application.properties rename to FHIR-Mapper/src/main/resources/application.properties index 3fda537d..f1ab1d77 100644 --- a/fhir-mapper/src/main/resources/application.properties +++ b/FHIR-Mapper/src/main/resources/application.properties @@ -16,9 +16,9 @@ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.Ph # LOGGER -# You can disable the logs by commenting the below lines. +# You can enable the logs by commenting the below lines. logging.level.com.nha.abdm.wrapper=DEBUG -logging.level.org.springframework.web=DEBUG -logging.level.org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor=TRACE -logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor=TRACE -logging.level.org.springframework.web.HttpLogging=TRACE \ No newline at end of file +#logging.level.org.springframework.web=DEBUG +#logging.level.org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor=TRACE +#logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor=TRACE +#logging.level.org.springframework.web.HttpLogging=TRACE \ No newline at end of file diff --git a/fhir-mapper/src/main/resources/banner.txt b/FHIR-Mapper/src/main/resources/banner.txt similarity index 100% rename from fhir-mapper/src/main/resources/banner.txt rename to FHIR-Mapper/src/main/resources/banner.txt diff --git a/fhir-mapper/src/main/resources/snomed/SnomedConditionProcedure.json b/FHIR-Mapper/src/main/resources/snomed/SnomedConditionProcedure.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedConditionProcedure.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedConditionProcedure.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedDiagnostic.json b/FHIR-Mapper/src/main/resources/snomed/SnomedDiagnostic.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedDiagnostic.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedDiagnostic.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedEncounter.json b/FHIR-Mapper/src/main/resources/snomed/SnomedEncounter.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedEncounter.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedEncounter.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedMedicine.json b/FHIR-Mapper/src/main/resources/snomed/SnomedMedicine.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedMedicine.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedMedicine.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedMedicineRoute.json b/FHIR-Mapper/src/main/resources/snomed/SnomedMedicineRoute.json similarity index 99% rename from fhir-mapper/src/main/resources/snomed/SnomedMedicineRoute.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedMedicineRoute.json index 7757e521..b9b1f65b 100644 --- a/fhir-mapper/src/main/resources/snomed/SnomedMedicineRoute.json +++ b/FHIR-Mapper/src/main/resources/snomed/SnomedMedicineRoute.json @@ -90,6 +90,7 @@ { "code": "419021003", "display": "Tumour cavity route" }, { "code": "419165009", "display": "Paravertebral route (qualifier value)" }, { "code": "419231003", "display": "Intrasinal route (qualifier value)" }, + { "code": "385055001", "display": "Tablet" }, { "code": "419243002", "display": "Transcervical route (qualifier value)" diff --git a/fhir-mapper/src/main/resources/snomed/SnomedObservation.json b/FHIR-Mapper/src/main/resources/snomed/SnomedObservation.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedObservation.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedObservation.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedSpecimen.json b/FHIR-Mapper/src/main/resources/snomed/SnomedSpecimen.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedSpecimen.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedSpecimen.json diff --git a/fhir-mapper/src/main/resources/snomed/SnomedVaccine.json b/FHIR-Mapper/src/main/resources/snomed/SnomedVaccine.json similarity index 100% rename from fhir-mapper/src/main/resources/snomed/SnomedVaccine.json rename to FHIR-Mapper/src/main/resources/snomed/SnomedVaccine.json diff --git a/FHIR-Mapper/src/main/resources/snomed/TypeChargeItem.json b/FHIR-Mapper/src/main/resources/snomed/TypeChargeItem.json new file mode 100644 index 00000000..81b45e37 --- /dev/null +++ b/FHIR-Mapper/src/main/resources/snomed/TypeChargeItem.json @@ -0,0 +1,42 @@ +[ + { + "code" : "00", + "display" : "Consultation" + }, + { + "code" : "01", + "display" : "Pharmacy" + }, + { + "code" : "02", + "display" : "IPD" + }, + { + "code" : "03", + "display" : "OPD" + }, + { + "code" : "04", + "display" : "Pathology" + }, + { + "code" : "05", + "display" : "Medicines" + }, + { + "code" : "06", + "display" : "Nursing Charges" + }, + { + "code" : "07", + "display" : "Handling Charges" + }, + { + "code" : "08", + "display" : "Delivery Charges" + }, + { + "code" : "99", + "display" : "Others" + } +] \ No newline at end of file diff --git a/FHIR-Mapper/src/main/resources/snomed/TypeInvoice.json b/FHIR-Mapper/src/main/resources/snomed/TypeInvoice.json new file mode 100644 index 00000000..94212ce4 --- /dev/null +++ b/FHIR-Mapper/src/main/resources/snomed/TypeInvoice.json @@ -0,0 +1,22 @@ +[ + { + "code" : "00", + "display" : "Consultation" + }, + { + "code" : "01", + "display" : "Pharmacy" + }, + { + "code" : "02", + "display" : "IPD" + }, + { + "code" : "03", + "display" : "OPD" + }, + { + "code" : "99", + "display" : "Others" + } +] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 0ca3d792..cb35f25d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,12 +2,17 @@ version: '3.8' services: abdm-wrapper: - build: . - image: abdm-wrapper + build: + context: . + dockerfile: Dockerfile + image: abdm-wrapper:latest ports: - '8082:8082' depends_on: - mongodb + environment: + SPRING_DATA_MONGODB_HOST: mongodb + SPRING_DATA_MONGODB_PORT: 27017 networks: - docker_network extra_hosts: @@ -20,15 +25,16 @@ services: mongodb: image: mongodb/mongodb-community-server:latest + restart: always ports: - '27017:27017' volumes: - - mongodb_vol:/data/db + - mongodb_data:/data/db networks: - docker_network volumes: - mongodb_vol: + mongodb_data: networks: docker_network: diff --git a/fhir-mapper/postmanCollection/FHIR.postman_collection.json b/fhir-mapper/postmanCollection/FHIR.postman_collection.json deleted file mode 100644 index 3cb05d03..00000000 --- a/fhir-mapper/postmanCollection/FHIR.postman_collection.json +++ /dev/null @@ -1,318 +0,0 @@ -{ - "info": { - "_postman_id": "6192a23b-5635-4954-9ba9-903e46159dfd", - "name": "FHIR", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "24014718" - }, - "item": [ - { - "name": "prescription", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var template = `", - "", - "", - "", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " {{#each response.entry}}", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " {{/each}}", - "
IDTypeStatusDateSubjectAuthorTitle
{{resource.id}}{{resource.resourceType}}{{resource.status}}{{resource.date}}{{resource.subject.reference}}{{resource.author.[0].reference}}{{resource.title}}
", - "`;", - "", - "function constructVisualizerPayload() {", - " return { response: pm.response.json() };", - "}", - "", - "pm.visualizer.set(template, constructVisualizerPayload());" - ], - "type": "text/javascript", - "packages": {} - } - }, - { - "listen": "prerequest", - "script": { - "exec": [ - "" - ], - "type": "text/javascript", - "packages": {} - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\": \"PrescriptionRecord\",\r\n \"careContextReference\": \"visit-{{$isoTimestamp}}\",\r\n \"authoredOn\": \"2024-05-01T06:33:37.361Z\",\r\n \"encounter\": \"\",\r\n \"patient\": {\r\n \"name\": \"Venu Ajitesh\",\r\n \"patientReference\": \"ajitesh6x\",\r\n \"gender\": \"male\",\r\n \"birthDate\": \"1940-04-27\"\r\n },\r\n \"practitioners\": [\r\n {\r\n \"name\": \"Dr.Venu Ajitesh\",\r\n \"practitionerId\": \"Predator\"\r\n }\r\n ],\r\n \"organisation\": {\r\n \"facilityName\": \"Predator_HIP\",\r\n \"facilityId\": \"Predator_HIP\"\r\n },\r\n \"prescriptions\": [\r\n {\r\n \"medicine\": \"Glucosamine 1 g oral tablet\",\r\n \"dosage\": \"1-0-1\",\r\n \"timing\": \"1-1-D\",\r\n \"route\": \"Oral\",\r\n \"method\": \"swallow\",\r\n \"additionalInstructions\": \"Take them after food\",\r\n \"reason\": \"fever\"\r\n },\r\n {\r\n \"medicine\": \"Acetaminophen 100 mg/mL oral solution\",\r\n \"dosage\": \"0-0-1\",\r\n \"timing\": \"1-2-MO\",\r\n \"route\": \"Syrup\",\r\n \"method\": \"drink\",\r\n \"additionalInstructions\": \"Take them before food\",\r\n \"reason\": \"Cough\"\r\n }\r\n ],\r\n \"documents\": [\r\n {\r\n \"type\": \"Prescription\",\r\n \"contentType\": \"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }\r\n ]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/prescription", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "prescription" - ] - } - }, - "response": [] - }, - { - "name": "OPConsultation", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\":\"OPConsultRecord\",\r\n \"careContextReference\":\"visist 21-03-2025\",\r\n \"visitDate\":\"2024-05-02T06:33:37.361Z\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"chiefComplaints\":[\r\n {\r\n \"complaint\":\"Dengue\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"physicalExaminations\":[\r\n {\r\n \"observation\":\"Heavy drinker\",\r\n \"result\":\"heavy\"\r\n // \"valueQuantity\": {\r\n\t\t\t// \t\t\"unit\": \"CM\",\r\n\t\t\t// \t\t\"value\": 170\r\n\t\t\t// }\r\n }\r\n ],\r\n \"allergies\":[\r\n \"\"\r\n ],\r\n \"medicalHistories\": \r\n [\r\n {\r\n \"complaint\":\"Typhoid fever\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"familyHistories\":[\r\n {\r\n \"relationship\":\"Friend\",\r\n \"observation\":\"Toxic\"\r\n }\r\n ],\r\n \"serviceRequests\":[\r\n {\r\n \"status\":\"ACTIVE\",\r\n \"details\":\"X-RAY\",\r\n \"specimen\":\"Lung cytologic material\"\r\n }\r\n ],\r\n \"medications\":\r\n [\r\n {\r\n \"medicine\":\"Nabilone 2 mg oral capsule\",\r\n \"dosage\":\"1-0-1\",\r\n \"timing\":\"2-5-D\",\r\n \"route\":\"Oral route\",\r\n \"method\":\"swallow\",\r\n \"additionalInstructions\":\"Take them after food\"\r\n }\r\n ,{\r\n \"medicine\":\"Nystatin 25000 unit/g vaginal cream\",\r\n \"dosage\":\"0-0-1\",\r\n \"timing\":\"1-2-D\",\r\n \"route\":\"Interstitial route (qualifier value)\",\r\n \"method\":\"drink\",\r\n \"additionalInstructions\":\"Take them before food\"\r\n }\r\n ],\r\n \"followups\":[\r\n {\r\n \"serviceType\":\"OPConsultation\",\r\n \"appointmentTime\":\"2024-05-20\",\r\n \"reason\":\"General\"\r\n }\r\n ],\r\n \"procedures\":[\r\n {\r\n \"date\":\"2001-04-20\",\r\n \"status\":\"INPROGRESS\",\r\n \"procedureReason\":\"Severe\",\r\n \"outcome\":\"Healthy\",\r\n \"procedureName\":\"Endodontic procedure\"\r\n }\r\n ],\r\n \"referrals\":[\r\n {\r\n \"status\":\"ACTIVE\",\r\n \"details\":\"Y-RAY\",\r\n \"specimen\":\"Pleural cytologic material\"\r\n }\r\n ],\r\n \"otherObservations\":[\r\n {\r\n \"observation\":\"Body weight\",\r\n // \"result\":\"Over weight\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"KG\",\r\n\t\t\t\t\t\"value\": 90\r\n\t\t\t\t}\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"OP record\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/op-consultation", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "op-consultation" - ] - } - }, - "response": [] - }, - { - "name": "health-document", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "" - ], - "type": "text/javascript", - "packages": {} - } - }, - { - "listen": "prerequest", - "script": { - "exec": [ - "" - ], - "type": "text/javascript", - "packages": {} - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\":\"HealthDocumentRecord\",\r\n \"careContextReference\":\"visist 21-03-2024\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"authoredOn\":\"2024-05-03T06:33:37.361Z\",\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"encounter\":\"\",\r\n \"documents\":[{\r\n \"type\":\"health-document\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"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7Igi2NJ03WIdb8CPaOhwBlKEkoax7E5ZdLjP42F98TiJWKZ1T9XnPz8+/Kc1f/jRS/+d3B19aNHmf3r24eU/ho/Y+4/AKijvgugHu5+K373i9d+++9oPF/X9P6FV1H1lbmRzdHJlYW0gCmVuZG9iaiAKMiAwIG9iaiAKPDwgCi9UeXBlIC9QYWdlcyAKL0tpZHMgWyA4IDAgUiBdIAovQ291bnQgMSAKL01lZGlhQm94IDMgMCBSIAovQ3JvcEJveCA0IDAgUiAKPj4gCmVuZG9iaiAKMyAwIG9iaiAKWyAwIDAgNTk1IDg0MSBdIAplbmRvYmogCjQgMCBvYmogClsgMCAwIDU5NSA4NDEgXSAKZW5kb2JqIAo2IDAgb2JqIAo8PCAKL1Byb2NTZXQgNyAwIFIgCi9Gb250IDw8IAovOSA5IDAgUiAgCi9hIDEwIDAgUiAgCj4+IAovWE9iamVjdCA8PCAKL2ltZzAgMTEgMCBSICAKPj4gCj4+IAplbmRvYmogCjcgMCBvYmogClsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSAgXSAKZW5kb2JqIAo4IDAgb2JqIAo8PCAKL1R5cGUgL1BhZ2UgCi9QYXJlbnQgMiAwIFIgCi9SZXNvdXJjZXMgNiAwIFIgCi9Db250ZW50cyBbIDUgMCBSIF0gCj4+IAplbmRvYmogCjkgMCBvYmogCjw8IAovVHlwZSAvRm9udCAKL1N1YnR5cGUgL1RydWVUeXBlIAovQmFzZUZvbnQgL0FBQUFBQStBcmlhbCxCb2xkIAovRmlyc3RDaGFyIDMyIAovTGFzdENoYXIgMTIxIAovV2lkdGhzIDE0IDAgUiAKL0ZvbnREZXNjcmlwdG9yIDE2IDAgUiAKL1RvVW5pY29kZSAxNSAwIFIgCj4+IAplbmRvYmogCjEwIDAgb2JqIAo8PCAKL1R5cGUgL0ZvbnQgCi9TdWJ0eXBlIC9UcnVlVHlwZSAKL0Jhc2VGb250IC9BQUFBQUIrQXJpYWwgCi9GaXJzdENoYXIgMzIgCi9MYXN0Q2hhciAxMjIgCi9XaWR0aHMgMTkgMCBSIAovRm9udERlc2NyaXB0b3IgMjEgMCBSIAovVG9Vbmljb2RlIDIwIDAgUiAKPj4gCmVuZG9iaiAKMTEgMCBvYmog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CjY2NyAKMCAKNzIyIAo2NjcgCjYxMSAKNzIyIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAo1NTYgCjYxMSAKNTU2IAo2MTEgCjU1NiAKMzMzIAo2MTEgCjYxMSAKMjc4IAowIAo1NTYgCjI3OCAKODg5IAo2MTEgCjYxMSAKNjExIAowIAozODkgCjU1NiAKMzMzIAo2MTEgCjU1NiAKMCAKMCAKNTU2IApdIAplbmRvYmogCjE2IDAgb2JqIAo8PCAKL1R5cGUgL0ZvbnREZXNjcmlwdG9yIAovQXNjZW50IDkwNSAKL0NhcEhlaWdodCA1MDAgCi9EZXNjZW50IC0yMTIgCi9GbGFncyA0IAovRm9udEJCb3ggMTcgMCBSIAovRm9udE5hbWUgL0FBQUFBQStBcmlhbCxCb2xkIAovSXRhbGljQW5nbGUgMAovU3RlbVYgMCAKL1N0ZW1IIDAgCi9BdmdXaWR0aCA0NzkgCi9Gb250RmlsZTIgMTggMCBSIAovTGVhZGluZyAwIAovTWF4V2lkdGggMjYyOCAKL01pc3NpbmdXaWR0aCA0NzkgCi9YSGVpZ2h0IDAgCj4+IAplbmRvYmogCjE3IDAgb2JqIApbIC02MjggLTM3NiAyMDAwIDEwNTYgXSAKZW5kb2JqIAoxOSAwIG9iaiAKWyAKMjc4IAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAowIAoyNzggCjMzMyAKMjc4IAoyNzggCjU1NiAKNTU2IAo1NTYgCjU1NiAKNTU2IAo1NTYgCjU1NiAKNTU2IAo1NTYgCjU1NiAKMjc4IAowIAowIAowIAowIAowIAowIAo2NjcgCjY2NyAKNzIyIAo3MjIgCjY2NyAKMCAKNzc4IAo3MjIgCjI3OCAKMCAKMCAKNTU2IAo4MzMgCjcyMiAKNzc4IAo2NjcgCjAgCjcyMiAKNjY3IAo2MTEgCjcyMiAKMCAKOTQ0IAowIAo2NjcgCjAgCjAgCjAgCjAgCjAgCjAgCjAgCjU1NiAKNTU2IAo1MDAgCjU1NiAKNTU2IAowIAo1NTYgCjU1NiAKMjIyIAoyMjIgCjAgCjIyMiAKODMzIAo1NTYgCjU1NiAKNTU2IAowIAozMzMgCjUwMCAKMjc4IAo1NTYgCjAgCjAgCjAgCjAgCjUwMCAKXSAKZW5kb2JqIAoyMSAwIG9iaiAKPDwgCi9UeXBlIC9Gb250RGVzY3JpcHRvciAKL0FzY2VudCA5MDUgCi9DYXBIZWlnaHQgNTAwIAovRGVzY2VudCAtMjEyIAovRmxhZ3MgNCAKL0ZvbnRCQm94IDIyIDAgUiAKL0ZvbnROYW1lIC9BQUFBQUIrQXJpYWwgCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwIAovU3RlbUggMCAKL0F2Z1dpZHRoIDQ0MSAKL0ZvbnRGaWxlMiAyMyAwIFIgCi9MZWFkaW5nIDAgCi9NYXhXaWR0aCAyNjY1IAovTWlzc2luZ1dpZHRoIDQ0MSAKL1hIZWlnaHQgMCAKPj4gCmVuZG9iaiAKMjIgMCBvYmogClsgLTY2NSAtMzI1IDIwMDAgMTA0MCBdIAplbmRvYmogCjI0IDAgb2JqIAooUG93ZXJlZCBCeSBDcnlzdGFsKSAKZW5kb2JqIAoyNSAwIG9iaiAKKENyeXN0YWwgUmVwb3J0cykgCmVuZG9iaiAKMjYgMCBvYmogCjw8IAovUHJvZHVjZXIgKFBvd2VyZWQgQnkgQ3J5c3RhbCkgIAovQ3JlYXRvciAoQ3J5c3RhbCBSZXBvcnRzKSAgCj4+IAplbmRvYmogCnhyZWYgCjAgMjcgCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNyAwMDAwMCBuIAowMDAwMDQyNDE0IDAwMDAwIG4gCjAwMDAwNDI1MTMgMDAwMDAgbiAKMDAwMDA0MjU0NyAwMDAwMCBuIAowMDAwMDAwMTk0IDAwMDAwIG4gCjAwMDAwNDI1ODEgMDAwMDAgbiAKMDAwMDA0MjY5MSAwMDAwMCBuIAowMDAwMDQyNzQ5IDAwMDAwIG4gCjAwMDAwNDI4NDEgMDAwMDAgbiAKMDAwMDA0MzAxOCAwMDAwMCBuIAowMDAwMDQzMTkxIDAwMDAwIG4gCjAwMDAwNTQ3MzUgMDAwMDAgbiAKMDAwMDA1NDc4OSAwMDAwMCBuIAowMDAwMDU1NjA0IDAwMDAwIG4gCjAwMDAwMDE0NzQgMDAwMDAgbiAKMDAwMDA1NTk5MCAwMDAwMCBuIAowMDAwMDU2MjY5IDAwMDAwIG4gCjAwMDAwMDIwOTUgMDAwMDAgbiAKMDAwMDA1NjMxMiAwMDAwMCBuIAowMDAwMDE4MTE3IDAwMDAwIG4gCjAwMDAwNTY3MTcgMDAwMDAgbiAKMDAwMDA1Njk5MSAwMDAwMCBuIAowMDAwMDE4Nzc5IDAwMDAwIG4gCjAwMDAwNTcwMzQgMDAwMDAgbiAKMDAwMDA1NzA3NCAwMDAwMCBuIAowMDAwMDU3MTExIDAwMDAwIG4gCnRyYWlsZXIgCjw8IAovU2l6ZSAyNyAKL1Jvb3QgMSAwIFIgCi9JbmZvIDI2IDAgUiAKPj4gCnN0YXJ0eHJlZiAKNTcxOTkgCiUlRU9GDQo=\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/health-document", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "health-document" - ] - } - }, - "response": [] - }, - { - "name": "diagnosticReport", - "protocolProfileBehavior": { - "disabledSystemHeaders": {} - }, - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\": \"DiagnosticReportRecord\",\r\n \"careContextReference\": \"visist 21-03-2024\",\r\n \"visitDate\": \"2024-05-07T06:33:37.361Z\",\r\n \"patient\": {\r\n \"name\": \"Venu Ajitesh\",\r\n \"patientReference\": \"ajitesh6x\",\r\n \"gender\": \"male\",\r\n \"birthDate\": \"1940-04-27\"\r\n },\r\n \"practitioners\": [\r\n {\r\n \"name\": \"Dr.Venu Ajitesh\",\r\n \"practitionerId\": \"Predator\"\r\n }\r\n ],\r\n \"organisation\": {\r\n \"facilityName\": \"Predator_HIP\",\r\n \"facilityId\": \"Predator_HIP\"\r\n },\r\n \"encounter\": \"Ambula\",\r\n \"diagnostics\": [\r\n {\r\n \"serviceName\": \"BloodTest\",\r\n \"authoredOn\":\"2024-11-23T21:34:38.989Z\",\r\n \"serviceCategory\": \"Hematography\",\r\n \"result\": [\r\n {\r\n \"observation\": \"Height\",\r\n \"result\": \"Normal\",\r\n \"valueQuantity\": {\r\n \"unit\": \"CM\",\r\n \"value\": 170\r\n }\r\n }\r\n ],\r\n \"conclusion\": \"Normal\",\r\n \"presentedForm\":{\r\n \"contentType\": \"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\": \"diagnosticReport\",\r\n \"contentType\": \"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/diagnostic-report", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "diagnostic-report" - ] - } - }, - "response": [] - }, - { - "name": "wellness-record", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\":\"WellnessRecord\",\r\n \"careContextReference\":\"visist 21-03-2025\",\r\n \"authoredOn\":\"2024-05-04T06:33:37.361Z\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"vitalSigns\":[\r\n {\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"bodyMeasurements\":[\r\n {\r\n \"observation\":\"BMI\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"physicalActivities\":[\r\n {\r\n \"observation\":\"Running\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"generalAssessments\":[\r\n {\r\n \"observation\":\"Physico\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\"womanHealths\":[\r\n {\r\n \"observation\":\"Crazy\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"lifeStyles\":[\r\n {\r\n \"observation\":\"Bad\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"otherObservations\":[\r\n {\r\n \"observation\":\"None\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"WellnessRecord\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\": \"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Mzc1Ci9YSGVpZ2h0IDUyOC4zMjAzMTMKL1N0ZW1WIDAKL0ZvbnRGaWxlMiAxNiAwIFIKPj4KZW5kb2JqCjE4IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9DSURGb250VHlwZTIKL0Jhc2VGb250IC9CWlpaWlorUm9ib3RvLVJlZ3VsYXIKL0NJRFN5c3RlbUluZm8gPDwKL1JlZ2lzdHJ5IChBZG9iZSkKL09yZGVyaW5nIChJZGVudGl0eSkKL1N1cHBsZW1lbnQgMAo+PgovRm9udERlc2NyaXB0b3IgMTcgMCBSCi9XIFswIFs5MDggNzEzLjM3ODkwNiA3MTMuMzc4OTA2IDY1Mi4zNDM3NSAyNDguMDQ2ODc1IDI0NC4xNDA2MjUgNTYzLjk2NDg0NCA4NzYuOTUzMTI1IDI0My4xNjQwNjMgNTUyLjI0NjA5NCA2MzYuNzE4NzUgNTcwLjMxMjUgNTUxLjI2OTUzMSA1MjMuNDM3NSA1NTAuNzgxMjUgNTMwLjI3MzQzOCAzMzguODY3MTg4IDI0My4xNjQwNjMgNTQzLjk0NTMxMyAzMjcuMTQ4NDM4IDU5My43NSA1MTYuMTEzMjgxIDU2Mi4wMTE3MTkgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDU2Mi4wMTE3MTkgNDg0LjM3NSA1NjIuMDExNzE5IDU2Mi4wMTE3MTkgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDg3My4wNDY4NzUgNjE2LjIxMDkzOCAyNzYuMzY3MTg4IDI0Mi4xODc1IDYzMC44NTkzNzUgMjYzLjY3MTg3NSAyNzEuOTcyNjU2IDU5Ni42Nzk2ODggNTY4LjM1OTM3NSA2NTYuMjUgNjUwLjg3ODkwNiAzNDcuNjU2MjUgNTYyLjAxMTcxOSA1NjIuMDExNzE5IDU2MS41MjM0MzggNjg3Ljk4ODI4MSA2NDguNDM3NSA1NjEuNTIzNDM4IDYwMC41ODU5MzhdXQovQ0lEVG9HSURNYXAgL0lkZW50aXR5Cj4+CmVuZG9iagoxOSAwIG9iago8PAovTGVuZ3RoIDMzNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeJxdUstugzAQvPMVe0wPEQFDaCSEVKUXDn2otKeqB2IvEVIxliEH/r7G4yZV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hSaeRYM/OC1xOdwlOx480lpmEZzGvKwIYw3O7ev2dcIFETqTyfRBfUg7ItEpSQGFjhGF/hcOmQnjCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDI0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNjQ0OSAwMDAwMCBuIAowMDAwMDA2NTA2IDAwMDAwIG4gCjAwMDAwMDYzODcgMDAwMDAgbiAKMDAwMDAwNjM2NiAwMDAwMCBuIAowMDAwMDAwMzU5IDAwMDAwIG4gCjAwMDAwMDAyMTkgMDAwMDAgbiAKMDAwMDAwMDEwOSAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNTkgMDAwMDAgbiAKMDAwMDAwNDgxMCAwMDAwMCBuIAowMDAwMDA2MjE4IDAwMDAwIG4gCjAwMDAwMDMzMTcgMDAwMDAgbiAKMDAwMDAwMzIyOSAwMDAwMCBuIAowMDAwMDAzMjU1IDAwMDAwIG4gCjAwMDAwMDMyODEgMDAwMDAgbiAKMDAwMDAwNjU1MyAwMDAwMCBuIAowMDAwMDAzMzkzIDAwMDAwIG4gCjAwMDAwMDM2NjEgMDAwMDAgbiAKMDAwMDAwNDQwMCAwMDAwMCBuIAowMDAwMDE0MjAzIDAwMDAwIG4gCjAwMDAwMDQ5NTkgMDAwMDAgbiAKMDAwMDAwNTIyNiAwMDAwMCBuIAowMDAwMDA1ODM2IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMjQKL1Jvb3QgMyAwIFIKL0luZm8gMTIgMCBSCi9JRCBbPDdiOTliYmRjNzc5ZjAyYjc4MGViNDI1ZWU0ZjdmY2JmPiA8N2I5OWJiZGM3NzlmMDJiNzgwZWI0MjVlZTRmN2ZjYmY+XQo+PgpzdGFydHhyZWYKMjA3NzUKJSVFT0YK\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/wellness-record", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "wellness-record" - ] - } - }, - "response": [] - }, - { - "name": "immunization", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\":\"ImmunizationRecord\",\r\n \"careContextReference\":\"visit-{{$isoTimestamp}}\",\r\n \"authoredOn\":\"{{$isoTimestamp}}\",\r\n \"encounter\":\"\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"immunizations\":[{\r\n \"date\":\"2024-06-15\",\r\n \"vaccineName\":\"Paratyphoid vaccine\",\r\n \"lotNumber\":\"IN00004\",\r\n \"manufacturer\":\"NHA\",\r\n \"doseNumber\":\"3\"\r\n }],\r\n \"documents\":[{\r\n \"type\":\"immunization\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\": \"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/immunization", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "immunization" - ] - } - }, - "response": [] - }, - { - "name": "discharge-summary", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"bundleType\":\"DischargeSummaryRecord\",\r\n \"careContextReference\":\"visist 21-03-2024\",\r\n \"patient\":{\r\n \"name\":\"Venu Ajitesh\",\r\n \"patientReference\":\"ajitesh6x\",\r\n \"gender\":\"male\",\r\n \"birthDate\":\"1940-04-27\"\r\n },\r\n \"practitioners\":[{\r\n \"name\":\"Dr.Venu Ajitesh\",\r\n \"practitionerId\":\"Predator\"\r\n }],\r\n \"carePlan\":{\r\n \"intent\":\"plan\",\r\n \"type\":\"Regular check up\",\r\n \"goal\":\"Reduce BP\",\r\n \"description\":\"Normal\",\r\n \"notes\":\"The patient has an HIGH BP, recommended to revisit on 29-10-2024\"\r\n },\r\n \"organisation\":{\r\n \"facilityName\":\"Predator_HIP\",\r\n \"facilityId\":\"Predator_HIP\"\r\n },\r\n \"chiefComplaints\":[\r\n {\r\n \"complaint\":\"Sugar\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"physicalExaminations\":[\r\n {\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }\r\n ],\r\n \"allergies\":[\r\n \"Walnuts\"\r\n ],\r\n \"medicalHistories\":[\r\n {\r\n \"complaint\":\"Sugar\",\r\n \"recordedDate\":\"2024-05-20\",\r\n \"dateRange\":{\r\n \"from\":\"2018-04-27\",\r\n \"to\":\"2018-05-26\"\r\n }\r\n }\r\n ],\r\n \"familyHistories\":[\r\n {\r\n \"relationship\":\"Friend\",\r\n \"observation\":\"Toxic\"\r\n }\r\n ],\r\n \"authoredOn\":\"2024-05-06T06:33:37.361Z\",\r\n \"medications\":[\r\n {\r\n \"medicine\":\"Aspirin 75 mg oral tablet\",\r\n \"dosage\":\"1-0-1\",\r\n \"timing\":\"2-5-D\",\r\n \"route\":\"Oral\",\r\n \"method\":\"swallow\",\r\n \"additionalInstructions\":\"Take them after food\"\r\n }\r\n ,{\r\n \"medicine\":\"Disprin\",\r\n \"dosage\":\"0-0-1\",\r\n \"timing\":\"1-2-D\",\r\n \"route\":\"Syrup\",\r\n \"method\":\"drink\",\r\n \"additionalInstructions\":\"Take them before food\"\r\n }\r\n ],\r\n \"diagnostics\":[{\r\n \"serviceName\":\"BloodTest\",\r\n \"serviceCategory\":\"Hematography\",\r\n \"result\":[{\r\n \"observation\":\"Height\",\r\n \"result\":\"Normal\",\r\n \"valueQuantity\": {\r\n\t\t\t\t\t\"unit\": \"CM\",\r\n\t\t\t\t\t\"value\": 170\r\n\t\t\t}\r\n }],\r\n \"authoredOn\":\"2024-05-08T06:33:37.361Z\",\r\n \"conclusion\":\"Normal\",\r\n \"presentedForm\":{\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }\r\n }],\r\n \"procedures\":[\r\n {\r\n \"date\":\"2001-04-20\",\r\n \"status\":\"INPROGRESS\",\r\n \"procedureReason\":\"Severe\",\r\n \"outcome\":\"Healthy\",\r\n \"procedureName\":\"Operation\"\r\n }\r\n ],\r\n \"documents\":[{\r\n \"type\":\"OP record\",\r\n \"contentType\":\"application/pdf\",\r\n \"data\":\"JVBERi0xLjMKJf////8K\"\r\n }]\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "localhost:8085/v1/bundle/discharge-summary", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "bundle", - "discharge-summary" - ] - } - }, - "response": [] - }, - { - "name": "Get SnomedCodes", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "localhost:8085/v1/snomed/Medications", - "host": [ - "localhost" - ], - "port": "8085", - "path": [ - "v1", - "snomed", - "Medications" - ] - } - }, - "response": [] - } - ] -} \ No newline at end of file diff --git a/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/FieldIdentifiers.java b/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/FieldIdentifiers.java index 851fff63..e02ccbf5 100644 --- a/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/FieldIdentifiers.java +++ b/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/FieldIdentifiers.java @@ -23,6 +23,8 @@ public class FieldIdentifiers { public static final String ENTITY = "entity"; public static final String ENTITY_TYPE = "entityType"; public static final String LAST_UPDATED = "lastUpdated"; + public static final String CREATED_ON = "createdOn"; + public static final String MODULE = "module"; public static final String LINK_TOKEN_REQUEST_ID = "linkTokenRequestId"; // Patient table. diff --git a/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/RequestStatus.java b/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/RequestStatus.java index 351f5d7d..64a7fcc9 100644 --- a/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/RequestStatus.java +++ b/src/main/java/in/nha/abdm/wrapper/v1/hip/hrp/database/mongo/tables/helpers/RequestStatus.java @@ -53,7 +53,15 @@ public enum RequestStatus { ENCRYPTED_HEALTH_INFORMATION_RECEIVED("Encrypted Health Information received by HIU from HIP"), ENCRYPTED_HEALTH_INFORMATION_ERROR( "Error while receiving encrypted Health Information by HIU from HIP"), - DECRYPTION_ERROR("Unable to decrypt the data sent by HIP"); + DECRYPTION_ERROR("Unable to decrypt the data sent by HIP"), + FETCHING_BUNDLE("Fetching bundle from HIP"), + FETCHING_BUNDLE_ERROR("Error while fetching bundle from HIP"), + FETCHING_BUNDLE_SUCCESS("Bundle fetched successfully from HIP"), + ENCRYPTION_ERROR("Error while encrypting the data"), + ENCRYPTION_SUCCESS("Data encrypted successfully"), + DATA_TRANSFER_INITIATED("Data transfer initiated successfully"), + DATA_TRANSFER_ERROR("Error while initiating data transfer"), + DATA_TRANSFER_SUCCESS("Data transfer completed successfully"); private String value; diff --git a/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/PatientV3Service.java b/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/PatientV3Service.java index 6f42bad8..2d729c4e 100644 --- a/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/PatientV3Service.java +++ b/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/PatientV3Service.java @@ -353,10 +353,20 @@ public FacadeV3Response upsertPatients(List patients) { } if (patient.getCareContexts() != null && !patient.getCareContexts().isEmpty()) { + List careContextDocs = + patient.getCareContexts().stream() + .map( + careContext -> + new Document() + .append("referenceNumber", careContext.getReferenceNumber()) + .append("display", careContext.getDisplay()) + .append("isLinked", Boolean.FALSE) + .append("hiType", careContext.getHiType())) + .collect(Collectors.toList()); + update.append( "$addToSet", - new Document( - FieldIdentifiers.CARE_CONTEXTS, new Document("$each", patient.getCareContexts()))); + new Document(FieldIdentifiers.CARE_CONTEXTS, new Document("$each", careContextDocs))); } if (!update.isEmpty()) { updates.add(new UpdateOneModel<>(filter, update, new UpdateOptions().upsert(true))); diff --git a/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/RequestLogV3Service.java b/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/RequestLogV3Service.java index c6e8cb25..a16be6b7 100644 --- a/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/RequestLogV3Service.java +++ b/src/main/java/in/nha/abdm/wrapper/v3/database/mongo/services/RequestLogV3Service.java @@ -29,12 +29,14 @@ import in.nha.abdm.wrapper.v3.hip.hrp.link.userInitiated.responses.InitV3Response; import in.nha.abdm.wrapper.v3.hip.hrp.share.requests.OnShareV3Request; import in.nha.abdm.wrapper.v3.hip.hrp.share.requests.ProfileShareV3Request; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -107,6 +109,17 @@ public void updateError(String requestId, Object errors, RequestStatus requestSt mongoTemplate.updateFirst(query, update, RequestLog.class); } + public void updateConsentStatus(String consentId, Object errors, RequestStatus requestStatus) { + Query query = new Query(Criteria.where(FieldIdentifiers.CONSENT_ID).is(consentId)); + Update update = new Update(); + if (errors != null) { + update.set(FieldIdentifiers.ERROR, errors); + } + update.set(FieldIdentifiers.STATUS, requestStatus); + update.set(FieldIdentifiers.LAST_UPDATED, Utils.getCurrentDateTime()); + mongoTemplate.updateFirst(query, update, RequestLog.class); + } + /** * If any error encountered in the generation of LinkToken API this method is used to update in * requestLogs @@ -241,43 +254,44 @@ public RequestLog findRequestLogByTransactionId(String transactionId) { */ public void persistHipLinkRequest( LinkRecordsV3Request linkRecordsV3Request, RequestStatus status, Object errors) { + if (Objects.isNull(linkRecordsV3Request)) { return; } - RequestLog existingLog = logsRepo.findByClientRequestId(linkRecordsV3Request.getRequestId()); - if (Objects.isNull(existingLog)) { - RequestLog requestLog = new RequestLog(); - requestLog.setAbhaAddress(linkRecordsV3Request.getAbhaAddress()); - requestLog.setModule(FieldIdentifiers.HIP_INITIATED_LINKING); - requestLog.setCreatedOn(Utils.getCurrentDateTime()); - requestLog.setLastUpdated(Utils.getCurrentDateTime()); - requestLog.setClientRequestId(linkRecordsV3Request.getRequestId()); - requestLog.setGatewayRequestId(linkRecordsV3Request.getRequestId()); - requestLog.setHipId(linkRecordsV3Request.getRequesterId()); - requestLog.setStatus(status); - HashMap map = new HashMap<>(); - map.put(FieldIdentifiers.LINK_RECORDS_REQUEST, linkRecordsV3Request); - requestLog.setRequestDetails(map); - if (Objects.nonNull(errors)) { - requestLog.setError(errors); - } - mongoTemplate.save(requestLog); - return; + String requestId = linkRecordsV3Request.getRequestId(); + LocalDateTime now = Utils.getCurrentDateTime(); + + RequestLog existingLog = logsRepo.findByClientRequestId(requestId); + + Map requestDetails = + Optional.ofNullable(existingLog != null ? existingLog.getRequestDetails() : null) + .orElse(new HashMap<>()); + + requestDetails.put(FieldIdentifiers.LINK_RECORDS_REQUEST, linkRecordsV3Request); + + Query query = Query.query(Criteria.where(FieldIdentifiers.CLIENT_REQUEST_ID).is(requestId)); + + Update update = + new Update() + .set(FieldIdentifiers.LAST_UPDATED, now) + .set(FieldIdentifiers.STATUS, status) + .set(FieldIdentifiers.REQUEST_DETAILS, requestDetails); + + if (existingLog == null) { + update + .setOnInsert(FieldIdentifiers.ABHA_ADDRESS, linkRecordsV3Request.getAbhaAddress()) + .setOnInsert(FieldIdentifiers.MODULE, FieldIdentifiers.HIP_INITIATED_LINKING) + .setOnInsert(FieldIdentifiers.CREATED_ON, now) + .setOnInsert(FieldIdentifiers.CLIENT_REQUEST_ID, requestId) + .setOnInsert(FieldIdentifiers.GATEWAY_REQUEST_ID, requestId) + .setOnInsert(FieldIdentifiers.HIP_ID, linkRecordsV3Request.getRequesterId()); } - Query query = - new Query( - Criteria.where(FieldIdentifiers.CLIENT_REQUEST_ID) - .is(linkRecordsV3Request.getRequestId())); - Map map = existingLog.getRequestDetails(); - if (Objects.isNull(map)) { - map = new HashMap<>(); + + if (Objects.nonNull(errors)) { + update.set(FieldIdentifiers.ERROR, errors); } - map.replace(FieldIdentifiers.LINK_RECORDS_REQUEST, linkRecordsV3Request); - Update update = new Update(); - update.set(FieldIdentifiers.REQUEST_DETAILS, map); - update.set(FieldIdentifiers.STATUS, status); - update.set(FieldIdentifiers.LAST_UPDATED, Utils.getCurrentDateTime()); - mongoTemplate.updateFirst(query, update, RequestLog.class); + + mongoTemplate.upsert(query, update, RequestLog.class); } /** @@ -602,38 +616,57 @@ public void saveLinkTokenRequest( * *

Adding linkOnAddCareContextsResponse dump into db. * - * @param linkOnAddCareContextsV3Response Acknowledgement from ABDM gateway for HipLinking. + * @param response Acknowledgement from ABDM gateway for HipLinking. */ - public void setHipOnAddCareContextResponse( - LinkOnAddCareContextsV3Response linkOnAddCareContextsV3Response) + public void setHipOnAddCareContextResponse(LinkOnAddCareContextsV3Response response) throws IllegalDataStateException { - RequestLog RequestLog = - logsRepo.findByGatewayRequestId( - linkOnAddCareContextsV3Response.getResponse().getRequestId()); - if (RequestLog == null) { - throw new IllegalDataStateException( - "Request not found in database for: " - + linkOnAddCareContextsV3Response.getResponse().getRequestId()); - } - HashMap map = RequestLog.getRequestDetails(); - map.put(FieldIdentifiers.HIP_ON_ADD_CARE_CONTEXT_RESPONSE, linkOnAddCareContextsV3Response); - Query query = - new Query( - Criteria.where(FieldIdentifiers.GATEWAY_REQUEST_ID) - .is(linkOnAddCareContextsV3Response.getResponse().getRequestId())); - Update update = new Update(); - if ((Objects.nonNull(linkOnAddCareContextsV3Response.getError()))) { - update.set(FieldIdentifiers.ERROR, linkOnAddCareContextsV3Response.getError()); + String requestId = response.getResponse().getRequestId(); + log.info("Processing HIP OnAddCareContext response for requestId: {}", requestId); + + Query query = Query.query(Criteria.where(FieldIdentifiers.GATEWAY_REQUEST_ID).is(requestId)); + Update update = + new Update() + .set( + FieldIdentifiers.REQUEST_DETAILS + + "." + + FieldIdentifiers.HIP_ON_ADD_CARE_CONTEXT_RESPONSE, + response) + .set(FieldIdentifiers.LAST_UPDATED, Utils.getCurrentDateTime()); + + if (response.getError() != null) { + update.set(FieldIdentifiers.ERROR, response.getError()); } else { update.set(FieldIdentifiers.STATUS, RequestStatus.CARE_CONTEXT_LINKED); - LinkRecordsV3Request linkRecordsV3Request = - (LinkRecordsV3Request) - RequestLog.getRequestDetails().get(FieldIdentifiers.LINK_RECORDS_REQUEST); - patientService.addPatientCareContexts(linkRecordsV3Request); } - update.set(FieldIdentifiers.REQUEST_DETAILS, map); - mongoTemplate.updateFirst(query, update, RequestLog.class); + log.info("Querying gatewayRequestId = {}", requestId); + log.info("Query for requestId: {} {}", query, requestId); + log.info("Update for requestId: {} {}", update, requestId); + RequestLog updatedLog = + mongoTemplate.findAndModify( + query, update, FindAndModifyOptions.options().returnNew(true), RequestLog.class); + + if (updatedLog == null) { + log.warn( + "findAndModify returned null, fallback to fetch manually for requestId: {}", requestId); + updatedLog = logsRepo.findByGatewayRequestId(requestId); + + if (updatedLog == null) { + throw new IllegalDataStateException("Request not found in database for: " + requestId); + } + } + + if (response.getError() == null) { + Object raw = updatedLog.getRequestDetails().get(FieldIdentifiers.LINK_RECORDS_REQUEST); + if (raw instanceof LinkRecordsV3Request) { + patientService.addPatientCareContexts((LinkRecordsV3Request) raw); + } else { + log.warn( + "Expected LinkRecordsV3Request but got: {}", + raw == null ? "null" : raw.getClass().getName()); + } + } + log.info("Successfully updated requestId: {}", requestId); } public RequestLog getLogsByAbhaAddress(String abhaAddress, String hipId) { diff --git a/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/dataTransfer/HIPHealthInformationV3Service.java b/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/dataTransfer/HIPHealthInformationV3Service.java index ebf522e2..f2fec9d1 100644 --- a/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/dataTransfer/HIPHealthInformationV3Service.java +++ b/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/dataTransfer/HIPHealthInformationV3Service.java @@ -7,6 +7,7 @@ import in.nha.abdm.wrapper.v1.common.models.RespRequest; import in.nha.abdm.wrapper.v1.common.requests.*; import in.nha.abdm.wrapper.v1.common.responses.ErrorResponse; +import in.nha.abdm.wrapper.v1.common.responses.ErrorV3Response; import in.nha.abdm.wrapper.v1.common.responses.GenericResponse; import in.nha.abdm.wrapper.v1.hip.hrp.consent.requests.HIPNotifyRequest; import in.nha.abdm.wrapper.v1.hip.hrp.dataTransfer.callback.HIPHealthInformationRequest; @@ -27,6 +28,7 @@ import in.nha.abdm.wrapper.v3.common.RequestV3Manager; import in.nha.abdm.wrapper.v3.common.exceptions.BadRequestHandler; import in.nha.abdm.wrapper.v3.common.models.GenericV3Response; +import in.nha.abdm.wrapper.v3.config.ErrorHandler; import in.nha.abdm.wrapper.v3.database.mongo.services.ConsentPatientV3Service; import in.nha.abdm.wrapper.v3.database.mongo.services.PatientV3Service; import in.nha.abdm.wrapper.v3.database.mongo.services.RequestLogV3Service; @@ -146,20 +148,32 @@ public void healthInformation( // Acknowledge to gateway that health information request has been received. healthInformationAcknowledgementRequest( hipHealthInformationRequest, onHealthInformationRequest, headers); + try { + // Sending the data to HIU only if there is no errors + if (Objects.isNull(onHealthInformationRequest.getError())) { + // Prepare health information bundle request which needs to be sent to HIU. + HealthInformationBundleResponse healthInformationBundleResponse = + fetchHealthInformationBundle(hipHealthInformationRequest, headers); + // Push the health information to HIU. + List> pushHealthInformationResponse = + pushHealthInformation(healthInformationBundleResponse, consentId, headers); + // Notify Gateway that health information was pushed to HIU. + healthInformationPushNotify( + hipHealthInformationRequest, consentId, pushHealthInformationResponse, headers); + } else { + // Sending BAD_REQUEST since there are some errors earlier + healthInformationPushNotify( + hipHealthInformationRequest, + consentId, + Collections.singletonList(new ResponseEntity<>(HttpStatus.BAD_REQUEST)), + headers); + } + } catch (Exception e) { + List errors = ErrorHandler.getErrors(e.getMessage()); + log.debug(errors); + requestLogV3Service.updateConsentStatus(consentId, errors, RequestStatus.DATA_TRANSFER_ERROR); - // Sending the data to HIU only if there is no errors - if (Objects.isNull(onHealthInformationRequest.getError())) { - // Prepare health information bundle request which needs to be sent to HIU. - HealthInformationBundleResponse healthInformationBundleResponse = - fetchHealthInformationBundle(hipHealthInformationRequest, headers); - // Push the health information to HIU. - List> pushHealthInformationResponse = - pushHealthInformation(healthInformationBundleResponse, consentId, headers); - // Notify Gateway that health information was pushed to HIU. - healthInformationPushNotify( - hipHealthInformationRequest, consentId, pushHealthInformationResponse, headers); - } else { - // Sending BAD_REQUEST since there are some errors earlier + // Notify Gateway that health information was pushed to HIU with BAD_REQUEST status. healthInformationPushNotify( hipHealthInformationRequest, consentId, @@ -212,27 +226,30 @@ private void healthInformationAcknowledgementRequest( private HealthInformationBundleResponse fetchHealthInformationBundle( HIPHealthInformationRequest hipHealthInformationRequest, HttpHeaders headers) throws IllegalDataStateException { - ConsentCareContextMapping existingLog = + ConsentCareContextMapping existingConsentLog = consentCareContextsService.findMappingByConsentId( hipHealthInformationRequest.getHiRequest().getConsent().getId()); + RequestLog existingLog = + requestLogV3Service.findByConsentId( + hipHealthInformationRequest.getHiRequest().getConsent().getId(), + GatewayConstants.HIP, + headers.getFirst(GatewayConstants.X_HIP_ID)); + if (existingLog == null) { + throw new IllegalDataStateException("Request log not found for consent id"); + } HIPNotifyRequest hipNotifyRequest = - (HIPNotifyRequest) - requestLogV3Service - .findByConsentId( - hipHealthInformationRequest.getHiRequest().getConsent().getId(), - GatewayConstants.HIP, - headers.getFirst(GatewayConstants.X_HIP_ID)) - .getRequestDetails() - .get(FieldIdentifiers.HIP_NOTIFY_REQUEST); + (HIPNotifyRequest) existingLog.getRequestDetails().get(FieldIdentifiers.HIP_NOTIFY_REQUEST); String hipId = hipNotifyRequest.getNotification().getConsentDetail().getHip().getId(); - if (existingLog == null) { + if (existingConsentLog == null) { throw new IllegalDataStateException("consent id not found in db"); } HealthInformationBundleRequest healthInformationBundleRequest = HealthInformationBundleRequest.builder() .hipId(hipId) - .careContextsWithPatientReferences(existingLog.getCareContexts()) + .careContextsWithPatientReferences(existingConsentLog.getCareContexts()) .build(); + requestLogV3Service.updateConsentStatus( + existingConsentLog.getConsentId(), null, RequestStatus.FETCHING_BUNDLE); log.debug( "Health information bundle request HIP : " + healthInformationBundleRequest.toString()); return hipClient.healthInformationBundleRequest(healthInformationBundleRequest).getBody(); @@ -298,6 +315,9 @@ private List fetchHealthInformationPushRequest( EncryptionResponse encryptedData = encryptionService.encrypt(hipHealthInformationRequest, healthInformationBundleResponse); + requestLogV3Service.updateConsentStatus( + hipNotifyRequest.getNotification().getConsentId(), null, RequestStatus.ENCRYPTION_SUCCESS); + HealthInformationDhPublicKey receiverDhPublicKey = hipHealthInformationRequest.getHiRequest().getKeyMaterial().getDhPublicKey(); @@ -362,7 +382,8 @@ private void healthInformationPushNotify( HIPHealthInformationRequest hipHealthInformationRequest, String consentId, List> pushHealthInformationResponse, - HttpHeaders headers) { + HttpHeaders headers) + throws IllegalDataStateException { boolean allSuccess = pushHealthInformationResponse.stream() .allMatch(response -> response.getStatusCode().is2xxSuccessful()); @@ -370,13 +391,14 @@ private void healthInformationPushNotify( String healthInformationStatus = allSuccess ? "DELIVERED" : "ERRORED"; String sessionStatus = allSuccess ? "TRANSFERRED" : "FAILED"; + RequestLog existingLog = + requestLogV3Service.findByConsentId( + consentId, GatewayConstants.HIP, headers.getFirst(GatewayConstants.X_HIP_ID)); + if (existingLog == null) { + throw new IllegalDataStateException("Request log not found for consent id: " + consentId); + } HIPNotifyRequest hipNotifyRequest = - (HIPNotifyRequest) - requestLogV3Service - .findByConsentId( - consentId, GatewayConstants.HIP, headers.getFirst(GatewayConstants.X_HIP_ID)) - .getRequestDetails() - .get(FieldIdentifiers.HIP_NOTIFY_REQUEST); + (HIPNotifyRequest) existingLog.getRequestDetails().get(FieldIdentifiers.HIP_NOTIFY_REQUEST); List listOfCareContexts = hipNotifyRequest.getNotification().getConsentDetail().getCareContexts(); List healthInformationStatusResponseList = new ArrayList<>(); @@ -415,6 +437,12 @@ private void healthInformationPushNotify( .notification(healthInformationNotificationStatus) .build(); log.info(healthInformationPushNotification.toString()); + if (allSuccess) { + requestLogV3Service.updateConsentStatus(consentId, null, RequestStatus.DATA_TRANSFER_SUCCESS); + } else { + requestLogV3Service.updateConsentStatus(consentId, null, RequestStatus.DATA_TRANSFER_ERROR); + log.error("Data transfer failed for consent id: " + consentId); + } try { ResponseEntity response = requestV3Manager.fetchResponseFromGateway( diff --git a/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/link/hipInitiated/HIPLinkV3Service.java b/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/link/hipInitiated/HIPLinkV3Service.java index 1c7ecc85..889bfcad 100644 --- a/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/link/hipInitiated/HIPLinkV3Service.java +++ b/src/main/java/in/nha/abdm/wrapper/v3/hip/hrp/link/hipInitiated/HIPLinkV3Service.java @@ -99,7 +99,7 @@ public FacadeV3Response addCareContexts(LinkRecordsV3Request linkRecordsV3Reques linkRecordsV3Request.getRequesterId(), linkRecordsV3Request.getCareContexts()); - if (sameCareContexts != null && !sameCareContexts.isEmpty()) { + if (Objects.nonNull(sameCareContexts) && !sameCareContexts.isEmpty()) { return hipContextNotify(linkRecordsV3Request, patient, sameCareContexts); } @@ -153,6 +153,7 @@ private List buildPatientCareContextHIType( private FacadeV3Response sendAddCareContextsRequest( LinkRecordsV3Request request, AddCareContexts addCareContexts, String linkToken) { try { + requestLogV3Service.persistHipLinkRequest(request, RequestStatus.INITIATING, null); ResponseEntity response = requestV3Manager.fetchResponseFromGateway( addCareContextsPath, @@ -210,6 +211,15 @@ private FacadeV3Response buildErrorResponse( .build(); } + private FacadeV3Response buildErrorResponse( + LinkRecordsV3Request request, List errors) { + return FacadeV3Response.builder() + .clientRequestId(request.getRequestId()) + .httpStatusCode(HttpStatus.BAD_REQUEST) + .errors(errors) + .build(); + } + private FacadeV3Response handleAddCareContextError(LinkRecordsV3Request request) { ErrorResponse errorResponse = ErrorResponse.builder() @@ -228,8 +238,10 @@ private FacadeV3Response handleAddCareContextError(LinkRecordsV3Request request) private FacadeV3Response handleWebClientBadRequest( LinkRecordsV3Request request, WebClientResponseException.BadRequest ex) { Object error = BadRequestHandler.getError(ex); - requestLogV3Service.persistHipLinkRequest(request, RequestStatus.ADD_CARE_CONTEXT_ERROR, error); - return buildErrorResponse(request, "Wrapper-1001", ex.getMessage()); + List errorList = ErrorHandler.getErrors(error); + requestLogV3Service.persistHipLinkRequest( + request, RequestStatus.ADD_CARE_CONTEXT_ERROR, errorList); + return buildErrorResponse(request, errorList); } private FacadeV3Response handleGeneralException(LinkRecordsV3Request request, Exception ex) { @@ -351,25 +363,24 @@ public void handleAddCareContexts( RequestStatus.LINK_TOKEN_REQUEST_ERROR); return; } + linkTokenService.saveLinkToken( onGenerateTokenResponse.getAbhaAddress(), onGenerateTokenResponse.getLinkToken(), Objects.requireNonNull(headers.getFirst(GatewayConstants.X_HIP_ID))); // Fetching the GenerateLinkToken request - RequestLog requestLog = + RequestLog RequestLog = requestLogV3Service.getLogsByAbhaAddress( onGenerateTokenResponse.getAbhaAddress(), Objects.requireNonNull(headers.get(GatewayConstants.X_HIP_ID)).toString()); - if (Objects.isNull(requestLog)) { - log.error("Request log not found for on-linkToken generation to initiate linking"); + if (Objects.isNull(RequestLog)) { return; } - log.info("RequestLog: " + requestLog); LinkRecordsV3Request linkRecordsV3Request = (LinkRecordsV3Request) - requestLog.getRequestDetails().get(FieldIdentifiers.LINK_RECORDS_REQUEST); - log.info("Initiating careContext Linking"); + RequestLog.getRequestDetails().get(FieldIdentifiers.LINK_RECORDS_REQUEST); + FacadeV3Response facadeV3Response = addCareContexts(linkRecordsV3Request); } catch (WebClientResponseException.BadRequest ex) { Object error = BadRequestHandler.getError(ex);