/*
* 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.letterofacceptance.service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;
import org.egov.commons.dao.EgwStatusHibernateDAO;
import org.egov.egf.budget.model.BudgetControlType;
import org.egov.egf.budget.service.BudgetControlTypeService;
import org.egov.eis.entity.Assignment;
import org.egov.eis.service.AssignmentService;
import org.egov.eis.service.DesignationService;
import org.egov.infra.admin.master.entity.AppConfigValues;
import org.egov.infra.admin.master.service.AppConfigValueService;
import org.egov.infra.security.utils.SecurityUtils;
import org.egov.infra.validation.exception.ValidationException;
import org.egov.pims.commons.Designation;
import org.egov.works.abstractestimate.service.EstimateService;
import org.egov.works.contractorbill.entity.ContractorBillRegister;
import org.egov.works.contractorbill.entity.enums.BillTypes;
import org.egov.works.contractorbill.repository.ContractorBillRegisterRepository;
import org.egov.works.letterofacceptance.entity.SearchRequestContractor;
import org.egov.works.letterofacceptance.entity.SearchRequestLetterOfAcceptance;
import org.egov.works.letterofacceptance.entity.WorkOrderHistory;
import org.egov.works.letterofacceptance.repository.LetterOfAcceptanceRepository;
import org.egov.works.letterofacceptance.repository.WorkOrderHistoryRepository;
import org.egov.works.lineestimate.entity.DocumentDetails;
import org.egov.works.lineestimate.entity.LineEstimateDetails;
import org.egov.works.lineestimate.repository.LineEstimateDetailsRepository;
import org.egov.works.lineestimate.service.LineEstimateAppropriationService;
import org.egov.works.lineestimate.service.LineEstimateDetailService;
import org.egov.works.lineestimate.service.LineEstimateService;
import org.egov.works.milestone.entity.Milestone;
import org.egov.works.milestone.service.MilestoneService;
import org.egov.works.models.masters.ContractorDetail;
import org.egov.works.models.workorder.WorkOrder;
import org.egov.works.models.workorder.WorkOrderEstimate;
import org.egov.works.utils.WorksConstants;
import org.egov.works.utils.WorksUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@Service
@Transactional(readOnly = true)
public class LetterOfAcceptanceService {
@PersistenceContext
private EntityManager entityManager;
private final LetterOfAcceptanceRepository letterOfAcceptanceRepository;
@Autowired
private EgwStatusHibernateDAO egwStatusHibernateDAO;
@Autowired
private AssignmentService assignmentService;
@Autowired
private DesignationService designationService;
@Autowired
private WorksUtils worksUtils;
@Autowired
private LineEstimateDetailsRepository lineEstimateDetailsRepository;
@Autowired
private LineEstimateService lineEstimateService;
@Autowired
private LineEstimateDetailService lineEstimateDetailService;
@Autowired
private AppConfigValueService appConfigValuesService;
@Autowired
private LineEstimateAppropriationService lineEstimateAppropriationService;
@Autowired
private WorkOrderHistoryRepository workOrderHistoryRepository;
@Autowired
private ContractorBillRegisterRepository contractorBillRegisterRepository;
@Autowired
private EstimateService estimateService;
@Autowired
private SecurityUtils securityUtils;
@Autowired
private MilestoneService milestoneService;
@Autowired
private BudgetControlTypeService budgetControlTypeService;
public Session getCurrentSession() {
return entityManager.unwrap(Session.class);
}
@Autowired
public LetterOfAcceptanceService(final LetterOfAcceptanceRepository letterOfAcceptanceRepository) {
this.letterOfAcceptanceRepository = letterOfAcceptanceRepository;
}
public WorkOrder getWorkOrderById(final Long id) {
return letterOfAcceptanceRepository.findById(id);
}
public List<String> getApprovedWorkOrderByNumberToModifyLOA(final String name) {
return letterOfAcceptanceRepository.findDistinctWorkorderNumberToModifyLOA("%" + name + "%", WorksConstants.APPROVED,
ContractorBillRegister.BillStatus.CANCELLED.toString(),
BillTypes.Final_Bill.toString());
}
@Transactional
public WorkOrder create(final WorkOrder workOrder, final MultipartFile[] files) throws IOException {
workOrder.setEgwStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(WorksConstants.WORKORDER,
WorksConstants.APPROVED));
if (StringUtils.isNotBlank(workOrder.getPercentageSign()) && workOrder.getPercentageSign().equals("-"))
workOrder.setTenderFinalizedPercentage(workOrder.getTenderFinalizedPercentage() * -1);
// createWorkOrderEstimate(workOrder);
final WorkOrder savedworkOrder = letterOfAcceptanceRepository.save(workOrder);
final List<DocumentDetails> documentDetails = worksUtils.getDocumentDetails(files, savedworkOrder,
WorksConstants.WORKORDER);
if (!documentDetails.isEmpty()) {
savedworkOrder.setDocumentDetails(documentDetails);
worksUtils.persistDocuments(documentDetails);
}
return savedworkOrder;
}
public WorkOrderEstimate createWorkOrderEstimate(WorkOrder workOrder) {
final WorkOrderEstimate workOrderEstimate = new WorkOrderEstimate();
workOrderEstimate.setWorkOrder(workOrder);
workOrderEstimate
.setEstimate(estimateService.getAbstractEstimateByEstimateNumberAndStatus(workOrder.getEstimateNumber()));
workOrderEstimate.setEstimateWOAmount(workOrder.getWorkOrderAmount());
// TO-DO Remove this code after converting entity to JPA
workOrderEstimate.setCreatedBy(securityUtils.getCurrentUser());
workOrderEstimate.setModifiedBy(securityUtils.getCurrentUser());
workOrderEstimate.setCreatedDate(new Date());
workOrderEstimate.setModifiedDate(new Date());
workOrder.addWorkOrderEstimate(workOrderEstimate);
return workOrderEstimate;
}
public WorkOrder getWorkOrderByWorkOrderNumber(final String workOrderNumber) {
return letterOfAcceptanceRepository.findByWorkOrderNumberAndEgwStatus_codeNotLike(workOrderNumber,
WorksConstants.CANCELLED_STATUS);
}
public List<Long> getEngineerInchargeDesignationIds() {
final List<Long> designationIds = new ArrayList<Long>();
final List<String> designationNames = new ArrayList<String>();
final List<AppConfigValues> configList = appConfigValuesService.getConfigValuesByModuleAndKey(
WorksConstants.WORKS_MODULE_NAME, WorksConstants.APPCONFIG_KEY_ENGINEERINCHARGE_DESIGNATION);
for (final AppConfigValues value : configList) {
designationNames.add(value.getValue().toUpperCase());
}
final List<Designation> designations = designationService.getDesignationsByNames(designationNames);
for (final Designation designation : designations) {
designationIds.add(designation.getId());
}
return designationIds;
}
public List<Assignment> getEngineerInchargeList(final Long departmentId, final List<Long> designationIds) {
return assignmentService.findByDepartmentDesignationsAndGivenDate(
departmentId, designationIds, new Date());
}
public WorkOrder getWorkOrderByEstimateNumber(final String estimateNumber) {
return letterOfAcceptanceRepository.findByEstimateNumberAndEgwStatus_codeNotLike(estimateNumber,
WorksConstants.CANCELLED_STATUS);
}
public WorkOrder getLetterOfAcceptanceDocumentAttachments(final WorkOrder workOrder) {
List<DocumentDetails> documentDetailsList = new ArrayList<DocumentDetails>();
documentDetailsList = worksUtils.findByObjectIdAndObjectType(workOrder.getId(),
WorksConstants.WORKORDER);
workOrder.setDocumentDetails(documentDetailsList);
return workOrder;
}
public WorkOrder getApprovedWorkOrder(final String workOrderNumber) {
return letterOfAcceptanceRepository.findByWorkOrderNumberAndEgwStatus_codeEquals(workOrderNumber,
WorksConstants.APPROVED);
}
public List<WorkOrder> searchLetterOfAcceptance(final SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance) {
// TODO Need TO handle in single query
final List<String> estimateNumbers = lineEstimateDetailsRepository
.findEstimateNumbersForDepartment(searchRequestLetterOfAcceptance.getDepartmentName());
if (estimateNumbers.isEmpty())
estimateNumbers.add("");
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(WorkOrder.class, "wo")
.addOrder(Order.asc("workOrderDate"))
.createAlias("wo.contractor", "woc")
.createAlias("egwStatus", "status");
if (searchRequestLetterOfAcceptance != null) {
if (searchRequestLetterOfAcceptance.getWorkOrderNumber() != null)
criteria.add(
Restrictions.eq("workOrderNumber", searchRequestLetterOfAcceptance.getWorkOrderNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFromDate() != null)
criteria.add(Restrictions.ge("workOrderDate", searchRequestLetterOfAcceptance.getFromDate()));
if (searchRequestLetterOfAcceptance.getToDate() != null)
criteria.add(Restrictions.le("workOrderDate", searchRequestLetterOfAcceptance.getToDate()));
if (searchRequestLetterOfAcceptance.getName() != null)
criteria.add(Restrictions.eq("woc.name", searchRequestLetterOfAcceptance.getName()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFileNumber() != null)
criteria.add(
Restrictions.ilike("fileNumber", searchRequestLetterOfAcceptance.getFileNumber(), MatchMode.ANYWHERE));
if (searchRequestLetterOfAcceptance.getEstimateNumber() != null)
criteria.add(Restrictions.eq("estimateNumber", searchRequestLetterOfAcceptance.getEstimateNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getDepartmentName() != null)
criteria.add(Restrictions.in("estimateNumber", estimateNumbers));
if (searchRequestLetterOfAcceptance.getEgwStatus() != null)
criteria.add(Restrictions.eq("status.code", searchRequestLetterOfAcceptance.getEgwStatus()));
}
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
public List<WorkOrder> searchLetterOfAcceptanceForContractorBill(
final SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance) {
final List<String> estimateNumbers = lineEstimateService
.getEstimateNumberForDepartment(searchRequestLetterOfAcceptance.getDepartmentName());
if (estimateNumbers.isEmpty())
estimateNumbers.add("");
// TODO: replace fetching workorders by query with criteria alias
final List<String> workOrderNumbers = letterOfAcceptanceRepository.getDistinctNonCancelledWorkOrderNumbersByBillType(
ContractorBillRegister.BillStatus.CANCELLED.toString(), BillTypes.Final_Bill.toString());
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(WorkOrder.class, "wo")
.createAlias("contractor", "woc")
.createAlias("egwStatus", "status");
if (searchRequestLetterOfAcceptance != null) {
if (searchRequestLetterOfAcceptance.getWorkOrderNumber() != null)
criteria.add(
Restrictions.eq("workOrderNumber", searchRequestLetterOfAcceptance.getWorkOrderNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFromDate() != null)
criteria.add(Restrictions.ge("workOrderDate", searchRequestLetterOfAcceptance.getFromDate()));
if (searchRequestLetterOfAcceptance.getToDate() != null)
criteria.add(Restrictions.le("workOrderDate", searchRequestLetterOfAcceptance.getToDate()));
if (searchRequestLetterOfAcceptance.getName() != null)
criteria.add(Restrictions.eq("woc.name", searchRequestLetterOfAcceptance.getName()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFileNumber() != null)
criteria.add(
Restrictions.ilike("fileNumber", searchRequestLetterOfAcceptance.getFileNumber(), MatchMode.ANYWHERE));
if (searchRequestLetterOfAcceptance.getEstimateNumber() != null)
criteria.add(Restrictions.eq("estimateNumber", searchRequestLetterOfAcceptance.getEstimateNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getDepartmentName() != null)
criteria.add(Restrictions.in("estimateNumber", estimateNumbers));
if (workOrderNumbers != null && !workOrderNumbers.isEmpty())
criteria.add(Restrictions.not(Restrictions.in("workOrderNumber", workOrderNumbers)));
}
criteria.add(Restrictions.eq("status.code", WorksConstants.APPROVED));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
public List<String> getApprovedEstimateNumbersToModifyLOA(final String name) {
return letterOfAcceptanceRepository.findDistinctEstimateNumberToModifyLOA("%" + name + "%", WorksConstants.APPROVED,
ContractorBillRegister.BillStatus.CANCELLED.toString(),
BillTypes.Final_Bill.toString());
}
public List<String> findDistinctContractorsInWorkOrderByCodeOrName(final String name) {
final List<String> results = letterOfAcceptanceRepository
.findDistinctContractorByContractor_codeAndNameContainingIgnoreCase("%" + name + "%");
return results;
}
public List<String> findLoaEstimateNumbersForContractorBill(final String estimateNumber) {
final List<WorkOrder> workorders = letterOfAcceptanceRepository
.findByEstimateNumberAndEgwStatus_codeEquals(estimateNumber, WorksConstants.APPROVED);
final List<String> results = new ArrayList<String>();
for (final WorkOrder details : workorders)
results.add(details.getEstimateNumber());
return results;
}
public List<String> getApprovedWorkOrdersForCreateContractorBill(final String workOrderNumber) {
final List<String> results = letterOfAcceptanceRepository.findWorkOrderNumberForContractorBill(
"%" + workOrderNumber + "%", WorksConstants.APPROVED, ContractorBillRegister.BillStatus.CANCELLED.toString(),
BillTypes.Final_Bill.toString());
return results;
}
public List<String> getApprovedEstimateNumbersForCreateContractorBill(final String estimateNumber) {
final List<String> results = letterOfAcceptanceRepository.findEstimateNumberForContractorBill("%" + estimateNumber + "%",
WorksConstants.APPROVED, ContractorBillRegister.BillStatus.CANCELLED.toString(), BillTypes.Final_Bill.toString());
return results;
}
public List<String> getApprovedContractorsForCreateContractorBill(final String contractorname) {
final List<String> results = letterOfAcceptanceRepository.findContractorForContractorBill("%" + contractorname + "%",
WorksConstants.APPROVED, ContractorBillRegister.BillStatus.CANCELLED.toString(), BillTypes.Final_Bill.toString());
return results;
}
public Boolean validateContractorBillInWorkflowForWorkorder(final Long workOrderId) {
final List<String> results = letterOfAcceptanceRepository.getContractorBillInWorkflowForWorkorder(workOrderId,
ContractorBillRegister.BillStatus.CANCELLED.toString(), ContractorBillRegister.BillStatus.APPROVED.toString());
if (results.isEmpty())
return true;
else
return false;
}
public List<ContractorDetail> searchContractorDetails(final SearchRequestContractor searchRequestContractor) {
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(ContractorDetail.class, "cd")
.createAlias("contractor", "contractor");
if (searchRequestContractor != null) {
if (searchRequestContractor.getDepartment() != null)
criteria.add(Restrictions.eq("department.id", searchRequestContractor.getDepartment()));
if (searchRequestContractor.getContractorClass() != null)
criteria.add(Restrictions.ge("grade.id", searchRequestContractor.getContractorClass()));
if (searchRequestContractor.getContractorCode() != null)
criteria.add(Restrictions.eq("contractor.code", searchRequestContractor.getContractorCode()).ignoreCase());
if (searchRequestContractor.getNameOfAgency() != null)
criteria.add(
Restrictions.ilike("contractor.name", searchRequestContractor.getNameOfAgency(), MatchMode.ANYWHERE));
}
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
public List<String> findLoaWorkOrderNumberForMilestone(final String workOrderNumber) {
final List<WorkOrder> workorders = letterOfAcceptanceRepository
.findByWorkOrderNumberContainingIgnoreCaseAndEgwStatus_codeEquals(workOrderNumber, WorksConstants.APPROVED);
final List<String> results = new ArrayList<String>();
for (final WorkOrder details : workorders)
results.add(details.getWorkOrderNumber());
return results;
}
public List<String> findWorkIdentificationNumbersToCreateMilestone(final String code) {
final List<String> workIdNumbers = letterOfAcceptanceRepository
.findWorkIdentificationNumberToCreateMilestone("%" + code + "%");
return workIdNumbers;
}
public List<WorkOrder> getLoaForCreateMilestone(SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance) {
final StringBuilder queryStr = new StringBuilder(500);
buildWhereClause(searchRequestLetterOfAcceptance, queryStr);
final Query query = setParameterForMilestone(searchRequestLetterOfAcceptance, queryStr);
final List<WorkOrder> workOrderList = query.getResultList();
return workOrderList;
}
private void buildWhereClause(SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance, final StringBuilder queryStr) {
queryStr.append(
"select distinct wo from WorkOrder wo where wo.egwStatus.moduletype = :moduleType and wo.egwStatus.code = :status and not exists (select ms.workOrderEstimate.workOrder.id from Milestone ms where ms.workOrderEstimate.workOrder.id = wo.id and upper(wo.egwStatus.code) != upper(:workorderstatus) )");
queryStr.append(
" and wo.estimateNumber in (select led.estimateNumber from LineEstimateDetails led where led.lineEstimate.executingDepartment.id = :departmentName)");
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getWorkIdentificationNumber()))
queryStr.append(
" and wo.estimateNumber = (select led.estimateNumber from LineEstimateDetails led where led.projectCode = (select po.id from ProjectCode po where upper(po.code) = :workIdentificationNumber))");
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getEstimateNumber()))
queryStr.append(" and upper(wo.estimateNumber) = :estimateNumber");
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getWorkOrderNumber()))
queryStr.append(" and upper(wo.workOrderNumber) = :workOrderNumber");
if (searchRequestLetterOfAcceptance.getTypeOfWork() != null)
queryStr.append(
" and wo.estimateNumber in (select led.estimateNumber from LineEstimateDetails led where led.lineEstimate.typeOfWork.id = :typeOfWork)");
if (searchRequestLetterOfAcceptance.getSubTypeOfWork() != null)
queryStr.append(
" and wo.estimateNumber in (select led.estimateNumber from LineEstimateDetails led where led.lineEstimate.subTypeOfWork.id = :subTypeOfWork)");
if (searchRequestLetterOfAcceptance.getAdminSanctionFromDate() != null)
queryStr.append(
" and wo.estimateNumber in (select led.estimateNumber from LineEstimateDetails led where led.lineEstimate.adminSanctionDate >= :adminSanctionFromDate)");
if (searchRequestLetterOfAcceptance.getAdminSanctionToDate() != null)
queryStr.append(
" and wo.estimateNumber in (select led.estimateNumber from LineEstimateDetails led where led.lineEstimate.adminSanctionDate <= :adminSanctionFromDate)");
}
private Query setParameterForMilestone(SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance,
final StringBuilder queryStr) {
final Query qry = entityManager.createQuery(queryStr.toString());
qry.setParameter("status", WorksConstants.APPROVED);
qry.setParameter("moduleType", WorksConstants.WORKORDER);
qry.setParameter("workorderstatus", WorksConstants.CANCELLED_STATUS);
if (searchRequestLetterOfAcceptance != null) {
qry.setParameter("departmentName", searchRequestLetterOfAcceptance.getDepartmentName());
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getWorkIdentificationNumber()))
qry.setParameter("workIdentificationNumber",
searchRequestLetterOfAcceptance.getWorkIdentificationNumber().toUpperCase());
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getEstimateNumber()))
qry.setParameter("estimateNumber", searchRequestLetterOfAcceptance.getEstimateNumber().toUpperCase());
if (StringUtils.isNotBlank(searchRequestLetterOfAcceptance.getWorkOrderNumber()))
qry.setParameter("workOrderNumber", searchRequestLetterOfAcceptance.getWorkOrderNumber().toUpperCase());
if (searchRequestLetterOfAcceptance.getTypeOfWork() != null)
qry.setParameter("typeOfWork", searchRequestLetterOfAcceptance.getTypeOfWork());
if (searchRequestLetterOfAcceptance.getSubTypeOfWork() != null)
qry.setParameter("subTypeOfWork", searchRequestLetterOfAcceptance.getSubTypeOfWork());
if (searchRequestLetterOfAcceptance.getAdminSanctionFromDate() != null)
qry.setParameter("adminSanctionFromDate", searchRequestLetterOfAcceptance.getAdminSanctionFromDate());
if (searchRequestLetterOfAcceptance.getAdminSanctionToDate() != null)
qry.setParameter("adminSanctionToDate", searchRequestLetterOfAcceptance.getAdminSanctionToDate());
}
return qry;
}
public Double getGrossBillAmountOfBillsCreated(String workOrderNumber, String status, String billstatus) {
return letterOfAcceptanceRepository.getGrossBillAmountOfBillsCreated(workOrderNumber, status, billstatus);
}
@Transactional
public WorkOrder update(WorkOrder workOrder, LineEstimateDetails lineEstimateDetails, Double appropriationAmount,
Double revisedWorkOrderAmount)
throws ValidationException {
WorkOrderHistory history = new WorkOrderHistory();
history.setWorkOrder(workOrder);
history.setWorkOrderAmount(workOrder.getWorkOrderAmount());
history.setRevisedWorkOrderAmount(revisedWorkOrderAmount);
workOrderHistoryRepository.save(history);
workOrder.setWorkOrderAmount(revisedWorkOrderAmount);
if (StringUtils.isNotBlank(workOrder.getPercentageSign()) && workOrder.getPercentageSign().equals("-"))
workOrder.setTenderFinalizedPercentage(workOrder.getTenderFinalizedPercentage() * -1);
if (workOrder.getPercentageSign().equals("+")) {
if (appropriationAmount > 0 && !BudgetControlType.BudgetCheckOption.NONE.toString()
.equalsIgnoreCase(budgetControlTypeService.getConfigValue())) {
final List<Long> budgetheadid = new ArrayList<Long>();
budgetheadid.add(lineEstimateDetails.getLineEstimate().getBudgetHead().getId());
final boolean flag = lineEstimateDetailService.checkConsumeEncumbranceBudget(lineEstimateDetails,
lineEstimateService.getCurrentFinancialYear(new Date())
.getId(),
appropriationAmount, budgetheadid);
if (!flag)
throw new ValidationException("", "error.budgetappropriation.insufficient.amount");
}
} else if (workOrder.getPercentageSign().equals("-")) {
if (appropriationAmount > 0 && !BudgetControlType.BudgetCheckOption.NONE.toString()
.equalsIgnoreCase(budgetControlTypeService.getConfigValue())) {
String appropriationNumber = lineEstimateAppropriationService
.generateBudgetAppropriationNumber(lineEstimateDetails);
lineEstimateService.releaseBudgetOnReject(lineEstimateDetails, appropriationAmount, appropriationNumber);
}
}
final WorkOrder savedworkOrder = letterOfAcceptanceRepository.save(workOrder);
return savedworkOrder;
}
public List<WorkOrder> searchLetterOfAcceptanceToModify(
final SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance) {
// TODO Need TO handle in single query
final List<String> estimateNumbers = lineEstimateDetailsRepository
.findEstimateNumbersForDepartment(searchRequestLetterOfAcceptance.getDepartmentName());
final List<String> workOrderNumbers = letterOfAcceptanceRepository.findWorkOrderNumbersToModifyLoa(
WorksConstants.APPROVED, ContractorBillRegister.BillStatus.CANCELLED.toString(),
BillTypes.Final_Bill.toString());
if (estimateNumbers.isEmpty())
estimateNumbers.add("");
if (workOrderNumbers.isEmpty())
workOrderNumbers.add("");
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(WorkOrder.class, "wo")
.addOrder(Order.asc("workOrderDate"))
.createAlias("wo.contractor", "woc")
.createAlias("egwStatus", "status");
if (searchRequestLetterOfAcceptance != null) {
if (searchRequestLetterOfAcceptance.getWorkOrderNumber() != null)
criteria.add(
Restrictions.eq("workOrderNumber", searchRequestLetterOfAcceptance.getWorkOrderNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFromDate() != null)
criteria.add(Restrictions.ge("workOrderDate", searchRequestLetterOfAcceptance.getFromDate()));
if (searchRequestLetterOfAcceptance.getToDate() != null)
criteria.add(Restrictions.le("workOrderDate", searchRequestLetterOfAcceptance.getToDate()));
if (searchRequestLetterOfAcceptance.getName() != null)
criteria.add(Restrictions.eq("woc.name", searchRequestLetterOfAcceptance.getName()).ignoreCase());
if (searchRequestLetterOfAcceptance.getFileNumber() != null)
criteria.add(
Restrictions.ilike("fileNumber", searchRequestLetterOfAcceptance.getFileNumber(), MatchMode.ANYWHERE));
if (searchRequestLetterOfAcceptance.getEstimateNumber() != null)
criteria.add(Restrictions.eq("estimateNumber", searchRequestLetterOfAcceptance.getEstimateNumber()).ignoreCase());
if (searchRequestLetterOfAcceptance.getDepartmentName() != null)
criteria.add(Restrictions.in("estimateNumber", estimateNumbers));
}
criteria.add(Restrictions.in("workOrderNumber", workOrderNumbers));
criteria.add(Restrictions.eq("status.code", WorksConstants.APPROVED));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
public List<WorkOrder> searchLOAsToCancel(final SearchRequestLetterOfAcceptance searchRequestLetterOfAcceptance) {
final Criteria criteria = entityManager.unwrap(Session.class).createCriteria(WorkOrder.class, "wo")
.addOrder(Order.asc("workOrderDate"))
.createAlias("wo.contractor", "woc")
.createAlias("egwStatus", "status");
if (searchRequestLetterOfAcceptance != null) {
if (searchRequestLetterOfAcceptance.getWorkOrderNumber() != null)
criteria.add(Restrictions.eq("workOrderNumber", searchRequestLetterOfAcceptance.getWorkOrderNumber())
.ignoreCase());
if (searchRequestLetterOfAcceptance.getContractor() != null) {
criteria.add(
Restrictions.or(Restrictions.eq("woc.name", searchRequestLetterOfAcceptance.getContractor()).ignoreCase(),
Restrictions.eq("woc.code", searchRequestLetterOfAcceptance.getContractor()).ignoreCase()));
}
if (searchRequestLetterOfAcceptance.getDepartmentName() != null) {
final List<String> estimateNumbers = lineEstimateDetailsRepository
.findEstimateNumbersForDepartment(searchRequestLetterOfAcceptance.getDepartmentName());
if (estimateNumbers.isEmpty())
estimateNumbers.add("");
criteria.add(Restrictions.in("estimateNumber", estimateNumbers));
}
if (searchRequestLetterOfAcceptance.getWorkIdentificationNumber() != null) {
final List<String> estimateNumbers = lineEstimateDetailsRepository
.findEstimateNumbersForWorkIdentificationNumber(searchRequestLetterOfAcceptance
.getWorkIdentificationNumber());
if (estimateNumbers.isEmpty())
estimateNumbers.add("");
criteria.add(Restrictions.in("estimateNumber", estimateNumbers));
}
if (searchRequestLetterOfAcceptance.getEgwStatus() != null)
criteria.add(Restrictions.eq("status.code", searchRequestLetterOfAcceptance.getEgwStatus()));
}
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return criteria.list();
}
public List<String> findWorkIdentificationNumbersToSearchLOAToCancel(final String code) {
final List<String> workIdNumbers = letterOfAcceptanceRepository
.findWorkIdentificationNumbersToSearchLOAToCancel("%" + code + "%",
WorksConstants.APPROVED.toString());
return workIdNumbers;
}
public List<String> findContractorsToSearchLOAToCancel(final String code) {
final List<String> contractors = letterOfAcceptanceRepository
.findContractorsToSearchLOAToCancel("%" + code + "%",
WorksConstants.APPROVED.toString());
return contractors;
}
public String checkIfBillsCreated(final Long id) {
String billNumbers = "";
final WorkOrder workOrder = letterOfAcceptanceRepository.findById(id);
final List<ContractorBillRegister> bills = contractorBillRegisterRepository.findByWorkOrderAndBillstatusNot(workOrder,
ContractorBillRegister.BillStatus.CANCELLED.toString());
if (bills == null || bills.isEmpty())
return "";
else {
for (ContractorBillRegister cbr : bills) {
billNumbers += cbr.getBillnumber() + ", ";
}
}
return billNumbers;
}
public boolean checkIfMileStonesCreated(final WorkOrder workOrder) {
Boolean flag = false;
for (WorkOrderEstimate woe : workOrder.getWorkOrderEstimates()) {
List<Milestone> milestones = milestoneService.getMilestoneByWorkOrderEstimateId(woe.getId());
for (Milestone ms : milestones) {
if (!ms.getStatus().getCode().equalsIgnoreCase(WorksConstants.CANCELLED)) {
flag = true;
break;
}
if (flag)
break;
}
}
return flag;
}
@Transactional
public WorkOrder cancel(final WorkOrder workOrder) {
workOrder.setEgwStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(WorksConstants.WORKORDER,
WorksConstants.CANCELLED_STATUS));
workOrder.setStatus(WorksConstants.CANCELLED.toString());
return letterOfAcceptanceRepository.save(workOrder);
}
public List<WorkOrder> findWorkOrderByEstimateNumberAndEgwStatus(final String estimateNumber) {
return letterOfAcceptanceRepository.findByEstimateNumberAndEgwStatus_codeEquals(estimateNumber, WorksConstants.APPROVED);
}
public List<String> getEstimateNumbersToSearchLOAToCancel(final Long lineEstimateId) {
final List<String> estimateNumbers = letterOfAcceptanceRepository
.findEstimateNumbersToSearchLOAToCancel(lineEstimateId,
WorksConstants.APPROVED.toString());
return estimateNumbers;
}
public List<String> getWorkOrderNumbersForViewEstimatePhotograph(final String workOrderNumber) {
final List<String> workOrderNumbers = letterOfAcceptanceRepository
.findworkOrderNumbersToViewEstimatePhotograph("%" + workOrderNumber + "%",
WorksConstants.APPROVED.toString());
return workOrderNumbers;
}
public List<String> getContractorsNamesForViewEstimatePhotograph(final String contractorName) {
final List<String> contractorNames = letterOfAcceptanceRepository
.findContractorsToViewEstimatePhotograph("%" + contractorName + "%",
WorksConstants.APPROVED.toString());
return contractorNames;
}
}