From ef1303481e5454056ce9dd192a67880fce3f07df Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Wed, 14 Oct 2026 14:06:05 +0530 Subject: [PATCH] fix(STOP-457): safe repeat import and correct free BenID count - saveGeneratedBenIDToLocalServer uses INSERT IGNORE, so importing the same IDs again (retry after a failed or partial import) skips existing rows instead of failing; returns the number really inserted. - checkAvailablBenIDLocalServer counts only IDs that are neither provisioned nor reserved by a registration in progress. Co-Authored-By: Claude Opus 5.5 --- .../controller/IdentityController.java | 2 ++ .../identity/repo/BenRegIdMappingRepo.java | 6 ++++ .../identity/service/IdentityService.java | 28 +++++++++++++++++-- 3 files changed, 33 insertions(+), 3 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 2482ac47..6468ed3e 100644 --- a/src/main/java/com/iemr/common/identity/controller/IdentityController.java +++ b/src/main/java/com/iemr/common/identity/controller/IdentityController.java @@ -990,6 +990,8 @@ public String saveGeneratedBenIDToLocalServer( logger.info("Number of unique benid imported to local server: " + i); if (i > 0) response.setResponse(i + " Unique benid imported to local server"); + else if (!benIdImportDTOList.isEmpty()) + response.setResponse("All benid already present in local server"); else { response.setResponse("Empty or invalid data"); logger.error("Empty or invalid data. Data Size is : " + benIdImportDTOList.size()); diff --git a/src/main/java/com/iemr/common/identity/repo/BenRegIdMappingRepo.java b/src/main/java/com/iemr/common/identity/repo/BenRegIdMappingRepo.java index 866b2137..ea629982 100644 --- a/src/main/java/com/iemr/common/identity/repo/BenRegIdMappingRepo.java +++ b/src/main/java/com/iemr/common/identity/repo/BenRegIdMappingRepo.java @@ -60,6 +60,12 @@ MBeneficiaryregidmapping findFirstByProviderServiceMapIDAndVehicalNoOrderByBenRe Long countByProvisioned(Boolean isProvisioned); + /** + * Count of BenRegIds that can be given to a new registration: not provisioned + * and not claimed by a registration in progress. + */ + Long countByProvisionedAndReserved(Boolean isProvisioned, Boolean isReserved); + @Transactional @Modifying @Query("update MBeneficiaryregidmapping set providerServiceMapID = null , vehicalNo = null " 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 0d965dd5..f1872cb1 100644 --- a/src/main/java/com/iemr/common/identity/service/IdentityService.java +++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java @@ -2170,7 +2170,9 @@ public int importBenIdToLocalServer(List benIdImportDTOList) { jdbcTemplate = getJdbcTemplate(); List dataList = new ArrayList<>(); Object[] objArr; - String query = " INSERT INTO m_beneficiaryregidmapping(BenRegId, BeneficiaryID, " + // INSERT IGNORE: importing the same IDs again (retry after a failed or partial + // import) skips rows already present instead of failing the whole batch + String query = " INSERT IGNORE INTO m_beneficiaryregidmapping(BenRegId, BeneficiaryID, " + " Provisioned, CreatedDate, CreatedBy, Reserved, vanID) VALUES (?,?,?,?,?,?,?) "; logger.info("query : " + query); for (MBeneficiaryregidmapping obj : mBeneficiaryregidmappingList) { @@ -2191,9 +2193,27 @@ public int importBenIdToLocalServer(List benIdImportDTOList) { logger.info("regid :" + obj.getBenRegId() + " - benid :" + obj.getBeneficiaryID()); } + // batched inserts do not report per-row results, so count the rows in this + // BenRegId range before and after to know how many were really added + java.math.BigInteger minId = null; + java.math.BigInteger maxId = null; + for (MBeneficiaryregidmapping obj : mBeneficiaryregidmappingList) { + java.math.BigInteger id = obj.getBenRegId(); + if (id != null) { + minId = (minId == null || id.compareTo(minId) < 0) ? id : minId; + maxId = (maxId == null || id.compareTo(maxId) > 0) ? id : maxId; + } + } + String rangeCount = "SELECT COUNT(*) FROM m_beneficiaryregidmapping WHERE BenRegId BETWEEN ? AND ?"; + Long before = minId == null ? 0L : jdbcTemplate.queryForObject(rangeCount, Long.class, minId, maxId); + int[] i = jdbcTemplate.batchUpdate(query, dataList); - return i.length; + Long after = minId == null ? 0L : jdbcTemplate.queryForObject(rangeCount, Long.class, minId, maxId); + int inserted = (int) (after - before); + logger.info("IdentityService.importBenIdToLocalServer - received " + i.length + ", newly inserted " + + inserted + ", already present or skipped " + (i.length - inserted)); + return inserted; } else { return 0; } @@ -2201,7 +2221,9 @@ public int importBenIdToLocalServer(List benIdImportDTOList) { } public Long checkBenIDAvailabilityLocal() { - return regIdRepo.countByProvisioned(false); + // Provisioned=false alone also counts rows claimed (Reserved=true) by a registration + // that never completed; those cannot be given to a new registration + return regIdRepo.countByProvisionedAndReserved(false, false); }