diff --git a/pom.xml b/pom.xml index c3b57f1c..9eda8258 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.common.identity identity-api - 3.6.2 + 3.9.0 war diff --git a/src/main/java/com/iemr/common/identity/controller/IdentityController.java b/src/main/java/com/iemr/common/identity/controller/IdentityController.java index 16995734..fc894761 100644 --- a/src/main/java/com/iemr/common/identity/controller/IdentityController.java +++ b/src/main/java/com/iemr/common/identity/controller/IdentityController.java @@ -30,10 +30,13 @@ import java.util.List; import java.util.Objects; +import com.iemr.common.identity.data.rmnch.RMNCHBeneficiaryDetailsRmnch; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -315,6 +318,17 @@ public String searchBeneficiaryByVillageIdAndLastModDate( } return response; } + + + @PostMapping("/getRmnchDataByBenRedID") + public ResponseEntity getRmnchDataByBenID(@RequestBody BigInteger object) { + try { + RMNCHBeneficiaryDetailsRmnch data = svc.getRmnchDataByBenID(object); + return ResponseEntity.ok(data); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); + } + } // search beneficiary by lastModDate and districtID @Operation(summary ="Get count of beneficiary by villageId and last modified date-time") @PostMapping(path = "/countBenByVillageIdAndLastModifiedDate") diff --git a/src/main/java/com/iemr/common/identity/controller/rmnch/RMNCHMobileAppController.java b/src/main/java/com/iemr/common/identity/controller/rmnch/RMNCHMobileAppController.java index 198fd5fc..f8a8957f 100644 --- a/src/main/java/com/iemr/common/identity/controller/rmnch/RMNCHMobileAppController.java +++ b/src/main/java/com/iemr/common/identity/controller/rmnch/RMNCHMobileAppController.java @@ -23,10 +23,13 @@ import java.sql.Timestamp; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; @@ -56,11 +59,11 @@ public class RMNCHMobileAppController { @PostMapping(value = "/syncDataToAmrit", consumes = "application/json", produces = "application/json") @Operation(summary = "Sync data to AMRIT for already regestered beneficiary with AMRIT beneficiary id ") - public String syncDataToAmrit(@RequestBody String requestOBJ) { + public String syncDataToAmrit(@RequestBody String requestOBJ,@RequestHeader(value = "jwttoken") String authorization) { OutputResponse response = new OutputResponse(); try { if (requestOBJ != null) { - String s = rmnchDataSyncService.syncDataToAmrit(requestOBJ); + String s = rmnchDataSyncService.syncDataToAmrit(requestOBJ,authorization); response.setResponse(s); } else response.setError(5000, "Invalid/NULL request obj"); @@ -73,6 +76,46 @@ public String syncDataToAmrit(@RequestBody String requestOBJ) { } + @PostMapping(value = "/syncDataToAmritByHwc", consumes = "application/json", produces = "application/json") + @Operation(summary = "Sync data to AMRIT for already registered beneficiary with AMRIT beneficiary id") + public ResponseEntity syncDataToAmritHwc(@RequestBody String requestOBJ) { + + try { + if (requestOBJ == null || requestOBJ.isEmpty()) { + return ResponseEntity.badRequest().body("Invalid/NULL request obj"); + } + + JsonObject requestObj = new Gson().fromJson(requestOBJ, JsonObject.class); + + Long beneficiaryID = requestObj.has("benficieryid") && !requestObj.get("benficieryid").isJsonNull() + ? requestObj.get("benficieryid").getAsLong() + : null; + + Long beneficiaryRegID = requestObj.has("benRegId") && !requestObj.get("benRegId").isJsonNull() + ? requestObj.get("benRegId").getAsLong() + : null; + + if (beneficiaryID == null || beneficiaryRegID == null) { + return ResponseEntity.badRequest().body("beneficiaryID or beneficiaryRegID is missing"); + } + + String result = rmnchDataSyncService.saveBeneficiaryDetailsAfterRegistration( + beneficiaryID, + beneficiaryRegID, + requestOBJ + ); + + return ResponseEntity.ok(result); + + } catch (Exception e) { + logger.error("Error in RMNCH mobile data sync : {}", e.getMessage()); + return ResponseEntity.internalServerError() + .body("Error in RMNCH mobile data sync : " + e.getMessage()); + } + } + + + // @Deprecated @PostMapping(value = "/getBeneficiaryDataForVillage", consumes = "application/json", produces = "application/json") @Operation(summary = "Get beneficiary data for given village ") diff --git a/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java b/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java index 4cab210c..e403b3d7 100644 --- a/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java +++ b/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java @@ -550,4 +550,7 @@ public class RMNCHBeneficiaryDetailsRmnch { @Expose private Boolean isDeactivate; + @Expose + @Transient + private String abhaId; } diff --git a/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHMBeneficiarydetail.java b/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHMBeneficiarydetail.java index 397c5a66..d9221675 100644 --- a/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHMBeneficiarydetail.java +++ b/src/main/java/com/iemr/common/identity/data/rmnch/RMNCHMBeneficiarydetail.java @@ -214,4 +214,8 @@ public class RMNCHMBeneficiarydetail { @Expose @Transient private Integer ProviderServiceMapID; + + @Expose + @Transient + private String abhaId; } \ No newline at end of file diff --git a/src/main/java/com/iemr/common/identity/dto/BeneficiariesDTO.java b/src/main/java/com/iemr/common/identity/dto/BeneficiariesDTO.java index d48cd9b5..0ecfb6b2 100644 --- a/src/main/java/com/iemr/common/identity/dto/BeneficiariesDTO.java +++ b/src/main/java/com/iemr/common/identity/dto/BeneficiariesDTO.java @@ -89,6 +89,8 @@ public int compareTo(BeneficiariesDTO ben) { private BigInteger religionId; private String religion; private String monthlyFamilyIncome; + private String reproductiveStatus; + private Integer reproductiveStatusId; // End Outreach // Start 1097 diff --git a/src/main/java/com/iemr/common/identity/dto/IdentityDTO.java b/src/main/java/com/iemr/common/identity/dto/IdentityDTO.java index 322e57fc..f6c000cb 100644 --- a/src/main/java/com/iemr/common/identity/dto/IdentityDTO.java +++ b/src/main/java/com/iemr/common/identity/dto/IdentityDTO.java @@ -125,6 +125,8 @@ public class IdentityDTO { private Integer incomeStatusId; private String incomeStatus; private String monthlyFamilyIncome; + private String reproductiveStatus; + private Integer reproductiveStatusId; @Expose private Integer vanID; diff --git a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBenDetailsRepo.java b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBenDetailsRepo.java index 1bc948a3..27c7a445 100644 --- a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBenDetailsRepo.java +++ b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBenDetailsRepo.java @@ -24,6 +24,7 @@ import java.math.BigInteger; import java.util.List; +import io.swagger.v3.oas.annotations.info.License; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; @@ -36,8 +37,16 @@ public interface RMNCHBenDetailsRepo extends CrudRepository getByBenRegID(@Param("beneficiaryRegID") BigInteger beneficiaryRegID); + + @Query(""" + SELECT t + FROM RMNCHMBeneficiarydetail t + WHERE t.id IN ( + SELECT m.benDetailsId + FROM RMNCHMBeneficiarymapping m + WHERE m.benRegId = :beneficiaryRegID + ) + """) + List getByBenRegID( + @Param("beneficiaryRegID") BigInteger beneficiaryRegID); } diff --git a/src/main/java/com/iemr/common/identity/service/IdentityService.java b/src/main/java/com/iemr/common/identity/service/IdentityService.java index 6e8a71ef..90e660b9 100644 --- a/src/main/java/com/iemr/common/identity/service/IdentityService.java +++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java @@ -809,6 +809,16 @@ public List searchBeneficiaryByVillageIdAndLastModifyDate(List return beneficiaryList; } + + public RMNCHBeneficiaryDetailsRmnch getRmnchDataByBenID(BigInteger benID) { + RMNCHBeneficiaryDetailsRmnch rmnchBeneficiaryDetailsRmnch = new RMNCHBeneficiaryDetailsRmnch(); + + if(!rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID).isEmpty()){ + rmnchBeneficiaryDetailsRmnch = rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID).get(0); + } + return rmnchBeneficiaryDetailsRmnch; + } + public Long countBeneficiaryByVillageIdAndLastModifyDate(List villageIDs, Timestamp lastModifiedDate) { Long beneficiaryCount = 0L; try { @@ -1993,6 +2003,7 @@ public List getBeneficiariesDeatilsByBenRegIdList(List resultMap = new HashMap(); @@ -128,6 +137,8 @@ public String syncDataToAmrit(String requestOBJ) throws Exception { // other tables data saving // ben details RMNCH extra fields details + logger.info("Request object of syncDataToAmrit: "+jsnOBJ); + BigInteger benRegID = null; @@ -182,9 +193,15 @@ public String syncDataToAmrit(String requestOBJ) throws Exception { rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus()); rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId()); benDetailsList.add(rmnchmBeneficiarydetail); + if (obj.getAbhaId()!=null && !obj.getAbhaId().isEmpty()) { + mapHealthIDToBeneficiary(authorization,obj.getBenRegId().longValue(),obj.getBenficieryid().longValue(),obj.getAbhaId(),obj.getCreatedBy(),obj.getFirstName(),obj.getLastName(),obj.getDob().toString(),obj.getProviderServiceMapID()); + + } + } } + } benDetailsExtraList = (ArrayList) rMNCHBeneficiaryDetailsRmnchRepo @@ -265,8 +282,11 @@ public String syncDataToAmrit(String requestOBJ) throws Exception { } catch ( Exception e) { + logger.error("Full Exception", e); + throw new Exception(e); // ✅ original exception wrap karo + } resultMap.put("beneficiaryDetails", beneficiaryDetailsIds); resultMap.put("bornBirthDeatils", bornBirthDeatilsIds); @@ -276,6 +296,229 @@ public String syncDataToAmrit(String requestOBJ) throws Exception { return new Gson().toJson(resultMap); } + public String mapHealthIDToBeneficiary(String authorization, + Long benRegID, + Long beneficiaryID, + String abhaId, + String createdBy,String firstName,String lastName,String dob,Integer providerServiceMapId) { + try { + RestTemplate restTemplate = new RestTemplate(); + String formattedDob = dob; + + try { + if (dob != null && dob.contains(" ")) { + Timestamp timestamp = Timestamp.valueOf(dob); + formattedDob = new SimpleDateFormat("dd-MM-yyyy") + .format(timestamp); + } + } catch (Exception ex) { + logger.warn("DOB format conversion failed, sending original DOB : {}", dob); + } + logger.info("Authorization Token : {}", authorization); + + Map requestMap = new HashMap<>(); + + requestMap.put("beneficiaryRegID", benRegID); + requestMap.put("beneficiaryID", beneficiaryID); + requestMap.put("healthIdNumber", abhaId); + + requestMap.put("createdBy", createdBy); + requestMap.put("providerServiceMapId", providerServiceMapId); + requestMap.put("isNew", false); + + // ABHA Profile + Map abhaProfile = new HashMap<>(); + abhaProfile.put("ABHANumber", abhaId); + + List phrAddress = new ArrayList<>(); + phrAddress.add(abhaId + "@abdm"); + + abhaProfile.put("phrAddress", phrAddress); + abhaProfile.put("firstName", firstName); + abhaProfile.put("middleName", ""); + abhaProfile.put("lastName", lastName); + abhaProfile.put("dob", formattedDob); + + + requestMap.put("ABHAProfile", abhaProfile); + + String requestBody = new Gson().toJson(requestMap); + + String url = fhirUrl + + ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"); + + logger.info("Calling URL : {}", url); + logger.info("Request Body : {}", requestBody); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + // Agar token me Bearer nahi aa raha hai + + headers.set("Jwttoken", authorization); + + HttpEntity entity = + new HttpEntity<>(requestBody, headers); + + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + String.class + ); + + logger.info("ABHA Mapping Response : {}", response.getBody()); + + return response.getBody(); + + } catch (HttpClientErrorException e) { + + logger.error("HTTP Error Status : {}", e.getStatusCode()); + logger.error("HTTP Error Response : {}", e.getResponseBodyAsString(), e); + + return "HTTP Error : " + e.getStatusCode(); + + } catch (Exception e) { + + logger.error("Error while saving Health ID Mapping", e); + + return "Error Save Health Id : " + e.getMessage(); + } + + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String saveBeneficiaryDetailsAfterRegistration( + Long beneficiaryID, + Long beneficiaryRegID, + String comingRequest) { + + logger.info("Method started. beneficiaryID={}, beneficiaryRegID={}", + beneficiaryID, beneficiaryRegID); + + try { + + JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class); + logger.info("Request Parsed Successfully"); + + List list = + rMNCHBeneficiaryDetailsRmnchRepo.getByRegID( + BigInteger.valueOf(beneficiaryRegID)); + + logger.info("Records found for RegID {} : {}", beneficiaryRegID, list.size()); + + RMNCHBeneficiaryDetailsRmnch entity; + boolean isNew = list.isEmpty(); + + if (isNew) { + entity = new RMNCHBeneficiaryDetailsRmnch(); + logger.info("Creating new RMNCH record"); + } else { + entity = list.get(0); + logger.info("Updating existing RMNCH record. ID={}", + entity.getBeneficiaryDetails_RmnchId()); + } + + String createdBy = getString(requestObj, "createdBy", "system"); + + entity.setBenficieryid(BigInteger.valueOf(beneficiaryID)); + entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID)); + + if (isNew) { + entity.setCreatedBy(createdBy); + entity.setCreatedDate(new Timestamp(System.currentTimeMillis())); + } else { + entity.setUpdatedBy(createdBy); + entity.setUpdatedDate(new Timestamp(System.currentTimeMillis())); + } + + entity.setVanID(getInt(requestObj, "vanID", null)); + entity.setParkingPlaceID(getInt(requestObj, "parkingPlaceID", null)); + entity.setProviderServiceMapID(getInt(requestObj, "providerServiceMapID", null)); + entity.setGenderId(getInt(requestObj, "genderID", null)); + + entity.setReproductiveStatusId( + getInt( + requestObj, + "reproductiveStatusId", + getInt(requestObj, "maritalStatusID", null) + ) + ); + + entity.setReproductiveStatus( + getString(requestObj, "reproductiveStatus", null) + ); + + entity.setFirstName(getString(requestObj, "firstName", null)); + entity.setLastName(getString(requestObj, "lastName", null)); + entity.setFatherName(getString(requestObj, "fatherName", null)); + entity.setSpousename(getString(requestObj, "spouseName", null)); + + entity.setMaritalstatusId( + getInt(requestObj, "maritalStatusID", null) + ); + + entity.setMaritalstatus( + getString(requestObj, "maritalStatusName", null) + ); + + // DOB + if (requestObj.has("dOB") + && !requestObj.get("dOB").isJsonNull() + && requestObj.get("dOB").getAsString().trim().length() > 0) { + + try { + entity.setDob( + Timestamp.valueOf( + requestObj.get("dOB") + .getAsString() + .replace("T", " ") + .replace("Z", "") + ) + ); + + logger.info("DOB set successfully"); + + } catch (Exception ex) { + logger.error("Invalid DOB format : {}", + requestObj.get("dOB").getAsString(), ex); + } + } + + logger.info("Before save"); + + RMNCHBeneficiaryDetailsRmnch saved = + rMNCHBeneficiaryDetailsRmnchRepo.save(entity); + + logger.info("After save. Saved ID={}", + saved.getBeneficiaryDetails_RmnchId()); + + logger.info("Saved RMNCH for benRegID={}", beneficiaryRegID); + + return "Saved RMNCH for beneficiaryID: " + beneficiaryID; + + } catch (Exception e) { + + logger.error( + "Exception occurred in saveBeneficiaryDetailsAfterRegistration", + e + ); + + return "Error save beneficiary in rmnch : " + e.getMessage(); + } + } + private String getString(JsonObject obj, String key, String defaultVal) { + return (obj.has(key) && !obj.get(key).isJsonNull()) + ? obj.get(key).getAsString() + : defaultVal; + } + + private Integer getInt(JsonObject obj, String key, Integer defaultVal) { + return (obj.has(key) && !obj.get(key).isJsonNull()) + ? obj.get(key).getAsInt() + : defaultVal; + } @Override public String getBenData(String requestOBJ, String authorisation) throws Exception { String outputResponse = null; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 12be1b44..79ba181f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -148,6 +148,7 @@ spring.jpa.properties.hibernate.show_sql=false door-to-door-page-size=2 get-HRP-Status=ANC/getHRPStatus getHealthID=healthID/getBenhealthID +mapHealthIDToBeneficiary=healthIDRecord/mapHealthIDToBeneficiary spring.main.allow-bean-definition-overriding=true spring.main.allow-circular-references=true