@@ -100,7 +100,7 @@ public M_Facility getMainStore(Integer mainStoreID) {
100100 @ Override
101101 public List <M_Facility > getAllMainStore (Integer providerServiceMapID ) {
102102 // TODO Auto-generated method stub
103- return (List <M_Facility >) mainStoreRepo .findByProviderServiceMapIDOrderByFacilityName (providerServiceMapID );
103+ return (List <M_Facility >) mainStoreRepo .findByProviderServiceMapIDOrNullOrderByFacilityName (providerServiceMapID );
104104 }
105105
106106 // @Override
@@ -321,6 +321,15 @@ public M_Facility createFacilityWithHierarchy(M_Facility facility, List<Integer>
321321 child .setParentFacilityID (savedFacility .getFacilityID ());
322322 child .setModifiedBy (facility .getCreatedBy ());
323323 mainStoreRepo .save (child );
324+
325+ // Only update store fields for NEW hierarchy facilities (PSMID is NULL)
326+ // Existing stores (PSMID set) keep their store chain intact for inventory compatibility
327+ if (child .getProviderServiceMapID () == null ) {
328+ if (child .getIsMainFacility () == null || child .getIsMainFacility ()) {
329+ mainStoreRepo .updateStoreFields (childID , false ,
330+ savedFacility .getFacilityID (), "SUB" );
331+ }
332+ }
324333 }
325334 }
326335 }
@@ -356,11 +365,16 @@ public M_Facility deleteFacilityWithHierarchy(Integer facilityID, String modifie
356365 throw new Exception ("Facility not found" );
357366 }
358367 // Fix 19: clear parentFacilityID on children (unlink from hierarchy, don't block)
368+ // Revert children to MainStore since parent is being deleted
359369 ArrayList <M_Facility > children = mainStoreRepo .findByParentFacilityIDAndDeletedFalseOrderByFacilityName (facilityID );
360370 for (M_Facility child : children ) {
361371 child .setParentFacilityID (null );
362372 child .setModifiedBy (modifiedBy );
363373 mainStoreRepo .save (child );
374+ // Only revert store fields for new facilities (PSMID NULL)
375+ if (child .getProviderServiceMapID () == null ) {
376+ mainStoreRepo .updateStoreFields (child .getFacilityID (), true , null , "MAIN" );
377+ }
364378 }
365379 facility .setDeleted (true );
366380 facility .setModifiedBy (modifiedBy );
@@ -386,14 +400,39 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List<Integer>
386400 throw new RuntimeException ("Facility not found" );
387401 }
388402
389- if (mainStoreRepo .existsByFacilityNameAndBlockIDAndNotFacilityID (facility .getFacilityName (), existing .getBlockID (), facility .getFacilityID ())) {
390- throw new RuntimeException ("Facility with this name already exists in this block" );
403+ if (existing .getBlockID () != null && facility .getFacilityName () != null ) {
404+ if (mainStoreRepo .existsByFacilityNameAndBlockIDAndNotFacilityID (facility .getFacilityName (), existing .getBlockID (), facility .getFacilityID ())) {
405+ throw new RuntimeException ("Facility with this name already exists in this block" );
406+ }
391407 }
392408
393- existing .setFacilityName (facility .getFacilityName ());
394- existing .setFacilityDesc (facility .getFacilityDesc ());
395- existing .setFacilityCode (facility .getFacilityCode ());
396- // Rural/Urban and FacilityType are read-only on edit — admin must delete and recreate to change
409+ if (facility .getFacilityName () != null ) {
410+ existing .setFacilityName (facility .getFacilityName ());
411+ }
412+ if (facility .getFacilityDesc () != null ) {
413+ existing .setFacilityDesc (facility .getFacilityDesc ());
414+ }
415+ if (facility .getFacilityCode () != null ) {
416+ existing .setFacilityCode (facility .getFacilityCode ());
417+ }
418+ // Set hierarchy fields: facilityType, ruralUrban, and location
419+ if (facility .getFacilityTypeID () != null ) {
420+ existing .setFacilityTypeID (facility .getFacilityTypeID ());
421+ }
422+ if (facility .getRuralUrban () != null ) {
423+ existing .setRuralUrban (facility .getRuralUrban ());
424+ }
425+ if (facility .getStateID () != null ) {
426+ existing .setStateID (facility .getStateID ());
427+ }
428+ if (facility .getDistrictID () != null ) {
429+ existing .setDistrictID (facility .getDistrictID ());
430+ }
431+ if (facility .getBlockID () != null ) {
432+ existing .setBlockID (facility .getBlockID ());
433+ }
434+ // Keep store relationships intact (isMainFacility, mainFacilityID, storeType)
435+ // Only hierarchy columns are added. Store chain stays for inventory compatibility.
397436 existing .setMainVillageID (mainVillageID );
398437 existing .setModifiedBy (facility .getModifiedBy ());
399438 M_Facility savedFacility = mainStoreRepo .save (existing );
@@ -458,13 +497,33 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List<Integer>
458497 }
459498 }
460499 }
500+ // Revert old children to MainStore before re-linking
501+ ArrayList <M_Facility > oldChildren = mainStoreRepo
502+ .findByParentFacilityIDAndDeletedFalseOrderByFacilityName (facility .getFacilityID ());
461503 mainStoreRepo .clearParentFacilityID (facility .getFacilityID (), facility .getModifiedBy ());
504+ for (M_Facility oldChild : oldChildren ) {
505+ if (!childFacilityIDs .contains (oldChild .getFacilityID ())) {
506+ // Child was removed — revert to MainStore only for new facilities (PSMID NULL)
507+ if (oldChild .getProviderServiceMapID () == null ) {
508+ mainStoreRepo .updateStoreFields (oldChild .getFacilityID (), true , null , "MAIN" );
509+ }
510+ }
511+ }
512+
462513 for (Integer childID : childFacilityIDs ) {
463514 M_Facility child = mainStoreRepo .findByFacilityID (childID );
464515 if (child != null ) {
465516 child .setParentFacilityID (savedFacility .getFacilityID ());
466517 child .setModifiedBy (facility .getModifiedBy ());
467518 mainStoreRepo .save (child );
519+
520+ // Only update store fields for NEW hierarchy facilities (PSMID is NULL)
521+ if (child .getProviderServiceMapID () == null ) {
522+ if (child .getIsMainFacility () == null || child .getIsMainFacility ()) {
523+ mainStoreRepo .updateStoreFields (childID , false ,
524+ savedFacility .getFacilityID (), "SUB" );
525+ }
526+ }
468527 }
469528 }
470529 }
0 commit comments