diff --git a/logs/admin-api.log.json.2026-02-26.gz b/logs/admin-api.log.json.2026-02-26.gz new file mode 100644 index 0000000..510c59d Binary files /dev/null and b/logs/admin-api.log.json.2026-02-26.gz differ diff --git a/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java b/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java index a827f18..0bf5bd5 100644 --- a/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java +++ b/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java @@ -228,6 +228,23 @@ public String getAllFacilityMappedData(@RequestBody String getAllFacilityMappedD } + @RequestMapping(value = "/getItemMappingsByFacility", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getItemMappingsByFacility(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + V_fetchItemFacilityMap reqObj = InputMapper.gson().fromJson(request, + V_fetchItemFacilityMap.class); + ArrayList data = M_itemfacilitymappingInter + .getItemMappingsByFacilityID(reqObj.getFacilityID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + @Operation(summary = "Get item from store id") @RequestMapping(value = "/getItemFromStoreID/{storeID}", headers = "Authorization", method = { RequestMethod.POST }, produces = { "application/json" }) diff --git a/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java b/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java index e94dba5..07b52bd 100644 --- a/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java +++ b/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java @@ -36,4 +36,12 @@ public interface V_fetchItemFacilityMapRepo extends CrudRepository getAllFacilityMappedData(@Param("providerServiceMapID") Integer providerServiceMapID); + @Query("SELECT u FROM V_fetchItemFacilityMap u where u.facilityID = :facilityID") + ArrayList getItemMappingsByFacilityID(@Param("facilityID") Integer facilityID); + + @Query(value = "SELECT u.* FROM v_fetchItemFacilityMap u WHERE u.FacilityID = :facilityID " + + "OR u.FacilityID IN (SELECT f.FacilityID FROM m_facility f WHERE f.MainFacilityID = :facilityID AND f.Deleted = false)", + nativeQuery = true) + ArrayList getItemMappingsByFacilityAndSubStores(@Param("facilityID") Integer facilityID); + } diff --git a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java index c9c1ef3..45b1015 100644 --- a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java +++ b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java @@ -37,6 +37,9 @@ public interface MainStoreRepo extends CrudRepository { List findByProviderServiceMapIDOrderByFacilityName(Integer providerServiceMapID); + @Query("SELECT f FROM M_Facility f WHERE (f.providerServiceMapID = :providerServiceMapID OR f.providerServiceMapID IS NULL) ORDER BY f.facilityName") + List findByProviderServiceMapIDOrNullOrderByFacilityName(@Param("providerServiceMapID") Integer providerServiceMapID); + @Query("SELECT u FROM M_Facility u WHERE u.providerServiceMapID=:providerServiceMapID AND u.isMainFacility=:isMainFacility AND deleted=false order by u.facilityName") ArrayList getAllMainFacility(@Param("providerServiceMapID") Integer providerServiceMapID, @Param("isMainFacility") Boolean isMainFacility); @@ -90,4 +93,11 @@ ArrayList findByBlockIDAndLevelValue(@Param("blockID") Integer block int clearParentFacilityID(@Param("parentFacilityID") Integer parentFacilityID, @Param("modifiedBy") String modifiedBy); + @Modifying + @Query(value = "UPDATE m_facility SET IsMainFacility = :isMainFacility, MainFacilityID = :mainFacilityID, StoreType = :storeType WHERE FacilityID = :facilityID", nativeQuery = true) + int updateStoreFields(@Param("facilityID") Integer facilityID, + @Param("isMainFacility") Boolean isMainFacility, + @Param("mainFacilityID") Integer mainFacilityID, + @Param("storeType") String storeType); + } diff --git a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java index 2d5ce00..e12a844 100644 --- a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java +++ b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java @@ -91,6 +91,11 @@ public ArrayList getAllFacilityMappedData(Integer provid return data; } + @Override + public ArrayList getItemMappingsByFacilityID(Integer facilityID) { + return v_fetchItemFacilityMapRepo.getItemMappingsByFacilityAndSubStores(facilityID); + } + @Override public List getItemMastersFromStoreID(Integer storeID) { // TODO Auto-generated method stub diff --git a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java index d41d661..54115cf 100644 --- a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java +++ b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java @@ -39,7 +39,9 @@ public interface M_itemfacilitymappingInter{ ArrayList getsubitemforsubStote(Integer providerServiceMapID, Integer facilityID); ArrayList getAllFacilityMappedData(Integer providerServiceMapID); - + + ArrayList getItemMappingsByFacilityID(Integer facilityID); + List getItemMastersFromStoreID(Integer storeID); Integer deleteItemStoreMapping(M_itemfacilitymapping storeID); diff --git a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java index db300f8..a08e8cd 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java @@ -100,7 +100,7 @@ public M_Facility getMainStore(Integer mainStoreID) { @Override public List getAllMainStore(Integer providerServiceMapID) { // TODO Auto-generated method stub - return (List) mainStoreRepo.findByProviderServiceMapIDOrderByFacilityName(providerServiceMapID); + return (List) mainStoreRepo.findByProviderServiceMapIDOrNullOrderByFacilityName(providerServiceMapID); } // @Override @@ -321,6 +321,15 @@ public M_Facility createFacilityWithHierarchy(M_Facility facility, List child.setParentFacilityID(savedFacility.getFacilityID()); child.setModifiedBy(facility.getCreatedBy()); mainStoreRepo.save(child); + + // Only update store fields for NEW hierarchy facilities (PSMID is NULL) + // Existing stores (PSMID set) keep their store chain intact for inventory compatibility + if (child.getProviderServiceMapID() == null) { + if (child.getIsMainFacility() == null || child.getIsMainFacility()) { + mainStoreRepo.updateStoreFields(childID, false, + savedFacility.getFacilityID(), "SUB"); + } + } } } } @@ -356,11 +365,16 @@ public M_Facility deleteFacilityWithHierarchy(Integer facilityID, String modifie throw new Exception("Facility not found"); } // Fix 19: clear parentFacilityID on children (unlink from hierarchy, don't block) + // Revert children to MainStore since parent is being deleted ArrayList children = mainStoreRepo.findByParentFacilityIDAndDeletedFalseOrderByFacilityName(facilityID); for (M_Facility child : children) { child.setParentFacilityID(null); child.setModifiedBy(modifiedBy); mainStoreRepo.save(child); + // Only revert store fields for new facilities (PSMID NULL) + if (child.getProviderServiceMapID() == null) { + mainStoreRepo.updateStoreFields(child.getFacilityID(), true, null, "MAIN"); + } } facility.setDeleted(true); facility.setModifiedBy(modifiedBy); @@ -386,14 +400,39 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List throw new RuntimeException("Facility not found"); } - if (mainStoreRepo.existsByFacilityNameAndBlockIDAndNotFacilityID(facility.getFacilityName(), existing.getBlockID(), facility.getFacilityID())) { - throw new RuntimeException("Facility with this name already exists in this block"); + if (existing.getBlockID() != null && facility.getFacilityName() != null) { + if (mainStoreRepo.existsByFacilityNameAndBlockIDAndNotFacilityID(facility.getFacilityName(), existing.getBlockID(), facility.getFacilityID())) { + throw new RuntimeException("Facility with this name already exists in this block"); + } } - existing.setFacilityName(facility.getFacilityName()); - existing.setFacilityDesc(facility.getFacilityDesc()); - existing.setFacilityCode(facility.getFacilityCode()); - // Rural/Urban and FacilityType are read-only on edit — admin must delete and recreate to change + if (facility.getFacilityName() != null) { + existing.setFacilityName(facility.getFacilityName()); + } + if (facility.getFacilityDesc() != null) { + existing.setFacilityDesc(facility.getFacilityDesc()); + } + if (facility.getFacilityCode() != null) { + existing.setFacilityCode(facility.getFacilityCode()); + } + // Set hierarchy fields: facilityType, ruralUrban, and location + if (facility.getFacilityTypeID() != null) { + existing.setFacilityTypeID(facility.getFacilityTypeID()); + } + if (facility.getRuralUrban() != null) { + existing.setRuralUrban(facility.getRuralUrban()); + } + if (facility.getStateID() != null) { + existing.setStateID(facility.getStateID()); + } + if (facility.getDistrictID() != null) { + existing.setDistrictID(facility.getDistrictID()); + } + if (facility.getBlockID() != null) { + existing.setBlockID(facility.getBlockID()); + } + // Keep store relationships intact (isMainFacility, mainFacilityID, storeType) + // Only hierarchy columns are added. Store chain stays for inventory compatibility. existing.setMainVillageID(mainVillageID); existing.setModifiedBy(facility.getModifiedBy()); M_Facility savedFacility = mainStoreRepo.save(existing); @@ -458,13 +497,33 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List } } } + // Revert old children to MainStore before re-linking + ArrayList oldChildren = mainStoreRepo + .findByParentFacilityIDAndDeletedFalseOrderByFacilityName(facility.getFacilityID()); mainStoreRepo.clearParentFacilityID(facility.getFacilityID(), facility.getModifiedBy()); + for (M_Facility oldChild : oldChildren) { + if (!childFacilityIDs.contains(oldChild.getFacilityID())) { + // Child was removed — revert to MainStore only for new facilities (PSMID NULL) + if (oldChild.getProviderServiceMapID() == null) { + mainStoreRepo.updateStoreFields(oldChild.getFacilityID(), true, null, "MAIN"); + } + } + } + for (Integer childID : childFacilityIDs) { M_Facility child = mainStoreRepo.findByFacilityID(childID); if (child != null) { child.setParentFacilityID(savedFacility.getFacilityID()); child.setModifiedBy(facility.getModifiedBy()); mainStoreRepo.save(child); + + // Only update store fields for NEW hierarchy facilities (PSMID is NULL) + if (child.getProviderServiceMapID() == null) { + if (child.getIsMainFacility() == null || child.getIsMainFacility()) { + mainStoreRepo.updateStoreFields(childID, false, + savedFacility.getFacilityID(), "SUB"); + } + } } } }