/** * eGov suite of products aim to improve the internal efficiency,transparency, accountability and the service delivery of the * government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation is available at http://www.egovernments.org * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the License, or any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If not, see * http://www.gnu.org/licenses/ or http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this program, the following additional terms are to be * complied with: * * 1) All versions of this program, verbatim or modified must carry this Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It is required that all modified versions of this * material be marked in reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program with regards to rights under trademark law for use of the * trade names or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.stms.transactions.service; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_CANCELLED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_CLOSERSANCTIONED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_COLLECTINSPECTIONFEE; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_CREATED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_DEEAPPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_ESTIMATENOTICEGEN; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_FEEPAID; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_FINALAPPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_INITIALAPPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_INSPECTIONFEEPAID; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_REJECTED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_SANCTIONED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPLICATION_STATUS_WOGENERATED; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPL_INDEX_MODULE_NAME; import static org.egov.stms.utils.constants.SewerageTaxConstants.APPROVEWORKFLOWACTION; import static org.egov.stms.utils.constants.SewerageTaxConstants.CHANGEINCLOSETS; import static org.egov.stms.utils.constants.SewerageTaxConstants.CHANGEINCLOSETS_NOCOLLECTION; import static org.egov.stms.utils.constants.SewerageTaxConstants.CLOSESEWERAGECONNECTION; import static org.egov.stms.utils.constants.SewerageTaxConstants.DOCTYPE_OTHERS; import static org.egov.stms.utils.constants.SewerageTaxConstants.MODULETYPE; import static org.egov.stms.utils.constants.SewerageTaxConstants.NOTICE_TYPE_WORK_ORDER_NOTICE; import static org.egov.stms.utils.constants.SewerageTaxConstants.WFLOW_ACTION_STEP_CANCEL; import static org.egov.stms.utils.constants.SewerageTaxConstants.WFLOW_ACTION_STEP_REJECT; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_ASSISTANT_APPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_CLERK_APPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_DEPUTY_EXE_APPROVED; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_INSPECTIONFEE_COLLECTED; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_INSPECTIONFEE_PENDING; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_PAYMENTDONE; import static org.egov.stms.utils.constants.SewerageTaxConstants.WF_STATE_REJECTED; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.validation.ValidationException; import org.egov.commons.entity.Source; import org.egov.demand.model.EgDemand; import org.egov.eis.entity.Assignment; import org.egov.eis.service.AssignmentService; import org.egov.eis.service.EisCommonService; import org.egov.infra.admin.master.entity.User; import org.egov.infra.admin.master.service.UserService; import org.egov.infra.filestore.entity.FileStoreMapper; import org.egov.infra.reporting.engine.ReportOutput; import org.egov.infra.search.elastic.entity.ApplicationIndex; import org.egov.infra.search.elastic.entity.ApplicationIndexBuilder; import org.egov.infra.search.elastic.entity.enums.ApprovalStatus; import org.egov.infra.search.elastic.entity.enums.ClosureStatus; import org.egov.infra.search.elastic.service.ApplicationIndexService; import org.egov.infra.security.utils.SecurityUtils; import org.egov.infra.utils.autonumber.AutonumberServiceBeanResolver; import org.egov.infra.workflow.entity.State; import org.egov.infra.workflow.entity.StateHistory; import org.egov.pims.commons.Position; import org.egov.ptis.domain.model.AssessmentDetails; import org.egov.ptis.domain.model.OwnerName; import org.egov.ptis.domain.service.property.PropertyExternalService; import org.egov.stms.autonumber.SHSCNumberGenerator; import org.egov.stms.autonumber.SewerageApplicationNumberGenerator; import org.egov.stms.autonumber.SewerageCloseConnectionNoticeNumberGenerator; import org.egov.stms.autonumber.SewerageEstimationNumberGenerator; import org.egov.stms.autonumber.SewerageWorkOrderNumberGenerator; import org.egov.stms.elasticSearch.service.SewerageIndexService; import org.egov.stms.masters.entity.enums.SewerageConnectionStatus; import org.egov.stms.masters.service.DocumentTypeMasterService; import org.egov.stms.notice.entity.SewerageNotice; import org.egov.stms.notice.service.SewerageNoticeService; import org.egov.stms.transactions.entity.SewerageApplicationDetails; import org.egov.stms.transactions.entity.SewerageApplicationDetailsDocument; import org.egov.stms.transactions.entity.SewerageDemandConnection; import org.egov.stms.transactions.repository.SewerageApplicationDetailsRepository; import org.egov.stms.transactions.workflow.ApplicationWorkflowCustomDefaultImpl; import org.egov.stms.utils.SewerageTaxUtils; import org.hibernate.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @Service @Transactional(readOnly = true) public class SewerageApplicationDetailsService { private static final Logger LOG = LoggerFactory.getLogger(SewerageApplicationDetailsService.class); @Autowired private SewerageTaxUtils sewerageTaxUtils; @Autowired @Qualifier("parentMessageSource") private MessageSource stmsMessageSource; protected SewerageApplicationDetailsRepository sewerageApplicationDetailsRepository; @Autowired private AssignmentService assignmentService; @Autowired private UserService userService; @Autowired private SecurityUtils securityUtils; @Autowired private ApplicationIndexService applicationIndexService; @PersistenceContext private EntityManager entityManager; @Autowired private AutonumberServiceBeanResolver beanResolver; @Autowired private SewerageDemandService sewerageDemandService; @Autowired @Qualifier("seweargeApplicationWorkflowCustomDefaultImpl") private ApplicationWorkflowCustomDefaultImpl applicationWorkflowCustomDefaultImpl; @Autowired private EisCommonService eisCommonService; @Autowired private SewerageIndexService sewerageIndexService; @Autowired private SewerageConnectionSmsAndEmailService sewerageConnectionSmsAndEmailService; @Autowired private SewerageNoticeService sewerageNoticeService; @Autowired private DocumentTypeMasterService documentTypeMasterService; @Autowired public SewerageApplicationDetailsService( final SewerageApplicationDetailsRepository sewerageApplicationDetailsRepository) { this.sewerageApplicationDetailsRepository = sewerageApplicationDetailsRepository; } public SewerageApplicationDetails findBy(final Long id) { return sewerageApplicationDetailsRepository.findOne(id); } public SewerageApplicationDetails findByApplicationNumber(final String applicationNumber) { return sewerageApplicationDetailsRepository.findByApplicationNumber(applicationNumber); } public SewerageApplicationDetails findByApplicationNumberAndConnectionStatus(final String applicationNumber, final SewerageConnectionStatus status) { return sewerageApplicationDetailsRepository.findByApplicationNumberAndConnection_Status(applicationNumber, status); } public SewerageApplicationDetails findByConnectionShscNumberAndConnectionStatus(final String shscNumber, final SewerageConnectionStatus status) { return sewerageApplicationDetailsRepository.findByConnection_ShscNumberAndConnection_Status(shscNumber, status); } public List<SewerageApplicationDetails> findByConnectionShscNumber(final String shscNumber) { return sewerageApplicationDetailsRepository.findByConnection_ShscNumber(shscNumber); } @Transactional public SewerageApplicationDetails createLegacySewerageConnection( final SewerageApplicationDetails sewerageApplicationDetails, final HttpServletRequest request) { if (sewerageApplicationDetails.getApplicationNumber() == null) { final SewerageApplicationNumberGenerator sewerageApplnNumberGenerator = beanResolver .getAutoNumberServiceFor(SewerageApplicationNumberGenerator.class); if (sewerageApplnNumberGenerator != null) sewerageApplicationDetails.setApplicationNumber(sewerageApplnNumberGenerator .generateNextApplicationNumber(sewerageApplicationDetails)); } sewerageApplicationDetails.getConnection().setLegacy(true); sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.ACTIVE); sewerageApplicationDetails.setActive(true); sewerageApplicationDetails.setApplicationDate(new Date()); final Date disposalDate = getDisposalDate(sewerageApplicationDetails, sewerageApplicationDetails.getApplicationType().getProcessingTime()); sewerageApplicationDetails.setDisposalDate(disposalDate); if (sewerageApplicationDetails != null && sewerageApplicationDetails.getCurrentDemand() == null) { final EgDemand demand = sewerageDemandService.createDemandOnLegacyConnection( sewerageApplicationDetails.getDemandDetailBeanList(), sewerageApplicationDetails); if (demand != null) { final SewerageDemandConnection sdc = new SewerageDemandConnection(); sdc.setDemand(demand); sdc.setApplicationDetails(sewerageApplicationDetails); sewerageApplicationDetails.addDemandConnections(sdc); } } sewerageApplicationDetailsRepository.save(sewerageApplicationDetails); updateIndexes(sewerageApplicationDetails); return sewerageApplicationDetails; } @Transactional public SewerageApplicationDetails createNewSewerageConnection( final SewerageApplicationDetails sewerageApplicationDetails, final Long approvalPosition, final String approvalComent, final String additionalRule, final MultipartFile[] files, final String workFlowAction, final HttpServletRequest request) { if (sewerageApplicationDetails.getApplicationNumber() == null) { final SewerageApplicationNumberGenerator sewerageApplnNumberGenerator = beanResolver .getAutoNumberServiceFor(SewerageApplicationNumberGenerator.class); if (sewerageApplnNumberGenerator != null) sewerageApplicationDetails.setApplicationNumber(sewerageApplnNumberGenerator .generateNextApplicationNumber(sewerageApplicationDetails)); } sewerageApplicationDetails.setApplicationDate(new Date()); final Date disposalDate = getDisposalDate(sewerageApplicationDetails, sewerageApplicationDetails.getApplicationType().getProcessingTime()); sewerageApplicationDetails.setDisposalDate(disposalDate); if (LOG.isDebugEnabled()) LOG.debug("applicationWorkflowCustomDefaultImpl initialization is done"); if (!sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CLOSESEWERAGECONNECTION)) if (sewerageApplicationDetails != null && sewerageApplicationDetails.getCurrentDemand() == null) { final EgDemand demand = sewerageDemandService.createDemandOnNewConnection( sewerageApplicationDetails.getConnectionFees(), sewerageApplicationDetails); if (demand != null) { final SewerageDemandConnection sdc = new SewerageDemandConnection(); sdc.setDemand(demand); sdc.setApplicationDetails(sewerageApplicationDetails); sewerageApplicationDetails.addDemandConnections(sdc); } } final Set<FileStoreMapper> fileStoreSet = sewerageTaxUtils.addToFileStore(files); if (fileStoreSet != null && !fileStoreSet.isEmpty()) { final List<SewerageApplicationDetailsDocument> appDetailDocList = new ArrayList<>(); final SewerageApplicationDetailsDocument appDetailDoc = new SewerageApplicationDetailsDocument(); appDetailDoc.setApplicationDetails(sewerageApplicationDetails); appDetailDoc.setDocumentTypeMaster(documentTypeMasterService .findByApplicationTypeAndDescription(sewerageApplicationDetails.getApplicationType(), DOCTYPE_OTHERS)); appDetailDoc.setFileStore(fileStoreSet); appDetailDocList.add(appDetailDoc); sewerageApplicationDetails.setAppDetailsDocument(appDetailDocList); } sewerageApplicationDetailsRepository.save(sewerageApplicationDetails); if (sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CLOSESEWERAGECONNECTION)) applicationWorkflowCustomDefaultImpl.createCloseConnectionWorkflowTransition(sewerageApplicationDetails, approvalPosition, approvalComent, additionalRule, workFlowAction); else applicationWorkflowCustomDefaultImpl.createCommonWorkflowTransition(sewerageApplicationDetails, approvalPosition, approvalComent, additionalRule, workFlowAction); updateIndexes(sewerageApplicationDetails); if (APPLICATION_STATUS_COLLECTINSPECTIONFEE.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode()) || APPLICATION_STATUS_CREATED.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode())) sewerageConnectionSmsAndEmailService.sendSmsAndEmail(sewerageApplicationDetails, request); return sewerageApplicationDetails; } @Transactional public void save(final SewerageApplicationDetails detail) { sewerageApplicationDetailsRepository.save(detail); } public Date getDisposalDate(final SewerageApplicationDetails sewerageApplicationDetails, final Integer appProcessTime) { final Calendar c = Calendar.getInstance(); c.setTime(sewerageApplicationDetails.getApplicationDate()); c.add(Calendar.DATE, appProcessTime); return c.getTime(); } public List<SewerageApplicationDetails> getSewerageConnectionDetailsByPropertyIDentifier(final String propertyIdentifier) { return sewerageApplicationDetailsRepository.getSewerageConnectionDetailsByPropertyID(propertyIdentifier); } public SewerageApplicationDetails findByConnection_ShscNumberAndIsActive(final String shscNumber) { return sewerageApplicationDetailsRepository.getActiveSewerageApplicationByShscNumber(shscNumber); } public String checkValidPropertyAssessmentNumber(final String asessmentNumber) { String errorMessage = ""; final AssessmentDetails assessmentDetails = sewerageTaxUtils.getAssessmentDetailsForFlag(asessmentNumber, PropertyExternalService.FLAG_FULL_DETAILS); errorMessage = validateProperty(assessmentDetails); if (errorMessage.isEmpty()) errorMessage = validatePTDue(asessmentNumber, assessmentDetails); return errorMessage; } /** * @param assessmentDetails * @return ErrorMessage If PropertyId is Not Valid */ private String validateProperty(final AssessmentDetails assessmentDetails) { String errorMessage = ""; if (assessmentDetails.getErrorDetails() != null && assessmentDetails.getErrorDetails().getErrorCode() != null) errorMessage = assessmentDetails.getErrorDetails().getErrorMessage(); return errorMessage; } private String validatePTDue(final String asessmentNumber, final AssessmentDetails assessmentDetails) { String errorMessage = ""; if (assessmentDetails.getPropertyDetails() != null && assessmentDetails.getPropertyDetails().getTaxDue() != null && assessmentDetails.getPropertyDetails().getTaxDue().doubleValue() > 0) /** * If property tax due present and configuration value is 'NO' then restrict not to allow new water tap connection * application. If configuration value is 'YES' then new water tap connection can be created even though there is * Property Tax Due present. **/ if (!sewerageTaxUtils.isNewConnectionAllowedIfPTDuePresent()) errorMessage = stmsMessageSource.getMessage("err.validate.seweragenewconnection.property.taxdue", new String[] { assessmentDetails.getPropertyDetails().getTaxDue().toString(), asessmentNumber, "new" }, null); return errorMessage; } public String checkConnectionPresentForProperty(final String propertyID) { String validationMessage = ""; final List<SewerageApplicationDetails> sewerageApplicationDetails = getSewerageConnectionDetailsByPropertyIDentifier( propertyID); if (sewerageApplicationDetails != null && !sewerageApplicationDetails.isEmpty()) if (sewerageApplicationDetails.get(0).getConnection().getStatus().toString() .equalsIgnoreCase(SewerageConnectionStatus.ACTIVE.toString())) validationMessage = stmsMessageSource.getMessage("err.validate.seweragenewconnection.active", new String[] { sewerageApplicationDetails.get(0).getConnection().getShscNumber(), propertyID }, null); else if (sewerageApplicationDetails.get(0).getConnection().getStatus().toString() .equalsIgnoreCase(SewerageConnectionStatus.INPROGRESS.toString())) validationMessage = stmsMessageSource.getMessage("err.validate.seweragenewconnection.application.inprocess", new String[] { propertyID, sewerageApplicationDetails.get(0).getApplicationNumber() }, null); else if (sewerageApplicationDetails.get(0).getConnection().getStatus().toString() .equalsIgnoreCase(SewerageConnectionStatus.INACTIVE.toString())) validationMessage = stmsMessageSource.getMessage("err.validate.seweragenewconnection.inactive", new String[] { sewerageApplicationDetails.get(0).getConnection().getShscNumber(), propertyID }, null); return validationMessage; } public void updateIndexes(final SewerageApplicationDetails sewerageApplicationDetails) { // TODO : Need to make Rest API call to get assessmentdetails final AssessmentDetails assessmentDetails = sewerageTaxUtils.getAssessmentDetailsForFlag( sewerageApplicationDetails.getConnectionDetail().getPropertyIdentifier(), PropertyExternalService.FLAG_FULL_DETAILS); if (LOG.isDebugEnabled()) LOG.debug(" updating Indexes Started... "); Iterator<OwnerName> ownerNameItr = null; if (null != assessmentDetails.getOwnerNames()) ownerNameItr = assessmentDetails.getOwnerNames().iterator(); final StringBuilder consumerName = new StringBuilder(); final StringBuilder mobileNumber = new StringBuilder(); Assignment assignment = null; User user = null; Integer elapsedDays = 0; final StringBuilder aadharNumber = new StringBuilder(); if (null != ownerNameItr && ownerNameItr.hasNext()) { final OwnerName primaryOwner = ownerNameItr.next(); consumerName.append(primaryOwner.getOwnerName() != null ? primaryOwner.getOwnerName() : ""); mobileNumber.append(primaryOwner.getMobileNumber() != null ? primaryOwner.getMobileNumber() : ""); aadharNumber.append(primaryOwner.getAadhaarNumber() != null ? primaryOwner.getAadhaarNumber() : ""); while (ownerNameItr.hasNext()) { final OwnerName secondaryOwner = ownerNameItr.next(); consumerName.append(",").append( secondaryOwner.getOwnerName() != null ? secondaryOwner.getOwnerName() : ""); mobileNumber.append(",").append( secondaryOwner.getMobileNumber() != null ? secondaryOwner.getMobileNumber() : ""); aadharNumber.append(",").append( secondaryOwner.getAadhaarNumber() != null ? secondaryOwner.getAadhaarNumber() : ""); } } List<Assignment> asignList = null; if (sewerageApplicationDetails.getState() != null && sewerageApplicationDetails.getState().getOwnerPosition() != null) { assignment = assignmentService.getPrimaryAssignmentForPositionAndDate(sewerageApplicationDetails.getState() .getOwnerPosition().getId(), new Date()); if (assignment != null) { asignList = new ArrayList<Assignment>(); asignList.add(assignment); } else if (assignment == null) asignList = assignmentService.getAssignmentsForPosition(sewerageApplicationDetails.getState() .getOwnerPosition().getId(), new Date()); if (!asignList.isEmpty()) user = userService.getUserById(asignList.get(0).getEmployee().getId()); } else user = securityUtils.getCurrentUser(); // For legacy application - create only SewarageIndex if (sewerageApplicationDetails.getConnection().getLegacy() && (null == sewerageApplicationDetails.getId() || null != sewerageApplicationDetails.getId() && sewerageApplicationDetails .getStatus().getCode().equalsIgnoreCase(APPLICATION_STATUS_SANCTIONED))) { sewerageIndexService.createSewarageIndex(sewerageApplicationDetails, assessmentDetails); return; } ApplicationIndex applicationIndex = applicationIndexService.findByApplicationNumber(sewerageApplicationDetails .getApplicationNumber()); // update existing application index if (applicationIndex != null && null != sewerageApplicationDetails.getId()) { applicationIndex.setStatus(sewerageApplicationDetails.getStatus().getDescription()); applicationIndex.setOwnername(user != null ? user.getUsername() + "::" + user.getName() : ""); // applicationIndex.setApplicantAddress(assessmentDetails.getPropertyAddress()); /* * Commented out as its required if we allow editing PT assessment no on reject //After reject, from creators inbox if * (sewerageApplicationDetails .getStatus().getCode().equals(SewerageTaxConstants .APPLICATION_STATUS_CREATED) || * sewerageApplicationDetails.getStatus ().getCode().equals(SewerageTaxConstants * .APPLICATION_STATUS_COLLECTINSPECTIONFEE) || sewerageApplicationDetails * .getStatus().getCode().equals(SewerageTaxConstants .APPLICATION_STATUS_INSPECTIONFEEPAID)){ * applicationIndex.setApplicantName(consumerName.toString()); applicationIndex * .setApplicantAddress(assessmentDetails.getPropertyAddress()); } */ // mark application index as closed on Connection Sanction if (sewerageApplicationDetails.getStatus().getCode() .equals(APPLICATION_STATUS_SANCTIONED)) { elapsedDays = (int) TimeUnit.DAYS.convert(new Date().getTime() - sewerageApplicationDetails.getApplicationDate().getTime(), TimeUnit.MILLISECONDS); applicationIndex.setElapsedDays(elapsedDays); applicationIndex.setApproved(ApprovalStatus.APPROVED); applicationIndex.setClosed(ClosureStatus.YES); } // mark application index as rejected and closed on Connection // cancellation else if (sewerageApplicationDetails.getStatus().getCode() .equals(APPLICATION_STATUS_CANCELLED)) { elapsedDays = (int) TimeUnit.DAYS.convert(new Date().getTime() - sewerageApplicationDetails.getApplicationDate().getTime(), TimeUnit.MILLISECONDS); applicationIndex.setElapsedDays(elapsedDays); applicationIndex.setApproved(ApprovalStatus.REJECTED); applicationIndex.setClosed(ClosureStatus.YES); } if (sewerageApplicationDetails.getConnection().getShscNumber() != null) applicationIndex.setConsumerCode(sewerageApplicationDetails.getConnection().getShscNumber()); applicationIndexService.updateApplicationIndex(applicationIndex); sewerageIndexService.createSewarageIndex(sewerageApplicationDetails, assessmentDetails); } else { // Create New ApplicationIndex on create sewerage connection if (sewerageApplicationDetails.getApplicationDate() == null) sewerageApplicationDetails.setApplicationDate(new Date()); // final String url = "/stms/application/view/" + sewerageApplicationDetails.getApplicationNumber(); final String url = "/stms/existing/sewerage/view/" + sewerageApplicationDetails.getApplicationNumber() + "/" + sewerageApplicationDetails.getConnectionDetail().getPropertyIdentifier(); if (LOG.isDebugEnabled()) LOG.debug("Application Index creation Started... "); final ApplicationIndexBuilder applicationIndexBuilder = new ApplicationIndexBuilder( APPL_INDEX_MODULE_NAME, sewerageApplicationDetails.getApplicationNumber(), sewerageApplicationDetails.getApplicationDate(), sewerageApplicationDetails.getApplicationType() .getName(), consumerName.toString(), sewerageApplicationDetails.getStatus() .getDescription().toString(), url, assessmentDetails.getPropertyAddress(), user.getUsername() + "::" + user.getName(), Source.SYSTEM.toString()); if (sewerageApplicationDetails.getDisposalDate() != null) applicationIndexBuilder.disposalDate(sewerageApplicationDetails.getDisposalDate()); applicationIndexBuilder.mobileNumber(mobileNumber.toString()); applicationIndexBuilder.aadharNumber(aadharNumber.toString()); applicationIndexBuilder.approved(ApprovalStatus.INPROGRESS); applicationIndexBuilder.closed(ClosureStatus.NO); applicationIndex = applicationIndexBuilder.build(); applicationIndexService.createApplicationIndex(applicationIndex); if (LOG.isDebugEnabled()) LOG.debug("Application Index creation completed..."); sewerageIndexService.createSewarageIndex(sewerageApplicationDetails, assessmentDetails); } } public BigDecimal getTotalAmount(final SewerageApplicationDetails sewerageApplicationDetails) { final BigDecimal balance = BigDecimal.ZERO; if (sewerageApplicationDetails != null) { final EgDemand currentDemand = sewerageApplicationDetails.getCurrentDemand(); if (currentDemand != null) { /* * final List<Object> instVsAmt = connectionDemandService.getDmdCollAmtInstallmentWise (currentDemand); for (final * Object object : instVsAmt) { final Object[] ddObject = (Object[]) object; final BigDecimal dmdAmt = * (BigDecimal) ddObject[2]; BigDecimal collAmt = BigDecimal.ZERO; if (ddObject[2] != null) collAmt = new * BigDecimal((Double) ddObject[3]); balance = balance.add(dmdAmt.subtract(collAmt)); } */ } } return balance; } public Session getCurrentSession() { return entityManager.unwrap(Session.class); } public Map showApprovalDetailsByApplcationCurState(final SewerageApplicationDetails sewerageApplicationDetails) { final Map<String, String> modelParams = new HashMap<String, String>(); if (sewerageApplicationDetails.getState() != null) { final String currentState = sewerageApplicationDetails.getState().getValue(); if (currentState.equalsIgnoreCase(WF_STATE_INSPECTIONFEE_PENDING) || currentState.equalsIgnoreCase(WF_STATE_ASSISTANT_APPROVED) || currentState.equalsIgnoreCase(WF_STATE_DEPUTY_EXE_APPROVED) || currentState.equalsIgnoreCase(WF_STATE_PAYMENTDONE)) modelParams.put("showApprovalDtls", "no"); else modelParams.put("showApprovalDtls", "yes"); if (currentState.equalsIgnoreCase(WF_STATE_INSPECTIONFEE_COLLECTED) || currentState.equalsIgnoreCase(WF_STATE_CLERK_APPROVED)) modelParams.put("mode", "edit"); else if (currentState.equalsIgnoreCase(WF_STATE_REJECTED)) modelParams.put("mode", "editOnReject"); else modelParams.put("mode", "view"); } return modelParams; } @Transactional public SewerageApplicationDetails updateSewerageApplicationDetails( final SewerageApplicationDetails sewerageApplicationDetails, final Long approvalPosition, final String approvalComent, final String additionalRule, final String workFlowAction, final String mode, final ReportOutput reportOutput, final HttpServletRequest request, final HttpSession session) throws ValidationException { // In change in closet if demand reduced, sewerage tax collection shld not be done. Hence directly fwd application from // DEE to EE and // also generate workorder notice no for dee approved applications if (sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_FEEPAID) && sewerageApplicationDetails.getState().getValue() .equalsIgnoreCase(WF_STATE_PAYMENTDONE) || sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_DEEAPPROVED) && additionalRule != null && additionalRule.equalsIgnoreCase(CHANGEINCLOSETS_NOCOLLECTION)) { if (sewerageApplicationDetails.getWorkOrderNumber() == null) { final SewerageWorkOrderNumberGenerator workOrderNumberGenerator = beanResolver .getAutoNumberServiceFor(SewerageWorkOrderNumberGenerator.class); if (workOrderNumberGenerator != null) { sewerageApplicationDetails.setWorkOrderNumber(workOrderNumberGenerator.generateSewerageWorkOrderNumber()); sewerageApplicationDetails.setWorkOrderDate(new Date()); } } if (sewerageApplicationDetails.getConnection().getShscNumber() == null) { final SHSCNumberGenerator shscNumberGenerator = beanResolver .getAutoNumberServiceFor(SHSCNumberGenerator.class); if (shscNumberGenerator != null) sewerageApplicationDetails.getConnection().setShscNumber( shscNumberGenerator.generateNextSHSCNumber(sewerageApplicationDetails)); } } if (sewerageApplicationDetails.getStatus().getCode() != null && sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_INITIALAPPROVED) || sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_INSPECTIONFEEPAID) || sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_CREATED)) if (sewerageApplicationDetails != null && sewerageApplicationDetails.getCurrentDemand() == null) { final EgDemand demand = sewerageDemandService.createDemandOnNewConnection( sewerageApplicationDetails.getConnectionFees(), sewerageApplicationDetails); if (demand != null) { final SewerageDemandConnection sdc = new SewerageDemandConnection(); sdc.setDemand(demand); sdc.setApplicationDetails(sewerageApplicationDetails); sewerageApplicationDetails.addDemandConnections(sdc); } } else if (sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CHANGEINCLOSETS)) { final SewerageApplicationDetails oldSewerageAppDtls = findByConnection_ShscNumberAndIsActive( sewerageApplicationDetails.getConnection().getShscNumber()); if (!workFlowAction.equals(WFLOW_ACTION_STEP_REJECT)) if (sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_INITIALAPPROVED)) sewerageDemandService.updateDemandOnChangeInClosets(oldSewerageAppDtls, sewerageApplicationDetails.getConnectionFees(), sewerageApplicationDetails.getCurrentDemand(), Boolean.TRUE); else sewerageDemandService.updateDemandOnChangeInClosets(oldSewerageAppDtls, sewerageApplicationDetails.getConnectionFees(), sewerageApplicationDetails.getCurrentDemand(), Boolean.FALSE); } else sewerageDemandService.updateDemand(sewerageApplicationDetails.getConnectionFees(), sewerageApplicationDetails.getCurrentDemand()); if (sewerageApplicationDetails.getStatus().getCode().equalsIgnoreCase(APPLICATION_STATUS_DEEAPPROVED) && sewerageApplicationDetails.getState().getValue().equalsIgnoreCase(WF_STATE_DEPUTY_EXE_APPROVED) && additionalRule != null && !additionalRule.equalsIgnoreCase(CHANGEINCLOSETS_NOCOLLECTION)) if (sewerageApplicationDetails.getEstimationNumber() == null) { final SewerageEstimationNumberGenerator estimationNumberGenerator = beanResolver .getAutoNumberServiceFor(SewerageEstimationNumberGenerator.class); if (estimationNumberGenerator != null) { sewerageApplicationDetails.setEstimationNumber(estimationNumberGenerator.generateEstimationNumber()); sewerageApplicationDetails.setEstimationDate(new Date()); } } if (additionalRule != null && additionalRule.equalsIgnoreCase(CHANGEINCLOSETS_NOCOLLECTION)) applicationStatusChange(sewerageApplicationDetails, workFlowAction, additionalRule); else applicationStatusChange(sewerageApplicationDetails, workFlowAction, mode); // Generate the sewerage notices based on type of notice and save into DB. if (sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_ESTIMATENOTICEGEN)) { final SewerageNotice sewerageNotice = sewerageNoticeService.generateReportForEstimation( sewerageApplicationDetails, session, request); if (sewerageNotice != null) sewerageApplicationDetails.addNotice(sewerageNotice); } else if (sewerageApplicationDetails.getStatus().getCode() .equalsIgnoreCase(APPLICATION_STATUS_WOGENERATED)) { final SewerageNotice existingSewerageNotice = sewerageNoticeService .findByNoticeNoAndNoticeType(sewerageApplicationDetails.getWorkOrderNumber(), NOTICE_TYPE_WORK_ORDER_NOTICE); if (existingSewerageNotice == null) { final SewerageNotice sewerageNotice = sewerageNoticeService.generateReportForWorkOrder(sewerageApplicationDetails, session, request); if (sewerageNotice != null) sewerageApplicationDetails.addNotice(sewerageNotice); } } final SewerageApplicationDetails updatedSewerageApplicationDetails = sewerageApplicationDetailsRepository .save(sewerageApplicationDetails); if (LOG.isDebugEnabled()) LOG.debug("applicationWorkflowCustomDefaultImpl initialization is done"); applicationWorkflowCustomDefaultImpl.createCommonWorkflowTransition(updatedSewerageApplicationDetails, approvalPosition, approvalComent, additionalRule, workFlowAction); if (sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CHANGEINCLOSETS) && sewerageApplicationDetails.getParent() != null) updateIndexes(sewerageApplicationDetails.getParent()); updateIndexes(sewerageApplicationDetails); if (APPLICATION_STATUS_COLLECTINSPECTIONFEE.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode()) || APPLICATION_STATUS_DEEAPPROVED.equalsIgnoreCase(sewerageApplicationDetails.getStatus() .getCode()) || APPLICATION_STATUS_CREATED.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode()) || APPLICATION_STATUS_FINALAPPROVED.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode()) || APPLICATION_STATUS_REJECTED.equalsIgnoreCase(sewerageApplicationDetails .getStatus().getCode())) { sewerageApplicationDetails.setApprovalComent(approvalComent); sewerageConnectionSmsAndEmailService.sendSmsAndEmail(sewerageApplicationDetails, request); } return updatedSewerageApplicationDetails; } // TODO : commented out code as statuses are changed. Need to correct public void applicationStatusChange(final SewerageApplicationDetails sewerageApplicationDetails, final String workFlowAction, final String mode) { if (null != sewerageApplicationDetails && null != sewerageApplicationDetails.getStatus() && null != sewerageApplicationDetails.getStatus().getCode()) if (WFLOW_ACTION_STEP_REJECT.equalsIgnoreCase(workFlowAction)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_REJECTED, MODULETYPE)); else if (WFLOW_ACTION_STEP_CANCEL.equalsIgnoreCase(workFlowAction)) { // In case of change in closet, mark only the application as cancelled on cancel application from creator's inbox if (sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CHANGEINCLOSETS)) { sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CANCELLED, MODULETYPE)); sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.ACTIVE); } else { // In case of new connection, connection is made inactive on cancel application from creator's inbox sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.INACTIVE); sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CANCELLED, MODULETYPE)); } } else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_CREATED) || sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_INSPECTIONFEEPAID)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_INITIALAPPROVED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_COLLECTINSPECTIONFEE)) sewerageApplicationDetails.setStatus( sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_INSPECTIONFEEPAID, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_INITIALAPPROVED)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_DEEAPPROVED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_DEEAPPROVED)) { if (mode != null && mode.equalsIgnoreCase(CHANGEINCLOSETS_NOCOLLECTION)) sewerageApplicationDetails.setStatus( sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_FINALAPPROVED, MODULETYPE)); else sewerageApplicationDetails.setStatus( sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_ESTIMATENOTICEGEN, MODULETYPE)); } else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_ESTIMATENOTICEGEN)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_FEEPAID, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_FEEPAID) && sewerageApplicationDetails.getState().getValue().equalsIgnoreCase(WF_STATE_PAYMENTDONE)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_FINALAPPROVED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_FINALAPPROVED)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_WOGENERATED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_WOGENERATED)) { sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_SANCTIONED, MODULETYPE)); // Make Connection status active on connection execution if (sewerageApplicationDetails.getConnection().getStatus().equals(SewerageConnectionStatus.INPROGRESS)) sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.ACTIVE); sewerageApplicationDetails.setActive(true); } else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_REJECTED)) if (sewerageTaxUtils.isInspectionFeeCollectionRequired()) { if (sewerageApplicationDetails.getCurrentDemand().getAmtCollected() .compareTo(BigDecimal.ZERO) == 0) sewerageApplicationDetails.setStatus(sewerageTaxUtils .getStatusByCodeAndModuleType(APPLICATION_STATUS_COLLECTINSPECTIONFEE, MODULETYPE)); else sewerageApplicationDetails.setStatus( sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_INSPECTIONFEEPAID, MODULETYPE)); } else sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CREATED, MODULETYPE)); } @Transactional public SewerageApplicationDetails updateCloseSewerageApplicationDetails( final SewerageApplicationDetails sewerageApplicationDetails, final Long approvalPosition, final String approvalComent, final String additionalRule, final String workFlowAction, final ReportOutput reportOutput, final HttpServletRequest request, final HttpSession session) throws ValidationException { // Generate closure notice number and date if (sewerageApplicationDetails.getStatus().getCode().equalsIgnoreCase(APPLICATION_STATUS_DEEAPPROVED) && sewerageApplicationDetails.getApplicationType().getCode().equalsIgnoreCase(CLOSESEWERAGECONNECTION) && APPROVEWORKFLOWACTION.equalsIgnoreCase(workFlowAction)) { final SewerageCloseConnectionNoticeNumberGenerator closeConnectionNoticeNumberGenerator = beanResolver .getAutoNumberServiceFor(SewerageCloseConnectionNoticeNumberGenerator.class); if (closeConnectionNoticeNumberGenerator != null && sewerageApplicationDetails.getClosureNoticeNumber() == null) { sewerageApplicationDetails .setClosureNoticeNumber(closeConnectionNoticeNumberGenerator.generateCloserNoticeNumber()); sewerageApplicationDetails.setClosureNoticeDate(new Date()); } } // Application status change if (null != sewerageApplicationDetails && null != sewerageApplicationDetails.getStatus() && null != sewerageApplicationDetails.getStatus().getCode()) if (WFLOW_ACTION_STEP_REJECT.equalsIgnoreCase(workFlowAction)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_REJECTED, MODULETYPE)); else if (WFLOW_ACTION_STEP_CANCEL.equalsIgnoreCase(workFlowAction)) { sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.ACTIVE); sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CANCELLED, MODULETYPE)); } else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_CREATED)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_INITIALAPPROVED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_INITIALAPPROVED)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_DEEAPPROVED, MODULETYPE)); else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_DEEAPPROVED)) { // Make Connection status closed on EE approval sewerageApplicationDetails.getConnection().setStatus(SewerageConnectionStatus.CLOSED); sewerageApplicationDetails.setActive(true); sewerageApplicationDetails.setStatus( sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CLOSERSANCTIONED, MODULETYPE)); } else if (sewerageApplicationDetails.getStatus().getCode().equals(APPLICATION_STATUS_REJECTED)) sewerageApplicationDetails .setStatus(sewerageTaxUtils.getStatusByCodeAndModuleType(APPLICATION_STATUS_CREATED, MODULETYPE)); // Generate the sewerage notices based on type of notice and save into DB. if (sewerageApplicationDetails.getStatus().getCode().equalsIgnoreCase(APPLICATION_STATUS_CLOSERSANCTIONED) && APPROVEWORKFLOWACTION.equalsIgnoreCase(workFlowAction)) { final SewerageNotice sewerageNotice = sewerageNoticeService.generateReportForCloseConnection( sewerageApplicationDetails, session); if (sewerageNotice != null) sewerageApplicationDetails.addNotice(sewerageNotice); } final SewerageApplicationDetails updatedSewerageApplicationDetails = sewerageApplicationDetailsRepository .save(sewerageApplicationDetails); if (LOG.isDebugEnabled()) LOG.debug("applicationWorkflowCustomDefaultImpl initialization is done"); applicationWorkflowCustomDefaultImpl.createCloseConnectionWorkflowTransition(updatedSewerageApplicationDetails, approvalPosition, approvalComent, additionalRule, workFlowAction); if (sewerageApplicationDetails.getParent() != null) updateIndexes(sewerageApplicationDetails.getParent()); updateIndexes(sewerageApplicationDetails); // TODO support sms and email for close connection if (APPLICATION_STATUS_CLOSERSANCTIONED.equalsIgnoreCase(sewerageApplicationDetails.getStatus().getCode()) && APPROVEWORKFLOWACTION.equalsIgnoreCase(workFlowAction) || APPLICATION_STATUS_CREATED.equalsIgnoreCase(sewerageApplicationDetails.getStatus().getCode()) || APPLICATION_STATUS_REJECTED.equalsIgnoreCase(sewerageApplicationDetails.getStatus().getCode())) { sewerageApplicationDetails.setApprovalComent(approvalComent); sewerageConnectionSmsAndEmailService.sendSmsAndEmail(sewerageApplicationDetails, request); } return updatedSewerageApplicationDetails; } public List<Hashtable<String, Object>> getHistory(final SewerageApplicationDetails sewerageApplicationDetails) { User user = null; final List<Hashtable<String, Object>> historyTable = new ArrayList<Hashtable<String, Object>>(); final State state = sewerageApplicationDetails.getState(); final Hashtable<String, Object> map = new Hashtable<String, Object>(0); if (null != state) { if (!sewerageApplicationDetails.getStateHistory().isEmpty() && sewerageApplicationDetails.getStateHistory() != null) Collections.reverse(sewerageApplicationDetails.getStateHistory()); for (final StateHistory stateHistory : sewerageApplicationDetails.getStateHistory()) { final Hashtable<String, Object> HistoryMap = new Hashtable<String, Object>(0); HistoryMap.put("date", stateHistory.getDateInfo()); HistoryMap.put("comments", stateHistory.getComments()); HistoryMap.put("updatedBy", stateHistory.getLastModifiedBy().getUsername() + "::" + stateHistory.getLastModifiedBy().getName()); HistoryMap.put("status", stateHistory.getValue()); final Position owner = stateHistory.getOwnerPosition(); user = stateHistory.getOwnerUser(); if (null != user) { HistoryMap.put("user", user.getUsername() + "::" + user.getName()); HistoryMap.put("department", null != eisCommonService.getDepartmentForUser(user.getId()) ? eisCommonService .getDepartmentForUser(user.getId()).getName() : ""); } else if (null != owner && null != owner.getDeptDesig()) { user = eisCommonService.getUserForPosition(owner.getId(), new Date()); HistoryMap .put("user", null != user.getUsername() ? user.getUsername() + "::" + user.getName() : ""); HistoryMap.put("department", null != owner.getDeptDesig().getDepartment() ? owner.getDeptDesig() .getDepartment().getName() : ""); } historyTable.add(HistoryMap); } map.put("date", state.getDateInfo()); map.put("comments", state.getComments() != null ? state.getComments() : ""); map.put("updatedBy", state.getLastModifiedBy().getUsername() + "::" + state.getLastModifiedBy().getName()); map.put("status", state.getValue()); final Position ownerPosition = state.getOwnerPosition(); user = state.getOwnerUser(); if (null != user) { map.put("user", user.getUsername() + "::" + user.getName()); map.put("department", null != eisCommonService.getDepartmentForUser(user.getId()) ? eisCommonService .getDepartmentForUser(user.getId()).getName() : ""); } else if (null != ownerPosition && null != ownerPosition.getDeptDesig()) { user = eisCommonService.getUserForPosition(ownerPosition.getId(), new Date()); map.put("user", null != user.getUsername() ? user.getUsername() + "::" + user.getName() : ""); map.put("department", null != ownerPosition.getDeptDesig().getDepartment() ? ownerPosition .getDeptDesig().getDepartment().getName() : ""); } historyTable.add(map); } return historyTable; } public void updateStateTransition(final SewerageApplicationDetails sewerageApplicationDetails, final Long approvalPosition, final String approvalComent, final String additionalRule, final String workFlowAction) { if (approvalPosition != null && additionalRule != null && org.apache.commons.lang.StringUtils.isNotEmpty(workFlowAction)) applicationWorkflowCustomDefaultImpl.createCommonWorkflowTransition(sewerageApplicationDetails, approvalPosition, approvalComent, additionalRule, workFlowAction); // TODO : update index on collection } public SewerageApplicationDetails checkModifyClosetInProgress(final String shscNumber) { return sewerageApplicationDetailsRepository.getSewerageApplicationInWorkFlow(shscNumber); } public BigDecimal getPendingTaxAmount(final SewerageApplicationDetails sewerageApplicationDetails) { BigDecimal taxPending = BigDecimal.ZERO; taxPending = sewerageDemandService.checkForPendingTaxAmountToCollect(sewerageApplicationDetails.getCurrentDemand()); return taxPending; } }