diff --git a/pom.xml b/pom.xml index 062df58..9e6a49b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.admin admin-api - 3.8.2 + 3.8.4 war Admin-API Admin Page diff --git a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java index 33d980c..cfe1979 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java @@ -1791,6 +1791,12 @@ public String UserRoleMappings(@RequestBody String userRoleMapping, HttpServletR Previleges1097_3[] predata1 = pre.get(x).getPrevileges(); for (Previleges1097_3 previl : predata1) { + // Each role in the ID array must become its own saved row. This used to + // build a single M_UserServiceRoleMapping2 across all iterations of this + // loop and only add it to resList1 once, after the loop — so a batched + // request carrying multiple roles (e.g. Nurse + Counsellor) silently + // discarded every role but the last one. Moving the object creation and + // the add() call inside the loop saves one row per role, as intended. Priveleges1097_2[] predata2 = previl.getID(); for (Priveleges1097_2 previl1 : predata2) { resDataMap1 = new M_UserServiceRoleMapping2(); @@ -1800,22 +1806,22 @@ public String UserRoleMappings(@RequestBody String userRoleMapping, HttpServletR if (previl1.getTeleConsultation() != null) { resDataMap1.setTeleConsultation(previl1.getTeleConsultation()); } + resDataMap1.setUserID(employeeMaster.get(x).getUserID()); + resDataMap1.setProviderServiceMapID(previl.getProviderServiceMapID()); + resDataMap1.setWorkingLocationID(previl.getWorkingLocationID()); + resDataMap1.setStateID(previl.getStateID()); + resDataMap1.setDistrictID(previl.getDistrictID()); + resDataMap1.setCreatedBy(employeeMaster.get(x).getCreatedBy()); + resDataMap1.setServiceProviderID(employeeMaster.get(x).getServiceProviderID()); + resDataMap1.setBlockID(previl.getBlockID()); + resDataMap1.setBlockName(previl.getBlockName()); + resDataMap1.setVillageID(previl.getVillageID()); + resDataMap1.setVillageName(previl.getVillageName()); + resDataMap1.setFacilityID(previl.getFacilityID()); + resDataMap1.setNikshayTUID(previl.getNikshayTUID()); + resDataMap1.setNikshayFacilityID(previl.getNikshayFacilityID()); + resList1.add(resDataMap1); } - resDataMap1.setUserID(employeeMaster.get(x).getUserID()); - resDataMap1.setProviderServiceMapID(previl.getProviderServiceMapID()); - resDataMap1.setWorkingLocationID(previl.getWorkingLocationID()); - resDataMap1.setStateID(previl.getStateID()); - resDataMap1.setDistrictID(previl.getDistrictID()); - resDataMap1.setCreatedBy(employeeMaster.get(x).getCreatedBy()); - resDataMap1.setServiceProviderID(employeeMaster.get(x).getServiceProviderID()); - resDataMap1.setBlockID(previl.getBlockID()); - resDataMap1.setBlockName(previl.getBlockName()); - resDataMap1.setVillageID(previl.getVillageID()); - resDataMap1.setVillageName(previl.getVillageName()); - resDataMap1.setFacilityID(previl.getFacilityID()); - resDataMap1.setNikshayTUID(previl.getNikshayTUID()); - resDataMap1.setNikshayFacilityID(previl.getNikshayFacilityID()); - resList1.add(resDataMap1); } x++; @@ -1863,11 +1869,15 @@ public String updateUserRoleMapping(@RequestBody String updateUserRoleMapping, H } } - // Soft-delete other active mappings for same user+service to prevent duplicates - // (e.g. old roleID 122 rows left over when new roleID 128 mapping was created) - if (pre.getUserID() != null && pre.getProviderServiceMapID() != null && pre.getuSRMappingID() != null) { + // Soft-delete other active mappings for same user+service+role to prevent + // duplicates (e.g. a stale leftover row still claiming this same role). + // Scoped by roleID as well as user+service — otherwise this deletes every + // OTHER role the user holds under this service line too, not just true + // duplicates of the role being saved here. + if (pre.getUserID() != null && pre.getProviderServiceMapID() != null && pre.getRoleID() != null + && pre.getuSRMappingID() != null) { employeeMasterInter.softDeleteOldMappings( - pre.getUserID(), pre.getProviderServiceMapID(), pre.getuSRMappingID()); + pre.getUserID(), pre.getProviderServiceMapID(), pre.getRoleID(), pre.getuSRMappingID()); } usrRole.setUserID(pre.getUserID()); diff --git a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java index e2bf74f..33929fe 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java @@ -155,10 +155,15 @@ boolean existsByUserIDAndRoleIDAndProviderServiceMapIDAndFacilityIDAndDeletedFal // Fix 2: count active USR rows for supervisor (check if other facilities remain) long countByUserIDAndRoleIDAndDeletedFalse(Integer userID, Integer roleID); - // Soft-delete old duplicate mappings for same user+service, excluding the current row being updated + // Soft-delete old duplicate mappings for the SAME user+service+role, excluding + // the current row being updated. Previously left roleID out of the WHERE + // clause entirely, so updating any one role's mapping soft-deleted every + // OTHER active role that user held under the same service line (e.g. saving + // Registration Officer wiped out an unrelated, already-active Counsellor + // mapping) instead of only cleaning up true duplicates of the same role. @Transactional @Modifying - @Query("UPDATE M_UserServiceRoleMapping2 u SET u.deleted = true WHERE u.userID = :userID AND u.providerServiceMapID = :providerServiceMapID AND u.uSRMappingID != :excludeUSRMappingID AND u.deleted = false") - int softDeleteOldMappings(@Param("userID") Integer userID, @Param("providerServiceMapID") Integer providerServiceMapID, @Param("excludeUSRMappingID") Integer excludeUSRMappingID); + @Query("UPDATE M_UserServiceRoleMapping2 u SET u.deleted = true WHERE u.userID = :userID AND u.providerServiceMapID = :providerServiceMapID AND u.roleID = :roleID AND u.uSRMappingID != :excludeUSRMappingID AND u.deleted = false") + int softDeleteOldMappings(@Param("userID") Integer userID, @Param("providerServiceMapID") Integer providerServiceMapID, @Param("roleID") Integer roleID, @Param("excludeUSRMappingID") Integer excludeUSRMappingID); } diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java index 859f087..9b51b81 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java @@ -166,8 +166,8 @@ Boolean checkingEmpDetails(String userName, String aadhaarNo, String getpAN, Str // Fix 2: cascade soft-delete asha_supervisor_mapping rows when a user is deactivated void cascadeDeleteAshaMappingsForUser(Integer userID); - // Soft-delete other active mappings for same user+service, excluding the row being updated - int softDeleteOldMappings(Integer userID, Integer providerServiceMapID, Integer excludeUSRMappingID); + // Soft-delete other active mappings for same user+service+role, excluding the row being updated + int softDeleteOldMappings(Integer userID, Integer providerServiceMapID, Integer roleID, Integer excludeUSRMappingID); // Fix 2: smart cascade — for supervisor with multiple facilities, only delete mappings for this facility void cascadeDeleteAshaMappingsForDeactivation(M_UserServiceRoleMapping2 usrRole); diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java index f09d0bd..16229ca 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -1025,8 +1025,8 @@ public void cascadeDeleteAshaMappingsForUser(Integer userID) { } @Override - public int softDeleteOldMappings(Integer userID, Integer providerServiceMapID, Integer excludeUSRMappingID) { - return employeeMasterRepo.softDeleteOldMappings(userID, providerServiceMapID, excludeUSRMappingID); + public int softDeleteOldMappings(Integer userID, Integer providerServiceMapID, Integer roleID, Integer excludeUSRMappingID) { + return employeeMasterRepo.softDeleteOldMappings(userID, providerServiceMapID, roleID, excludeUSRMappingID); } @Override