/*
* 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.egov.commons.CFinancialYear;
import org.egov.infra.admin.master.entity.Boundary;
import org.egov.infra.utils.DateUtils;
import org.egov.infstr.services.PersistenceService;
import org.egov.works.abstractestimate.entity.AbstractEstimate;
import org.egov.works.models.masters.Contractor;
import org.egov.works.models.measurementbook.MBHeader;
import org.egov.works.models.tender.EstimateLineItemsForWP;
import org.egov.works.models.tender.TenderResponse;
import org.egov.works.models.tender.TenderResponseActivity;
import org.egov.works.models.tender.WorksPackage;
import org.egov.works.models.workorder.AbstractEstimateForWp;
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.models.workorder.WorkOrderNumberGenerator;
import org.egov.works.revisionestimate.entity.enums.RevisionType;
import org.egov.works.services.MeasurementBookService;
import org.egov.works.services.WorkOrderService;
import org.egov.works.services.WorksPackageService;
import org.egov.works.services.WorksService;
import org.egov.works.utils.WorksConstants;
public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrder, Long> implements WorkOrderService {
private static final Logger logger = Logger.getLogger(WorkOrderServiceImpl.class);
private PersistenceService<Contractor, Long> contractorService;
private WorksService worksService;
private MeasurementBookService measurementBookService;
private WorkOrderNumberGenerator workOrderNumberGenerators;
// Search parameters
public static final String CONTRACTOR_ID = "CONTRACTOR_ID";
public static final String CREATE_DATE = "CREATE_DATE";
public static final String FROM_DATE = "FROM_DATE";
public static final String TO_DATE = "TO_DATE";
public static final String STATUS = "STATUS";
public static final String TENDER_NO = "TENDER_NO";
public static final String WORKORDER_NO = "WORKORDER_NO";
public static final String MB_CREATION = "MB_CREATION";
public static final String WORKORDER_ID = "WORKORDER_ID";
public static final String WORKORDER_ESTIMATE_ID = "WORKORDER_ESTIMATE_ID";
public static final String PROJECT_CODE = "PROJECT_CODE";
public static final String ACTIVITY_DESC = "ACTIVITY_DESC";
public static final String ACTIVITY_CODE = "ACTIVITY_CODE";
public static final String ACTION_FLAG = "ACTION_FLAG";
public static final String ESTIMATE_NO = "ESTIMATE_NO";
public static final String WP_NO = "WP_NO";
public static final String TENDER_FILE_NO = "TENDER_FILE_NO";
public static final String REVISION_TYPE = "REVISION_TYPE";
public static final String SOURCEPAGE = "sourcepage";
public static final String CANCELWO = "cancelWO";
private WorksPackageService workspackageService;
public WorkOrderServiceImpl(final PersistenceService<WorkOrder, Long> persistenceService) {
super(persistenceService);
}
@Override
public Double getSecurityDepositConfValue() {
final String securityDepConfValue = worksService.getWorksConfigValue("SECURITY_DEPOSIT_MULTIPLIER");
if (StringUtils.isNotBlank(securityDepConfValue))
return Double.valueOf(securityDepConfValue);
return 0.0;
}
@Override
public Double getLabourWelfareFundConfValue() {
final String labourWelfareConfValue = worksService.getWorksConfigValue("LWF_MULTIPLIER");
if (StringUtils.isNotBlank(labourWelfareConfValue))
return Double.valueOf(labourWelfareConfValue);
return 0.0;
}
/**
* This method will set workorder number to the work order object
*
* @param entity
* @param workOrder
*/
@Override
public WorkOrder setWorkOrderNumber(final AbstractEstimate abstractEstimate, final WorkOrder workOrder,
final WorksPackage worksPackage) {
final CFinancialYear financialYear = getCurrentFinancialYear(workOrder.getWorkOrderDate());
if (workOrder.getWorkOrderNumber() == null)
workOrder.setWorkOrderNumber(workOrderNumberGenerators.getWorkOrderNumberGenerator(abstractEstimate,
financialYear, worksPackage, workOrder, persistenceService));
return workOrder;
}
/**
* This method will return all the contractors which are having active work orders.
*
* @return List of ContractorDetail
*/
@Override
public List<Contractor> getContractorsWithWO() {
logger.info("-------------------------Inside getContractorsWithWO---------------------");
List<Contractor> contractorList = null;
contractorList = contractorService.findAllByNamedQuery("getContractorsWithWO");
return contractorList;
}
/**
* This method will search list of WO's for the given criteria and eligible for MB. CriteriaMap will
* have:CONTRACTOR_ID,CREATE_DATE,TENDER_NO,WORKORDER_NO Filter: 1)isApprovalLimitReachedForWO 2)isMBCreatedAndPendingForWO
* 3)isFinalBillApprovedForWO
*
* @param criteriaMap
* @return
*/
@Override
public List<WorkOrder> searchWOForMB(final Map<String, Object> criteriaMap) {
logger.info("---------------------------Inside searchWOForMB----------------------------");
final List<WorkOrder> filteredList = new ArrayList<WorkOrder>();
criteriaMap.put(ACTION_FLAG, "searchWOForMB");
// Filter list for approval limit
for (final WorkOrder workorder : searchWO(criteriaMap))
if (!isApprovalLimitReachedForWO(workorder.getId()))
filteredList.add(workorder);
return filteredList;
}
/**
* This method will search list of WO's for the given criteria and eligible for MB. CriteriaMap will
* have:CONTRACTOR_ID,CREATE_DATE,TENDER_NO,WORKORDER_NO,PROJECT_CODE Filter: 1)An existing bill with status in "New" or
* "approval pending" or "Rejected will NOT be retrieved 2)Work orders for which the final bill is generated will NOT be
* retrieved for selection in the search result set. 2)Work orders with existing bill with status " Approved" with no existing
* bill can be retrieved for selection
*
* @param criteriaMap
* @return
*/
@Override
public List<WorkOrder> searchWOForBilling(final Map<String, Object> criteriaMap) {
logger.debug("-------------------------Inside searchWOForBilling-----------------------");
final List<WorkOrder> filteredList = new ArrayList<WorkOrder>();
criteriaMap.put(ACTION_FLAG, "searchWOForBilling");
// Filter list for approval limit
for (final WorkOrder workorder : searchWO(criteriaMap))
if (!isWOValidforBill(workorder.getId()))
filteredList.add(workorder);
return filteredList;
}
/**
* This method will search list of WO's for the given criteria and eligible to be view. CriteriaMap may
* have:CONTRACTOR_ID,FROM_DATE,TO_DATE,WORKORDER_NO,STATUS
*
* @param criteriaMap
* @return List<WorkOrder>
*/
@Override
public List<String> searchWOToPaginatedView(final Map<String, Object> criteriaMap, final List<Object> paramList) {
logger.info("-------------------------Inside searchWOToView-----------------------");
return searchWOQuery(criteriaMap, paramList);
}
/**
* Copy of searchWO using for Pagination This method will search list of WO's for the given criteria. CriteriaMap will
* have:CONTRACTOR_ID,CREATE_DATE,TENDER_NO,WORKORDER_NO,PROJECT_CODE Date of creation ~ WorkOrder.workOrderDate Contractor ~
* WorkOrder.contractor Tender number ~ WorkOrder.abstractEstimate ~ TenderEstimate.tendernumber Work order number ~
* WorkOrder.workOrderNumber Project code ~ WorkOrder.AbstractEstimate.projectCode. approved quantity ~
* WorkOrder.WorkOrderActivity.approvedQuantity a pre-defined % ~ APP_CONFIG line items in a work order ~
* WorkOrder.WorkOrderActivity final bill is approved MB is in a "approval pending" ~ MBHeader.currentStat bill with status
* "New" or "approval pending" or "Rejected" final bill is generated existing bill with status "Approved"
*
* @param criteriaMap
* @return
*/
public List<String> searchWOQuery(final Map<String, Object> criteriaMap, final List<Object> paramList) {
logger.info("-------------------------Inside searchWO---------------------------------");
final List<String> qryList = new ArrayList<String>();
StringBuffer commonQueryFilter = new StringBuffer();
// this String is the return Countqruery
final String CountQry = " select count(distinct wo) from WorkOrder wo left join wo.workOrderEstimates workOrderEstimate"
+ " where wo.id is not null and wo.parent is null and wo.egwStatus.code<>'NEW' ";
final String dynQuery = "select distinct wo from WorkOrder wo left join wo.workOrderEstimates workOrderEstimate"
+ " where wo.id is not null and wo.parent is null and wo.egwStatus.code<>'NEW' ";
final String setStat = worksService.getWorksConfigValue("WorkOrder.setstatus");
if (criteriaMap.get(STATUS) != null)
if (criteriaMap.get(STATUS).equals("APPROVED") || criteriaMap.get(STATUS).equals("CANCELLED")) {
if (criteriaMap.get(SOURCEPAGE) != null && CANCELWO.equals(criteriaMap.get(SOURCEPAGE))) {
commonQueryFilter = commonQueryFilter.append(" and wo.egwStatus.code = ? ");
paramList.add(criteriaMap.get(STATUS));
} else if (criteriaMap.get(STATUS).equals("APPROVED")) {
commonQueryFilter = commonQueryFilter.append(" and wo.egwStatus.code = ? and "
+ " wo.id not in (select objectId from OfflineStatus where objectType=?)");
paramList.add(criteriaMap.get(STATUS));
paramList.add("WorkOrder");
} else if (criteriaMap.get(STATUS).equals("CANCELLED")) {
commonQueryFilter = commonQueryFilter.append(" and wo.egwStatus.code = ? ");
paramList.add(criteriaMap.get(STATUS));
}
} else if (!criteriaMap.get(STATUS).equals("-1")
&& Arrays.asList(setStat.split(",")).contains(criteriaMap.get(STATUS))) {
commonQueryFilter = commonQueryFilter
.append(" and wo.egwStatus.code = 'APPROVED' and wo.id in(select stat.objectId from "
+ "OfflineStatus stat where stat.egwStatus.code=? and stat.id = (select"
+ " max(stat1.id) from OfflineStatus stat1 where wo.id=stat1.objectId and stat1.objectType=?) and stat.objectType=?)");
paramList.add(criteriaMap.get(STATUS));
paramList.add("WorkOrder");
paramList.add("WorkOrder");
} else if (!criteriaMap.get(STATUS).equals("-1")
&& !Arrays.asList(setStat.split(",")).contains(criteriaMap.get(STATUS))) {
commonQueryFilter = commonQueryFilter.append(" and wo.egwStatus.code = ?");
paramList.add(criteriaMap.get(STATUS));
}
if (criteriaMap.get(CREATE_DATE) != null) {
commonQueryFilter = commonQueryFilter.append(" and wo.workOrderDate = ? ");
paramList.add(criteriaMap.get(CREATE_DATE));
}
if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) == null) {
commonQueryFilter = commonQueryFilter.append(" and wo.workOrderDate >= ? ");
paramList.add(criteriaMap.get(FROM_DATE));
} else if (criteriaMap.get(TO_DATE) != null && criteriaMap.get(FROM_DATE) == null) {
commonQueryFilter = commonQueryFilter.append(" and wo.workOrderDate <= ? ");
paramList.add(criteriaMap.get(TO_DATE));
} else if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) != null) {
commonQueryFilter = commonQueryFilter.append(" and wo.workOrderDate between ? and ? ");
paramList.add(criteriaMap.get(FROM_DATE));
paramList.add(criteriaMap.get(TO_DATE));
}
if (criteriaMap.get(WORKORDER_NO) != null) {
commonQueryFilter = commonQueryFilter.append(" and UPPER(wo.workOrderNumber) like ? ");
paramList.add("%" + criteriaMap.get(WORKORDER_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(WP_NO) != null) {
commonQueryFilter = commonQueryFilter.append(" and UPPER(wo.packageNumber) like ? ");
paramList.add("%" + criteriaMap.get(WP_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(TENDER_FILE_NO) != null) {
commonQueryFilter = commonQueryFilter
.append(" and wo.negotiationNumber in (select tr1.negotiationNumber from TenderResponse tr1 where "
+ "UPPER(tr1.tenderEstimate.worksPackage.tenderFileNumber) like ? )");
paramList.add("%" + criteriaMap.get(TENDER_FILE_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(CONTRACTOR_ID) != null) {
commonQueryFilter = commonQueryFilter.append(" and wo.contractor.id = ? ");
paramList.add(criteriaMap.get(CONTRACTOR_ID));
}
if (criteriaMap.get("DEPT_ID") != null) {
commonQueryFilter = commonQueryFilter
.append(" and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " we.estimate.executingDepartment.id = ?) ");
paramList.add(criteriaMap.get("DEPT_ID"));
}
if (criteriaMap.get(ESTIMATE_NO) != null) {
commonQueryFilter = commonQueryFilter
.append(" and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " UPPER(we.estimate.estimateNumber) like ? ) ");
paramList.add("%" + criteriaMap.get(ESTIMATE_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(TENDER_NO) != null && !"".equalsIgnoreCase((String) criteriaMap.get(TENDER_NO))) {
logger.debug("-------TENDER_NO-----------" + criteriaMap.get(TENDER_NO));
commonQueryFilter = commonQueryFilter.append(" and UPPER(wo.tenderNumber like) ? ) ");
paramList.add("%" + criteriaMap.get(TENDER_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(PROJECT_CODE) != null) {
commonQueryFilter = commonQueryFilter
.append(" and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " UPPER(we.estimate.executingDepartment.projectCode.code) like ? ) ");
paramList.add("%" + criteriaMap.get(PROJECT_CODE).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(ACTION_FLAG) != null
&& criteriaMap.get(ACTION_FLAG).toString().equalsIgnoreCase("searchWOForMB")) {
commonQueryFilter = commonQueryFilter
.append(" and workOrderEstimate.estimate.projectCode.egwStatus.code!='CLOSED' and workOrderEstimate.id not in (select distinct mbh.workOrderEstimate.id "
+ "from MBHeader mbh where mbh.egwStatus.code=? "
+ " or mbh.egwStatus.code=?"
+ " or mbh.egwStatus.code=?"
+ " or mbh.egwStatus.code=? or mbh.egwStatus.code=? )"
+ "and workOrderEstimate.id not in (select distinct mbh.workOrderEstimate.id "
+ "from MBHeader mbh where "
+ " mbh.egwStatus.code = ? and mbh.egBillregister.billstatus = ? and "
+ " mbh.egBillregister.billtype=?)");
paramList.add(MBHeader.MeasurementBookStatus.CREATED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CHECKED.toString());
paramList.add(MBHeader.MeasurementBookStatus.RESUBMITTED.toString());
paramList.add(MBHeader.MeasurementBookStatus.REJECTED.toString());
paramList.add(MBHeader.MeasurementBookStatus.NEW.toString());
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(getFinalBillTypeConfigValue());
}
if (criteriaMap.get(ACTION_FLAG) != null
&& criteriaMap.get(ACTION_FLAG).toString().equalsIgnoreCase("searchWOForBilling")) {
commonQueryFilter = commonQueryFilter
.append(" and workOrderEstimate.estimate.projectCode.egwStatus.code!='CLOSED' and workOrderEstimate.id not in "
+ "(select distinct mbh.workOrderEstimate.id from MBHeader mbh where mbh.egwStatus.code = ? "
+ " and (mbh.egBillregister.billstatus <> ? and mbh.egBillregister.billtype = ?))");
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
paramList.add(getFinalBillTypeConfigValue());
}
final String orderQry = " Order by wo.workOrderDate ";
logger.info("Query is ::" + dynQuery);
qryList.add(CountQry + commonQueryFilter + orderQry);
qryList.add(dynQuery + commonQueryFilter + orderQry);
return qryList;
}
/**
* This method will search list of WO's for the given criteria and eligible to be view. CriteriaMap may
* have:CONTRACTOR_ID,FROM_DATE,TO_DATE,WORKORDER_NO,STATUS
*
* @param criteriaMap
* @return List<WorkOrder>
*/
@Override
public List<WorkOrder> searchWOToView(final Map<String, Object> criteriaMap) {
logger.debug("-------------------------Inside searchWOToView-----------------------");
return searchWO(criteriaMap);
}
/**
* This method will search list of WO's for the given criteria. CriteriaMap will
* have:CONTRACTOR_ID,CREATE_DATE,TENDER_NO,WORKORDER_NO,PROJECT_CODE Date of creation ~ WorkOrder.workOrderDate Contractor ~
* WorkOrder.contractor Tender number ~ WorkOrder.abstractEstimate ~ TenderEstimate.tendernumber Work order number ~
* WorkOrder.workOrderNumber Project code ~ WorkOrder.AbstractEstimate.projectCode. approved quantity ~
* WorkOrder.WorkOrderActivity.approvedQuantity a pre-defined % ~ APP_CONFIG line items in a work order ~
* WorkOrder.WorkOrderActivity final bill is approved MB is in a "approval pending" ~ MBHeader.currentStat bill with status
* "New" or "approval pending" or "Rejected" final bill is generated existing bill with status "Approved"
*
* @param criteriaMap
* @return
*/
public List<WorkOrder> searchWO(final Map<String, Object> criteriaMap) {
logger.info("-------------------------Inside searchWO---------------------------------");
List<WorkOrder> wolList = null;
String dynQuery = "select distinct wo from WorkOrder wo left join wo.workOrderEstimates workOrderEstimate"
+ " where wo.id is not null and wo.parent is null ";
Object[] params;
final List<Object> paramList = new ArrayList<Object>();
final String setStat = worksService.getWorksConfigValue("WorkOrder.setstatus");
if (criteriaMap.get(STATUS) != null)
if (criteriaMap.get(STATUS).equals("APPROVED") || criteriaMap.get(STATUS).equals("CANCELLED")) {
if (criteriaMap.get(SOURCEPAGE) != null && CANCELWO.equals(criteriaMap.get(SOURCEPAGE))) {
dynQuery = dynQuery + " and wo.egwStatus.code = ? ";
paramList.add(criteriaMap.get(STATUS));
} else {
dynQuery = dynQuery + " and wo.egwStatus.code = ? and "
+ " wo.id not in (select objectId from OfflineStatus where objectType=?)";
paramList.add(criteriaMap.get(STATUS));
paramList.add("WorkOrder");
}
} else if (!criteriaMap.get(STATUS).equals("-1")
&& Arrays.asList(setStat.split(",")).contains(criteriaMap.get(STATUS))) {
dynQuery = dynQuery
+ " and wo.id in(select stat.objectId from "
+ "OfflineStatus stat where stat.egwStatus.code=? and stat.id = (select"
+ " max(stat1.id) from OfflineStatus stat1 where wo.id=stat1.objectId and stat1.objectType=?) and stat.objectType=?)";
paramList.add(criteriaMap.get(STATUS));
paramList.add("WorkOrder");
paramList.add("WorkOrder");
} else if (!criteriaMap.get(STATUS).equals("-1")
&& !Arrays.asList(setStat.split(",")).contains(criteriaMap.get(STATUS))) {
dynQuery = dynQuery + " and wo.egwStatus.code = ?";
paramList.add(criteriaMap.get(STATUS));
}
if (criteriaMap.get(CREATE_DATE) != null) {
dynQuery = dynQuery + " and wo.workOrderDate = ? ";
paramList.add(criteriaMap.get(CREATE_DATE));
}
if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) == null) {
dynQuery = dynQuery + " and wo.workOrderDate >= ? ";
paramList.add(criteriaMap.get(FROM_DATE));
} else if (criteriaMap.get(TO_DATE) != null && criteriaMap.get(FROM_DATE) == null) {
dynQuery = dynQuery + " and wo.workOrderDate <= ? ";
paramList.add(criteriaMap.get(TO_DATE));
} else if (criteriaMap.get(FROM_DATE) != null && criteriaMap.get(TO_DATE) != null) {
dynQuery = dynQuery + " and wo.workOrderDate between ? and ? ";
paramList.add(criteriaMap.get(FROM_DATE));
paramList.add(criteriaMap.get(TO_DATE));
}
if (criteriaMap.get(WORKORDER_NO) != null) {
dynQuery = dynQuery + " and UPPER(wo.workOrderNumber) like ? ";
paramList.add("%" + criteriaMap.get(WORKORDER_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(WP_NO) != null) {
dynQuery = dynQuery + " and UPPER(wo.packageNumber) like ? ";
paramList.add("%" + criteriaMap.get(WP_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(TENDER_FILE_NO) != null) {
dynQuery = dynQuery
+ " and wo.negotiationNumber in (select tr1.negotiationNumber from TenderResponse tr1 where "
+ "UPPER(tr1.tenderEstimate.worksPackage.tenderFileNumber) like ? )";
paramList.add("%" + criteriaMap.get(TENDER_FILE_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(CONTRACTOR_ID) != null) {
dynQuery = dynQuery + " and wo.contractor.id = ? ";
paramList.add(criteriaMap.get(CONTRACTOR_ID));
}
if (criteriaMap.get("DEPT_ID") != null) {
dynQuery = dynQuery
+ " and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " we.estimate.executingDepartment.id = ?) ";
paramList.add(criteriaMap.get("DEPT_ID"));
}
if (criteriaMap.get(ESTIMATE_NO) != null) {
dynQuery = dynQuery
+ " and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " UPPER(we.estimate.estimateNumber) like ? ) ";
paramList.add("%" + criteriaMap.get(ESTIMATE_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(TENDER_NO) != null && !"".equalsIgnoreCase((String) criteriaMap.get(TENDER_NO))) {
logger.debug("-------TENDER_NO-----------" + criteriaMap.get(TENDER_NO));
dynQuery = dynQuery + " and UPPER(wo.tenderNumber like) ? ) ";
paramList.add("%" + criteriaMap.get(TENDER_NO).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(PROJECT_CODE) != null) {
dynQuery = dynQuery
+ " and wo.id in (select we.workOrder.id from WorkOrderEstimate we where we.workOrder.id=wo.id and "
+ " UPPER(we.estimate.executingDepartment.projectCode.code) like ? ) ";
paramList.add("%" + criteriaMap.get(PROJECT_CODE).toString().trim().toUpperCase() + "%");
}
if (criteriaMap.get(ACTION_FLAG) != null
&& criteriaMap.get(ACTION_FLAG).toString().equalsIgnoreCase("searchWOForMB")) {
dynQuery = dynQuery
+ " and workOrderEstimate.workOrder.egwStatus.code!='CANCELLED' and workOrderEstimate.estimate.projectCode.egwStatus.code!='CLOSED' and workOrderEstimate.id not in (select distinct mbh.workOrderEstimate.id "
+ "from MBHeader mbh where mbh.egwStatus.code=? " + " or mbh.egwStatus.code=?"
+ " or mbh.egwStatus.code=?" + " or mbh.egwStatus.code=? or mbh.egwStatus.code=? )"
+ "and workOrderEstimate.id not in (select distinct mbh.workOrderEstimate.id "
+ "from MBHeader mbh where "
+ " mbh.egwStatus.code = ? and mbh.egBillregister.billstatus = ? and "
+ " mbh.egBillregister.billtype=?)";
paramList.add(MBHeader.MeasurementBookStatus.CREATED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CHECKED.toString());
paramList.add(MBHeader.MeasurementBookStatus.RESUBMITTED.toString());
paramList.add(MBHeader.MeasurementBookStatus.REJECTED.toString());
paramList.add(MBHeader.MeasurementBookStatus.NEW.toString());
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(getFinalBillTypeConfigValue());
}
if (criteriaMap.get(ACTION_FLAG) != null
&& criteriaMap.get(ACTION_FLAG).toString().equalsIgnoreCase("searchWOForBilling")) {
dynQuery = dynQuery
+ " and workOrderEstimate.workOrder.egwStatus.code!='CANCELLED' and workOrderEstimate.estimate.projectCode.egwStatus.code!='CLOSED' and workOrderEstimate.id not in "
+ "(select distinct mbh.workOrderEstimate.id from MBHeader mbh where mbh.egwStatus.code = ? "
+ " and (mbh.egBillregister.billstatus <> ? and mbh.egBillregister.billtype = ?))";
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
paramList.add(getFinalBillTypeConfigValue());
}
// @Todo check action_flag
logger.debug("Query is ::" + dynQuery);
if (paramList.isEmpty())
wolList = findAllBy(dynQuery);
else {
params = new Object[paramList.size()];
params = paramList.toArray(params);
wolList = findAllBy(dynQuery, params);
}
return wolList;
}
/**
* This method will check whether approval limit is already used for all line item for the WO. Sum of
* WorkOrder.WorkOrderActivity.approvedQuantity <= ??Quantity??
*
* @param woId
* @return
*/
public Boolean isApprovalLimitReachedForWO(final Long woId) {
Boolean result = false;
final WorkOrder wo = findById(woId, false);
if (measurementBookService.getWorkOrderEstimatesForMB(wo.getWorkOrderEstimates()).isEmpty())
result = true;
return result;
}
public Boolean isWOValidforBill(final Long woId) {
Boolean result = false;
final WorkOrder wo = findById(woId, false);
if (measurementBookService.getWOEstForBillExludingLegacyMB(wo.getWorkOrderEstimates()).isEmpty())
result = true;
return result;
}
/**
* This method will search and return list of woactivity based on searched criteria. Search criteria:
* WORKORDER_NO,ACTIVITY_DESC,LINEITEM_CODE Story #567 Search Line item to record measurement
*
* @param criteriaMap
* @return
*/
@Override
public List<WorkOrderActivity> searchWOActivities(final Map<String, Object> criteriaMap) {
logger.info("-------------------------Inside searchWOActivities-----------------------");
List<WorkOrderActivity> woActivityList;
String dynQuery = "select distinct woa from WorkOrderActivity woa left join woa.activity.schedule schedule"
+ " left join woa.activity.nonSor nonSor where woa.id != null and woa.workOrderEstimate.estimate.parent is null "
+ " and woa.workOrderEstimate.workOrder.egwStatus.code != 'CANCELLED' ";
Object[] params;
final List<Object> paramList = new ArrayList<Object>();
if (criteriaMap.get(WORKORDER_NO) != null) {
dynQuery = dynQuery + " and woa.workOrderEstimate.workOrder.workOrderNumber = ? ";
paramList.add(criteriaMap.get(WORKORDER_NO));
}
if (criteriaMap.get(WORKORDER_ESTIMATE_ID) != null) {
dynQuery = dynQuery + " and woa.workOrderEstimate.estimate.id = ? ";
paramList.add(criteriaMap.get(WORKORDER_ESTIMATE_ID));
}
if (criteriaMap.get(ACTIVITY_DESC) != null) {
dynQuery = dynQuery + " and (" + "(UPPER(schedule.description) like ?) or ("
+ " UPPER(nonSor.description) like ? ))";
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase() + "%");
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase() + "%");
}
if (criteriaMap.get(ACTIVITY_CODE) != null) {
dynQuery = dynQuery + " and " + "UPPER(schedule.code) like ? ";
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_CODE)).toUpperCase() + "%");
}
// @Todo state not in approved and cancelled
/*
* dynQuery = dynQuery + "and woa.id not in (select distinct mbd.workOrderActivity.id from MBDetails mbd where " +
* "mbd.mbHeader.state.previous.value not in (?,?) and mbd.workOrderActivity.id = woa.id)" ;
* paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
* paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
*/
final Double extraPercentage = worksService.getConfigval();
double factor = 1;
if (extraPercentage.doubleValue() > 0)
factor = 1 + extraPercentage / 100;
// @Todo ignore quantity of cancelled mb
if (!"Required".equals(worksService.getWorksConfigValue("ORDER_NUMBER_REQUIRED"))) {
dynQuery = dynQuery
+ "and ((woa.approvedQuantity*? > (select sum(mbd.quantity) as sumq from MBDetails mbd "
+ " where mbd.mbHeader.egwStatus.code != ? group by mbd.workOrderActivity "
+ "having mbd.workOrderActivity.id = woa.id)) or (select sum(mbd.quantity) as sumq from MBDetails mbd "
+ " where mbd.mbHeader.egwStatus.code != ? group by mbd.workOrderActivity "
+ "having mbd.workOrderActivity.id = woa.id) is null)";
paramList.add(factor);
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
}
params = new Object[paramList.size()];
params = paramList.toArray(params);
woActivityList = genericService.findAllBy(dynQuery, params);
return woActivityList;
}
/**
* For the purpose of change quantity in revision estimate Will get work order activity list for the original work order and
* subsequent revision work orders It will not get the activities for which MB is present in workflow
*
* @param criteriaMap
* @return
*/
@Override
public List<WorkOrderActivity> searchWOActivitiesForChangeQuantity(final Map<String, Object> criteriaMap) {
logger.info("-------------------------Inside searchWOActivities-----------------------");
List<WorkOrderActivity> woActivityList;
String dynQuery = "select distinct woa from WorkOrderActivity woa left join woa.activity.schedule schedule"
+ " left join woa.activity.nonSor nonSor where woa.id is not null ";
Object[] params;
final List<Object> paramList = new ArrayList<Object>();
if (criteriaMap.get(ACTIVITY_DESC) != null)
dynQuery = dynQuery + " and (" + "(UPPER(schedule.description) like '%"
+ ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase() + "%') or ("
+ " UPPER(nonSor.description) like '%" + ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase()
+ "%' ))";
if (criteriaMap.get(ACTIVITY_CODE) != null)
dynQuery = dynQuery + " and " + "UPPER(schedule.code) like '%"
+ ((String) criteriaMap.get(ACTIVITY_CODE)).toUpperCase() + "%'";
if (criteriaMap.get(WORKORDER_ESTIMATE_ID) != null) {
if (criteriaMap.get(WORKORDER_ID) != null) {
dynQuery = dynQuery
+ " and (woa.workOrderEstimate.estimate.id = ? and woa.workOrderEstimate.workOrder.egwStatus.code=? and woa.workOrderEstimate.workOrder.id = ?) ";
paramList.add(criteriaMap.get(WORKORDER_ESTIMATE_ID));
paramList.add(WorksConstants.APPROVED);
paramList.add(criteriaMap.get(WORKORDER_ID));
} else {
dynQuery = dynQuery
+ " and (woa.workOrderEstimate.estimate.id = ? and woa.workOrderEstimate.workOrder.egwStatus.code=?) ";
paramList.add(criteriaMap.get(WORKORDER_ESTIMATE_ID));
paramList.add(WorksConstants.APPROVED);
}
dynQuery = dynQuery
+ " or ((woa.workOrderEstimate.estimate.egwStatus is not null and woa.workOrderEstimate.estimate.egwStatus.code=?)"
+ " and (woa.workOrderEstimate.estimate.parent is not null and woa.workOrderEstimate.estimate.parent.id = ? ))";
paramList.add(AbstractEstimate.EstimateStatus.APPROVED.toString());
paramList.add(criteriaMap.get(WORKORDER_ESTIMATE_ID));
}
if (criteriaMap.get(WORKORDER_ID) != null) {
dynQuery = dynQuery
+ " and (woa.workOrderEstimate.workOrder.id = ?) or ((woa.workOrderEstimate.workOrder.egwStatus is not null and woa.workOrderEstimate.workOrder.egwStatus.code=?)"
+ " and (woa.workOrderEstimate.workOrder.parent is not null and woa.workOrderEstimate.workOrder.parent.id = ? ))";
paramList.add(criteriaMap.get(WORKORDER_ID));
paramList.add(WorksConstants.APPROVED);
paramList.add(criteriaMap.get(WORKORDER_ID));
}
dynQuery = dynQuery + "and woa.id not in (select distinct mbd.workOrderActivity.id from MBDetails mbd where "
+ "mbd.mbHeader.egwStatus.code not in (?,?) and mbd.workOrderActivity.id = woa.id)";
paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
params = new Object[paramList.size()];
params = paramList.toArray(params);
dynQuery = dynQuery + " order by woa.activity.id asc";
woActivityList = genericService.findAllBy(dynQuery, params);
return woActivityList;
}
/**
* This method will search and return list of woactivity from only revision estimates based on searched criteria. Search
* criteria: WORKORDER_NO,ACTIVITY_DESC,LINEITEM_CODE
*
* @param criteriaMap
* @return
*/
@Override
public List<WorkOrderActivity> searchWOActivitiesFromRevEstimates(final Map<String, Object> criteriaMap) {
logger.info("-------------------------Inside searchWOActivities-----------------------");
List<WorkOrderActivity> woActivityList;
String dynQuery = "select distinct woa from WorkOrderActivity woa left join woa.activity.schedule schedule"
+ " left join woa.activity.nonSor nonSor where woa.id != null ";
Object[] params;
final List<Object> paramList = new ArrayList<Object>();
if (criteriaMap.get(WORKORDER_NO) != null) {
dynQuery = dynQuery + " and woa.workOrderEstimate.workOrder.parent.workOrderNumber = ? ";
paramList.add(criteriaMap.get(WORKORDER_NO));
}
if (criteriaMap.get(WORKORDER_ESTIMATE_ID) != null) {
dynQuery = dynQuery + " and woa.workOrderEstimate.estimate.parent.id = ? ";
paramList.add(criteriaMap.get(WORKORDER_ESTIMATE_ID));
}
if (criteriaMap.get(ACTIVITY_DESC) != null) {
dynQuery = dynQuery + " and (" + "(UPPER(schedule.description) like ?) or ("
+ " UPPER(nonSor.description) like ? ))";
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase() + "%");
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_DESC)).toUpperCase() + "%");
}
if (criteriaMap.get(ACTIVITY_CODE) != null) {
dynQuery = dynQuery + " and " + "UPPER(schedule.code) like ? ";
paramList.add("%" + ((String) criteriaMap.get(ACTIVITY_CODE)).toUpperCase() + "%");
}
// Check Approved REs
dynQuery = dynQuery + " and woa.workOrderEstimate.estimate.egwStatus.code=? ";
paramList.add(WorksConstants.APPROVED);
if (criteriaMap.get(REVISION_TYPE) != null) {
dynQuery = dynQuery + " and woa.activity.revisionType=? ";
paramList.add(criteriaMap.get(REVISION_TYPE));
}
// @Todo state not in approved and cancelled
/*
* dynQuery = dynQuery + "and woa.id not in (select distinct mbd.workOrderActivity.id from MBDetails mbd where " +
* "mbd.mbHeader.state.previous.value not in (?,?) and mbd.workOrderActivity.id = woa.id)" ;
* paramList.add(MBHeader.MeasurementBookStatus.APPROVED.toString());
* paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
*/
final Double extraPercentage = worksService.getConfigval();
double factor = 1;
if (extraPercentage.doubleValue() > 0)
factor = 1 + extraPercentage / 100;
// @Todo ignore quantity of cancelled mb
if (!"Required".equals(worksService.getWorksConfigValue("ORDER_NUMBER_REQUIRED"))) {
dynQuery = dynQuery
+ "and ((woa.approvedQuantity*? > (select sum(mbd.quantity) as sumq from MBDetails mbd "
+ " where mbd.mbHeader.egwStatus.code != ? group by mbd.workOrderActivity "
+ "having mbd.workOrderActivity.id = woa.id)) or (select sum(mbd.quantity) as sumq from MBDetails mbd "
+ " where mbd.mbHeader.egwStatus.code != ? group by mbd.workOrderActivity "
+ "having mbd.workOrderActivity.id = woa.id) is null)";
paramList.add(factor);
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
paramList.add(MBHeader.MeasurementBookStatus.CANCELLED.toString());
}
params = new Object[paramList.size()];
params = paramList.toArray(params);
woActivityList = genericService.findAllBy(dynQuery, params);
// /woActivityListOriEst = searchWOActivities(criteriaMap);
// Remove the SOR items that were present in the original Estimate
/*
* if(woActivityListOriEst !=null && !woActivityListOriEst.isEmpty() && woActivityList!=null && !woActivityList.isEmpty())
* { for(WorkOrderActivity woaOri :woActivityListOriEst) { for(WorkOrderActivity woaRev : woActivityList) {
* if(woaOri.getActivity().getId()==woaRev.getActivity().getId()) { woActivityList.remove(woaRev); } } } }
*/
return woActivityList;
}
/**
* This method will return toPageNo for a line item from the last mb entry.
*
* @param workOrderActivity
* @return
*/
@Override
public MBHeader findLastMBPageNoForLineItem(final WorkOrderActivity workOrderActivity, final Long mbHeaderId) {
logger.info("-------------------------Inside findLastMBPageNoForLineItem--------------");
String query = "select distinct mbh from MBHeader mbh join mbh.mbDetails as mbDetail ";
Object[] params;
final List<Object> paramList = new ArrayList<Object>();
// if(workOrderActivity.getActivity().getSchedule() != null)
// query = query +
// "where mbDetail.workOrderActivity.activity.schedule.id = "+workOrderActivity.getActivity().getSchedule().getId();
// if(workOrderActivity.getActivity().getNonSor() != null)
// query = query +
// "where mbDetail.workOrderActivity.activity.nonSor.id = "+workOrderActivity.getActivity().getNonSor().getId();
query = query + " where mbDetail.workOrderActivity.id = ? " + " and mbh.id != ? and mbh.egwStatus.code=? "
+ " and mbh.modifiedDate < (select modifiedDate from MBHeader where id = ? )"
+ " order by mbh.modifiedDate desc";
paramList.add(workOrderActivity.getId());
paramList.add(mbHeaderId);
paramList.add(WorksConstants.APPROVED);
paramList.add(mbHeaderId);
params = new Object[paramList.size()];
params = paramList.toArray(params);
final List<MBHeader> mbHeaderList = genericService.findAllBy(query, params);
MBHeader result = null;
if (mbHeaderList != null && !mbHeaderList.isEmpty())
result = mbHeaderList.get(0);
return result;
}
/**
* This method will check whether MB is created and pending for approval for the given WO. final bill is not approved for
* workorder??
*
* @param woId
* @return
*/
// public Boolean isMBCreatedAndPendingForWO(Long woId){
// Boolean result = false;
//
// return result;
// }
/**
* This method will check whether final bill is already approved for wo or not. No MB is in a "approval pending" for the work
* order.
*
* @param woId
* @return
*/
// public Boolean isFinalBillApprovedForWO(Long woId){
// Boolean result = false;
//
// return result;
//
// }
public void setContractorService(final PersistenceService<Contractor, Long> contractorService) {
this.contractorService = contractorService;
}
public void setWorksService(final WorksService worksService) {
this.worksService = worksService;
}
/**
* The method return true if the work number has to be re-generated
*
* @param entity an instance of <code>AbstractEstimate</code> containing the estimate date
* @param financialYear an instance of <code>CFinancialYear</code> representing the financial year for the estimate date.
* @return a boolean value indicating if the estimate number change is required.
*/
/*
* private boolean workOrderNumberChangeRequired(AbstractEstimate entity, CFinancialYear financialYear,WorkOrder workOrder){
* String[] workOrderNum = workOrder.getWorkOrderNumber().split("/"); if(entity!=null &&
* workOrderNum[0].equals(entity.getExecutingDepartment().getDeptCode()) &&
* workOrderNum[2].equals(financialYear.getFinYearRange())) { return false; } return true; }
*/
// end work order generation logic
/**
* @param workOrderNumberGenerators
*/
public void setWorkOrderNumberGenerators(final WorkOrderNumberGenerator workOrderNumberGenerators) {
this.workOrderNumberGenerators = workOrderNumberGenerators;
}
/*
* @return Contractor List
*/
@Override
public List<Contractor> getAllContractorForWorkOrder() {
logger.info("-------------------------Inside getAllContractorForWorkOrder---------------------");
// Assuming that status is inserted using db script
final String status = worksService.getWorksConfigValue("CONTRACTOR_STATUS");
List<Contractor> contractorList = null;
contractorList = contractorService.findAllByNamedQuery("GET_All_CONTRACTORS", status);
return contractorList;
}
/**
* Check whether any MB entry is pending for approval for the given WorkOrder
*
* @param woId
* @return
*/
@Override
public Boolean isMBInApprovalPendingForWO(final String woNumber) {
Boolean result = false;
final Map<String, Object> criteriaMap = new HashMap<String, Object>();
criteriaMap.put(WORKORDER_NO, woNumber);
criteriaMap.put(ACTION_FLAG, "searchWOForMB");
if (searchWO(criteriaMap).isEmpty())
result = true;
return result;
}
/**
* This method will return ActivitiesForWorkorder.
*
* @param tenderResponse
* @return Collection<EstimateLineItemsForWP>
*/
@Override
public Collection<EstimateLineItemsForWP> getActivitiesForWorkorder(final TenderResponse tenderResponse) {
final Map<Long, EstimateLineItemsForWP> resultMap = new HashMap<Long, EstimateLineItemsForWP>();
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
final List<String> tenderTypeList = worksService.getTendertypeList();
String percTenderType = "";
if (tenderTypeList != null && !tenderTypeList.isEmpty())
percTenderType = tenderTypeList.get(0);
for (final TenderResponseActivity tenAct : tenderResponse.getTenderResponseActivities()) {
final EstimateLineItemsForWP estlineItem = new EstimateLineItemsForWP();
if (tenAct.getActivity().getSchedule() != null)
if (resultMap.containsKey(tenAct.getActivity().getSchedule().getId())) {
final EstimateLineItemsForWP preEstlineItem = resultMap.get(tenAct.getActivity().getSchedule()
.getId());
preEstlineItem.setQuantity(tenAct.getNegotiatedQuantity() + preEstlineItem.getQuantity());
if (DateUtils.compareDates(tenAct.getActivity().getAbstractEstimate().getEstimateDate(),
preEstlineItem.getEstimateDate())) {
if (tenderResponse.getTenderEstimate().getTenderType().equals(percTenderType))
preEstlineItem.setRate(tenAct.getActivity().getSORCurrentRate().getValue());
else
preEstlineItem.setRate(tenAct.getNegotiatedRate());
double result = 1;
if (tenAct.getActivity().getSchedule() != null
&& exceptionaSorMap.containsKey(tenAct.getActivity().getUom().getUom())) {
result = exceptionaSorMap.get(tenAct.getActivity().getUom().getUom());
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate() / result);
} else
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate());
preEstlineItem.setActivity(tenAct.getActivity());
}
resultMap.put(tenAct.getActivity().getSchedule().getId(), preEstlineItem);
} else {
addEstLineItem(tenAct, estlineItem);
resultMap.put(tenAct.getActivity().getSchedule().getId(), estlineItem);
}
if (tenAct.getActivity().getNonSor() != null) {
addEstLineItem(tenAct, estlineItem);
resultMap.put(tenAct.getActivity().getNonSor().getId(), estlineItem);
}
}
return getEstLineItemsWithSrlNo(resultMap.values());
}
/**
* This method will return Activities For WorksPackage.
*
* @param tenderResponse
* @return Collection<EstimateLineItemsForWP>
*/
@Override
public Collection<EstimateLineItemsForWP> getActivitiesForWorksPackage(final TenderResponse tenderResponse) {
final Map<Long, EstimateLineItemsForWP> resultMap = new HashMap<Long, EstimateLineItemsForWP>();
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
final List<String> tenderTypeList = worksService.getTendertypeList();
if (tenderTypeList != null && !tenderTypeList.isEmpty())
tenderTypeList.get(0);
for (final TenderResponseActivity tenAct : tenderResponse.getTenderResponseActivities()) {
final EstimateLineItemsForWP estlineItem = new EstimateLineItemsForWP();
if (tenAct.getActivity().getSchedule() != null)
if (resultMap.containsKey(tenAct.getActivity().getSchedule().getId())) {
final EstimateLineItemsForWP preEstlineItem = resultMap.get(tenAct.getActivity().getSchedule()
.getId());
preEstlineItem.setQuantity(tenAct.getActivity().getQuantity() + preEstlineItem.getQuantity());
if (DateUtils.compareDates(tenAct.getActivity().getAbstractEstimate().getEstimateDate(),
preEstlineItem.getEstimateDate())) {
preEstlineItem.setRate(tenAct.getActivity().getSORCurrentRate().getValue());
double result = 1;
if (tenAct.getActivity().getSchedule() != null
&& exceptionaSorMap.containsKey(tenAct.getActivity().getUom().getUom())) {
result = exceptionaSorMap.get(tenAct.getActivity().getUom().getUom());
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate() / result);
} else
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate());
preEstlineItem.setActivity(tenAct.getActivity());
}
resultMap.put(tenAct.getActivity().getSchedule().getId(), preEstlineItem);
} else {
addEstLineItemWP(tenAct, estlineItem);
resultMap.put(tenAct.getActivity().getSchedule().getId(), estlineItem);
}
if (tenAct.getActivity().getNonSor() != null) {
addEstLineItemWP(tenAct, estlineItem);
resultMap.put(tenAct.getActivity().getNonSor().getId(), estlineItem);
}
}
return getEstLineItemsWithSrlNo(resultMap.values());
}
private Map<String, Integer> getSpecialUoms() {
return worksService.getExceptionSOR();
}
private Collection<EstimateLineItemsForWP> getEstLineItemsWithSrlNo(final Collection<EstimateLineItemsForWP> actList) {
int i = 1;
final Collection<EstimateLineItemsForWP> latestEstLineItemList = new ArrayList<EstimateLineItemsForWP>();
for (final EstimateLineItemsForWP act : actList) {
act.setSrlNo(i);
latestEstLineItemList.add(act);
i++;
}
return latestEstLineItemList;
}
private void addEstLineItem(final TenderResponseActivity act, final EstimateLineItemsForWP estlineItem) {
if (act.getActivity().getSchedule() == null) {
estlineItem.setCode("");
estlineItem.setSummary("");
estlineItem.setDescription(act.getActivity().getNonSor().getDescription());
estlineItem.setRate(act.getNegotiatedRate());
estlineItem.setAmt(act.getNegotiatedQuantity() * act.getNegotiatedRate());
} else {
estlineItem.setCode(act.getActivity().getSchedule().getCode());
estlineItem.setDescription(act.getActivity().getSchedule().getDescription());
estlineItem.setRate(act.getNegotiatedRate());
estlineItem.setSummary(act.getActivity().getSchedule().getSummary());
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
double result = 1;
if (exceptionaSorMap.containsKey(act.getActivity().getUom().getUom()))
result = exceptionaSorMap.get(act.getActivity().getUom().getUom());
estlineItem.setAmt(act.getNegotiatedQuantity() * act.getNegotiatedRate() / result);
}
estlineItem.setActivity(act.getActivity());
estlineItem.setQuantity(act.getNegotiatedQuantity());
estlineItem.setUom(act.getActivity().getUom().getUom());
estlineItem.setConversionFactor(act.getActivity().getConversionFactor());
}
private void addEstLineItemWP(final TenderResponseActivity act, final EstimateLineItemsForWP estlineItem) {
if (act.getActivity().getSchedule() == null) {
estlineItem.setCode("");
estlineItem.setSummary("");
estlineItem.setDescription(act.getActivity().getNonSor().getDescription());
estlineItem.setRate(act.getActivity().getRate());
estlineItem.setAmt(act.getActivity().getQuantity() * estlineItem.getRate());
} else {
estlineItem.setCode(act.getActivity().getSchedule().getCode());
estlineItem.setDescription(act.getActivity().getSchedule().getDescription());
estlineItem.setRate(act.getActivity().getSORCurrentRate().getValue());
estlineItem.setSummary(act.getActivity().getSchedule().getSummary());
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
double result = 1;
if (exceptionaSorMap.containsKey(act.getActivity().getUom().getUom()))
result = exceptionaSorMap.get(act.getActivity().getUom().getUom());
estlineItem.setAmt(act.getActivity().getQuantity() * estlineItem.getRate() / result);
}
estlineItem.setActivity(act.getActivity());
estlineItem.setQuantity(act.getActivity().getQuantity());
estlineItem.setUom(act.getActivity().getUom().getUom());
estlineItem.setConversionFactor(act.getActivity().getConversionFactor());
}
/**
* This method will return ActivitiesForWorkorder.
*
* @param WorkOrder
* @return Collection<EstimateLineItemsForWP>
*/
@Override
public Collection<EstimateLineItemsForWP> getActivitiesForWorkorder(final WorkOrder workOrder) {
final Map<Long, EstimateLineItemsForWP> resultMap = new HashMap<Long, EstimateLineItemsForWP>();
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
for (final WorkOrderEstimate workOrderEstimate : workOrder.getWorkOrderEstimates())
for (final WorkOrderActivity woAct : workOrderEstimate.getWorkOrderActivities()) {
final EstimateLineItemsForWP estlineItem = new EstimateLineItemsForWP();
if (woAct.getActivity().getSchedule() != null)
if (resultMap.containsKey(woAct.getActivity().getSchedule().getId())) {
final EstimateLineItemsForWP preEstlineItem = resultMap.get(woAct.getActivity().getSchedule()
.getId());
preEstlineItem.setQuantity(woAct.getApprovedQuantity() + preEstlineItem.getQuantity());
if (DateUtils.compareDates(woAct.getActivity().getAbstractEstimate().getEstimateDate(),
preEstlineItem.getEstimateDate())) {
preEstlineItem.setRate(woAct.getActivity().getSORCurrentRate().getValue());
double result = 1;
if (woAct.getActivity().getSchedule() != null
&& exceptionaSorMap.containsKey(woAct.getActivity().getUom().getUom())) {
result = exceptionaSorMap.get(woAct.getActivity().getUom().getUom());
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate() / result);
} else
preEstlineItem.setAmt(preEstlineItem.getQuantity() * preEstlineItem.getRate());
preEstlineItem.setActivity(woAct.getActivity());
}
resultMap.put(woAct.getActivity().getSchedule().getId(), preEstlineItem);
} else {
addEstLineItem(woAct, estlineItem);
resultMap.put(woAct.getActivity().getSchedule().getId(), estlineItem);
}
if (woAct.getActivity().getNonSor() != null) {
addEstLineItem(woAct, estlineItem);
resultMap.put(woAct.getActivity().getNonSor().getId(), estlineItem);
}
}
return getEstLineItemsWithSrlNo(resultMap.values());
}
private void addEstLineItem(final WorkOrderActivity act, final EstimateLineItemsForWP estlineItem) {
if (act.getActivity().getSchedule() == null) {
estlineItem.setCode("");
estlineItem.setSummary("");
estlineItem.setDescription(act.getActivity().getNonSor().getDescription());
estlineItem.setRate(act.getApprovedRate());
estlineItem.setAmt(act.getApprovedQuantity() * act.getApprovedRate());
} else {
estlineItem.setCode(act.getActivity().getSchedule().getCode());
estlineItem.setDescription(act.getActivity().getSchedule().getDescription());
estlineItem.setRate(act.getApprovedRate());
estlineItem.setSummary(act.getActivity().getSchedule().getSummary());
final Map<String, Integer> exceptionaSorMap = getSpecialUoms();
double result = 1;
if (exceptionaSorMap.containsKey(act.getActivity().getUom().getUom()))
result = exceptionaSorMap.get(act.getActivity().getUom().getUom());
estlineItem.setAmt(act.getApprovedQuantity() * act.getApprovedRate() / result);
}
estlineItem.setActivity(act.getActivity());
estlineItem.setQuantity(act.getApprovedQuantity());
estlineItem.setUom(act.getActivity().getUom().getUom());
estlineItem.setConversionFactor(act.getActivity().getConversionFactor());
}
/**
* returns headermap for pdf
*
* @param workOrder
* @return
*/
@Override
public Map createHeaderParams(final WorkOrder workOrder, final String type) {
final Map<String, Object> reportParams = new HashMap<String, Object>();
if (workOrder != null)
if ("estimate".equalsIgnoreCase(type)) {
for (final WorkOrderEstimate workOrderEstimate : workOrder.getWorkOrderEstimates())
if (workOrderEstimate != null && workOrderEstimate.getEstimate() != null) {
reportParams
.put("deptName", workOrderEstimate.getEstimate().getExecutingDepartment().getName());
final Boundary b = getTopLevelBoundary(workOrderEstimate.getEstimate().getWard());
reportParams.put("cityName", b == null ? "" : b.getName());
// TODO - Department address variable has been removed
// from Department object. Need to find alternative way
// to find department address and pass the same here.
// reportParams.put("deptAddress",workOrderEstimate.getEstimate().getExecutingDepartment().getDeptAddress());
reportParams.put("deptAddress", "");
reportParams.put("aeWorkNameForEstimate", workOrderEstimate.getEstimate().getName());
reportParams.put("negotiatedAmtForEstimate", workOrder.getWorkOrderAmount());
reportParams.put("estimateNo", workOrderEstimate.getEstimate().getEstimateNumber());
reportParams.put("estimateDate", workOrderEstimate.getEstimate().getEstimateDate());
if (workOrderEstimate.getEstimate().getProjectCode() != null)
reportParams.put("projectCode", workOrderEstimate.getEstimate().getProjectCode().getCode());
}
} else {
// reportParams.put("grandTotal", getGrandTotal(aeForWp));
final List<WorkOrderEstimate> aeList = getAbstractEstimateListForWp(workOrder);
final String projectCode = getProjectCodeListForAe(aeList);
reportParams.put("projectCodeList", projectCode);
final WorksPackage wp = workspackageService.findByNamedQuery("GET_WORKSPACKAGE_PACKAGENUMBER",
workOrder.getPackageNumber());
if (wp != null)
reportParams.put("workPackageDate", wp.getCreatedDate());
if (wp != null)
reportParams.put("tenderFileNumber", wp.getTenderFileNumber());
reportParams.put("workPackageNo", workOrder.getPackageNumber());
if (aeList != null && !aeList.isEmpty()) {
reportParams.put("deptName", aeList.get(0).getEstimate().getExecutingDepartment().getName());
final Boundary b = getTopLevelBoundary(aeList.get(0).getEstimate().getWard());
reportParams.put("cityName", b == null ? "" : b.getName());
// TODO - Department address variable has been removed from
// Department object. Need to find alternative way to find
// department address and pass the same here.
// reportParams.put("deptAddress",aeList.get(0).getEstimate().getExecutingDepartment().getDeptAddress());
reportParams.put("deptAddress", "");
}
}
if (workOrder != null && workOrder.getContractor() != null) {
String contractorAddress = workOrder.getContractor().getName() + " , "
+ workOrder.getContractor().getCode();
if (workOrder.getContractor().getPaymentAddress() != null)
contractorAddress = contractorAddress + " , " + workOrder.getContractor().getPaymentAddress();
reportParams.put("contractorAddress", contractorAddress);
}
reportParams.put("WorkOrderObj", workOrder);
return reportParams;
}
public double getGrandTotal(final List<AbstractEstimateForWp> aeForWp) {
double grandTotal = 0.00;
for (final AbstractEstimateForWp aeforWp : aeForWp)
grandTotal = grandTotal + aeforWp.getNegotiatedAmtForWp();
return grandTotal;
}
protected Boundary getTopLevelBoundary(final Boundary boundary) {
Boundary b = boundary;
while (b != null && b.getParent() != null)
b = b.getParent();
return b;
}
protected String getProjectCodeListForAe(final List<WorkOrderEstimate> aeList) {
String projectCodes = "";
int i = 0;
for (final WorkOrderEstimate ae : aeList) {
if (ae.getEstimate().getProjectCode() != null && ae.getEstimate().getProjectCode().getCode() != null)
projectCodes = projectCodes + ae.getEstimate().getProjectCode().getCode();
if (i < aeList.size() - 1)
projectCodes = projectCodes.concat(", ");
i++;
}
return projectCodes;
}
/**
* returns AbstractEstimateForWp list
*
* @param workOrder
* @return
*/
protected List<AbstractEstimateForWp> getAeForWp(final List<WorkOrderEstimate> aeList) {
final List<AbstractEstimateForWp> aeForWpList = new ArrayList<AbstractEstimateForWp>();
int srlNo = 0;
for (final WorkOrderEstimate ae : aeList) {
final AbstractEstimateForWp aeForWp = new AbstractEstimateForWp();
aeForWp.setSrlNo(++srlNo);
aeForWp.setAeWorkNameForWp(ae.getEstimate().getName());
aeForWp.setNegotiatedAmtForWp(getWorkOrderEstimateAmount(ae));
aeForWpList.add(aeForWp);
}
return aeForWpList;
}
public double getWorkOrderEstimateAmount(final WorkOrderEstimate ae) {
double totalAmt = 0.0;
for (final WorkOrderActivity wact : ae.getWorkOrderActivities())
totalAmt += wact.getApprovedAmount();
return totalAmt;
}
@Override
public List<AbstractEstimateForWp> getAeForWp(final WorkOrder workOrder) {
final List<WorkOrderEstimate> aeList = getAbstractEstimateListForWp(workOrder);
return getAeForWp(aeList);
}
/**
* returns WorkOrderEstimate list
*
* @param workOrder
* @return
*/
public List<WorkOrderEstimate> getAbstractEstimateListForWp(final WorkOrder workOrder) {
final List<WorkOrderEstimate> aeList = new ArrayList<WorkOrderEstimate>();
final List<WorkOrderEstimate> workOrderEstimateList = workOrder.getWorkOrderEstimates();
for (final WorkOrderEstimate workOrderEstimate : workOrderEstimateList)
aeList.add(workOrderEstimate);
return aeList;
}
/**
* Populate all the cumulative fields related to WOA line item
*
* @param workOrderEstimate
* @return
*/
@Override
public WorkOrderEstimate calculateCumulativeDetailsForRE(final WorkOrderEstimate workOrderEstimate) {
final List<WorkOrderActivity> woaList = workOrderEstimate.getWorkOrderActivities();
double lPrevCumlvQuant = 0;
for (final WorkOrderActivity detail : woaList) {
if (detail.getActivity().getParent() == null) { // IN CASE OF
// NON_TENDERED &
// LUMPSUM
lPrevCumlvQuant = measurementBookService.prevCumulativeQuantityIncludingCQ(detail.getId(), null, detail
.getActivity().getId(), workOrderEstimate.getWorkOrder());
detail.setTotalEstQuantity(measurementBookService.totalEstimatedQuantityForPreviousREs(detail.getId(),
workOrderEstimate.getEstimate().getId(), detail.getActivity().getId(),
workOrderEstimate.getWorkOrder()));
} else { // IN CASE OF CHANGE_QUANTITY
WorkOrderActivity woa = null;
// CHANGE_QUANTITY DONE FOR NON_TENDERED & LUMPSUM ACTIVITIES
if (detail.getActivity().getParent().getRevisionType() != null
&& (detail.getActivity().getParent().getRevisionType().equals(RevisionType.NON_TENDERED_ITEM) || detail
.getActivity().getParent().getRevisionType().equals(RevisionType.LUMP_SUM_ITEM)))
woa = (WorkOrderActivity) genericService.find(
"from WorkOrderActivity where activity.id=? and workOrderEstimate.estimate.id=?", detail
.getActivity().getParent().getId(),
detail.getActivity().getParent()
.getAbstractEstimate().getId());
else
// CHANGE_QUANTITY DONE FOR ORIGINAL ESTIMATE ACTIVITIES
woa = (WorkOrderActivity) genericService.find(
"from WorkOrderActivity where activity.id=? and workOrderEstimate.estimate.id=?", detail
.getActivity().getParent().getId(),
workOrderEstimate.getEstimate().getParent()
.getId());
detail.setParent(woa);
lPrevCumlvQuant = measurementBookService.prevCumulativeQuantityIncludingCQ(detail.getId(), null, detail
.getActivity().getParent().getId(), workOrderEstimate.getWorkOrder().getParent());
detail.setTotalEstQuantity(measurementBookService.totalEstimatedQuantityForPreviousREs(detail.getId(),
workOrderEstimate.getEstimate().getId(), detail.getActivity().getParent().getId(),
workOrderEstimate.getWorkOrder().getParent()));
}
if (detail.getTotalEstQuantity() == 0 && detail.getParent() != null
&& detail.getParent().getActivity().getQuantity() != 0)
detail.setTotalEstQuantity(detail.getApprovedQuantity());
detail.setPrevCumlvQuantity(lPrevCumlvQuant);
}
return workOrderEstimate;
}
public void setWorkspackageService(final WorksPackageService workspackageService) {
this.workspackageService = workspackageService;
}
public void setMeasurementBookService(final MeasurementBookService measurementBookService) {
this.measurementBookService = measurementBookService;
}
public String getFinalBillTypeConfigValue() {
return worksService.getWorksConfigValue("FinalBillType");
}
@Override
public Date getWorkCommencedDateByWOId(final Long id) {
final Object wOCommencedDate = persistenceService
.find(" select stat.statusDate from OfflineStatus stat where stat.objectId = ? and stat.objectType = ? and stat.egwStatus.code = ? ",
id, "WorkOrder", WorksConstants.WO_STATUS_WOCOMMENCED);
return (Date) wOCommencedDate;
}
@Override
public String getWorksPackageName(final String wpNumber) {
final Object nameOfWO = persistenceService.find(
" select wp.name from WorksPackage wp where wp.wpNumber = ? and wp.egwStatus.code = ? ", wpNumber,
WorksConstants.APPROVED);
return nameOfWO.toString();
}
@Override
public Object getTenderNegotiationInfo(final String negotiationNo) {
final Object obj = persistenceService
.find("select tr.percNegotiatedAmountRate,tr.tenderEstimate.tenderType from TenderResponse tr where tr.egwStatus.code = 'APPROVED' and tr.negotiationNumber = ? ",
negotiationNo);
return obj;
}
@Override
public WorkOrderEstimate getWorkOrderEstimateForWOIdAndEstimateId(final Long workOrderId, final Long estimateId) {
final WorkOrderEstimate workOrderEstimate = (WorkOrderEstimate) genericService
.find("from WorkOrderEstimate woe where woe.workOrder.id = ? "
+ "and woe.estimate.id = ? and woe.estimate.egwStatus.code = ? and woe.workOrder.egwStatus.code = ? "
+ "and woe.workOrder.parent is null ", workOrderId, estimateId,
AbstractEstimate.EstimateStatus.ADMIN_SANCTIONED.toString(), WorksConstants.APPROVED);
return workOrderEstimate;
}
@Override
public List<Object> getWorkOrderDetails(final Long estimateId) {
final List<Object> woDetails = genericService.findAllBy(
"select woe.workOrder.id ,woe.workOrder.workOrderNumber from WorkOrderEstimate woe "
+ " where woe.estimate.id = ? and woe.workOrder.egwStatus.code not in (?,?) ",
estimateId,
WorksConstants.NEW, WorksConstants.CANCELLED_STATUS);
return woDetails;
}
@Override
public Collection<WorkOrderActivity> getActionWorkOrderActivitiesList(
final List<WorkOrderActivity> actionWorkOrderActivities) {
return CollectionUtils.select(actionWorkOrderActivities,
workOrderActivity -> (WorkOrderActivity) workOrderActivity != null);
}
}