diff --git a/src/main/java/com/iemr/hwc/fhir/config/fhirRestfulServer/FhirRestfulServer.java b/src/main/java/com/iemr/hwc/fhir/config/fhirRestfulServer/FhirRestfulServer.java index 4cca3f40..1dc7ed1d 100644 --- a/src/main/java/com/iemr/hwc/fhir/config/fhirRestfulServer/FhirRestfulServer.java +++ b/src/main/java/com/iemr/hwc/fhir/config/fhirRestfulServer/FhirRestfulServer.java @@ -11,6 +11,7 @@ import com.iemr.hwc.fhir.provider.condition.ConditionExtProvider; import com.iemr.hwc.fhir.provider.encounter.EncounterExtProvider; import com.iemr.hwc.fhir.provider.immunization.ImmunizationExtProvider; +import com.iemr.hwc.fhir.provider.medicationStatement.MedicationStatementExtProvider; import com.iemr.hwc.fhir.provider.observation.ObservationExtProvider; import com.iemr.hwc.fhir.provider.patient.PatientExtProvider; import org.hl7.fhir.r4.hapi.validation.FhirInstanceValidator; @@ -45,6 +46,7 @@ protected void initialize() throws ServletException{ resourceProviders.add(applicationContext.getBean(ConditionExtProvider.class)); resourceProviders.add(applicationContext.getBean(ObservationExtProvider.class)); resourceProviders.add(applicationContext.getBean(ImmunizationExtProvider.class)); + resourceProviders.add(applicationContext.getBean(MedicationStatementExtProvider.class)); setResourceProviders(resourceProviders); //Registering Interceptors diff --git a/src/main/java/com/iemr/hwc/fhir/dto/historyDetails/medicationHistory/MedicationHistoryDTO.java b/src/main/java/com/iemr/hwc/fhir/dto/historyDetails/medicationHistory/MedicationHistoryDTO.java index dacad31b..4eeae615 100644 --- a/src/main/java/com/iemr/hwc/fhir/dto/historyDetails/medicationHistory/MedicationHistoryDTO.java +++ b/src/main/java/com/iemr/hwc/fhir/dto/historyDetails/medicationHistory/MedicationHistoryDTO.java @@ -9,6 +9,7 @@ public class MedicationHistoryDTO { private String beneficiaryRegID; private Integer providerServiceMapID; private String benVisitID; + private String visitCode; private String createdBy; private Integer vanID; private Integer parkingPlaceID; diff --git a/src/main/java/com/iemr/hwc/fhir/model/medicationStatement/MedicationStatementExt.java b/src/main/java/com/iemr/hwc/fhir/model/medicationStatement/MedicationStatementExt.java new file mode 100644 index 00000000..a4ce86b7 --- /dev/null +++ b/src/main/java/com/iemr/hwc/fhir/model/medicationStatement/MedicationStatementExt.java @@ -0,0 +1,99 @@ +package com.iemr.hwc.fhir.model.medicationStatement; + +import ca.uhn.fhir.model.api.annotation.Child; +import ca.uhn.fhir.model.api.annotation.Description; +import ca.uhn.fhir.model.api.annotation.Extension; +import ca.uhn.fhir.model.api.annotation.ResourceDef; +import ca.uhn.fhir.util.ElementUtil; +import org.hl7.fhir.r4.model.MedicationStatement; +import org.hl7.fhir.r4.model.StringType; + +@ResourceDef(name = "MedicationStatement") +public class MedicationStatementExt extends MedicationStatement { + + @Description(shortDefinition = "Contains providerServiceMapId ") + @Extension(url = "http://hl7.org/fhir/StructureDefinition/MedicationStatement#MedicationStatement.providerServiceMapId", isModifier = false, definedLocally = true) + @Child(name = "providerServiceMapId") + private StringType providerServiceMapId; + + @Description(shortDefinition = "Contains vanID ") + @Extension(url = "http://hl7.org/fhir/StructureDefinition/MedicationStatement#MedicationStatement.vanID", isModifier = false, definedLocally = true) + @Child(name = "vanID") + private StringType vanID; + + @Description(shortDefinition = "Contains parkingPlaceID ") + @Extension(url = "http://hl7.org/fhir/StructureDefinition/MedicationStatement#MedicationStatement.parkingPlaceID", isModifier = false, definedLocally = true) + @Child(name = "parkingPlaceID") + private StringType parkingPlaceID; + + @Description(shortDefinition = "Contains createdBy ") + @Extension(url = "http://hl7.org/fhir/StructureDefinition/MedicationStatement#MedicationStatement.createdBy", isModifier = false, definedLocally = true) + @Child(name = "createdBy") + private StringType createdBy; + + @Description(shortDefinition = "Contains benFlowID ") + @Extension(url = "http://hl7.org/fhir/StructureDefinition/MedicationStatement#MedicationStatement.benFlowID", isModifier = false, definedLocally = true) + @Child(name = "benFlowID") + private StringType benFlowID; + + public StringType getProviderServiceMapId() { + if (providerServiceMapId == null) { + providerServiceMapId = new StringType(); + } + return providerServiceMapId; + } + + public void setProviderServiceMapId(StringType providerService_MapId) { + providerServiceMapId = providerService_MapId; + } + + public StringType getVanID() { + if (vanID == null) { + vanID = new StringType(); + } + return vanID; + } + + public void setVanID(StringType van_ID) { + vanID = van_ID; + } + + public StringType getParkingPlaceID() { + if (parkingPlaceID == null) { + parkingPlaceID = new StringType(); + } + return parkingPlaceID; + } + + public void setParkingPlaceID(StringType parking_PlaceID) { + parkingPlaceID = parking_PlaceID; + } + + public StringType getCreatedBy() { + if (createdBy == null) { + createdBy = new StringType(); + } + return createdBy; + } + + public void setCreatedBy(StringType created_By) { + createdBy = created_By; + } + + public StringType getBenFlowID() { + if (benFlowID == null) { + benFlowID = new StringType(); + } + return benFlowID; + } + + public void setBenFlowID(StringType benFlow_ID) { + benFlowID = benFlow_ID; + } + + @Override + public boolean isEmpty() { + return super.isEmpty() && ElementUtil.isEmpty(benFlowID , providerServiceMapId , + vanID , parkingPlaceID , createdBy ); + } +} diff --git a/src/main/java/com/iemr/hwc/fhir/provider/medicationStatement/MedicationStatementExtProvider.java b/src/main/java/com/iemr/hwc/fhir/provider/medicationStatement/MedicationStatementExtProvider.java new file mode 100644 index 00000000..b8848d0d --- /dev/null +++ b/src/main/java/com/iemr/hwc/fhir/provider/medicationStatement/MedicationStatementExtProvider.java @@ -0,0 +1,36 @@ +package com.iemr.hwc.fhir.provider.medicationStatement; + +import ca.uhn.fhir.rest.annotation.Create; +import ca.uhn.fhir.rest.annotation.ResourceParam; +import ca.uhn.fhir.rest.api.MethodOutcome; +import ca.uhn.fhir.rest.server.IResourceProvider; +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; +import com.iemr.hwc.fhir.service.medicationStatement.MedicationService; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.OperationOutcome; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; + +@Component +public class MedicationStatementExtProvider implements IResourceProvider { + + @Autowired + private MedicationService medicationService; + + @Override + public Class getResourceType() { + return MedicationStatementExt.class; + } + + @Create() + public MethodOutcome createMedicationStatement(HttpServletRequest theRequest, @ResourceParam MedicationStatementExt medicationStatementExt) throws Exception{ + + MethodOutcome method = new MethodOutcome(); + method.setCreated(true); + OperationOutcome opOutcome = new OperationOutcome(); + method.setOperationOutcome(opOutcome); + method.setResource(medicationService.createMedicationStatement(theRequest,medicationStatementExt)); + return method; + } +} diff --git a/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationService.java b/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationService.java new file mode 100644 index 00000000..e48c0018 --- /dev/null +++ b/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationService.java @@ -0,0 +1,8 @@ +package com.iemr.hwc.fhir.service.medicationStatement; + +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; +import javax.servlet.http.HttpServletRequest; + +public interface MedicationService { + MedicationStatementExt createMedicationStatement(HttpServletRequest theRequest, MedicationStatementExt medicationStatementExt) throws Exception; +} diff --git a/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationStatementServiceImpl.java b/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationStatementServiceImpl.java new file mode 100644 index 00000000..9fbe3737 --- /dev/null +++ b/src/main/java/com/iemr/hwc/fhir/service/medicationStatement/MedicationStatementServiceImpl.java @@ -0,0 +1,89 @@ +package com.iemr.hwc.fhir.service.medicationStatement; + +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.iemr.hwc.data.anc.WrapperMedicationHistory; +import com.iemr.hwc.data.benFlowStatus.BeneficiaryFlowStatus; +import com.iemr.hwc.fhir.dto.historyDetails.medicationHistory.MedicationHistoryDTO; +import com.iemr.hwc.fhir.dto.historyDetails.medicationHistory.MedicationListDTO; +import com.iemr.hwc.fhir.dto.mandatoryFieldsDTO.MandatoryFieldsDTO; +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; +import com.iemr.hwc.fhir.utils.mapper.MapperMethods; +import com.iemr.hwc.fhir.utils.mapper.MapperUtils; +import com.iemr.hwc.fhir.utils.validation.MedicationStatementValidation; +import com.iemr.hwc.repo.benFlowStatus.BeneficiaryFlowStatusRepo; +import com.iemr.hwc.service.common.transaction.CommonNurseServiceImpl; +import com.iemr.hwc.utils.exception.IEMRException; +import com.iemr.hwc.utils.mapper.InputMapper; +import org.mapstruct.factory.Mappers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; + +@Service +public class MedicationStatementServiceImpl implements MedicationService{ + + public MapperUtils mapper = Mappers.getMapper(MapperUtils.class); + + Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + @Autowired + private MedicationStatementValidation validation; + + @Autowired + private BeneficiaryFlowStatusRepo beneficiaryFlowStatusRepo; + + @Autowired + private CommonNurseServiceImpl commonNurseService; + + @Override + public MedicationStatementExt createMedicationStatement(HttpServletRequest theRequest, MedicationStatementExt medicationStatementExt) throws Exception { + + validation.medicationStatementValidator(medicationStatementExt); + + //Todo - Currently implemented considering all relevant IDs(benRegID, benFlowID) are coming in payload. + //Todo - If not, might need to write new APIs to fetch necessary IDs through some sort of logic. And then use those further. + MandatoryFieldsDTO mandatoryFieldsDTO = mapper.medicationStatementResourceToMandatoryFieldsDTO(medicationStatementExt); + + BeneficiaryFlowStatus beneficiaryFlowStatus = beneficiaryFlowStatusRepo.getBenDetailsForLeftSidePanel(Long.parseLong(mandatoryFieldsDTO.getBenFlowID())); + + if (beneficiaryFlowStatus !=null ) { + mandatoryFieldsDTO.setBenVisitID(beneficiaryFlowStatus.getBenVisitID().toString()); + mandatoryFieldsDTO.setVisitCode(beneficiaryFlowStatus.getBenVisitCode().toString()); + } + else { + logger.error("No beneficiary flow status record found for the provided benFlowID"); + throw new ResourceNotFoundException("No record found for given benFlowID"); + } + + MedicationHistoryDTO medicationHistoryDTO = mapper.mandatoryFieldsDTOToMedicationHistoryDTO(mandatoryFieldsDTO); + + if (medicationStatementExt.getMedicationCodeableConcept().hasCoding()) { + medicationHistoryDTO.setMedicationHistoryList(MapperMethods.medicationToMedicationListDTO(medicationStatementExt)); + } + else { + medicationHistoryDTO.setMedicationHistoryList(new ArrayList()); + } + + String medicationHistoryDTOGson = new GsonBuilder().create().toJson(medicationHistoryDTO); + JsonObject medicationHistoryDTOJson = new JsonParser().parse(medicationHistoryDTOGson).getAsJsonObject(); + + try{ + WrapperMedicationHistory wrapperMedicationHistory = InputMapper.gson() + .fromJson(medicationHistoryDTOJson, WrapperMedicationHistory.class); + + commonNurseService.updateBenMedicationHistory(wrapperMedicationHistory); + }catch (IEMRException e){ + logger.error("Encountered custom exception - IEMRException while trying to map Json with WrapperMedicationHistory class using Input Mapper " + e); + throw new InternalErrorException("Error mapping json to WrapperMedicationHistory class " + e); + } + + return medicationStatementExt; + } +} diff --git a/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperMethods.java b/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperMethods.java index 20d98ef8..b39ce38c 100644 --- a/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperMethods.java +++ b/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperMethods.java @@ -5,17 +5,16 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.iemr.hwc.fhir.dto.beneficiary.benIdentities.GovtIdentitiesDTO; +import com.iemr.hwc.fhir.dto.historyDetails.medicationHistory.MedicationListDTO; import com.iemr.hwc.fhir.dto.historyDetails.pastHistory.PastIllnessDTO; import com.iemr.hwc.fhir.dto.historyDetails.pastHistory.PastSurgeryDTO; import com.iemr.hwc.fhir.dto.vitalDetails.VitalDetailsDTO; import com.iemr.hwc.fhir.model.encounter.EncounterExt; +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; import com.iemr.hwc.fhir.model.observation.ObservationExt; import com.iemr.hwc.fhir.model.patient.PatientExt; import com.iemr.hwc.utils.exception.IEMRException; import com.iemr.hwc.utils.mapper.InputMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -152,4 +151,22 @@ public static List observationPastHistoryToPastSurgeryDTO(Observ } return pastSurgeryDTOList; } + + public static List medicationToMedicationListDTO(MedicationStatementExt medicationStatementExt) { + List medicationDTOList = new ArrayList<>(); + for (int i=0 ; i < medicationStatementExt.getMedicationCodeableConcept().getCoding().size() ; i++){ + MedicationListDTO medicationListDTO = new MedicationListDTO(); + + medicationListDTO.setCurrentMedication(medicationStatementExt.getMedicationCodeableConcept().getCoding().get(i).getDisplay()); + + if(medicationStatementExt.getMedicationCodeableConcept().getCoding().get(i).hasCode()) { + String[] arr = medicationStatementExt.getMedicationCodeableConcept().getCoding().get(i).getCode().split(","); + medicationListDTO.setTimePeriodAgo(arr[0]); + medicationListDTO.setTimePeriodUnit(arr[1]); + } + + medicationDTOList.add(medicationListDTO); + } + return medicationDTOList; + } } diff --git a/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperUtils.java b/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperUtils.java index f44e5197..353fee2a 100644 --- a/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperUtils.java +++ b/src/main/java/com/iemr/hwc/fhir/utils/mapper/MapperUtils.java @@ -6,6 +6,7 @@ import com.iemr.hwc.fhir.dto.covidVaccineStatus.CovidVaccineStatusDTO; import com.iemr.hwc.fhir.dto.examinationDetails.ExaminationDetailsMainDTO; import com.iemr.hwc.fhir.dto.historyDetails.HistoryDetailsMainDTO; +import com.iemr.hwc.fhir.dto.historyDetails.medicationHistory.MedicationHistoryDTO; import com.iemr.hwc.fhir.dto.historyDetails.pastHistory.PastHistoryDTO; import com.iemr.hwc.fhir.dto.mandatoryFieldsDTO.MandatoryFieldsDTO; import com.iemr.hwc.fhir.dto.nurseForm.NurseFormDTO; @@ -17,6 +18,7 @@ import com.iemr.hwc.fhir.model.condition.ConditionExt; import com.iemr.hwc.fhir.model.encounter.EncounterExt; import com.iemr.hwc.fhir.model.immunization.ImmunizationExt; +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; import com.iemr.hwc.fhir.model.observation.ObservationExt; import com.iemr.hwc.fhir.model.patient.PatientExt; import org.mapstruct.Mapper; @@ -171,7 +173,7 @@ public interface MapperUtils { @Mappings({@Mapping(target = "providerServiceMapID", expression = "java(null == immunizationExt.getProviderServiceMapId().asStringValue() ? null : Integer.parseInt(immunizationExt.getProviderServiceMapId().asStringValue()))"), @Mapping(target = "parkingPlaceID", expression = "java(null == immunizationExt.getParkingPlaceID().asStringValue() ? null : Integer.parseInt(immunizationExt.getParkingPlaceID().asStringValue()))"), @Mapping(target = "vanID", expression = "java(null == immunizationExt.getVanID().asStringValue() ? null : Integer.parseInt(immunizationExt.getVanID().asStringValue()))"), - @Mapping(target = "beneficiaryRegID", expression = "java(immunizationExt.getPatient().getReference())"), + @Mapping(target = "beneficiaryRegID", expression = "java(immunizationExt.getPatient().getDisplay())"), @Mapping(target = "createdBy", expression = "java(immunizationExt.getCreatedBy().asStringValue())"), @Mapping(target = "modifiedBy", expression = "java(immunizationExt.getModifiedBy().asStringValue())") }) @@ -191,6 +193,17 @@ public interface MapperUtils { }) CovidVaccineStatusDTO immunizationResourceToCovidVaccineStatusDTO(ImmunizationExt immunizationExt, MandatoryFieldsDTO mandatoryFieldsDTO); + @Mappings({@Mapping(target = "providerServiceMapID", expression = "java(Integer.parseInt(medicationStatementExt.getProviderServiceMapId().asStringValue()))"), + @Mapping(target = "parkingPlaceID", expression = "java(Integer.parseInt(medicationStatementExt.getParkingPlaceID().asStringValue()))"), + @Mapping(target = "vanID", expression = "java(Integer.parseInt(medicationStatementExt.getVanID().asStringValue()))"), + @Mapping(target = "benFlowID", expression = "java(medicationStatementExt.getBenFlowID().asStringValue())"), + @Mapping(target = "beneficiaryRegID", expression = "java(medicationStatementExt.getSubject().getDisplay())"), + @Mapping(target = "createdBy", expression = "java(medicationStatementExt.getCreatedBy().asStringValue())"), + }) + MandatoryFieldsDTO medicationStatementResourceToMandatoryFieldsDTO(MedicationStatementExt medicationStatementExt); + + MedicationHistoryDTO mandatoryFieldsDTOToMedicationHistoryDTO(MandatoryFieldsDTO mandatoryFieldsDTO); + diff --git a/src/main/java/com/iemr/hwc/fhir/utils/validation/ImmunizationValidation.java b/src/main/java/com/iemr/hwc/fhir/utils/validation/ImmunizationValidation.java index 49e1db68..1025fd2e 100644 --- a/src/main/java/com/iemr/hwc/fhir/utils/validation/ImmunizationValidation.java +++ b/src/main/java/com/iemr/hwc/fhir/utils/validation/ImmunizationValidation.java @@ -36,6 +36,11 @@ public void immunizationResourceValidator(ImmunizationExt immunizationExt) throw errMessages.add("Mandatory extension 'vanId' missing"); } + if (!immunizationExt.getPatient().hasDisplay()) { + logger.error("Error while validating Immunization resource. benRegID is a mandatory field and is MISSING"); + errMessages.add("Mandatory field 'display'(benRegID) in 'patient' missing"); + } + //If vaccination is done then validations for type of vaccine, type of dose if (immunizationExt.getStatus().getDisplay().equalsIgnoreCase("completed")) { if (!immunizationExt.getVaccineCode().hasText()) { diff --git a/src/main/java/com/iemr/hwc/fhir/utils/validation/MedicationStatementValidation.java b/src/main/java/com/iemr/hwc/fhir/utils/validation/MedicationStatementValidation.java new file mode 100644 index 00000000..85ad33b2 --- /dev/null +++ b/src/main/java/com/iemr/hwc/fhir/utils/validation/MedicationStatementValidation.java @@ -0,0 +1,52 @@ +package com.iemr.hwc.fhir.utils.validation; + +import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; +import com.iemr.hwc.fhir.model.medicationStatement.MedicationStatementExt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import java.util.ArrayList; + +@Service +public class MedicationStatementValidation { + + Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + public void medicationStatementValidator(MedicationStatementExt medicationStatementExt) throws UnprocessableEntityException { + ArrayList errMessages = new ArrayList<>(); + + if (medicationStatementExt.getBenFlowID().isEmpty()) { + logger.error("Error while validating MedicationStatement resource. BenFlowID is a mandatory field and is MISSING"); + errMessages.add("Mandatory extension 'benFlowID' missing"); + } + + if (medicationStatementExt.getCreatedBy().isEmpty()) { + logger.error("Error while validating MedicationStatement resource. CreatedBy is a mandatory field and is MISSING"); + errMessages.add("Mandatory extension 'createdBy' missing"); + } + + if (medicationStatementExt.getProviderServiceMapId().isEmpty()) { + logger.error("Error while validating MedicationStatement resource. providerServiceMapId is a mandatory field and is MISSING"); + errMessages.add("Mandatory extension 'providerServiceMapId' missing"); + } + + if (medicationStatementExt.getParkingPlaceID().isEmpty()) { + logger.error("Error while validating MedicationStatement resource. parkingPlaceId is a mandatory field and is MISSING"); + errMessages.add("Mandatory extension 'parkingPlaceId' missing"); + } + + if (medicationStatementExt.getVanID().isEmpty()) { + logger.error("Error while validating MedicationStatement resource. vanId is a mandatory field and is MISSING"); + errMessages.add("Mandatory extension 'vanId' missing"); + } + + if (!medicationStatementExt.getSubject().hasDisplay()) { + logger.error("Error while validating MedicationStatement resource. benRegID is a mandatory field and is MISSING"); + errMessages.add("Mandatory field 'display'(benRegID) in 'subject' missing"); + } + + if(!errMessages.isEmpty()){ + throw new UnprocessableEntityException(errMessages.toArray(new String[0])); + } + } +}