/* * 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.works.services.impl; import org.apache.log4j.Logger; import org.egov.infstr.services.PersistenceService; import org.egov.works.models.measurementbook.MBDetails; import org.egov.works.models.measurementbook.MBHeader; import org.egov.works.models.workorder.WorkOrder; import org.egov.works.models.workorder.WorkOrderActivity; import org.egov.works.models.workorder.WorkOrderEstimate; import org.egov.works.services.MeasurementBookService; import org.egov.works.services.WorksService; import org.egov.works.utils.WorksConstants; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * This class will expose all measurment book related operations. NOTE ::: Suffix CQ and RE denote Change Quantity and Revision * Estimate Respectively */ public class MeasurementBookServiceImpl extends BaseServiceImpl<MBHeader, Long> implements MeasurementBookService { private static final Logger logger = Logger.getLogger(MeasurementBookServiceImpl.class); public static final String WORKORDER_NO = "WORKORDER_NO"; public static final String CONTRACTOR_ID = "CONTRACTOR_ID"; public static final String CREATE_DATE = "CREATE_DATE"; public static final String MB_REF_NO = "MB_REF_NO"; public static final String MB_PAGE_NO = "MB_PAGE_NO"; public static final String STATUS = "STATUS"; public static final String BILLDATE = "BILLDATE"; public static final String BILLSTATUS = "BILLSTATUS"; public static final String BILLNO = "BILLNO"; public static final String ALL_STATUS = "ALL_STATUS"; public static final String FROM_DATE = "FROM_DATE"; public static final String TO_DATE = "TO_DATE"; public static final String EST_NO = "EST_NO"; public static final String DEPT_ID = "DEPT_ID"; private WorksService worksService; public MeasurementBookServiceImpl(final PersistenceService<MBHeader, Long> persistenceService) { super(persistenceService); } /** * This method will search list of mbheader based on input criteria. Search Criteria : * WORKORDER_NO,CONTRACTOR_ID,CREATE_DATE,MB_REF_NO,MB_PAGE_NO,STATUS Story #436 - Search MB-View MB * * @param criteriaMap * @return */ @Override public List<String> searchMB(final Map<String, Object> criteriaMap, final List<Object> paramList) { logger.debug("-------Inside searchMB method-----------------------"); final List<String> mbHeaderQryList = new ArrayList<String>(); final String countQry = "select count(distinct mbh) from MBHeader mbh where mbh.id != null and mbh.egwStatus.code != 'NEW' "; final String resultQry = "select distinct mbh from MBHeader mbh where mbh.id != null and mbh.egwStatus.code != 'NEW'"; StringBuffer commonFilter = new StringBuffer(); // List<Object> paramList = new ArrayList<Object>(); if (criteriaMap.get(WORKORDER_NO) != null) { commonFilter = commonFilter.append(" and mbh.workOrder.workOrderNumber like ?"); paramList.add("%" + criteriaMap.get(WORKORDER_NO) + "%"); } if (criteriaMap.get(CONTRACTOR_ID) != null && !"-1".equals(criteriaMap.get(CONTRACTOR_ID))) { commonFilter = commonFilter.append(" and mbh.workOrder.contractor.id = ?"); paramList.add(criteriaMap.get(CONTRACTOR_ID)); } if (criteriaMap.get(DEPT_ID) != null && !"-1".equals(criteriaMap.get(DEPT_ID))) { commonFilter = commonFilter.append(" and mbh.workOrderEstimate.estimate.executingDepartment.id = ?"); paramList.add(criteriaMap.get(DEPT_ID)); } if (criteriaMap.get(CREATE_DATE) != null) { commonFilter = commonFilter.append(" and mbh.mbDate = ?"); paramList.add(criteriaMap.get(CREATE_DATE)); } if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) == null) { commonFilter = commonFilter.append(" and mbh.mbDate >= ? "); paramList.add(criteriaMap.get(FROM_DATE)); } else if (criteriaMap.get(TO_DATE) != null && criteriaMap.get(FROM_DATE) == null) { commonFilter = commonFilter.append(" and mbh.mbDate <= ? "); paramList.add(criteriaMap.get(TO_DATE)); } else if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) != null) { commonFilter = commonFilter.append(" and mbh.mbDate between ? and ? "); paramList.add(criteriaMap.get(FROM_DATE)); paramList.add(criteriaMap.get(TO_DATE)); } if (criteriaMap.get(EST_NO) != null) { commonFilter = commonFilter.append(" and mbh.workOrderEstimate.estimate.estimateNumber like ?"); paramList.add("%" + criteriaMap.get(EST_NO) + "%"); } if (criteriaMap.get(MB_REF_NO) != null) { commonFilter = commonFilter.append(" and mbh.mbRefNo = ?"); paramList.add(criteriaMap.get(MB_REF_NO)); } if (criteriaMap.get(MB_PAGE_NO) != null) { commonFilter = commonFilter.append(" and ? between mbh.fromPageNo and mbh.toPageNo "); paramList.add(criteriaMap.get(MB_PAGE_NO)); } if ("1".equals(criteriaMap.get(ALL_STATUS))) commonFilter = commonFilter.append(" and mbh.egBillregister.id is not null"); else if (!"-1".equals(criteriaMap.get(STATUS)) && criteriaMap.get(STATUS) != null && (criteriaMap.get(STATUS).equals(MBHeader.MeasurementBookStatus.APPROVED.toString()) || criteriaMap .get(STATUS).equals(MBHeader.MeasurementBookStatus.CANCELLED.toString()))) { commonFilter = commonFilter.append(" and mbh.egwStatus.code = ?"); paramList.add(criteriaMap.get(STATUS)); } else if (!"-1".equals(criteriaMap.get(STATUS)) && criteriaMap.get(STATUS) != null) { commonFilter = commonFilter.append(" and mbh.egwStatus.code = ?"); paramList.add(criteriaMap.get(STATUS)); } // Adding criteria for search bill-Sreekanth D. if (criteriaMap.get(BILLDATE) != null) { commonFilter = commonFilter.append(" and trunc(mbh.egBillregister.billdate) = ?"); paramList.add(criteriaMap.get(BILLDATE)); } if (criteriaMap.get(BILLSTATUS) != null && !criteriaMap.get(BILLSTATUS).equals("-1")) { commonFilter = commonFilter.append(" and mbh.egBillregister.status.code like ?"); paramList.add("%" + criteriaMap.get(BILLSTATUS) + "%"); } if (criteriaMap.get(BILLNO) != null) { commonFilter = commonFilter.append(" and mbh.egBillregister.billnumber= ? "); paramList.add(criteriaMap.get(BILLNO)); } commonFilter = commonFilter.append(" order by mbh.mbDate "); final String searchQry = resultQry + commonFilter; final String countResultQry = countQry + commonFilter; mbHeaderQryList.add(searchQry); mbHeaderQryList.add(countResultQry); return mbHeaderQryList; } /** * Get previous cumulative amount(approved, approval pending and draft entries) based on workorder activity Id. This will * search list of MBDetail and then get cmulative amount. * * @param woActivityId * @return */ @Override public double prevCumulativeQuantity(final Long woActivityId, Long mbHeaderId) { if (mbHeaderId == null) mbHeaderId = -1l; final Object[] params = new Object[] { mbHeaderId, mbHeaderId, WorksConstants.CANCELLED_STATUS, woActivityId }; final Double pQuant = (Double) genericService.findByNamedQuery("prevCumulativeQuantity", params); if (pQuant == null) return 0.0d; else return pQuant.doubleValue(); } @Override public double prevCumulativeQuantityIncludingCQ(final Long woActivityId, Long mbHeaderId, final Long activityId, final WorkOrder workOrder) { if (mbHeaderId == null) mbHeaderId = -1l; Object[] params = new Object[] { mbHeaderId, mbHeaderId, WorksConstants.CANCELLED_STATUS, workOrder, workOrder, woActivityId, activityId }; Double pQuant = (Double) genericService.findByNamedQuery("prevCumulativeQuantityForCQ", params); params = new Object[] { mbHeaderId, mbHeaderId, WorksConstants.CANCELLED_STATUS, activityId }; final Double pQuantRE = (Double) genericService.findByNamedQuery("prevCumulativeQuantityForREs", params); if (pQuant != null && pQuantRE != null) pQuant = pQuant + pQuantRE; if (pQuant == null && pQuantRE != null) pQuant = pQuantRE; if (pQuant == null) return 0.0d; else return pQuant.doubleValue(); } /** * This is used by RE screens. Get estimated quantity for Change in quantity of RE for given work order activity. Here work * order activities of only non-cancelled Abstract Estimates/REs are considered * * @param woActivityId ,estimateId,activityId * @return */ @Override public double totalEstimatedQuantityForRE(final Long woActivityId, Long estimateId, final Long activityId, final WorkOrder workOrder) { if (estimateId == null) estimateId = -1l; Object[] params = null; Double estQuantity = null; params = new Object[] { estimateId, workOrder, workOrder, woActivityId, activityId }; estQuantity = (Double) genericService.findByNamedQuery("totalEstimatedQuantityInRE", params); Double estQuantityRE = null; if (workOrder.getParent() != null) params = new Object[] { estimateId, workOrder.getParent(), workOrder.getParent(), activityId }; else params = new Object[] { estimateId, workOrder, workOrder, activityId }; estQuantityRE = (Double) genericService.findByNamedQuery("totalEstimatedQuantityForREinRE", params); if (estQuantity != null && estQuantityRE != null) estQuantity = estQuantity + estQuantityRE; if (estQuantity == null && estQuantityRE != null) estQuantity = estQuantityRE; if (estQuantity == null) return 0.0d; else return estQuantity.doubleValue(); } /** * Similar to totalEstimatedQuantityForRE but will consider only previous REs and not all REs * * @param woActivityId ,estimateId,activityId, workOrder * @return */ @Override public double totalEstimatedQuantityForPreviousREs(final Long woActivityId, Long estimateId, final Long activityId, final WorkOrder workOrder) { if (estimateId == null) estimateId = -1l; Object[] params = null; Double estQuantity = null; params = new Object[] { estimateId, workOrder, workOrder, woActivityId, activityId }; estQuantity = (Double) genericService.findByNamedQuery("totalEstimatedQuantityInRE", params); Double estQuantityRE = null; params = new Object[] { estimateId, workOrder, workOrder, activityId }; estQuantityRE = (Double) genericService.findByNamedQuery("totalEstimatedQuantityForPreviousREs", params); if (estQuantity != null && estQuantityRE != null) estQuantity = estQuantity + estQuantityRE; if (estQuantity == null && estQuantityRE != null) estQuantity = estQuantityRE; if (estQuantity == null) return 0.0d; else return estQuantity.doubleValue(); } /** * This method will return workorderestimates objects pending for MB * * @param workOrderEstimateList * @param mbHeader * @return List<WorkOrderEstimate> */ @Override public List<WorkOrderEstimate> getWorkOrderEstimatesForMB(final List<WorkOrderEstimate> workOrderEstimateList) { final List<WorkOrderEstimate> woEstimateList = new ArrayList<WorkOrderEstimate>(); final List<WorkOrderEstimate> usedWOEstimateList = new ArrayList<WorkOrderEstimate>(); Double approvedQuantity = 0D; Double usedQuantity = 0D; final Double extraPercentage = worksService.getConfigval(); // Approved quantity for workorder for (final WorkOrderEstimate woe : workOrderEstimateList) { for (final WorkOrderActivity woActivity : woe.getWorkOrderActivities()) approvedQuantity += woActivity.getApprovedQuantity(); if (extraPercentage.doubleValue() > 0) approvedQuantity = approvedQuantity * (1 + extraPercentage / 100); final List<MBHeader> mbHeaderList = findAllByNamedQuery("getMBbyWorkOrderEstID", woe.getId(), WorksConstants.CANCELLED_STATUS, getFinalBillTypeConfigValue(), WorksConstants.CANCELLED_STATUS); if (mbHeaderList != null && !mbHeaderList.isEmpty()) { usedQuantity = getUsedQuantity(usedQuantity, mbHeaderList); for (final MBHeader mbHeader : mbHeaderList) for (final MBDetails mbDetails : mbHeader.getMbDetails()) if ("Required".equals(worksService.getWorksConfigValue("ORDER_NUMBER_REQUIRED"))) addUnlimitedWorkOrderEstimatesForMB(woEstimateList, usedWOEstimateList, woe, mbHeader, mbDetails); else addLimitedWorkOrderEstimatesForMB(woEstimateList, usedWOEstimateList, approvedQuantity, usedQuantity, woe, mbHeader, mbDetails); } else if (!woEstimateList.contains(woe)) addNewWorkOrderEstimatesForMB(woEstimateList, woe); } for (final WorkOrderEstimate woe : usedWOEstimateList) woEstimateList.remove(woe); return woEstimateList; } private void addNewWorkOrderEstimatesForMB(final List<WorkOrderEstimate> woEstimateList, final WorkOrderEstimate woe) { if (woe.getMbHeaders().isEmpty()) woEstimateList.add(woe); else for (final MBHeader mbh : woe.getMbHeaders()) if (mbh.getEgwStatus() != null && mbh.getEgwStatus().getCode().equals(MBHeader.MeasurementBookStatus.CANCELLED.toString()) && !woEstimateList.contains(woe)) woEstimateList.add(woe); } private void addUnlimitedWorkOrderEstimatesForMB(final List<WorkOrderEstimate> woEstimateList, final List<WorkOrderEstimate> usedWOEstimateList, final WorkOrderEstimate woe, final MBHeader mbHeader, final MBDetails mbDetails) { if (// woe.getWorkOrderActivities().contains(mbDetails.getWorkOrderActivity()) // && mbHeader.getEgwStatus() != null && mbHeader.getEgwStatus().getCode() .equalsIgnoreCase(MBHeader.MeasurementBookStatus.APPROVED.toString())) { if (!woEstimateList.contains(woe)) woEstimateList.add(woe); } else if (woEstimateList.contains(woe)) usedWOEstimateList.add(woe); } private void addLimitedWorkOrderEstimatesForMB(final List<WorkOrderEstimate> woEstimateList, final List<WorkOrderEstimate> usedWOEstimateList, final Double approvedQuantity, final Double usedQuantity, final WorkOrderEstimate woe, final MBHeader mbHeader, final MBDetails mbDetails) { if (usedQuantity < approvedQuantity && woe.getWorkOrderActivities().contains(mbDetails.getWorkOrderActivity()) && mbHeader.getEgwStatus() != null && mbHeader.getEgwStatus().getCode() .equalsIgnoreCase(MBHeader.MeasurementBookStatus.APPROVED.toString())) { if (!woEstimateList.contains(woe)) woEstimateList.add(woe); } else if (woEstimateList.contains(woe)) usedWOEstimateList.add(woe); } private Double getUsedQuantity(final Double usedQuantity, final List<MBHeader> mbHeaderList) { Double usedQty = usedQuantity; for (final MBHeader mbHeader : mbHeaderList) if (mbHeader != null && mbHeader.getEgwStatus() != null && !mbHeader.getEgwStatus().getCode() .equalsIgnoreCase(MBHeader.MeasurementBookStatus.CANCELLED.toString())) for (final MBDetails mbDetails : mbHeader.getMbDetails()) usedQty += mbDetails.getQuantity(); return usedQty; } /** * This method will return workorderestimates objects pending for Bill * * @param workOrderEstimateList * @param mbHeader * @return List<WorkOrderEstimate> */ @Override public List<WorkOrderEstimate> getWorkOrderEstimatesForBill(final List<WorkOrderEstimate> workOrderEstimateList) { final List<WorkOrderEstimate> woEstimateList = new ArrayList<WorkOrderEstimate>(); // Approved quantity for workorder for (final WorkOrderEstimate woe : workOrderEstimateList) { final List<MBHeader> mbHeaderList = findAllByNamedQuery("getMBbyWorkOrderEstID", woe.getId(), WorksConstants.CANCELLED_STATUS, getFinalBillTypeConfigValue(), WorksConstants.CANCELLED_STATUS); if (mbHeaderList != null && !mbHeaderList.isEmpty()) for (final MBHeader mbHeader : mbHeaderList) { if (mbHeader.getEgBillregister() != null && mbHeader.getEgBillregister().getBillstatus() .equals(MBHeader.MeasurementBookStatus.CANCELLED.toString()) && !woEstimateList.contains(woe)) woEstimateList.add(woe); for (final MBDetails mbDetails : mbHeader.getMbDetails()) if (woe.getWorkOrderActivities().contains(mbDetails.getWorkOrderActivity()) && mbHeader.getEgwStatus() != null && mbHeader.getEgwStatus().getCode() .equalsIgnoreCase(MBHeader.MeasurementBookStatus.APPROVED.toString()) && mbHeader.getEgBillregister() == null && !woEstimateList.contains(woe)) woEstimateList.add(woe); } } return woEstimateList; } /** * This method will return workorderestimates objects pending for Bill , but it will not consider Legacy MBs * * @param workOrderEstimateList * @param mbHeader * @return List<WorkOrderEstimate> */ @Override public List<WorkOrderEstimate> getWOEstForBillExludingLegacyMB(final List<WorkOrderEstimate> workOrderEstimateList) { final List<WorkOrderEstimate> woEstimateList = new ArrayList<WorkOrderEstimate>(); // Approved quantity for workorder for (final WorkOrderEstimate woe : workOrderEstimateList) { final List<MBHeader> mbHeaderList = findAllByNamedQuery("getMBWithoutLegacyByWOEstID", woe.getId(), WorksConstants.CANCELLED_STATUS, getFinalBillTypeConfigValue(), WorksConstants.CANCELLED_STATUS); if (mbHeaderList != null && !mbHeaderList.isEmpty()) for (final MBHeader mbHeader : mbHeaderList) { if (mbHeader.getEgBillregister() != null && mbHeader.getEgBillregister().getBillstatus() .equals(MBHeader.MeasurementBookStatus.CANCELLED.toString()) && !woEstimateList.contains(woe)) woEstimateList.add(woe); for (final MBDetails mbDetails : mbHeader.getMbDetails()) if ((woe.getWorkOrderActivities().contains(mbDetails.getWorkOrderActivity()) || mbDetails .getWorkOrderActivity().getActivity().getRevisionType() != null) && mbHeader.getEgwStatus() != null && mbHeader.getEgwStatus().getCode() .equalsIgnoreCase(MBHeader.MeasurementBookStatus.APPROVED.toString()) && mbHeader.getEgBillregister() == null && !woEstimateList.contains(woe)) woEstimateList.add(woe); } } return woEstimateList; } /** * Populate all the cumulative fields related to mbdetail line item * * @param woActivityId * @return */ @Override public MBHeader calculateMBDetails(final MBHeader mbHeader, final boolean isPersistedObject) { final List<MBDetails> mbDetailList = mbHeader.getMbDetails(); double lPrevCumlvQuant = 0; for (final MBDetails detail : mbDetailList) { if (detail.getWorkOrderActivity().getActivity().getParent() == null) { lPrevCumlvQuant = prevCumulativeQuantityIncludingCQ(detail.getWorkOrderActivity().getId(), mbHeader.getId(), detail.getWorkOrderActivity().getActivity().getId(), detail .getWorkOrderActivity().getWorkOrderEstimate().getWorkOrder()); detail.setTotalEstQuantity(totalEstimatedQuantity(detail.getWorkOrderActivity().getId(), mbHeader.getId(), detail.getWorkOrderActivity().getActivity().getId(), detail .getWorkOrderActivity().getWorkOrderEstimate().getWorkOrder())); } else { detail.getWorkOrderActivity() .setParent( (WorkOrderActivity) genericService .find("from WorkOrderActivity where activity.id=? and (workOrderEstimate.id=? or workOrderEstimate.estimate.parent.id=?)", detail.getWorkOrderActivity().getActivity().getParent().getId(), mbHeader.getWorkOrderEstimate().getId(), mbHeader .getWorkOrderEstimate().getEstimate().getId())); lPrevCumlvQuant = prevCumulativeQuantityIncludingCQ(detail.getWorkOrderActivity().getId(), mbHeader.getId(), detail.getWorkOrderActivity().getActivity().getParent().getId(), detail .getWorkOrderActivity().getWorkOrderEstimate().getWorkOrder()); detail.setTotalEstQuantity(totalEstimatedQuantity(detail.getWorkOrderActivity().getId(), mbHeader.getId(), detail.getWorkOrderActivity().getActivity().getParent().getId(), detail .getWorkOrderActivity().getWorkOrderEstimate().getWorkOrder())); } detail.setPrevCumlvQuantity(lPrevCumlvQuant); detail.setCurrCumlvQuantity(lPrevCumlvQuant + detail.getQuantity()); detail.setAmtForCurrQuantity(detail.getQuantity() * detail.getWorkOrderActivity().getApprovedRate()); detail.setCumlvAmtForCurrCumlvQuantity((lPrevCumlvQuant + detail.getQuantity()) * detail.getWorkOrderActivity().getApprovedRate()); } return mbHeader; } /** * This is used by MB screens. This returns the estimated quantity for an work order activity This returns original activity * quantity + all change quantities of the activity for all associated REs Work order activities of only approved REs are * considered * * @param woActivityId ,mbHeaderId,activityId, workOrder * @return */ @Override public double totalEstimatedQuantity(final Long woActivityId, Long mbHeaderId, final Long activityId, final WorkOrder workOrder) { Date currentTimestamp = null; MBHeader mbHeader = null; if (mbHeaderId == null) { mbHeaderId = -1l; currentTimestamp = new Date(); } else { mbHeader = persistenceService.find(" from MBHeader where id = ?", mbHeaderId); currentTimestamp = mbHeader.getCreatedDate(); } Object[] params = null; Double estQuantity = null; params = new Object[] { workOrder, woActivityId, activityId }; estQuantity = (Double) genericService.findByNamedQuery("totalEstimatedQuantity", params); Double estQuantityRE = null; if (workOrder.getParent() != null) params = new Object[] { currentTimestamp, workOrder.getParent(), workOrder.getParent(), activityId }; else params = new Object[] { currentTimestamp, workOrder, workOrder, activityId }; estQuantityRE = (Double) genericService.findByNamedQuery("totalEstimatedQuantityForRE", params); if (estQuantity != null && estQuantityRE != null) estQuantity = estQuantity + estQuantityRE; if (estQuantity == null && estQuantityRE != null) estQuantity = estQuantityRE; if (estQuantity == null) return 0.0d; else return estQuantity.doubleValue(); } /** * @param workOrderNumber ,lineItemId * @return boolean */ @Override public boolean isMBExistForLineItem(final String workOrderNumber, final long lineItemId) { boolean flag = false; List<MBHeader> mbHeaderList = null; Object[] params; final List<Object> paramList = new ArrayList<Object>(); String dynQuery = "select distinct mbHeader from MBHeader mbHeader, WorkOrder wo " + " join wo.workOrderActivities woa left join woa.activity.schedule schedule left join woa.activity.nonSor nonSor" + " where mbHeader.id !=null" + " and mbHeader.workOrder.workOrderNumber like ?" + " and mbHeader.egwStatus.code like ?"; paramList.add("%" + workOrderNumber + "%"); paramList.add("NEW"); if (lineItemId > 0) { dynQuery = dynQuery + " and (schedule.id = ? or nonSor.id = ?)"; paramList.add(lineItemId); paramList.add(lineItemId); } logger.debug("1--inside action dynquery is" + dynQuery); if (paramList.isEmpty()) mbHeaderList = genericService.findAllBy(dynQuery); else { params = new Object[paramList.size()]; params = paramList.toArray(params); mbHeaderList = genericService.findAllBy(dynQuery, params); } if (mbHeaderList != null && !mbHeaderList.isEmpty()) flag = true; return flag; } /** * Check if mb entries are within approved limit or not. If Current quantity + prev cumulative quantity is greater than 100% * and less than (100+Extra percentage)% of work order activity approved quantity, true is returned If Current quantity + prev * cumulative quantity > (100+Extra percentage)% of work order activity approved quantity, null is returned If Current * quantity + prev cumulative quantity <= 100% work order activity approved quantity then false is returned. Eg: If Extra * percentage=25 If Current quantity + prev cumulative quantity is greater than 100% and less than 125% of work order activity * approved quantity, true is returned If Current quantity + prev cumulative quantity > 125% of work order activity approved * quantity, null is returned If Current quantity + prev cumulative quantity <= 100% work order activity approved quantity * then false is returned. * * @param mbHeader * @return */ // @todo remove cancelled mb quantity @Override public Boolean approvalLimitCrossed(final MBDetails details) { Boolean result = false; Double approvedQuantity = 0D; final Double approvedQuantityWithoutPercentage = totalEstimatedQuantity(details.getWorkOrderActivity().getId(), details.getMbHeader() == null ? null : details.getMbHeader().getId(), details.getWorkOrderActivity() .getActivity().getId(), details.getWorkOrderActivity().getWorkOrderEstimate().getWorkOrder()); final Double extraPercentage = worksService.getConfigval(); if (extraPercentage.doubleValue() > 0) approvedQuantity = approvedQuantityWithoutPercentage * (1 + extraPercentage / 100); else approvedQuantity = approvedQuantityWithoutPercentage; if (details.getPrevCumlvQuantity() + details.getQuantity() > approvedQuantityWithoutPercentage) result = true; if (details.getPrevCumlvQuantity() + details.getQuantity() > approvedQuantity) result = null; return result; } /** * List of all approved MB's for which Bill is not generated or bill is cancelled. NOTE --- THIS WILL NOT CONSIDER LEGACY MBs * * @param workOrderId * @param asOnDate * @return */ @Override public List<MBHeader> getApprovedMBList(final Long workOrderId, final Long workOrderEstimateId, final Date asOnDate) { final Object[] params = new Object[] { WorksConstants.APPROVED, asOnDate, workOrderId, workOrderEstimateId }; final List<MBHeader> mbList = persistenceService.findAllByNamedQuery("getApprovedMBList", params); final List<MBHeader> mbListForBill = new ArrayList<MBHeader>(); if (mbList != null && !mbList.isEmpty()) for (final MBHeader mbHeader : mbList) { if (mbHeader.getEgBillregister() != null && mbHeader.getEgBillregister().getStatus() != null && mbHeader.getEgBillregister().getStatus().getCode().equals("CANCELLED")) mbListForBill.add(mbHeader); if (mbHeader.getEgBillregister() == null) mbListForBill.add(mbHeader); } return mbListForBill; } /** * List of all MB's were the bill is created and bill type is part bill * * @param workOrderId * @param billtype * @return */ @Override public List<MBHeader> getPartBillList(final Long workOrderId, final String billtype) { final Object[] params = new Object[] { WorksConstants.APPROVED, workOrderId, WorksConstants.CANCELLED_STATUS, billtype }; return persistenceService.findAllByNamedQuery("getPartBillList", params); } /** * returns latest bill date for MB * * @param workOrderId * @return */ @Override public Date getLatestBillDateForMB(final Long workOrderId) { return (Date) genericService.findByNamedQuery("getAllBilledMBs", WorksConstants.APPROVED, workOrderId); } /** * returns latest bill date for MB * * @param workOrderEstimateId * @return */ @Override public Date getLatestBillDateForMBPassingWOEstimate(final Long workOrderEstimateId) { return (Date) genericService.findByNamedQuery("getAllBilledMBsForWOEstimate", WorksConstants.APPROVED, workOrderEstimateId); } public void setWorksService(final WorksService worksService) { this.worksService = worksService; } public String getFinalBillTypeConfigValue() { return worksService.getWorksConfigValue("FinalBillType"); } @Override public BigDecimal getTotalMBAmountForPrevMBs(final WorkOrderEstimate workOrderEstimate, final double negoPerc, final String tenderType) { final List<MBHeader> mbHeaderList = persistenceService.findAllByNamedQuery("getAllApprovedMBHeaders", WorksConstants.APPROVED, workOrderEstimate.getWorkOrder().getId(), workOrderEstimate.getEstimate() .getId()); BigDecimal tenderedAmount = BigDecimal.ZERO; BigDecimal mbAmount = BigDecimal.ZERO; BigDecimal tenderedMBAmount = BigDecimal.ZERO; BigDecimal totalMBAmount = BigDecimal.ZERO; if (tenderType.equalsIgnoreCase(WorksConstants.PERC_TENDER)) { for (final MBHeader mbhObj : mbHeaderList) { for (final MBDetails mbd : mbhObj.getMbDetails()) if (mbd.getWorkOrderActivity().getActivity().getRevisionType() == null) tenderedAmount = tenderedAmount.add(BigDecimal.valueOf(mbd.getAmount())); mbAmount = mbAmount.add(mbhObj.getTotalMBAmount()); } // applying percentage on tendered items if (tenderedAmount != null) tenderedMBAmount = tenderedAmount.add(tenderedAmount.multiply(BigDecimal.valueOf(negoPerc / 100))); // adding tendered amount with the non tendered items amount, to get // the total mb amount totalMBAmount = tenderedMBAmount.add(mbAmount.subtract(tenderedAmount)); } else for (final MBHeader mbhObj : mbHeaderList) totalMBAmount = totalMBAmount.add(mbhObj.getTotalMBAmount()); return totalMBAmount.setScale(2, RoundingMode.HALF_UP); } @Override public BigDecimal getTotalMBAmount(final Long workOrderId, final Long estimateId) { BigDecimal totalMBAmount = BigDecimal.ZERO; totalMBAmount = (BigDecimal) genericService .find("select sum(mbAmount) from MBHeader where egwStatus.code != 'CANCELLED' and workOrderEstimate.workOrder.id=? and workOrderEstimate.estimate.id= ? ", workOrderId, estimateId); return totalMBAmount; } @Override public Date getWorkCommencedDate(final Long woId) { final Date workCommencedDate = (Date) genericService.find(" select stat.statusDate from OfflineStatus stat " + "where stat.objectId = ? and stat.objectType = ? and stat.egwStatus.code = ? ", woId, "WorkOrder", WorksConstants.WO_STATUS_WOCOMMENCED); return workCommencedDate; } @Override public Date getLastMBCreatedDate(final Long woId, final Long estId) { final Date latestMBDate = (Date) genericService .find(" select max(mbh.mbDate) from MBHeader mbh " + "where mbh.workOrder.id= ? and mbh.workOrderEstimate.estimate.id=? and mbh.workOrderEstimate.estimate.egwStatus.code= ? and mbh.egwStatus.code = ? ", woId, estId, WorksConstants.ADMIN_SANCTIONED_STATUS, WorksConstants.APPROVED); return latestMBDate; } }