From db1c562f7970331f8be1f25c71a056e4ed40e27a Mon Sep 17 00:00:00 2001
From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com>
Date: Thu, 25 Sep 2025 11:54:58 +0530
Subject: [PATCH 01/42] Update pom.xml
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index dee19366..3cf9dfcc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0com.iemr.common.identityidentity-api
- 3.1.0
+ 3.8.0war
From 6bdd82251233e391a564a115d467c1e710b84bd7 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 14:08:49 +0530
Subject: [PATCH 02/42] add status of women
---
.../rmnch/RMNCHMobileAppController.java | 20 +++++++
.../rmnch/RmnchDataSyncServiceImpl.java | 58 +++++++++++++++++++
2 files changed, 78 insertions(+)
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 26b2694c..d9bec043 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
@@ -72,6 +72,26 @@ public String syncDataToAmrit(@RequestBody String requestOBJ) {
}
+ @PostMapping(value = "/syncDataToAmritByHwc", consumes = "application/json", produces = "application/json")
+ @Operation(summary = "Sync data to AMRIT for already regestered beneficiary with AMRIT beneficiary id ")
+ public String syncDataToAmritHwc(@RequestBody String requestOBJ) {
+ OutputResponse response = new OutputResponse();
+ try {
+ if (requestOBJ != null) {
+ String s = rmnchDataSyncService.syncDataToAmrit(requestOBJ);
+ response.setResponse(s);
+ } else
+ response.setError(5000, "Invalid/NULL request obj");
+ } catch (Exception e) {
+ logger.error("Error in RMNCH mobile data sync : {} " , e.getMessage());
+ response.setError(5000, "Error in RMNCH mobile data sync : " + e);
+ }
+ return response.toString();
+
+ }
+
+
+
// @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/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index bd973193..5b7bb79d 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -267,6 +267,64 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
return new Gson().toJson(resultMap);
}
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ public void saveBeneficiaryDetailsAfterRegistration(
+ Long beneficiaryID,
+ Long beneficiaryRegID,
+ String comingRequest) {
+ try {
+ JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class);
+
+ RMNCHBeneficiaryDetailsRmnch beneficiaryDetailsRmnch =
+ rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+
+ if (beneficiaryDetailsRmnch == null) {
+ beneficiaryDetailsRmnch = new RMNCHBeneficiaryDetailsRmnch();
+ }
+
+ beneficiaryDetailsRmnch.setBenficieryid(BigInteger.valueOf(beneficiaryID));
+ beneficiaryDetailsRmnch.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
+ beneficiaryDetailsRmnch.setCreatedBy(
+ requestObj.get("createdBy").getAsString());
+ beneficiaryDetailsRmnch.setVanID(
+ requestObj.get("vanID").getAsInt());
+ beneficiaryDetailsRmnch.setParkingPlaceID(
+ requestObj.get("parkingPlaceID").getAsInt());
+ beneficiaryDetailsRmnch.setProviderServiceMapID(
+ requestObj.get("providerServiceMapID").getAsInt());
+ beneficiaryDetailsRmnch.setGenderId(
+ requestObj.get("genderID").getAsInt());
+ beneficiaryDetailsRmnch.setReproductiveStatusId(
+ requestObj.get("maritalStatusID").getAsInt());
+
+ if (requestObj.get("maritalStatusName") != null
+ && !requestObj.get("maritalStatusName").isJsonNull()) {
+ beneficiaryDetailsRmnch.setReproductiveStatus(
+ requestObj.get("maritalStatusName").getAsString());
+ }
+
+ beneficiaryDetailsRmnch.setReproductiveStatusId(
+ requestObj.has("reproductiveStatusId") && !requestObj.get("reproductiveStatusId").isJsonNull()
+ ? requestObj.get("reproductiveStatusId").getAsInt()
+ : requestObj.get("maritalStatusID").getAsInt()
+ );
+
+ beneficiaryDetailsRmnch.setReproductiveStatus(
+ requestObj.has("reproductiveStatus") && !requestObj.get("reproductiveStatus").isJsonNull()
+ ? requestObj.get("reproductiveStatus").getAsString()
+ : null
+ );
+
+ rMNCHBeneficiaryDetailsRmnchRepo.save(beneficiaryDetailsRmnch);
+ logger.info("BeneficiaryDetailsRmnch saved for beneficiaryRegID: " + beneficiaryRegID);
+
+ } catch (Exception e) {
+ logger.error("Error saving BeneficiaryDetailsRmnch: " + e.getMessage());
+ throw e;
+ }
+ }
+
@Override
public String getBenData(String requestOBJ, String authorisation) throws Exception {
String outputResponse = null;
From 58f3d5c2d10682a8a516a9d0a89a1c034da2fc43 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 15:44:44 +0530
Subject: [PATCH 03/42] add status of women
---
.../identity/controller/rmnch/RMNCHMobileAppController.java | 2 +-
.../common/identity/service/rmnch/RmnchDataSyncService.java | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
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 d9bec043..83153453 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
@@ -78,7 +78,7 @@ public String syncDataToAmritHwc(@RequestBody String requestOBJ) {
OutputResponse response = new OutputResponse();
try {
if (requestOBJ != null) {
- String s = rmnchDataSyncService.syncDataToAmrit(requestOBJ);
+ String s = rmnchDataSyncService.saveBeneficiaryDetailsAfterRegistration(requestOBJ);
response.setResponse(s);
} else
response.setError(5000, "Invalid/NULL request obj");
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
index 1d343d4b..e7f18d14 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
@@ -23,6 +23,7 @@
public interface RmnchDataSyncService {
public String syncDataToAmrit(String requestOBJ) throws Exception;
+ public String saveBeneficiaryDetailsAfterRegistration(String requestOBJ) throws Exception;
public String getBenData(String requestOBJ, String authorisation) throws Exception;
public String getBenDataByAsha(String requestOBJ, String authorisation) throws Exception;
}
From c16275af681623c9296c87b7d31b9d164d830bcd Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 16:11:02 +0530
Subject: [PATCH 04/42] add status of women
---
.../java/com/iemr/common/identity/dto/BeneficiariesDTO.java | 2 ++
.../com/iemr/common/identity/service/IdentityService.java | 5 +++++
2 files changed, 7 insertions(+)
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/service/IdentityService.java b/src/main/java/com/iemr/common/identity/service/IdentityService.java
index 08b9fbbe..72d7d7e0 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -1996,6 +1996,11 @@ private BeneficiariesDTO getBeneficiariesDTO(MBeneficiarymapping benMap) {
bdto.setFaceEmbedding(floatList);
}
// bdto.setOtherFields(benMap.getMBeneficiarydetail().getOtherFields());
+ if(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId())!=null ){
+ bdto.setReproductiveStatus(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId()).getMenstrualStatus());
+ bdto.setReproductiveStatusId(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId()).getReproductiveStatusId());
+ }
+
bdto.setBeneficiaryFamilyTags(
mapper.mapToMBeneficiaryfamilymappingWithBenFamilyDTOList(benMap.getMBeneficiaryfamilymappings()));
bdto.setBeneficiaryIdentites(
From a137f00b88ab822bf5a63d5230cceab08f870ec6 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 16:11:31 +0530
Subject: [PATCH 05/42] add status of women
---
.../java/com/iemr/common/identity/service/IdentityService.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 72d7d7e0..40f2d2e6 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -1997,7 +1997,7 @@ private BeneficiariesDTO getBeneficiariesDTO(MBeneficiarymapping benMap) {
}
// bdto.setOtherFields(benMap.getMBeneficiarydetail().getOtherFields());
if(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId())!=null ){
- bdto.setReproductiveStatus(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId()).getMenstrualStatus());
+ bdto.setReproductiveStatus(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId()).getReproductiveStatus());
bdto.setReproductiveStatusId(rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benMap.getBenRegId()).getReproductiveStatusId());
}
From e96a15247b2b8b10d0b679ad21a9bef87a758726 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 16:15:24 +0530
Subject: [PATCH 06/42] add status of women
---
.../common/identity/service/rmnch/RmnchDataSyncService.java | 5 ++++-
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 3 ++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
index e7f18d14..845e79f9 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
@@ -23,7 +23,10 @@
public interface RmnchDataSyncService {
public String syncDataToAmrit(String requestOBJ) throws Exception;
- public String saveBeneficiaryDetailsAfterRegistration(String requestOBJ) throws Exception;
+ public String saveBeneficiaryDetailsAfterRegistration(
+ Long beneficiaryID,
+ Long beneficiaryRegID,
+ String comingRequest);
public String getBenData(String requestOBJ, String authorisation) throws Exception;
public String getBenDataByAsha(String requestOBJ, String authorisation) throws Exception;
}
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 5b7bb79d..963b77ad 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -269,7 +269,7 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
- public void saveBeneficiaryDetailsAfterRegistration(
+ public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
Long beneficiaryRegID,
String comingRequest) {
@@ -323,6 +323,7 @@ public void saveBeneficiaryDetailsAfterRegistration(
logger.error("Error saving BeneficiaryDetailsRmnch: " + e.getMessage());
throw e;
}
+ return "BeneficiaryDetailsRmnch saved for beneficiaryRegID:"+beneficiaryID;
}
@Override
From ef5827529dd08a79e3a01024d8386445f65b693e Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 16:25:54 +0530
Subject: [PATCH 07/42] add status of women
---
.../rmnch/RMNCHMobileAppController.java | 47 ++++++++++++++-----
.../rmnch/RmnchDataSyncServiceImpl.java | 4 ++
2 files changed, 39 insertions(+), 12 deletions(-)
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 83153453..6fa8df8f 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;
@@ -73,21 +76,41 @@ public String syncDataToAmrit(@RequestBody String requestOBJ) {
}
@PostMapping(value = "/syncDataToAmritByHwc", consumes = "application/json", produces = "application/json")
- @Operation(summary = "Sync data to AMRIT for already regestered beneficiary with AMRIT beneficiary id ")
- public String syncDataToAmritHwc(@RequestBody String requestOBJ) {
- OutputResponse response = new OutputResponse();
+ @Operation(summary = "Sync data to AMRIT for already registered beneficiary with AMRIT beneficiary id")
+ public ResponseEntity> syncDataToAmritHwc(@RequestBody String requestOBJ) {
+
try {
- if (requestOBJ != null) {
- String s = rmnchDataSyncService.saveBeneficiaryDetailsAfterRegistration(requestOBJ);
- response.setResponse(s);
- } else
- response.setError(5000, "Invalid/NULL request obj");
+ 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());
- response.setError(5000, "Error in RMNCH mobile data sync : " + e);
+ logger.error("Error in RMNCH mobile data sync : {}", e.getMessage());
+ return ResponseEntity.internalServerError()
+ .body("Error in RMNCH mobile data sync : " + e.getMessage());
}
- return response.toString();
-
}
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 963b77ad..3348267e 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -32,6 +32,8 @@
import java.util.Map;
import java.util.regex.Pattern;
+import com.iemr.common.identity.utils.OutputResponse;
+import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -77,6 +79,8 @@
import com.iemr.common.identity.utils.exception.IEMRException;
import com.iemr.common.identity.utils.http.HttpUtils;
import com.iemr.common.identity.utils.mapper.InputMapper;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
@Service
@Qualifier("rmnchServiceImpl")
From 452b8093fd08fcd15d3fc2b53ab2139d2e31e9c8 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 18 Mar 2026 18:12:05 +0530
Subject: [PATCH 08/42] add status of women
---
.../iemr/common/identity/dto/IdentityDTO.java | 2 +
.../rmnch/RmnchDataSyncServiceImpl.java | 86 +++++++++++--------
2 files changed, 53 insertions(+), 35 deletions(-)
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/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 3348267e..dc30d444 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -23,6 +23,7 @@
import java.math.BigInteger;
import java.sql.Date;
+import java.sql.Timestamp;
import java.time.Period;
import java.util.ArrayList;
import java.util.Arrays;
@@ -277,59 +278,74 @@ public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
Long beneficiaryRegID,
String comingRequest) {
+
try {
JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class);
- RMNCHBeneficiaryDetailsRmnch beneficiaryDetailsRmnch =
+ RMNCHBeneficiaryDetailsRmnch entity =
rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
- if (beneficiaryDetailsRmnch == null) {
- beneficiaryDetailsRmnch = new RMNCHBeneficiaryDetailsRmnch();
+ if (entity == null) {
+ entity = new RMNCHBeneficiaryDetailsRmnch();
}
- beneficiaryDetailsRmnch.setBenficieryid(BigInteger.valueOf(beneficiaryID));
- beneficiaryDetailsRmnch.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
- beneficiaryDetailsRmnch.setCreatedBy(
- requestObj.get("createdBy").getAsString());
- beneficiaryDetailsRmnch.setVanID(
- requestObj.get("vanID").getAsInt());
- beneficiaryDetailsRmnch.setParkingPlaceID(
- requestObj.get("parkingPlaceID").getAsInt());
- beneficiaryDetailsRmnch.setProviderServiceMapID(
- requestObj.get("providerServiceMapID").getAsInt());
- beneficiaryDetailsRmnch.setGenderId(
- requestObj.get("genderID").getAsInt());
- beneficiaryDetailsRmnch.setReproductiveStatusId(
- requestObj.get("maritalStatusID").getAsInt());
-
- if (requestObj.get("maritalStatusName") != null
- && !requestObj.get("maritalStatusName").isJsonNull()) {
- beneficiaryDetailsRmnch.setReproductiveStatus(
- requestObj.get("maritalStatusName").getAsString());
- }
+ String createdBy = getString(requestObj, "createdBy", "system");
+
+ entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
+ entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
+ entity.setCreatedBy(createdBy);
+ entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
- beneficiaryDetailsRmnch.setReproductiveStatusId(
- requestObj.has("reproductiveStatusId") && !requestObj.get("reproductiveStatusId").isJsonNull()
- ? requestObj.get("reproductiveStatusId").getAsInt()
- : requestObj.get("maritalStatusID").getAsInt()
+ 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))
);
- beneficiaryDetailsRmnch.setReproductiveStatus(
- requestObj.has("reproductiveStatus") && !requestObj.get("reproductiveStatus").isJsonNull()
- ? requestObj.get("reproductiveStatus").getAsString()
- : null
+ entity.setReproductiveStatus(
+ getString(requestObj, "reproductiveStatus", null)
);
- rMNCHBeneficiaryDetailsRmnchRepo.save(beneficiaryDetailsRmnch);
- logger.info("BeneficiaryDetailsRmnch saved for beneficiaryRegID: " + beneficiaryRegID);
+ 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 (String → Timestamp)
+ if (requestObj.has("dOB") && !requestObj.get("dOB").isJsonNull()) {
+ entity.setDob(Timestamp.valueOf(
+ requestObj.get("dOB").getAsString().replace("T", " ").replace("Z", "")
+ ));
+ }
+
+ rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
+
+ logger.info("Saved RMNCH for benRegID: " + beneficiaryRegID);
} catch (Exception e) {
- logger.error("Error saving BeneficiaryDetailsRmnch: " + e.getMessage());
+ logger.error("Error: ", e);
throw e;
}
- return "BeneficiaryDetailsRmnch saved for beneficiaryRegID:"+beneficiaryID;
+
+ return "Saved RMNCH for beneficiaryID: " + beneficiaryID;
+ }
+ 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;
From 0f4f37830c6ffbfa0745d5f52c79f0f847c0b586 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Tue, 24 Mar 2026 12:45:26 +0530
Subject: [PATCH 09/42] add status of women
---
.../identity/controller/IdentityController.java | 16 ++++++++++++++++
.../common/identity/service/IdentityService.java | 6 ++++++
2 files changed, 22 insertions(+)
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..74d9767b 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,19 @@ 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/service/IdentityService.java b/src/main/java/com/iemr/common/identity/service/IdentityService.java
index 40f2d2e6..c216b634 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -799,6 +799,12 @@ public List searchBeneficiaryByVillageIdAndLastModifyDate(List
return beneficiaryList;
}
+
+ public RMNCHBeneficiaryDetailsRmnch getRmnchDataByBenID(BigInteger benID) {
+
+ return rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID);
+ }
+
public Long countBeneficiaryByVillageIdAndLastModifyDate(List villageIDs, Timestamp lastModifiedDate) {
Long beneficiaryCount = 0L;
try {
From b46f36938e6f9cea550a8832083b0bee4e61bba6 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Tue, 24 Mar 2026 14:22:40 +0530
Subject: [PATCH 10/42] add status of women
---
.../rmnch/RmnchDataSyncServiceImpl.java | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index dc30d444..660547d9 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -115,7 +115,6 @@ public class RmnchDataSyncServiceImpl implements RmnchDataSyncService {
private RMNCHBenContactRepo rMNCHBenContactRepo;
@Autowired
private RMNCHMBenRegIdMapRepo rMNCHMBenRegIdMapRepo;
-
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public String syncDataToAmrit(String requestOBJ) throws Exception {
@@ -273,6 +272,7 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
}
+
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
@@ -282,19 +282,30 @@ public String saveBeneficiaryDetailsAfterRegistration(
try {
JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class);
+ // ✅ use find instead of get
RMNCHBeneficiaryDetailsRmnch entity =
rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+ boolean isNew = false;
+
if (entity == null) {
entity = new RMNCHBeneficiaryDetailsRmnch();
+ isNew = true;
}
String createdBy = getString(requestObj, "createdBy", "system");
entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
- entity.setCreatedBy(createdBy);
- entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
+
+ // ✅ Only set created fields for new record
+ 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));
@@ -317,7 +328,7 @@ public String saveBeneficiaryDetailsAfterRegistration(
entity.setMaritalstatusId(getInt(requestObj, "maritalStatusID", null));
entity.setMaritalstatus(getString(requestObj, "maritalStatusName", null));
- // DOB (String → Timestamp)
+ // DOB
if (requestObj.has("dOB") && !requestObj.get("dOB").isJsonNull()) {
entity.setDob(Timestamp.valueOf(
requestObj.get("dOB").getAsString().replace("T", " ").replace("Z", "")
From 6e0d0f705c88dd63dfebeb16235700ba4c5ac28c Mon Sep 17 00:00:00 2001
From: Vanitha S <116701245+vanitha1822@users.noreply.github.com>
Date: Fri, 22 May 2026 13:52:02 +0530
Subject: [PATCH 11/42] Merge Release 3.6.2 to Main (#163)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Elasticsearch implementation for Beneficiary Search (#123)
* fix: ES Implementation-mapping, indexing and async records
* fix: add service for ES Search
* fix: search implementation
* fix: add additional fields as per the requirement
* fix: comment extra fields
* fix: rename the files, remove commented code
* fix: update pom.xml
* fix: revert advancesearch
* fix: add properties
* fix: coderabbit comments
* fix: remove comment code
* fix: accept numeric values for search
* fix: update the env variable
* fix: advance search functionality
* fix: update the advance search ES functionality
* fix: sync and fetch benid
* fix: size limit issue
* fix: improve response time
* fix: updated the end point to advancedSearchES
* fix: age issue while moving to nurse worklist (#130)
* Optimize the Elasticsearch for better Response Time (#131)
* fix: optimize the index and reduce the size
* fix: align indent
* fix: abha / health id issue
* fix: sync optimization
* fix: get abha created date
* fix: state issue
* fix: village issue
* fix: add abha details
* fix: abha fix and refresh index
* fix: refresh index
* fix: remove duplicate dependency
* fix: fuzzy search, resume, refresh api's
* fix: add middlename, maritalstatus
* fix: remove refresh while bulk indexing
* fix: add license
* fix: remove the bean function to create the index automatically (#133)
* Fix ES Issue in the Query (#137)
* fix: ES Exception
* fix: ES exception
* Nd/vs/fix es (#138)
* fix: ES Exception
* fix: ES exception
* fix: enable multi-word fuzzy search requirement (#139)
* fix: enable multi-word fuzzy search requirement
* Downgrade version from 3.6.2 to 3.6.1
* fix: multi-word search (#140)
* Fix the column mismatch issue in beneficiary search (#142)
* fix: column mismatch issue
* fix: update marital status
* add new column in rmnch table for death and child record
* add new column in rmnch table for death and child record
* Cherry-pick health and version API enhancements to release-3.6.1 (#145)
* feat(health,version): add health and version endpoints
* feat(health,version): add health and version endpoints without auth
* fix(health): remove unused private methods
* fix(health): fix exception issue
* fix(health): redact error details for unauthenticated health checks
* fix code quality issues and reduce cognitive complexity
* feat(health): add MySQL health endpoint
* refactor(health): simplify MySQL health check and remove sensitive details
* fix(health): remove unused imports and variables
* refactor(health): address nitpicks (configurable ES scheme, log noise, graceful shutdown, record)
* fix(health): scope PROCESSLIST lock-wait check to application DB user
* refactor(health): remove unused params and reuse response/error constants
* fix(health): remove unused imports and methods
* chore(health): clean up unused imports, params, and dead helpers
* fix(health): avoid sharing JDBC connections across threads in advanced MySQL checks
* refactor(health): reuse REDIS_COMPONENT constant and extract nested try block
* fix(health): avoid blocking DB I/O under write lock and restore interrupt flag
* fix(health): cancel in-flight futures on generic failure
* feat(health,version): add index existance, read-only detection, canary write for elasticsearch health check
* refactor(health): reduce cognitive complexity, remove dead throws, and clean code smells
* Rebase 3.6.2 (#150)
* fix: enable multi-word fuzzy search requirement (#139)
* fix: enable multi-word fuzzy search requirement
* Downgrade version from 3.6.2 to 3.6.1
* fix: multi-word search (#140)
* Fix the column mismatch issue in beneficiary search (#142)
* fix: column mismatch issue
* fix: update marital status
* add new column in rmnch table for death and child record
* add new column in rmnch table for death and child record
* Cherry-pick health and version API enhancements to release-3.6.1 (#145)
* feat(health,version): add health and version endpoints
* feat(health,version): add health and version endpoints without auth
* fix(health): remove unused private methods
* fix(health): fix exception issue
* fix(health): redact error details for unauthenticated health checks
* fix code quality issues and reduce cognitive complexity
* feat(health): add MySQL health endpoint
* refactor(health): simplify MySQL health check and remove sensitive details
* fix(health): remove unused imports and variables
* refactor(health): address nitpicks (configurable ES scheme, log noise, graceful shutdown, record)
* fix(health): scope PROCESSLIST lock-wait check to application DB user
* refactor(health): remove unused params and reuse response/error constants
* fix(health): remove unused imports and methods
* chore(health): clean up unused imports, params, and dead helpers
* fix(health): avoid sharing JDBC connections across threads in advanced MySQL checks
* refactor(health): reuse REDIS_COMPONENT constant and extract nested try block
* fix(health): avoid blocking DB I/O under write lock and restore interrupt flag
* fix(health): cancel in-flight futures on generic failure
* feat(health,version): add index existance, read-only detection, canary write for elasticsearch health check
* refactor(health): reduce cognitive complexity, remove dead throws, and clean code smells
---------
Co-authored-by: Saurav Mishra
Co-authored-by: Saurav Mishra <80103738+SauravBizbRolly@users.noreply.github.com>
Co-authored-by: KOPPIREDDY DURGA PRASAD <144464542+DurgaPrasad-54@users.noreply.github.com>
* feat(jwt): enhance jwt validation logging and public endpoint check (#151)
* fix: pom version (#152)
* Add the missing properties for 1097_Preprod (#153)
* fix: add the missing properties
* fix: update db url
* docs: add CLAUDE.md for Claude Code guidance
* fix: map sexualOrientationID during beneficiary update in 1097
convertIdentityEditDTOToMBeneficiarydetail() was missing sexualOrientationID
and sexualOrientationType, so the field was never persisted on update.
Co-Authored-By: Claude Sonnet 4.6
* Sexual orientation data not reflecting under DB record (#157)
* fix: enable multi-word fuzzy search requirement (#139)
* fix: enable multi-word fuzzy search requirement
* Downgrade version from 3.6.2 to 3.6.1
* fix: multi-word search (#140)
* Fix the column mismatch issue in beneficiary search (#142)
* fix: column mismatch issue
* fix: update marital status
* add new column in rmnch table for death and child record
* add new column in rmnch table for death and child record
* Cherry-pick health and version API enhancements to release-3.6.1 (#145)
* feat(health,version): add health and version endpoints
* feat(health,version): add health and version endpoints without auth
* fix(health): remove unused private methods
* fix(health): fix exception issue
* fix(health): redact error details for unauthenticated health checks
* fix code quality issues and reduce cognitive complexity
* feat(health): add MySQL health endpoint
* refactor(health): simplify MySQL health check and remove sensitive details
* fix(health): remove unused imports and variables
* refactor(health): address nitpicks (configurable ES scheme, log noise, graceful shutdown, record)
* fix(health): scope PROCESSLIST lock-wait check to application DB user
* refactor(health): remove unused params and reuse response/error constants
* fix(health): remove unused imports and methods
* chore(health): clean up unused imports, params, and dead helpers
* fix(health): avoid sharing JDBC connections across threads in advanced MySQL checks
* refactor(health): reuse REDIS_COMPONENT constant and extract nested try block
* fix(health): avoid blocking DB I/O under write lock and restore interrupt flag
* fix(health): cancel in-flight futures on generic failure
* feat(health,version): add index existance, read-only detection, canary write for elasticsearch health check
* refactor(health): reduce cognitive complexity, remove dead throws, and clean code smells
* fix: map sexualOrientationID during beneficiary update in 1097
convertIdentityEditDTOToMBeneficiarydetail() was missing sexualOrientationID
and sexualOrientationType, so the field was never persisted on update.
Co-Authored-By: Claude Sonnet 4.6
---------
Co-authored-by: Vanitha S <116701245+vanitha1822@users.noreply.github.com>
Co-authored-by: Saurav Mishra
Co-authored-by: Saurav Mishra <80103738+SauravBizbRolly@users.noreply.github.com>
Co-authored-by: KOPPIREDDY DURGA PRASAD <144464542+DurgaPrasad-54@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6
* feat: add getBenFamilyDetails API and fix searchFamily queries
- Add POST /family/getBenFamilyDetails endpoint that returns full family
details (master record + all members) for a given beneficiaryRegId
- Fix searchFamily and searchFamilyWithFamilyId queries: replace
noOfmembers > 0 guard with deleted=false filter so families with
zero/null member count and soft-deleted records are handled correctly;
also make villageId optional and use LIKE prefix match for familyName
Co-Authored-By: Claude Sonnet 4.6
* fix: preserve existing occupation and education when incoming values are null
During beneficiary edit, convertIdentityEditDTOToMBeneficiarydetail creates
a fresh entity and overwrites all columns on save. Added null-guards for
occupationId, occupation, educationId, and education so existing DB values
are preserved when the incoming DTO omits them — consistent with the existing
pattern for familyId and headOfFamily_Relation.
Co-Authored-By: Claude Sonnet 4.6
* fix: replace in-memory queue with SELECT FOR UPDATE SKIP LOCKED for BenRegId allocation (#159)
* aam-2126 Memeberlist is not displying properly
* fix: aam-2313 phone number leading with zero - removed zero (#161)
* Allowing numbers with zero is search by phone number. (#162)
* fix: aam-2313 phone number leading with zero - removed zero
* fix: aam-2313 serach by user phone number fix for number leading with zero
---------
Co-authored-by: Saurav Mishra
Co-authored-by: Saurav Mishra <80103738+SauravBizbRolly@users.noreply.github.com>
Co-authored-by: KOPPIREDDY DURGA PRASAD <144464542+DurgaPrasad-54@users.noreply.github.com>
Co-authored-by: SnehaRH
Co-authored-by: Claude Sonnet 4.6
Co-authored-by: SnehaRH <77656297+snehar-nd@users.noreply.github.com>
---
CLAUDE.md | 73 +++++++++++++++
pom.xml | 2 +-
src/main/environment/1097_ci.properties | 1 -
src/main/environment/1097_example.properties | 1 -
.../FamilyTaggingController.java | 14 +++
.../common/identity/repo/BenContactRepo.java | 10 ++-
.../identity/repo/BenRegIdMappingRepo.java | 9 ++
.../repo/familyTag/FamilyTagRepo.java | 8 +-
.../service/BenRegIdClaimService.java | 89 +++++++++++++++++++
.../identity/service/IdentityService.java | 60 +++++++------
.../familyTagging/FamilyTagService.java | 2 +
.../familyTagging/FamilyTagServiceImpl.java | 44 ++++++++-
.../utils/JwtUserIdValidationFilter.java | 7 +-
13 files changed, 279 insertions(+), 41 deletions(-)
create mode 100644 CLAUDE.md
create mode 100644 src/main/java/com/iemr/common/identity/service/BenRegIdClaimService.java
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 00000000..ae3f45c7
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,73 @@
+# CLAUDE.md - Identity-API
+
+## Project Overview
+
+Identity-API is the beneficiary identity management service for the AMRIT platform. It handles beneficiary creation, search, update, and deduplication across dual database profiles (`db_iemr` main and `db_identity`). It supports RMNCH (Reproductive, Maternal, Newborn, Child, and Adolescent Health) data management, family tagging, Elasticsearch-based beneficiary search, and health ID linkage.
+
+## Tech Stack
+
+- Java 17, Spring Boot 3.2.2, Maven
+- Spring Data JPA / Hibernate, MySQL 8.0
+- Elasticsearch (Spring Data Elasticsearch for beneficiary search indexing)
+- Redis for session management
+- Lombok (1.18.36), MapStruct
+- SpringDoc OpenAPI (Swagger UI at `/swagger-ui.html`)
+- ECS logging (logback-ecs-encoder)
+- JaCoCo for test coverage
+- Packaged as WAR for Wildfly deployment
+
+## Build & Run
+
+```bash
+mvn clean install -DENV_VAR=local # Build
+mvn spring-boot:run -DENV_VAR=local # Run locally
+mvn -B package --file pom.xml -P # Package WAR (dev, local, test, ci, uat)
+mvn test # Run tests
+```
+
+Environment config: `src/main/resources/common_.properties` is copied to `application.properties` at build time.
+
+## Key Packages (`com.iemr.common.identity`)
+
+- **controller/** - REST endpoints:
+ - `IdentityController` - Core beneficiary CRUD (create, search, update, search by phone/ID/name)
+ - `IdentityESController` - Elasticsearch-based beneficiary search
+ - `rmnch/RMNCHMobileAppController` - RMNCH mobile app data sync
+ - `familyTagging/FamilyTaggingController` - Family tagging and family search
+ - `elasticsearch/ElasticsearchSyncController` - Elasticsearch sync management
+ - `health/HealthController` - Health check endpoint
+ - `version/VersionController` - API version info
+- **service/** - Business logic:
+ - `IdentityService` - Core identity operations
+ - `rmnch/` - RMNCH beneficiary management
+ - `familyTagging/` - Family tagging logic
+ - `elasticsearch/` - Elasticsearch indexing and sync
+ - `health/` - Health check service
+- **domain/** - Core JPA entities for beneficiary data:
+ - `MBeneficiaryregidmapping` - Beneficiary registration ID mapping
+ - `MBeneficiaryaddress`, `MBeneficiarycontact`, `MBeneficiaryAccount` - Beneficiary demographics
+ - `MBeneficiaryfamilymapping` - Family relationships
+ - `MBeneficiaryconsent` - Consent management
+ - `VBenAdvanceSearch` - View for advanced search queries
+- **data/** - Additional data models:
+ - `rmnch/` - RMNCH-specific entities (CBAC details, born birth details, household details, NCD/TB/HRP data)
+ - `elasticsearch/` - Elasticsearch document models and sync job
+ - `familyTagging/` - Family tagging models
+- **dto/** - Data transfer objects for API requests/responses
+- **repo/** - Spring Data JPA and Elasticsearch repositories
+- **mapper/** - MapStruct mappers for entity-DTO conversion
+- **filter/** - Servlet filters
+- **security/** - Security configuration
+- **utils/** - Utilities (Redis, HTTP, validation, session, gateway, email, exception handling)
+- **config/** - Application configuration
+
+## Architecture Notes
+
+- Dual-profile beneficiary storage: main identity in `db_identity`, with mapping to `db_iemr` for AMRIT platform integration
+- Elasticsearch integration provides fast full-text beneficiary search with background sync jobs
+- RMNCH module handles field-worker mobile app data (CBAC screening, household surveys, birth details)
+- Family tagging enables linking beneficiaries into family units with search by family ID
+- MapStruct mappers handle complex entity-to-DTO transformations
+- Health ID (ABHA) linkage stored per beneficiary for ABDM integration
+- Beneficiary deduplication logic via advanced search views
+- Artifact ID: `identity-api`, group: `com.iemr.common.identity`, version: 3.6.1
diff --git a/pom.xml b/pom.xml
index f29361fd..c3b57f1c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0com.iemr.common.identityidentity-api
- 3.6.1
+ 3.6.2war
diff --git a/src/main/environment/1097_ci.properties b/src/main/environment/1097_ci.properties
index 0e8deded..514f675d 100644
--- a/src/main/environment/1097_ci.properties
+++ b/src/main/environment/1097_ci.properties
@@ -24,7 +24,6 @@ spring.redis.host=@env.REDIS_HOST@
cors.allowed-origins=@env.CORS_ALLOWED_ORIGINS@
-
# Elasticsearch Configuration
elasticsearch.host=@env.ELASTICSEARCH_HOST@
elasticsearch.port=@env.ELASTICSEARCH_PORT@
diff --git a/src/main/environment/1097_example.properties b/src/main/environment/1097_example.properties
index ab87d360..ba2f3211 100644
--- a/src/main/environment/1097_example.properties
+++ b/src/main/environment/1097_example.properties
@@ -31,4 +31,3 @@ elasticsearch.index.beneficiary=beneficiary_index
# Enable/Disable ES (for gradual rollout)
elasticsearch.enabled=true
-
diff --git a/src/main/java/com/iemr/common/identity/controller/familyTagging/FamilyTaggingController.java b/src/main/java/com/iemr/common/identity/controller/familyTagging/FamilyTaggingController.java
index 19323611..b347bd50 100644
--- a/src/main/java/com/iemr/common/identity/controller/familyTagging/FamilyTaggingController.java
+++ b/src/main/java/com/iemr/common/identity/controller/familyTagging/FamilyTaggingController.java
@@ -116,6 +116,20 @@ public String untagFamily(@RequestBody String comingReq) {
return response.toString();
}
+ @Operation(summary = "Get family tagging details by beneficiary ID")
+ @PostMapping(value = { "/getBenFamilyDetails" }, consumes = "application/json", produces = "application/json")
+ public String getFamilyDetailsByBeneficiaryId(@RequestBody String comingReq) {
+ OutputResponse response = new OutputResponse();
+ try {
+ String s = familyTagService.getFamilyDetailsByBeneficiaryId(comingReq);
+ response.setResponse(s);
+ } catch (Exception e) {
+ logger.error("Error in fetching family details by beneficiary ID : " + e);
+ response.setError(5000, "Error in fetching family details by beneficiary ID : " + e.getLocalizedMessage());
+ }
+ return response.toString();
+ }
+
@Operation(summary = "Edit beneficiary family details")
@PostMapping(value = { "/editFamilyTagging" }, consumes = "application/json", produces = "application/json")
public String editFamilyDetails(@RequestBody String comingReq) {
diff --git a/src/main/java/com/iemr/common/identity/repo/BenContactRepo.java b/src/main/java/com/iemr/common/identity/repo/BenContactRepo.java
index fdbda216..02334684 100644
--- a/src/main/java/com/iemr/common/identity/repo/BenContactRepo.java
+++ b/src/main/java/com/iemr/common/identity/repo/BenContactRepo.java
@@ -49,8 +49,12 @@ public interface BenContactRepo extends CrudRepository findByPreferredSMSPhoneNumOrderByBenContactsIDAsc(String smsPhoneNum);
- @Query("select c from MBeneficiarycontact c where c.preferredPhoneNum = :phoneNum ")
- List findByAnyPhoneNum(@Param("phoneNum") String phoneNum);
+ // @Query("select c from MBeneficiarycontact c where c.preferredPhoneNum = :phoneNum ")
+ // List findByAnyPhoneNum(@Param("phoneNum") String phoneNum);
+
+ @Query("select c from MBeneficiarycontact c where c.preferredPhoneNum IN :variants")
+ List findByAnyPhoneNum(@Param("variants") List variants);
+
@Query("select c from MBeneficiarycontact c where c.preferredPhoneNum = :phoneNum or c.phoneNum1 = :phoneNum "
@@ -70,4 +74,6 @@ public interface BenContactRepo extends CrudRepository findTop10000ByProvisionedAndReserved(Boolean isProvisioned,Boolean isReserved);
+ /**
+ * Atomically selects and locks the next available registration ID row.
+ * SKIP LOCKED ensures concurrent servers each get a distinct row without blocking each other,
+ * eliminating duplicate BenRegId assignments when multiple app instances share the same database.
+ */
+ @Transactional
+ @Query(value = "SELECT * FROM m_beneficiaryregidmapping WHERE Provisioned = false AND Reserved = false ORDER BY BenRegId ASC LIMIT 1 FOR UPDATE SKIP LOCKED", nativeQuery = true)
+ MBeneficiaryregidmapping findAndLockNextAvailable();
+
}
diff --git a/src/main/java/com/iemr/common/identity/repo/familyTag/FamilyTagRepo.java b/src/main/java/com/iemr/common/identity/repo/familyTag/FamilyTagRepo.java
index 4451fd37..88d05388 100644
--- a/src/main/java/com/iemr/common/identity/repo/familyTag/FamilyTagRepo.java
+++ b/src/main/java/com/iemr/common/identity/repo/familyTag/FamilyTagRepo.java
@@ -42,12 +42,10 @@ public interface FamilyTagRepo extends CrudRepository {
public int untagFamily(@Param("benFamilyTagId") List benFamilyTagId,@Param("modifiedBy") String modifiedBy);
- @Query("SELECT obj FROM BenFamilyMapping obj WHERE obj.familyName =:familyName AND obj.villageId =:villageId AND (obj.noOfmembers is not null "
- + " AND obj.noOfmembers >0)")
+ @Query("SELECT obj FROM BenFamilyMapping obj WHERE obj.familyName LIKE CONCAT(:familyName, '%') AND (:villageId IS NULL OR obj.villageId =:villageId) AND (obj.deleted IS NULL OR obj.deleted = false)")
List searchFamily(@Param("familyName") String familyName,@Param("villageId") Integer villageId);
-
- @Query("SELECT obj FROM BenFamilyMapping obj WHERE obj.familyName =:familyName AND obj.villageId =:villageId AND obj.familyId =:familyId AND (obj.noOfmembers is not null "
- + " AND obj.noOfmembers >0)")
+
+ @Query("SELECT obj FROM BenFamilyMapping obj WHERE obj.familyName LIKE CONCAT(:familyName, '%') AND (:villageId IS NULL OR obj.villageId =:villageId) AND obj.familyId =:familyId AND (obj.deleted IS NULL OR obj.deleted = false)")
List searchFamilyWithFamilyId(@Param("familyName") String familyName,@Param("villageId") Integer villageId,@Param("familyId") String familyId);
@Query("SELECT obj FROM BenFamilyMapping obj WHERE obj.familyId =:familyId")
diff --git a/src/main/java/com/iemr/common/identity/service/BenRegIdClaimService.java b/src/main/java/com/iemr/common/identity/service/BenRegIdClaimService.java
new file mode 100644
index 00000000..ba2c32eb
--- /dev/null
+++ b/src/main/java/com/iemr/common/identity/service/BenRegIdClaimService.java
@@ -0,0 +1,89 @@
+/*
+* AMRIT – Accessible Medical Records via Integrated Technology
+* Integrated EHR (Electronic Health Records) Solution
+*
+* Copyright (C) "Piramal Swasthya Management and Research Institute"
+*
+* This file is part of AMRIT.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see https://www.gnu.org/licenses/.
+*/
+package com.iemr.common.identity.service;
+
+import java.sql.Timestamp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.iemr.common.identity.domain.MBeneficiaryregidmapping;
+import com.iemr.common.identity.repo.BenRegIdMappingRepo;
+
+/**
+ * Handles atomic beneficiary registration ID claiming.
+ *
+ * Uses SELECT ... FOR UPDATE SKIP LOCKED so that each application instance
+ * obtains a distinct, exclusive row. Multiple servers sharing the same database
+ * will never receive the same BenRegId, preventing
+ * SQLIntegrityConstraintViolationException duplicate-key errors that occurred
+ * with the previous in-memory ArrayDeque queue approach.
+ *
+ * REQUIRES_NEW propagation ensures the SELECT + UPDATE happens in its own
+ * short-lived transaction, releasing the row lock immediately after the ID is
+ * marked reserved — keeping lock contention to a minimum.
+ */
+@Service
+public class BenRegIdClaimService {
+
+ private static final Logger logger = LoggerFactory.getLogger(BenRegIdClaimService.class);
+
+ @Autowired
+ private BenRegIdMappingRepo regIdRepo;
+
+ /**
+ * Atomically claims the next available registration ID.
+ *
+ *
+ *
Opens a brand-new transaction (REQUIRES_NEW).
+ *
Executes SELECT … FOR UPDATE SKIP LOCKED to lock exactly one row.
+ * Concurrent callers on other servers/threads skip the locked row and
+ * get the next one — no two callers ever see the same row.
+ *
Marks the row {@code reserved = true} and flushes it within the same
+ * transaction so the change is visible to other connections the moment
+ * this method returns.
+ *
+ *
+ * @return the reserved {@link MBeneficiaryregidmapping} with {@code reserved=true}
+ * @throws IllegalStateException if the ID pool is exhausted
+ */
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
+ public MBeneficiaryregidmapping claimNextAvailableRegId() {
+ MBeneficiaryregidmapping regMap = regIdRepo.findAndLockNextAvailable();
+ if (regMap == null) {
+ throw new IllegalStateException(
+ "No available registration IDs in the pool. "
+ + "Please contact the system administrator to import more IDs.");
+ }
+ if (regMap.getCreatedDate() == null) {
+ regMap.setCreatedDate(new Timestamp(System.currentTimeMillis()));
+ }
+ regMap.setReserved(true);
+ regMap = regIdRepo.save(regMap);
+ logger.info("BenRegIdClaimService: claimed BenRegId={}", regMap.getBenRegId());
+ return regMap;
+ }
+}
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 08b9fbbe..afb193e3 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -25,8 +25,8 @@
import java.math.BigInteger;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
-import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -154,6 +154,8 @@ private JdbcTemplate getJdbcTemplate() {
@Autowired
BenRegIdMappingRepo regIdRepo;
@Autowired
+ private BenRegIdClaimService benRegIdClaimService;
+ @Autowired
BenServiceMappingRepo serviceMapRepo;
@Autowired
MBeneficiaryAccountRepo accountRepo;
@@ -555,7 +557,15 @@ public List getBeneficiariesByPhoneNum(String phoneNum)
List list = new ArrayList<>();
try {
- List benContact = contactRepo.findByAnyPhoneNum(phoneNum);
+ // List benContact = contactRepo.findByAnyPhoneNum(phoneNum);
+
+ String clean = phoneNum.trim();
+ if (clean.startsWith("+91")) clean = clean.substring(3);
+ else if (clean.startsWith("91") && clean.length() == 12) clean = clean.substring(2);
+ else if (clean.startsWith("0") && clean.length() == 11) clean = clean.substring(1);
+
+ List variants = Arrays.asList(clean, "0" + clean, "91" + clean, "+91" + clean);
+ List benContact = contactRepo.findByAnyPhoneNum(variants);
logger.info(benContact.size() + " contacts found for phone number " + phoneNum);
@@ -1038,6 +1048,18 @@ public void editIdentity(IdentityEditDTO identity) throws MissingMandatoryFields
if (benDetails.getOther() != null) {
mbDetl.setOther(benDetails.getOther());
}
+ if (mbDetl.getOccupationId() == null && benDetails.getOccupationId() != null) {
+ mbDetl.setOccupationId(benDetails.getOccupationId());
+ }
+ if (mbDetl.getOccupation() == null && benDetails.getOccupation() != null) {
+ mbDetl.setOccupation(benDetails.getOccupation());
+ }
+ if (mbDetl.getEducationId() == null && benDetails.getEducationId() != null) {
+ mbDetl.setEducationId(benDetails.getEducationId());
+ }
+ if (mbDetl.getEducation() == null && benDetails.getEducation() != null) {
+ mbDetl.setEducation(benDetails.getEducation());
+ }
// Extract and set extra fields
// String identityJson = new Gson().toJson(json);
@@ -1337,6 +1359,8 @@ private MBeneficiarydetail convertIdentityEditDTOToMBeneficiarydetail(IdentityEd
if (dto.getOtherFields() != null) {
beneficiarydetail.setOtherFields(dto.getOtherFields());
}
+ beneficiarydetail.setSexualOrientationID(dto.getSexualOrientationID());
+ beneficiarydetail.setSexualOrientationType(dto.getSexualOrientationType());
return beneficiarydetail;
}
@@ -1345,34 +1369,13 @@ private MBeneficiarydetail convertIdentityEditDTOToMBeneficiarydetail(IdentityEd
* @param identity
* @return
*/
- ArrayDeque queue = new ArrayDeque<>();
-
public BeneficiaryCreateResp createIdentity(IdentityDTO identity) {
logger.info("IdentityService.createIdentity - start");
- List list = null;
- MBeneficiaryregidmapping regMap = null;
- synchronized (queue) {
- if (queue.isEmpty()) {
- logger.info("fetching 10000 rows");
- list = regIdRepo.findTop10000ByProvisionedAndReserved(false, false);
- logger.info("Adding SynchronousQueue start-- ");
- for (MBeneficiaryregidmapping map : list) {
- queue.add(map);
- }
- logger.info("Adding SynchronousQueue end-- ");
- }
- regMap = queue.removeFirst();
- }
- regMap.setReserved(true);
- if (regMap.getCreatedDate() == null) {
- SimpleDateFormat sdf = new SimpleDateFormat(CREATED_DATE_FORMAT);
- String dateToStoreInDataBase = sdf.format(new Date());
- Timestamp ts = Timestamp.valueOf(dateToStoreInDataBase);
- regMap.setCreatedDate(ts);
- }
-
- regIdRepo.save(regMap);
+ // Atomically claim the next available ID using SELECT … FOR UPDATE SKIP LOCKED.
+ // This is safe across multiple app servers sharing the same database — each server
+ // locks and reserves a distinct row, so duplicate BenRegId inserts cannot occur.
+ MBeneficiaryregidmapping regMap = benRegIdClaimService.claimNextAvailableRegId();
regMap.setProvisioned(true);
@@ -1665,6 +1668,9 @@ private String cleanPhoneNumber(String phoneNumber) {
} else if (cleaned.startsWith("91") && cleaned.length() == 12) {
// Handle case where + is already removed but 91 remains
cleaned = cleaned.substring(2);
+ } else if (cleaned.startsWith("0") && cleaned.length() == 11) {
+ // Handle case where number starts with 0 and is 11 digits long
+ cleaned = cleaned.substring(1);
}
return cleaned.trim();
diff --git a/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagService.java b/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagService.java
index 85e8cfba..5bf22b36 100644
--- a/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagService.java
+++ b/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagService.java
@@ -36,4 +36,6 @@ public interface FamilyTagService {
public String searchFamily(String request) throws IEMRException;
public String editFamilyDetails(String request) throws IEMRException;
+
+ public String getFamilyDetailsByBeneficiaryId(String request) throws IEMRException;
}
diff --git a/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagServiceImpl.java b/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagServiceImpl.java
index 2a60571b..f44eecf8 100644
--- a/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/familyTagging/FamilyTagServiceImpl.java
@@ -37,6 +37,7 @@
import com.google.gson.JsonParser;
import com.iemr.common.identity.data.familyTagging.BenFamilyMapping;
import com.iemr.common.identity.data.familyTagging.FamilyMembers;
+import com.iemr.common.identity.data.familyTagging.FamilySearchResponse;
import com.iemr.common.identity.domain.MBeneficiarydetail;
import com.iemr.common.identity.domain.MBeneficiarymapping;
import com.iemr.common.identity.exception.IEMRException;
@@ -264,10 +265,49 @@ public String getFamilyDetails(String request) throws IEMRException {
throw new IEMRException("Error while fetching family member details :" + e.getLocalizedMessage());
}
}
+ @Override
+ public String getFamilyDetailsByBeneficiaryId(String request) throws IEMRException {
+ try {
+ BenFamilyMapping reqObj = InputMapper.gson().fromJson(request, BenFamilyMapping.class);
+ if (reqObj.getBeneficiaryRegId() == null)
+ throw new IEMRException("beneficiaryRegId is required");
+
+ MBeneficiarymapping mapping = benMappingRepo
+ .getBenDetailsId(BigInteger.valueOf(reqObj.getBeneficiaryRegId()));
+ if (mapping == null || mapping.getBenDetailsId() == null)
+ throw new IEMRException("Beneficiary not found");
+
+ List benDetails = benDetailRepo
+ .findByBeneficiaryDetailsIdOrderByBeneficiaryDetailsIdAsc(mapping.getBenDetailsId());
+ if (benDetails == null || benDetails.isEmpty() || benDetails.get(0).getFamilyId() == null)
+ return "No family tagged to this beneficiary";
+
+ String familyId = benDetails.get(0).getFamilyId();
+
+ BenFamilyMapping familyMaster = familyTagRepo.searchFamilyByFamilyId(familyId);
+ List memberList = benDetailRepo.getFamilyDetails(familyId);
+
+ FamilySearchResponse resp = new FamilySearchResponse();
+ if (familyMaster != null) {
+ resp.setFamilyId(familyMaster.getFamilyId());
+ resp.setFamilyName(familyMaster.getFamilyName());
+ resp.setHeadOfTheFamily(familyMaster.getFamilyHeadName());
+ resp.setNoOfMembers(familyMaster.getNoOfmembers());
+ }
+ List memberResponseList = new ArrayList<>();
+ addFamilyMembersToList(memberList, memberResponseList);
+ resp.setFamilyMembers(memberResponseList);
+
+ return new Gson().toJson(resp);
+ } catch (Exception e) {
+ throw new IEMRException(
+ "Error while fetching family details by beneficiary ID : " + e.getLocalizedMessage());
+ }
+ }
+
private void addFamilyMembersToList(List list, List responseList) {
- StringBuilder name = new StringBuilder("");
for (MBeneficiarydetail obj : list) {
-
+ StringBuilder name = new StringBuilder("");
FamilyMembers famObj = new FamilyMembers();
BigInteger benRegId = benMappingRepo.getBenRegId(obj.getBeneficiaryDetailsId(), obj.getVanID());
if (benRegId != null)
diff --git a/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java
index af81ea34..cf959aa6 100644
--- a/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java
+++ b/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java
@@ -43,10 +43,13 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
return;
}
String path = request.getRequestURI();
- logger.info("JwtUserIdValidationFilter invoked for path: {}", path);
+
+ String servletPath = request.getServletPath();
+ logger.info("JwtUserIdValidationFilter invoked for requestURI: {}, servletPath: {}", path, servletPath);
// Skip JWT validation for public endpoints
- if (path.equals("/health") || path.equals("/version")) {
+ if (servletPath.equals("/health") || servletPath.equals("/version") ||
+ path.endsWith("/health") || path.endsWith("/version")) {
logger.info("Public endpoint accessed: {} - skipping JWT validation", path);
filterChain.doFilter(servletRequest, servletResponse);
return;
From 9fa18573308f58b1f2b282c1842d074ce7b81699 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Thu, 4 Jun 2026 18:40:39 +0530
Subject: [PATCH 12/42] merge with release-3.6.2
---
.../rmnch/RmnchDataSyncServiceImpl.java | 95 ++++++++++---------
1 file changed, 50 insertions(+), 45 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 600ccd5b..07904279 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -287,59 +287,64 @@ public String saveBeneficiaryDetailsAfterRegistration(
JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class);
// ✅ use find instead of get
- RMNCHBeneficiaryDetailsRmnch entity =
- rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+ if(!rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID)).isEmpty()){
+ RMNCHBeneficiaryDetailsRmnch entity =
+ rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID)).get(0);
- boolean isNew = false;
+ boolean isNew = false;
- if (entity == null) {
- entity = new RMNCHBeneficiaryDetailsRmnch();
- isNew = true;
- }
+ if (entity == null) {
+ entity = new RMNCHBeneficiaryDetailsRmnch();
+ isNew = true;
+ }
- String createdBy = getString(requestObj, "createdBy", "system");
+ String createdBy = getString(requestObj, "createdBy", "system");
- entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
- entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
+ entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
+ entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
- // ✅ Only set created fields for new record
- if (isNew) {
- entity.setCreatedBy(createdBy);
- entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
- } else {
- entity.setUpdatedBy(createdBy);
- entity.setUpdatedDate(new Timestamp(System.currentTimeMillis()));
- }
+ // ✅ Only set created fields for new record
+ 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()) {
+ entity.setDob(Timestamp.valueOf(
+ requestObj.get("dOB").getAsString().replace("T", " ").replace("Z", "")
+ ));
+ }
+
+ rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
- 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()) {
- entity.setDob(Timestamp.valueOf(
- requestObj.get("dOB").getAsString().replace("T", " ").replace("Z", "")
- ));
}
- rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
+
logger.info("Saved RMNCH for benRegID: " + beneficiaryRegID);
From b95b68ecd37b875ce9b5b6dd7538d336ecf75bd1 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Thu, 4 Jun 2026 20:39:55 +0530
Subject: [PATCH 13/42] merge with release-3.6.2
---
.../com/iemr/common/identity/service/IdentityService.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
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 a84febff..d0baad39 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -811,8 +811,12 @@ public List searchBeneficiaryByVillageIdAndLastModifyDate(List
public RMNCHBeneficiaryDetailsRmnch getRmnchDataByBenID(BigInteger benID) {
+ RMNCHBeneficiaryDetailsRmnch rmnchBeneficiaryDetailsRmnch = new RMNCHBeneficiaryDetailsRmnch();
- return rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID);
+ if(!rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID).isEmpty()){
+ rmnchBeneficiaryDetailsRmnch = rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(benID).get(0);
+ }
+ return rmnchBeneficiaryDetailsRmnch;
}
public Long countBeneficiaryByVillageIdAndLastModifyDate(List villageIDs, Timestamp lastModifiedDate) {
From bc39ce176de3f13899ec63b3752662b7ac2a8af6 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Thu, 4 Jun 2026 20:53:25 +0530
Subject: [PATCH 14/42] merge with release-3.6.2
---
.../iemr/common/identity/service/IdentityService.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
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 d0baad39..90e660b9 100644
--- a/src/main/java/com/iemr/common/identity/service/IdentityService.java
+++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java
@@ -2003,6 +2003,7 @@ public List getBeneficiariesDeatilsByBenRegIdList(List
Date: Fri, 12 Jun 2026 17:35:46 +0530
Subject: [PATCH 15/42] fix beneficiary save
---
.../iemr/common/identity/controller/IdentityController.java | 4 +---
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
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 74d9767b..fc894761 100644
--- a/src/main/java/com/iemr/common/identity/controller/IdentityController.java
+++ b/src/main/java/com/iemr/common/identity/controller/IdentityController.java
@@ -321,9 +321,7 @@ public String searchBeneficiaryByVillageIdAndLastModDate(
@PostMapping("/getRmnchDataByBenRedID")
- public ResponseEntity getRmnchDataByBenID(
- @RequestBody BigInteger object) {
-
+ public ResponseEntity getRmnchDataByBenID(@RequestBody BigInteger object) {
try {
RMNCHBeneficiaryDetailsRmnch data = svc.getRmnchDataByBenID(object);
return ResponseEntity.ok(data);
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 07904279..d845d396 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -350,7 +350,7 @@ public String saveBeneficiaryDetailsAfterRegistration(
} catch (Exception e) {
logger.error("Error: ", e);
- throw e;
+ return "Error save beneficiary in rmnch :"+e.getMessage();
}
return "Saved RMNCH for beneficiaryID: " + beneficiaryID;
From 3162f663e49005262c04b96139f4e557cd97471f Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Fri, 12 Jun 2026 18:04:10 +0530
Subject: [PATCH 16/42] fix beneficiary save
---
.../service/rmnch/RmnchDataSyncServiceImpl.java | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index d845d396..f88b095b 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -288,14 +288,18 @@ public String saveBeneficiaryDetailsAfterRegistration(
// ✅ use find instead of get
if(!rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID)).isEmpty()){
- RMNCHBeneficiaryDetailsRmnch entity =
- rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID)).get(0);
+ List list =
+ rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+
+ RMNCHBeneficiaryDetailsRmnch entity;
boolean isNew = false;
- if (entity == null) {
+ if (list.isEmpty()) {
entity = new RMNCHBeneficiaryDetailsRmnch();
isNew = true;
+ } else {
+ entity = list.get(0);
}
String createdBy = getString(requestObj, "createdBy", "system");
@@ -340,8 +344,10 @@ public String saveBeneficiaryDetailsAfterRegistration(
));
}
- rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
+ RMNCHBeneficiaryDetailsRmnch saved =
+ rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
+ logger.info("Saved Entity Id : {}", saved.getBeneficiaryDetails_RmnchId());
}
From c1e2e2d9c54b42f22fc9c6991c4ba0ec70aada2c Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Fri, 12 Jun 2026 18:15:16 +0530
Subject: [PATCH 17/42] fix beneficiary save
---
.../common/identity/service/rmnch/RmnchDataSyncServiceImpl.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index f88b095b..cc8074da 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -277,7 +277,6 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
Long beneficiaryRegID,
From 853ec9736cc495dbe7bb9430307d8eff7b4bd21e Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Sat, 13 Jun 2026 10:17:01 +0530
Subject: [PATCH 18/42] fix beneficiary save
---
.../rmnch/RmnchDataSyncServiceImpl.java | 68 +++++++++++--------
1 file changed, 41 insertions(+), 27 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index cc8074da..b3b760d9 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -276,19 +276,27 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
}
-
+ @Override
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));
- // ✅ use find instead of get
- if(!rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID)).isEmpty()){
- List list =
- rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+ logger.info("Records found for RegID {} : {}", beneficiaryRegID, list.size());
+
+ if (!list.isEmpty()) {
+
+ logger.info("Entering save/update block");
RMNCHBeneficiaryDetailsRmnch entity;
@@ -297,65 +305,71 @@ public String saveBeneficiaryDetailsAfterRegistration(
if (list.isEmpty()) {
entity = new RMNCHBeneficiaryDetailsRmnch();
isNew = true;
+ logger.info("Creating new entity");
} else {
entity = list.get(0);
+ logger.info("Updating existing entity. ID={}",
+ entity.getBeneficiaryDetails_RmnchId());
}
String createdBy = getString(requestObj, "createdBy", "system");
+ logger.info("createdBy={}", createdBy);
entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
- // ✅ Only set created fields for new record
+ logger.info("Basic details set");
+
if (isNew) {
entity.setCreatedBy(createdBy);
entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
+ logger.info("Created fields set");
} else {
entity.setUpdatedBy(createdBy);
entity.setUpdatedDate(new Timestamp(System.currentTimeMillis()));
+ logger.info("Updated fields set");
}
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)
- );
+ logger.info("Location details set");
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
+ logger.info("Personal details set. FirstName={}, LastName={}",
+ entity.getFirstName(), entity.getLastName());
+
if (requestObj.has("dOB") && !requestObj.get("dOB").isJsonNull()) {
+ logger.info("DOB found in request : {}",
+ requestObj.get("dOB").getAsString());
+
entity.setDob(Timestamp.valueOf(
- requestObj.get("dOB").getAsString().replace("T", " ").replace("Z", "")
+ requestObj.get("dOB").getAsString()
+ .replace("T", " ")
+ .replace("Z", "")
));
}
+ logger.info("Before save");
+
RMNCHBeneficiaryDetailsRmnch saved =
rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
- logger.info("Saved Entity Id : {}", saved.getBeneficiaryDetails_RmnchId());
- }
-
+ logger.info("After save. Saved ID={}",
+ saved.getBeneficiaryDetails_RmnchId());
+ } else {
+ logger.info("No record found for beneficiaryRegID={}", beneficiaryRegID);
+ }
- logger.info("Saved RMNCH for benRegID: " + beneficiaryRegID);
+ logger.info("Method completed successfully");
} catch (Exception e) {
- logger.error("Error: ", e);
- return "Error save beneficiary in rmnch :"+e.getMessage();
+ logger.error("Exception occurred in saveBeneficiaryDetailsAfterRegistration", e);
+ return "Error save beneficiary in rmnch :" + e.getMessage();
}
return "Saved RMNCH for beneficiaryID: " + beneficiaryID;
From 52caaa1ecfed73177a0d9d0e0d6061608910e58b Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Sat, 13 Jun 2026 10:25:29 +0530
Subject: [PATCH 19/42] fix beneficiary save
---
.../rmnch/RmnchDataSyncServiceImpl.java | 153 ++++++++++--------
1 file changed, 88 insertions(+), 65 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index b3b760d9..3348775e 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -277,6 +277,7 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
@Override
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
Long beneficiaryRegID,
@@ -286,93 +287,115 @@ public String saveBeneficiaryDetailsAfterRegistration(
beneficiaryID, beneficiaryRegID);
try {
+
JsonObject requestObj = new Gson().fromJson(comingRequest, JsonObject.class);
logger.info("Request Parsed Successfully");
List list =
- rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(BigInteger.valueOf(beneficiaryRegID));
+ rMNCHBeneficiaryDetailsRmnchRepo.getByRegID(
+ BigInteger.valueOf(beneficiaryRegID));
logger.info("Records found for RegID {} : {}", beneficiaryRegID, list.size());
- if (!list.isEmpty()) {
-
- logger.info("Entering save/update block");
+ RMNCHBeneficiaryDetailsRmnch entity;
+ boolean isNew = list.isEmpty();
- RMNCHBeneficiaryDetailsRmnch entity;
-
- boolean isNew = false;
-
- if (list.isEmpty()) {
- entity = new RMNCHBeneficiaryDetailsRmnch();
- isNew = true;
- logger.info("Creating new entity");
- } else {
- entity = list.get(0);
- logger.info("Updating existing entity. ID={}",
- entity.getBeneficiaryDetails_RmnchId());
- }
+ 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");
- logger.info("createdBy={}", createdBy);
+ String createdBy = getString(requestObj, "createdBy", "system");
- entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
- entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
+ entity.setBenficieryid(BigInteger.valueOf(beneficiaryID));
+ entity.setBenRegId(BigInteger.valueOf(beneficiaryRegID));
- logger.info("Basic details set");
+ if (isNew) {
+ entity.setCreatedBy(createdBy);
+ entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
+ } else {
+ entity.setUpdatedBy(createdBy);
+ entity.setUpdatedDate(new Timestamp(System.currentTimeMillis()));
+ }
- if (isNew) {
- entity.setCreatedBy(createdBy);
- entity.setCreatedDate(new Timestamp(System.currentTimeMillis()));
- logger.info("Created fields set");
- } else {
- entity.setUpdatedBy(createdBy);
- entity.setUpdatedDate(new Timestamp(System.currentTimeMillis()));
- logger.info("Updated fields set");
+ 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);
}
+ }
- entity.setVanID(getInt(requestObj, "vanID", null));
- entity.setParkingPlaceID(getInt(requestObj, "parkingPlaceID", null));
- entity.setProviderServiceMapID(getInt(requestObj, "providerServiceMapID", null));
-
- logger.info("Location details set");
-
- entity.setFirstName(getString(requestObj, "firstName", null));
- entity.setLastName(getString(requestObj, "lastName", null));
-
- logger.info("Personal details set. FirstName={}, LastName={}",
- entity.getFirstName(), entity.getLastName());
-
- if (requestObj.has("dOB") && !requestObj.get("dOB").isJsonNull()) {
- logger.info("DOB found in request : {}",
- requestObj.get("dOB").getAsString());
+ logger.info("Before save");
- entity.setDob(Timestamp.valueOf(
- requestObj.get("dOB").getAsString()
- .replace("T", " ")
- .replace("Z", "")
- ));
- }
+ RMNCHBeneficiaryDetailsRmnch saved =
+ rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
- logger.info("Before save");
+ logger.info("After save. Saved ID={}",
+ saved.getBeneficiaryDetails_RmnchId());
- RMNCHBeneficiaryDetailsRmnch saved =
- rMNCHBeneficiaryDetailsRmnchRepo.save(entity);
+ logger.info("Saved RMNCH for benRegID={}", beneficiaryRegID);
- logger.info("After save. Saved ID={}",
- saved.getBeneficiaryDetails_RmnchId());
+ return "Saved RMNCH for beneficiaryID: " + beneficiaryID;
- } else {
- logger.info("No record found for beneficiaryRegID={}", beneficiaryRegID);
- }
+ } catch (Exception e) {
- logger.info("Method completed successfully");
+ logger.error(
+ "Exception occurred in saveBeneficiaryDetailsAfterRegistration",
+ e
+ );
- } catch (Exception e) {
- logger.error("Exception occurred in saveBeneficiaryDetailsAfterRegistration", e);
- return "Error save beneficiary in rmnch :" + e.getMessage();
+ return "Error save beneficiary in rmnch : " + e.getMessage();
}
-
- return "Saved RMNCH for beneficiaryID: " + beneficiaryID;
}
private String getString(JsonObject obj, String key, String defaultVal) {
return (obj.has(key) && !obj.get(key).isJsonNull())
From d75ed23bbc180fbd3ca56fcf06c6d41f125b62ce Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Tue, 16 Jun 2026 16:23:37 +0530
Subject: [PATCH 20/42] fix beneficiary save
---
.../repo/rmnch/RMNCHBenDetailsRepo.java | 18 +++++++---
.../rmnch/RmnchDataSyncServiceImpl.java | 34 +++++++++++--------
2 files changed, 34 insertions(+), 18 deletions(-)
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 104fe902..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
@@ -22,7 +22,9 @@
package com.iemr.common.identity.repo.rmnch;
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;
@@ -35,8 +37,16 @@ public interface RMNCHBenDetailsRepo extends CrudRepository getByBenRegID(
+ @Param("beneficiaryRegID") BigInteger beneficiaryRegID);
}
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 3348775e..ca0807fc 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -172,22 +172,25 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
}
obj.setRelatedBeneficiaryIdsDB(sb.toString());
}
- RMNCHMBeneficiarydetail rmnchmBeneficiarydetail =
- rMNCHBenDetailsRepo.getByBenRegID(obj.getBenRegId());
- if (rmnchmBeneficiarydetail != null) {
- rmnchmBeneficiarydetail.setFirstName(obj.getFirstName());
- rmnchmBeneficiarydetail.setLastName(obj.getLastName());
- rmnchmBeneficiarydetail.setFatherName(obj.getFatherName());
- rmnchmBeneficiarydetail.setMotherName(obj.getMotherName());
- rmnchmBeneficiarydetail.setDob(obj.getDob());
- rmnchmBeneficiarydetail.setSpousename(obj.getSpousename());
- rmnchmBeneficiarydetail.setGender(obj.getGender());
- rmnchmBeneficiarydetail.setGenderId(obj.getGenderId());
- rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus());
- rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId());
- benDetailsList.add(rmnchmBeneficiarydetail);
+ if(!rMNCHBenDetailsRepo.getByBenRegID(obj.getBenRegId()).isEmpty()){
+ RMNCHMBeneficiarydetail rmnchmBeneficiarydetail =
+ rMNCHBenDetailsRepo.getByBenRegID(obj.getBenRegId()).get(0);
+ if (rmnchmBeneficiarydetail != null) {
+ rmnchmBeneficiarydetail.setFirstName(obj.getFirstName());
+ rmnchmBeneficiarydetail.setLastName(obj.getLastName());
+ rmnchmBeneficiarydetail.setFatherName(obj.getFatherName());
+ rmnchmBeneficiarydetail.setMotherName(obj.getMotherName());
+ rmnchmBeneficiarydetail.setDob(obj.getDob());
+ rmnchmBeneficiarydetail.setSpousename(obj.getSpousename());
+ rmnchmBeneficiarydetail.setGender(obj.getGender());
+ rmnchmBeneficiarydetail.setGenderId(obj.getGenderId());
+ rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus());
+ rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId());
+ benDetailsList.add(rmnchmBeneficiarydetail);
+ }
}
+
}
benDetailsExtraList = (ArrayList) rMNCHBeneficiaryDetailsRmnchRepo
@@ -264,8 +267,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);
From 028e1b771466e9855c4ddd812c4495a525edd6a8 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Tue, 16 Jun 2026 16:33:02 +0530
Subject: [PATCH 21/42] fix beneficiary save
---
.../identity/repo/rmnch/RMNCHHouseHoldDetailsRepo.java | 6 ++++--
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 4 ++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHHouseHoldDetailsRepo.java b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHHouseHoldDetailsRepo.java
index 4aed3c87..76490cbd 100644
--- a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHHouseHoldDetailsRepo.java
+++ b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHHouseHoldDetailsRepo.java
@@ -28,11 +28,13 @@
import com.iemr.common.identity.data.rmnch.RMNCHHouseHoldDetails;
+import java.util.List;
+
@Repository
public interface RMNCHHouseHoldDetailsRepo extends CrudRepository {
@Query(" SELECT t FROM RMNCHHouseHoldDetails t WHERE t.id = :vanSerialNo AND t.VanID = :vanID")
public RMNCHHouseHoldDetails getByIdAndVanID(@Param("vanSerialNo") long vanSerialNo, @Param("vanID") int vanID);
- @Query(" SELECT t FROM RMNCHHouseHoldDetails t WHERE t.houseoldId =:houseoldId ")
- public RMNCHHouseHoldDetails getByHouseHoldID(@Param("houseoldId") long houseoldId);
+ @Query("SELECT t FROM RMNCHHouseHoldDetails t WHERE t.houseoldId = :houseoldId")
+ List getByHouseHoldID(@Param("houseoldId") long houseoldId);
}
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index ca0807fc..708bb918 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -248,7 +248,7 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
for (RMNCHHouseHoldDetails obj : houseHoldList) {
RMNCHHouseHoldDetails temp = rMNCHHouseHoldDetailsRepo
- .getByHouseHoldID(obj.getHouseoldId());
+ .getByHouseHoldID(obj.getHouseoldId()).get(0);
if (temp != null)
obj.setHouseHoldDetailsId(temp.getHouseHoldDetailsId());
}
@@ -583,7 +583,7 @@ private String getMappingsForAddressIDs(List addressLi
// 20-09-2021,end
if (benDetailsRMNCHOBJ != null && benDetailsRMNCHOBJ.getHouseoldId() != null)
benHouseHoldRMNCHROBJ = rMNCHHouseHoldDetailsRepo
- .getByHouseHoldID(benDetailsRMNCHOBJ.getHouseoldId());
+ .getByHouseHoldID(benDetailsRMNCHOBJ.getHouseoldId()).get(0);
}
if (benDetailsRMNCHOBJ == null)
From 6258dae8119c3db8bff1ce4c51a32971a7c1a06b Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Tue, 16 Jun 2026 16:43:30 +0530
Subject: [PATCH 22/42] fix beneficiary save
---
.../service/rmnch/RmnchDataSyncServiceImpl.java | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 708bb918..ca85397f 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -247,10 +247,14 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
List houseHoldList = Arrays.asList(objArr3);
for (RMNCHHouseHoldDetails obj : houseHoldList) {
- RMNCHHouseHoldDetails temp = rMNCHHouseHoldDetailsRepo
- .getByHouseHoldID(obj.getHouseoldId()).get(0);
- if (temp != null)
- obj.setHouseHoldDetailsId(temp.getHouseHoldDetailsId());
+ if(!rMNCHHouseHoldDetailsRepo
+ .getByHouseHoldID(obj.getHouseoldId()).isEmpty()){
+ RMNCHHouseHoldDetails temp = rMNCHHouseHoldDetailsRepo
+ .getByHouseHoldID(obj.getHouseoldId()).get(0);
+ if (temp != null)
+ obj.setHouseHoldDetailsId(temp.getHouseHoldDetailsId());
+ }
+
}
houseHoldList = (ArrayList) rMNCHHouseHoldDetailsRepo
.saveAll(houseHoldList);
From ee770954722ab31b6ee27378f941ac1a6df77f05 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 08:22:46 +0530
Subject: [PATCH 23/42] change release version
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index c3b57f1c..9eda8258 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0com.iemr.common.identityidentity-api
- 3.6.2
+ 3.9.0war
From 8d83a9af95d3280c080d3060bdadcaf94aedae34 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 14:03:20 +0530
Subject: [PATCH 24/42] save abha id in health maping with beneficiaryID
---
.../rmnch/RMNCHMobileAppController.java | 4 +-
.../service/rmnch/RmnchDataSyncService.java | 2 +-
.../rmnch/RmnchDataSyncServiceImpl.java | 67 +++++++++++++++++--
src/main/resources/application.properties | 1 +
4 files changed, 66 insertions(+), 8 deletions(-)
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 cbb91cce..5552e90f 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
@@ -59,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 = "Authorization") 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");
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
index 845e79f9..7bbcb316 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncService.java
@@ -22,7 +22,7 @@
package com.iemr.common.identity.service.rmnch;
public interface RmnchDataSyncService {
- public String syncDataToAmrit(String requestOBJ) throws Exception;
+ public String syncDataToAmrit(String requestOBJ, String authorization) throws Exception;
public String saveBeneficiaryDetailsAfterRegistration(
Long beneficiaryID,
Long beneficiaryRegID,
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index a62450ed..d2284ee5 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -33,8 +33,6 @@
import java.util.Map;
import java.util.regex.Pattern;
-import com.iemr.common.identity.utils.OutputResponse;
-import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -78,8 +76,6 @@
import com.iemr.common.identity.utils.exception.IEMRException;
import com.iemr.common.identity.utils.http.HttpUtils;
import com.iemr.common.identity.utils.mapper.InputMapper;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
@Service
@Qualifier("rmnchServiceImpl")
@@ -115,7 +111,8 @@ public class RmnchDataSyncServiceImpl implements RmnchDataSyncService {
private RMNCHMBenRegIdMapRepo rMNCHMBenRegIdMapRepo;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
- public String syncDataToAmrit(String requestOBJ) throws Exception {
+ public String syncDataToAmrit(String requestOBJ, String authorization) throws Exception {
+
Map resultMap = new HashMap();
@@ -133,6 +130,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;
@@ -187,6 +186,14 @@ public String syncDataToAmrit(String requestOBJ) throws Exception {
rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus());
rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId());
benDetailsList.add(rmnchmBeneficiarydetail);
+ if (jsnOBJ.has("abhaId") && !jsnOBJ.get("abhaId").isJsonNull()) {
+ String abhaId = jsnOBJ.get("abhaId").getAsString();
+ if(!abhaId.isEmpty() || abhaId!=null){
+ mapHealthIDToBeneficiary(authorization,rmnchmBeneficiarydetail.getBenRegId().longValue(),rmnchmBeneficiarydetail.getBenficieryid().longValue(),abhaId,rmnchmBeneficiarydetail.getCreatedBy(),rmnchmBeneficiarydetail.getFirstName(),rmnchmBeneficiarydetail.getLastName(),rmnchmBeneficiarydetail.getDob().toString(),rmnchmBeneficiarydetail.getProviderServiceMapID());
+
+ }
+ }
+
}
}
@@ -285,6 +292,56 @@ 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 {
+ 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", dob);
+
+ requestMap.put("ABHAProfile", abhaProfile);
+
+ HttpUtils utils = new HttpUtils();
+
+ HashMap header = new HashMap<>();
+ header.put("Authorization", authorization);
+
+ String responseStr = utils.post(
+ ConfigProperties.getPropertyByName("fhir-url")
+ + ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"),
+ new Gson().toJson(requestMap),
+ header);
+ logger.info("Save abha id in health mapping:"+responseStr.toString());
+ return responseStr;
+ }catch (Exception e){
+ logger.info("Error Save Health Id");
+ return "Error Save Health Id: "+e.getMessage();
+ }
+
+ }
+
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
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
From 3b7dd5200937faa4a7bf965933dcf0b7d5c6e111 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 16:27:15 +0530
Subject: [PATCH 25/42] abha id add in entity class
---
.../identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java | 3 +++
.../identity/data/rmnch/RMNCHMBeneficiarydetail.java | 4 ++++
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 7 ++-----
3 files changed, 9 insertions(+), 5 deletions(-)
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/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index d2284ee5..27ca8739 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -186,12 +186,9 @@ public String syncDataToAmrit(String requestOBJ, String authorization) throws Ex
rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus());
rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId());
benDetailsList.add(rmnchmBeneficiarydetail);
- if (jsnOBJ.has("abhaId") && !jsnOBJ.get("abhaId").isJsonNull()) {
- String abhaId = jsnOBJ.get("abhaId").getAsString();
- if(!abhaId.isEmpty() || abhaId!=null){
- mapHealthIDToBeneficiary(authorization,rmnchmBeneficiarydetail.getBenRegId().longValue(),rmnchmBeneficiarydetail.getBenficieryid().longValue(),abhaId,rmnchmBeneficiarydetail.getCreatedBy(),rmnchmBeneficiarydetail.getFirstName(),rmnchmBeneficiarydetail.getLastName(),rmnchmBeneficiarydetail.getDob().toString(),rmnchmBeneficiarydetail.getProviderServiceMapID());
+ 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());
- }
}
}
From 1d8dbe75ce20d33ac2f192e21cb1c399cbd35d9d Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 16:37:16 +0530
Subject: [PATCH 26/42] abha id add in entity class
---
.../common/identity/service/rmnch/RmnchDataSyncServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 27ca8739..962c31c8 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -333,7 +333,7 @@ public String mapHealthIDToBeneficiary(String authorization,
logger.info("Save abha id in health mapping:"+responseStr.toString());
return responseStr;
}catch (Exception e){
- logger.info("Error Save Health Id");
+ logger.info("Error Save Health Id"+e);
return "Error Save Health Id: "+e.getMessage();
}
From 1801efed23e349b400fe1da51cfafb42c565764c Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 17:31:48 +0530
Subject: [PATCH 27/42] abha id add in entity class
---
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 962c31c8..d5dd5a1b 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -109,6 +109,9 @@ public class RmnchDataSyncServiceImpl implements RmnchDataSyncService {
private RMNCHBenContactRepo rMNCHBenContactRepo;
@Autowired
private RMNCHMBenRegIdMapRepo rMNCHMBenRegIdMapRepo;
+
+ @Value("${fhir-url}")
+ private String fhirUrl;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public String syncDataToAmrit(String requestOBJ, String authorization) throws Exception {
@@ -326,8 +329,7 @@ public String mapHealthIDToBeneficiary(String authorization,
header.put("Authorization", authorization);
String responseStr = utils.post(
- ConfigProperties.getPropertyByName("fhir-url")
- + ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"),
+ fhirUrl+ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"),
new Gson().toJson(requestMap),
header);
logger.info("Save abha id in health mapping:"+responseStr.toString());
From 594ab594c19898d10ea6c75e8a612e99d027de6a Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 17:43:32 +0530
Subject: [PATCH 28/42] abha id add in entity class
---
.../identity/controller/rmnch/RMNCHMobileAppController.java | 2 +-
.../common/identity/service/rmnch/RmnchDataSyncServiceImpl.java | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
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 5552e90f..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
@@ -59,7 +59,7 @@ 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,@RequestHeader(value = "Authorization") String authorization) {
+ public String syncDataToAmrit(@RequestBody String requestOBJ,@RequestHeader(value = "jwttoken") String authorization) {
OutputResponse response = new OutputResponse();
try {
if (requestOBJ != null) {
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index d5dd5a1b..dffbf5df 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -328,6 +328,7 @@ public String mapHealthIDToBeneficiary(String authorization,
HashMap header = new HashMap<>();
header.put("Authorization", authorization);
+
String responseStr = utils.post(
fhirUrl+ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"),
new Gson().toJson(requestMap),
From ec021c4a27c03aa0406a141264a168af92c85b5e Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 17:48:36 +0530
Subject: [PATCH 29/42] abha id add in entity class
---
.../common/identity/service/rmnch/RmnchDataSyncServiceImpl.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index dffbf5df..c7f9e795 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -299,6 +299,7 @@ public String mapHealthIDToBeneficiary(String authorization,
String createdBy,String firstName,String lastName,String dob,Integer providerServiceMapId) {
try {
Map requestMap = new HashMap<>();
+ logger.info("authorization:"+authorization);
requestMap.put("beneficiaryRegID", benRegID);
requestMap.put("beneficiaryID", beneficiaryID);
From 5a83005d1895e31443170e7d47adffd24cfef1b3 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 17:59:41 +0530
Subject: [PATCH 30/42] abha id add in entity class
---
.../rmnch/RmnchDataSyncServiceImpl.java | 61 +++++++++++++++----
1 file changed, 48 insertions(+), 13 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index c7f9e795..f73a2d98 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -40,6 +40,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
+import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -76,6 +77,8 @@
import com.iemr.common.identity.utils.exception.IEMRException;
import com.iemr.common.identity.utils.http.HttpUtils;
import com.iemr.common.identity.utils.mapper.InputMapper;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
@Service
@Qualifier("rmnchServiceImpl")
@@ -298,8 +301,11 @@ public String mapHealthIDToBeneficiary(String authorization,
String abhaId,
String createdBy,String firstName,String lastName,String dob,Integer providerServiceMapId) {
try {
+ RestTemplate restTemplate = new RestTemplate();
+
+ logger.info("Authorization Token : {}", authorization);
+
Map requestMap = new HashMap<>();
- logger.info("authorization:"+authorization);
requestMap.put("beneficiaryRegID", benRegID);
requestMap.put("beneficiaryID", beneficiaryID);
@@ -324,21 +330,50 @@ public String mapHealthIDToBeneficiary(String authorization,
requestMap.put("ABHAProfile", abhaProfile);
- HttpUtils utils = new HttpUtils();
+ 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
+ if (authorization != null && !authorization.startsWith("Bearer ")) {
+ authorization = "Bearer " + authorization;
+ }
+
+ headers.set("Authorization", 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();
- HashMap header = new HashMap<>();
- header.put("Authorization", authorization);
+ } catch (Exception e) {
+ logger.error("Error while saving Health ID Mapping", e);
- String responseStr = utils.post(
- fhirUrl+ConfigProperties.getPropertyByName("mapHealthIDToBeneficiary"),
- new Gson().toJson(requestMap),
- header);
- logger.info("Save abha id in health mapping:"+responseStr.toString());
- return responseStr;
- }catch (Exception e){
- logger.info("Error Save Health Id"+e);
- return "Error Save Health Id: "+e.getMessage();
+ return "Error Save Health Id : " + e.getMessage();
}
}
From 32db7e19a23ca42fc02d06830a8ab14d20a84452 Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 18:18:37 +0530
Subject: [PATCH 31/42] abha id add in entity class
---
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index f73a2d98..131d55f4 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -340,13 +340,9 @@ public String mapHealthIDToBeneficiary(String authorization,
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
-
// Agar token me Bearer nahi aa raha hai
- if (authorization != null && !authorization.startsWith("Bearer ")) {
- authorization = "Bearer " + authorization;
- }
- headers.set("Authorization", authorization);
+ headers.set("Jwttoken", authorization);
HttpEntity entity =
new HttpEntity<>(requestBody, headers);
From a90fe132d315f1822b9fac9e9affcb5b05acfc0c Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 17 Jun 2026 18:32:16 +0530
Subject: [PATCH 32/42] abha id add in entity class
---
.../service/rmnch/RmnchDataSyncServiceImpl.java | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 131d55f4..e11aba38 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -24,6 +24,7 @@
import java.math.BigInteger;
import java.sql.Date;
import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
import java.time.Period;
import java.util.ArrayList;
import java.util.Arrays;
@@ -302,7 +303,17 @@ public String mapHealthIDToBeneficiary(String authorization,
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<>();
@@ -326,7 +337,8 @@ public String mapHealthIDToBeneficiary(String authorization,
abhaProfile.put("firstName", firstName);
abhaProfile.put("middleName", "");
abhaProfile.put("lastName", lastName);
- abhaProfile.put("dob", dob);
+ abhaProfile.put("dob", formattedDob);
+
requestMap.put("ABHAProfile", abhaProfile);
From dc2ad36aad93f0726c8aa065121b14cc52d6df0a Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Mon, 22 Jun 2026 18:05:28 +0530
Subject: [PATCH 33/42] abha id add in entity class
---
.../identity/data/rmnch/RMNCHBeneficiaryDetailsRmnch.java | 4 ++++
.../common/identity/data/rmnch/RMNCHMBeneficiarydetail.java | 4 ++++
.../identity/service/rmnch/RmnchDataSyncServiceImpl.java | 4 ++++
3 files changed, 12 insertions(+)
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 e403b3d7..1fb1b66d 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
@@ -553,4 +553,8 @@ public class RMNCHBeneficiaryDetailsRmnch {
@Expose
@Transient
private String abhaId;
+
+ @Expose
+ @Transient
+ private String familyId;
}
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 d9221675..44f15679 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
@@ -218,4 +218,8 @@ public class RMNCHMBeneficiarydetail {
@Expose
@Transient
private String abhaId;
+
+ @Expose
+ @Column(name = "familyid")
+ private String familyId;
}
\ No newline at end of file
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index e11aba38..0b469009 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -192,6 +192,10 @@ public String syncDataToAmrit(String requestOBJ, String authorization) throws Ex
rmnchmBeneficiarydetail.setGenderId(obj.getGenderId());
rmnchmBeneficiarydetail.setMaritalstatus(obj.getMaritalstatus());
rmnchmBeneficiarydetail.setMaritalstatusId(obj.getMaritalstatusId());
+ if(obj.getFamilyId()!=null && !obj.getFamilyId().isEmpty()){
+ rmnchmBeneficiarydetail.setFamilyId(obj.getFamilyId());
+
+ }
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());
From f1ec9716626d6e143326918f605f7786bee5959a Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 24 Jun 2026 13:55:16 +0530
Subject: [PATCH 34/42] fixed issue of Query did not return a unique result: 2
results were returned in RMNCH
---
.../common/identity/service/rmnch/RmnchDataSyncServiceImpl.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
index 0b469009..f82abf3d 100644
--- a/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
+++ b/src/main/java/com/iemr/common/identity/service/rmnch/RmnchDataSyncServiceImpl.java
@@ -356,7 +356,6 @@ public String mapHealthIDToBeneficiary(String authorization,
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
- // Agar token me Bearer nahi aa raha hai
headers.set("Jwttoken", authorization);
From ad138d7da109609aeeec4be194e514f15214624f Mon Sep 17 00:00:00 2001
From: Saurav Mishra
Date: Wed, 24 Jun 2026 14:25:58 +0530
Subject: [PATCH 35/42] fixed issue of Query did not return a unique result: 2
results were returned in RMNCH
---
.../repo/rmnch/RMNCHBornBirthDetailsRepo.java | 3 ++-
.../repo/rmnch/RMNCHCBACDetailsRepo.java | 2 +-
.../rmnch/RmnchDataSyncServiceImpl.java | 27 +++++++++++++------
3 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBornBirthDetailsRepo.java b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBornBirthDetailsRepo.java
index 2af4d5b7..21488700 100644
--- a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBornBirthDetailsRepo.java
+++ b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHBornBirthDetailsRepo.java
@@ -22,6 +22,7 @@
package com.iemr.common.identity.repo.rmnch;
import java.math.BigInteger;
+import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
@@ -36,5 +37,5 @@ public interface RMNCHBornBirthDetailsRepo extends CrudRepository getByRegID(@Param("benRegID") BigInteger benRegID);
}
diff --git a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHCBACDetailsRepo.java b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHCBACDetailsRepo.java
index 49fb4697..95e452b4 100644
--- a/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHCBACDetailsRepo.java
+++ b/src/main/java/com/iemr/common/identity/repo/rmnch/RMNCHCBACDetailsRepo.java
@@ -37,7 +37,7 @@ public interface RMNCHCBACDetailsRepo extends CrudRepository getByRegID(@Param("benRegID") BigInteger benRegID);
@Query(value = "select beneficiary_visit_code,visit_category from db_iemr.i_ben_flow_outreach where beneficiary_reg_id=:benRegID AND beneficiary_visit_code is not null AND visit_category is not null order by created_date desc limit 1", nativeQuery = true)
public List