diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDao.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDao.java index dee40df2715..0f105ec9af6 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDao.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDao.java @@ -64,7 +64,7 @@ List getConnectionsNoListforsingledemand(String tenantId, String l public List getConnectionCancels( String tenantId, String demandid); public Boolean getUpdates(List demandlists); - public List> getCollection(String tenatId,Long fromDate, Long toDate, String connectionno); + public List> getCollection(String tenatId,Long fromDate, Long toDate, String connectionno,String businessService); public List getBillss (String tenantId, String demandid); diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDaoImpl.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDaoImpl.java index 26b16cc6f06..260e46ac625 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDaoImpl.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/WSCalculationDaoImpl.java @@ -405,9 +405,9 @@ public List getConnectionCancel(String businessService, Stri @Override - public List> getCollection(String tenantId, Long taxPeriodFrom, Long taxPeriodTo, String consumerCode) { + public List> getCollection(String tenantId, Long taxPeriodFrom, Long taxPeriodTo, String consumerCode,String businessService) { List preparedStatement = new ArrayList<>(); - String query = queryBuilder.getCollection(tenantId, taxPeriodFrom, taxPeriodTo, consumerCode, preparedStatement); + String query = queryBuilder.getCollection(tenantId, taxPeriodFrom, taxPeriodTo, consumerCode,businessService, preparedStatement); log.info("preparedStatement: {} | query: {}", preparedStatement, query); diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/builder/WSCalculatorQueryBuilder.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/builder/WSCalculatorQueryBuilder.java index 71f500caca7..54b95ee79e0 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/builder/WSCalculatorQueryBuilder.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/repository/builder/WSCalculatorQueryBuilder.java @@ -786,7 +786,7 @@ public String getCancelBill(String businessService, String tenantId, String cons - public String getCollection( String tenantId, Long taxperiodfrom,Long taxPeriodTo,String consumerCode, + public String getCollection( String tenantId, Long taxperiodfrom,Long taxPeriodTo,String consumerCode,String businessService, List preparedStatement) { StringBuilder query = new StringBuilder(getDemandId); @@ -806,12 +806,22 @@ public String getCollection( String tenantId, Long taxperiodfrom,Long taxPerio preparedStatement.add(consumerCode); - query.append("AND d.businessservice = 'WS' "); + addClauseIfRequired(preparedStatement, query); + query.append(" d.businessservice = ? "); + if (businessService == null || businessService.isEmpty() || "WS".equalsIgnoreCase(businessService)) { + preparedStatement.add("WS"); + } else { + preparedStatement.add("SW"); + } // addClauseIfRequired(preparedStatement, query); // query.append(" dd.collectionamount = '0' "); addClauseIfRequired(preparedStatement, query); + query.append(" d.status = ? "); + preparedStatement.add("ACTIVE"); + + addClauseIfRequired(preparedStatement, query); query.append(" d.ispaymentcompleted = 'false' "); //Add taxperiodfrom diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java index e0243c348a5..85c42bb6db6 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java @@ -57,6 +57,9 @@ @Slf4j public class DemandService { + @Autowired + private WSCalculationDao wSCalculationDao; + @Autowired private ServiceRequestRepository repository; @@ -576,20 +579,6 @@ private List createDemand(CalculationReq calculationReq, List existingSwDemands = searchDemandBasedOnConsumerCode(tenantId, relatedSwConn, requestInfo, "SW"); - if (!CollectionUtils.isEmpty(existingSwDemands)) { - for (Demand existingSwDemand : existingSwDemands) { - if (StatusEnum.ACTIVE.equals(existingSwDemand.getStatus())) { - CancelDemandReq cancelDemandReq = new CancelDemandReq(); - cancelDemandReq.setId(existingSwDemand.getId()); - cancelDemandReq.setTenantId(tenantId); - cancelDemandReq.setConsumerCode(relatedSwConn); - cancelDemandReq.setBusinessService("SW"); - dao.cancelPreviousMeterReading(cancelDemandReq); - } - } - } - if (WSCalculationConstant.meteredConnectionType.equalsIgnoreCase(connection.getConnectionType())) { demandReq.addAll(demands); businessServices = "SW"; @@ -2548,5 +2537,66 @@ public StringBuilder getDemandSearchURLForWS( return url; } +public void validateNoCollectionBeforeCancel(String connectionNo, String relatedSwConn, List> demandList, List> demandListSw) { + double waterCollected = 0.0; + double swCollected = 0.0; + + if (demandList != null && !demandList.isEmpty()) { + for (Map row : demandList) { + Object obj = row.get("amountcollected"); + waterCollected = obj != null ? Double.parseDouble(obj.toString()) : 0.0; + } + } + + if (demandListSw != null && !demandListSw.isEmpty()) { + for (Map row : demandListSw) { + Object obj = row.get("amountcollected"); + swCollected = obj != null ? Double.parseDouble(obj.toString()) : 0.0; + } + } + + if (swCollected > 0) { + throw new CustomException("CANCEL_NOT_ALLOWED", "Cancel demand is not allowed for water related sewerage connection " + relatedSwConn + " as collectionamount > 0."); + } +} + + public void cancelWaterAndRelatedSwDemand(String tenantId, String connectionNo, String relatedSwConn, List> demandList, List> demandListSw) { + + if (demandList != null && !demandList.isEmpty()) { + for (Map row : demandList) { + String demandId = row.get("demandId") != null ? row.get("demandId").toString() : null; + if (demandId == null) { + continue; + } + CancelDemandReq cancelDemandReq = new CancelDemandReq(); + cancelDemandReq.setId(demandId); + cancelDemandReq.setTenantId(tenantId); + cancelDemandReq.setConsumerCode(connectionNo); + cancelDemandReq.setBusinessService("WS"); + + log.info("Synchronously cancelling existing WS demand {} for consumer {}", demandId, connectionNo); + + wSCalculationDao.cancelPreviousMeterReading(cancelDemandReq); + } + } + + if (demandListSw != null && !demandListSw.isEmpty()) { + for (Map row : demandListSw) { + String demandIdSw = row.get("demandId") != null ? row.get("demandId").toString() : null; + if (demandIdSw == null) { + continue; + } + CancelDemandReq cancelSwDemandReq = new CancelDemandReq(); + cancelSwDemandReq.setId(demandIdSw); + cancelSwDemandReq.setTenantId(tenantId); + cancelSwDemandReq.setConsumerCode(relatedSwConn); + cancelSwDemandReq.setBusinessService("SW"); + + log.info("Synchronously cancelling existing SW demand {} for consumer {}", demandIdSw, relatedSwConn); + + wSCalculationDao.cancelPreviousMeterReading(cancelSwDemandReq); + } + } + } } diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/MeterServicesImpl.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/MeterServicesImpl.java index 160872856c1..4a1c7887edf 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/MeterServicesImpl.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/MeterServicesImpl.java @@ -1,6 +1,8 @@ package org.egov.wscalculation.service; import java.util.ArrayList; + +import org.egov.tracer.model.CustomException; import org.egov.wscalculation.validator.MDMSValidator; import org.json.JSONArray; import org.json.JSONObject; @@ -39,6 +41,9 @@ @Component public class MeterServicesImpl implements MeterService { + @Autowired + private DemandService demandService; + @Autowired private WSCalculationDao wSCalculationDao; @@ -191,29 +196,29 @@ public List updateMeterReading(MeterConnectionRequest meterConnect wsCalculationValidator.validateMeterReading(meterConnectionRequest, true); } enrichmentService.enrichMeterReadingRequest(meterConnectionRequest); - List> demandList = wSCalculationDao.getCollection( - meterConnectionRequest.getMeterReading().getTenantId(), - meterConnectionRequest.getMeterReading().getLastReadingDate(), - meterConnectionRequest.getMeterReading().getCurrentReadingDate(), - meterConnectionRequest.getMeterReading().getConnectionNo() - ); - if (demandList != null && !demandList.isEmpty()) { - for (Map row : demandList) { - String status = (String) row.get("status"); - if ("ACTIVE".equalsIgnoreCase(status)) { - String demandId = (String) row.get("demandId"); - - CancelDemandReq cancelDemandReq = new CancelDemandReq(); - cancelDemandReq.setId(demandId); - cancelDemandReq.setTenantId(meterConnectionRequest.getMeterReading().getTenantId()); - cancelDemandReq.setConsumerCode(meterConnectionRequest.getMeterReading().getConnectionNo()); - cancelDemandReq.setBusinessService("WS"); - - wSCalculationDao.cancelPreviousMeterReading(cancelDemandReq); - } - } - } + String tenantId = meterConnectionRequest.getMeterReading().getTenantId(); + String connectionNo = meterConnectionRequest.getMeterReading().getConnectionNo(); + Long lastReadingDate = meterConnectionRequest.getMeterReading().getLastReadingDate(); + Long currentReadingDate = meterConnectionRequest.getMeterReading().getCurrentReadingDate(); + + // Fetch WS demand only once + List> demandList = wSCalculationDao.getCollection(tenantId, lastReadingDate, currentReadingDate, connectionNo, "WS"); + + // Get related SW connection + String relatedSwConn = wSCalculationDao.getSwConnection(tenantId, connectionNo); + + // Fetch SW demand only once + List> demandListSw = null; + if (relatedSwConn != null && !relatedSwConn.isEmpty()) { + demandListSw = wSCalculationDao.getCollection(tenantId, lastReadingDate, currentReadingDate, relatedSwConn, "SW"); + } + // Validate using the SAME fetched lists + demandService.validateNoCollectionBeforeCancel(connectionNo, relatedSwConn, demandList, demandListSw); + + // Cancel using the SAME fetched lists + demandService.cancelWaterAndRelatedSwDemand(tenantId, connectionNo, relatedSwConn, demandList, demandListSw); + meterConnectionRequest.getMeterReading().setId(previousMeterReadingId);; meterReadingsList.add(meterConnectionRequest.getMeterReading()); wSCalculationDao.updateMeterReading(meterConnectionRequest); diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/validator/WSCalculationValidator.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/validator/WSCalculationValidator.java index 841114454d3..b90c6d063b5 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/validator/WSCalculationValidator.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/validator/WSCalculationValidator.java @@ -207,7 +207,7 @@ public void validateMeterReading(MeterConnectionRequest meterConnectionRequest, criteria.getTenantId(), meterConnectionRequest.getMeterReading().getLastReadingDate(), meterConnectionRequest.getMeterReading().getCurrentReadingDate(), - meterConnectionRequest.getMeterReading().getConnectionNo()); + meterConnectionRequest.getMeterReading().getConnectionNo(),null); if (isAnythingPaid != null && !isAnythingPaid.isEmpty()) { for (Map row : isAnythingPaid) {