/*
* 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.web.actions.measurementbook;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.egov.commons.EgwStatus;
import org.egov.commons.dao.EgwStatusHibernateDAO;
import org.egov.eis.entity.Assignment;
import org.egov.eis.entity.EmployeeView;
import org.egov.eis.service.AssignmentService;
import org.egov.infra.admin.master.entity.User;
import org.egov.infra.admin.master.service.UserService;
import org.egov.infra.exception.ApplicationRuntimeException;
import org.egov.infra.utils.DateUtils;
import org.egov.infra.validation.exception.ValidationError;
import org.egov.infra.validation.exception.ValidationException;
import org.egov.infra.web.struts.actions.BaseFormAction;
import org.egov.infra.web.utils.EgovPaginatedList;
import org.egov.infra.workflow.entity.WorkflowAction;
import org.egov.infra.workflow.service.WorkflowService;
import org.egov.infstr.services.Page;
import org.egov.pims.model.PersonalInformation;
import org.egov.pims.service.EisUtilService;
import org.egov.pims.service.EmployeeServiceOld;
import org.egov.pims.service.PersonalInformationService;
import org.egov.works.models.masters.Contractor;
import org.egov.works.models.measurementbook.MBDetails;
import org.egov.works.models.measurementbook.MBHeader;
import org.egov.works.models.tender.TenderEstimate;
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.revisionestimate.entity.enums.RevisionType;
import org.egov.works.services.MeasurementBookService;
import org.egov.works.services.MeasurementBookWFService;
import org.egov.works.services.WorkOrderService;
import org.egov.works.services.WorksService;
import org.egov.works.services.impl.MeasurementBookServiceImpl;
import org.egov.works.services.impl.WorkOrderServiceImpl;
import org.egov.works.utils.DateConversionUtil;
import org.egov.works.utils.WorksConstants;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ParentPackage("egov")
@Result(name = MeasurementBookAction.NEW, location = "measurementBook-new.jsp")
public class MeasurementBookAction extends BaseFormAction {
private static final long serialVersionUID = 1536135285051426488L;
private static final Logger logger = Logger.getLogger(MeasurementBookAction.class);
private static final String VERIFY = "verify";
private static final String SUBMITTED = "submitted";
private static final String ACTIVITY_SEARCH = "activitySearch";
private static final String MB_SEARCH = "mbSearch";
private static final String DATEFORMAT = "dd-MMM-yyyy";
private MBHeader mbHeader = new MBHeader();
private List<MBDetails> mbDetails = new LinkedList<MBDetails>();
private String messageKey;
private Long id;
@Autowired
private AssignmentService assignmentService;
@Autowired
private EmployeeServiceOld employeeServiceOld;
@Autowired
private UserService userService;
@Autowired
private EgwStatusHibernateDAO egwStatusHibernateDAO;
private EmployeeView mbPreparedByView;
private MeasurementBookService measurementBookService;
private WorksService worksService;
private WorkOrderService workOrderService;
private List<MBDetails> actionMbDetailValues = new LinkedList<MBDetails>();
private double quantityFactor;
private List<WorkOrderActivity> activityList; // for search page
private List<MBHeader> mbList; // for search page
private List<WorkOrderEstimate> workOrderEstimateList = new ArrayList<WorkOrderEstimate>();
private String workorderNo;
private Long workOrderId;
private String mode;
private String mborderNumberRequired;
private String workName;
private String projectCode;
// -----------------------Activity Search ----------------------------------
private String activityCode;
private String activityDesc;
// -------------------------------------------------------------------
// -----------------------MB Search ----------------------------------
private Long contractorId;
private Date fromDate;
private Date toDate;
private String mbRefNo;
private String mbPages;
private String mbStatus;
// -------------------------------------------------------------------
// -----------------------Manual Workflow ----------------------------
private Long departmentId;
private Integer designationId;
private String approverComments;
private Integer approverUserId;
// -------------------------------------------------------------------
// -------------- on for workflow service
private MeasurementBookWFService measurementBookWFService;
private WorkflowService<MBHeader> workflowService;
private static final String SAVE_ACTION = "save";
private static final String SOURCE_INBOX = "inbox";
private String sourcepage = "";
private String dispEmployeeName;
private String dispDesignation;
private Long estimateId;
private PersonalInformationService personalInformationService;
private static final String ACTION_NAME = "actionName";
private String activitySearchMode;
private boolean isLegacyMB;
private static final String NON_TENDERED = "nonTendered";
private static final String LUMP_SUM = "lumpSum";
private String cancellationReason;
private String cancelRemarks;
private Long mbId;
private String estimateNo;
private Integer execDeptid;
private Integer page = 1;
private Integer pageSize = 30;
private EgovPaginatedList pagedResults;
private Integer defaultPreparedById;
private String defaultDesgination;
private String isRCEstimate;
private static final String YES = "yes";
private Date workCommencedDate;
private Date latestMBDate;
private Long woId;
public MeasurementBookAction() {
addRelatedEntity("workOrder", WorkOrder.class);
}
@Override
public void prepare() {
final AjaxMeasurementBookAction ajaxMBAction = new AjaxMeasurementBookAction();
ajaxMBAction.setPersistenceService(getPersistenceService());
ajaxMBAction.setAssignmentService(assignmentService);
ajaxMBAction.setPersonalInformationService(personalInformationService);
if (id != null) {
mbHeader = measurementBookService.findById(id, false);
if (mbHeader != null)
workOrderEstimateList.add(mbHeader.getWorkOrderEstimate());
} else if (workOrderId != null) {
workOrderEstimateList.addAll(getPersistenceService().findAllByNamedQuery(
"getWorkOrderEstimateByWorkOrderId", workOrderId));
mbHeader.setWorkOrder(workOrderService.findById(workOrderId, false));
}
if (workOrderEstimateList.isEmpty())
addDropdownData("workOrderEstimateList", Collections.EMPTY_LIST);
else
addDropdownData("workOrderEstimateList",
measurementBookService.getWorkOrderEstimatesForMB(workOrderEstimateList));
super.prepare();
setupDropdownDataExcluding("workOrder");
addDropdownData("executingDepartmentList", getPersistenceService().findAllBy("from DepartmentImpl"));
if (getLatestAssignmentForCurrentLoginUser() != null)
departmentId = getLatestAssignmentForCurrentLoginUser().getDepartment().getId();
populateQuantityFactor();
if ("cancelMB".equals(sourcepage))
setMbStatus(MBHeader.MeasurementBookStatus.APPROVED.toString());
getWrkCommndAndLatestMBDates();
}
private void getWrkCommndAndLatestMBDates() {
if (id == null
|| mbHeader.getEgwStatus() != null
&& (mbHeader.getEgwStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || mbHeader.getEgwStatus()
.getCode().equalsIgnoreCase(WorksConstants.REJECTED))) {
if (id == null)
woId = workOrderId;
else
woId = mbHeader.getWorkOrder().getId();
if (woId != null)
workCommencedDate = measurementBookService.getWorkCommencedDate(woId);
if (workOrderEstimateList.size() == 1) {
Long estId;
if (id == null)
estId = workOrderEstimateList.get(0).getEstimate().getId();
else
estId = mbHeader.getWorkOrderEstimate().getEstimate().getId();
if (estId != null)
latestMBDate = measurementBookService.getLastMBCreatedDate(woId, estId);
}
}
}
public Assignment getLatestAssignmentForCurrentLoginUser() {
PersonalInformation personalInformation = null;
final Long loggedInUserId = worksService.getCurrentLoggedInUserId();
if (loggedInUserId != null)
personalInformation = employeeServiceOld.getEmpForUserId(loggedInUserId);
Assignment assignment = null;
if (personalInformation != null)
assignment = employeeServiceOld.getLatestAssignmentForEmployee(personalInformation.getIdPersonalInformation());
return assignment;
}
protected void populateQuantityFactor() {
final String configVal = worksService.getWorksConfigValue("MAXEXTRALINEITEMPERCENTAGE");
try {
quantityFactor = Double.valueOf(configVal);
} catch (final Exception e) {
logger.error("Exception in populateQuantityFactor()>>>" + e.getMessage());
quantityFactor = 0.0d;
}
}
protected MBHeader calculateMBdetails(final MBHeader mbHeader, final boolean isPersistedObject) {
return measurementBookService.calculateMBDetails(mbHeader, isPersistedObject);
}
public String loadSerachForActivity() {
logger.info("Loading search page for Activity............");
return ACTIVITY_SEARCH;
}
public String searchActivitiesForMB() {
final Map<String, Object> criteriaMap = new HashMap<String, Object>();
if (workorderNo != null && !"".equalsIgnoreCase(workorderNo))
criteriaMap.put(WorkOrderServiceImpl.WORKORDER_NO, workorderNo);
if (estimateId != null)
criteriaMap.put(WorkOrderServiceImpl.WORKORDER_ESTIMATE_ID, estimateId);
if (activityCode != null && !"".equalsIgnoreCase(activityCode))
criteriaMap.put(WorkOrderServiceImpl.ACTIVITY_CODE, activityCode);
if (activityDesc != null && !"".equalsIgnoreCase(activityDesc))
criteriaMap.put(WorkOrderServiceImpl.ACTIVITY_DESC, activityDesc);
if (workOrderId != null)
criteriaMap.put(WorkOrderServiceImpl.WORKORDER_ID, workOrderId);
if (StringUtils.isNotBlank(activitySearchMode) && activitySearchMode.equalsIgnoreCase(NON_TENDERED)) {
criteriaMap.put(WorkOrderServiceImpl.REVISION_TYPE, RevisionType.NON_TENDERED_ITEM.toString());
activityList = workOrderService.searchWOActivitiesFromRevEstimates(criteriaMap);
} else if (StringUtils.isNotBlank(activitySearchMode) && activitySearchMode.equalsIgnoreCase(LUMP_SUM)) {
criteriaMap.put(WorkOrderServiceImpl.REVISION_TYPE, RevisionType.LUMP_SUM_ITEM.toString());
activityList = workOrderService.searchWOActivitiesFromRevEstimates(criteriaMap);
} else
activityList = workOrderService.searchWOActivities(criteriaMap);
return ACTIVITY_SEARCH;
}
public String loadSerachForMB() {
logger.debug("Loading search page for MB............");
return MB_SEARCH;
}
public String loadSearchForMB() {
logger.debug("Loading search page for MB............");
return MB_SEARCH;
}
public String searchMB() {
final Map<String, Object> criteriaMap = new HashMap<String, Object>();
final List<Object> paramList = new ArrayList<Object>();
List<String> qryObj = new ArrayList<String>();
Object[] params;
if (workorderNo != null && !"".equalsIgnoreCase(workorderNo))
criteriaMap.put(MeasurementBookServiceImpl.WORKORDER_NO, workorderNo);
if (contractorId != null && contractorId != -1)
criteriaMap.put(MeasurementBookServiceImpl.CONTRACTOR_ID, contractorId);
if (fromDate != null && toDate != null && !DateUtils.compareDates(getToDate(), getFromDate()))
addFieldError("enddate", getText("greaterthan.endDate.fromDate"));
if (toDate != null && !DateUtils.compareDates(new Date(), getToDate()))
addFieldError("enddate", getText("greaterthan.endDate.currentdate"));
if (fromDate != null && toDate == null)
criteriaMap.put("FROM_DATE", new Date(DateUtils.getFormattedDate(getFromDate(), DATEFORMAT)));
else if (toDate != null && fromDate == null)
criteriaMap.put("TO_DATE", new Date(DateUtils.getFormattedDate(getToDate(), DATEFORMAT)));
else if (fromDate != null && toDate != null && getFieldErrors().isEmpty()) {
criteriaMap.put("FROM_DATE", new Date(DateUtils.getFormattedDate(getFromDate(), DATEFORMAT)));
criteriaMap.put("TO_DATE", new Date(DateUtils.getFormattedDate(getToDate(), DATEFORMAT)));
}
if (mbRefNo != null && !"".equalsIgnoreCase(mbRefNo))
criteriaMap.put(MeasurementBookServiceImpl.MB_REF_NO, mbRefNo);
if (mbPages != null && !"".equalsIgnoreCase(mbPages))
criteriaMap.put(MeasurementBookServiceImpl.MB_PAGE_NO, mbPages);
if (mbStatus != null && !"".equalsIgnoreCase(mbStatus) && !"-1".equals(mbStatus))
criteriaMap.put(MeasurementBookServiceImpl.STATUS, mbStatus);
/*
* if(mbStatus != null && "-1".equals(mbStatus)) criteriaMap.put(MeasurementBookServiceImpl.STATUS, mbStatus);
*/
if (execDeptid != null && execDeptid != -1)
criteriaMap.put(MeasurementBookServiceImpl.DEPT_ID, execDeptid);
if (estimateNo != null && !"".equalsIgnoreCase(estimateNo))
criteriaMap.put(MeasurementBookServiceImpl.EST_NO, estimateNo);
qryObj = measurementBookService.searchMB(criteriaMap, paramList);
// mbList = measurementBookService.searchMB(criteriaMap, paramList);
Page resPage;
Long count;
final String qry = qryObj.get(0);
if (paramList.isEmpty()) {
params = null;
final Query qry1 = persistenceService.getSession().createQuery(qry);
count = (Long) persistenceService.find(qryObj.get(1));
resPage = new Page(qry1, page, pageSize);
// resPage= persistenceService.findPageBy(qry,page,pageSize,params);
} else {
params = new Object[paramList.size()];
params = paramList.toArray(params);
count = (Long) persistenceService.find(qryObj.get(1), params);
resPage = persistenceService.findPageBy(qry, page, pageSize, params);
}
pagedResults = new EgovPaginatedList(resPage, count.intValue());
mbList = pagedResults != null ? pagedResults.getList() : null;
if (!mbList.isEmpty())
mbList = getPositionAndUser(mbList);
pagedResults.setList(mbList);
return MB_SEARCH;
}
protected List<MBHeader> getPositionAndUser(final List<MBHeader> results) {
final List<MBHeader> mbHeaderList = new ArrayList<MBHeader>();
for (final MBHeader mbh : results) {
if (!mbh.getEgwStatus().getCode().equalsIgnoreCase(WorksConstants.APPROVED)
&& !mbh.getEgwStatus().getCode().equalsIgnoreCase(WorksConstants.CANCELLED_STATUS)) {
final PersonalInformation emp = employeeServiceOld.getEmployeeforPosition(mbh.getCurrentState()
.getOwnerPosition());
if (emp != null && StringUtils.isNotBlank(emp.getEmployeeName()))
mbh.setOwner(emp.getEmployeeName());
}
mbHeaderList.add(mbh);
final String actions = worksService.getWorksConfigValue("MB_SHOW_ACTIONS");
if (StringUtils.isNotBlank(actions))
mbh.getMbActions().addAll(Arrays.asList(actions.split(",")));
}
return mbHeaderList;
}
public Map<String, Object> getContractorForApprovedWorkOrder() {
final Map<String, Object> contractorsWithWOList = new HashMap<String, Object>();
if (workOrderService.getContractorsWithWO() != null)
for (final Contractor contractor : workOrderService.getContractorsWithWO())
contractorsWithWOList.put(contractor.getId() + "", contractor.getCode() + " - " + contractor.getName());
return contractorsWithWOList;
}
public List<EgwStatus> getMbStatusList() {
return persistenceService.findAllBy("from EgwStatus s where moduletype=? and code<>'NEW' order by orderId",
MBHeader.class.getSimpleName());
}
public List<Contractor> getContractorList() {
return workOrderService.getAllContractorForWorkOrder();
}
@Action(value = "/measurementbook/measurementBook-newform")
public String newform() {
return NEW;
}
public String edit() {
if (SOURCE_INBOX.equalsIgnoreCase(sourcepage)) {
final User user = userService.getUserById(worksService.getCurrentLoggedInUserId());
final boolean isValidUser = worksService.validateWorkflowForUser(mbHeader, user);
if (isValidUser)
throw new ApplicationRuntimeException("Error: Invalid Owner - No permission to view this page.");
} else if (StringUtils.isEmpty(sourcepage))
sourcepage = "search";
mbHeader = calculateMBdetails(mbHeader, true);
return NEW;
}
@Override
public String execute() {
return SUCCESS;
}
private boolean canUserModify() {
boolean result = false;
String designWhoCanModify = null;
designWhoCanModify = getMBWorkflowModifyDesignation();
String currentDesgination = null;
if (mbHeader.getCurrentState() != null
&& mbHeader.getCurrentState().getOwnerPosition() != null
&& mbHeader.getCurrentState().getOwnerPosition().getDeptDesig() != null
&& mbHeader.getCurrentState().getOwnerPosition().getDeptDesig().getDesignation() != null
&& mbHeader.getCurrentState().getOwnerPosition().getDeptDesig().getDesignation().getName() != null)
currentDesgination = mbHeader.getCurrentState().getOwnerPosition().getDeptDesig().getDesignation()
.getName();
if (designWhoCanModify != null && currentDesgination != null
&& designWhoCanModify.equalsIgnoreCase(currentDesgination))
result = true;
return result;
}
private void setApprovedQtyAndPrevCumlVal() {
final AjaxMeasurementBookAction ajaxMBAction = new AjaxMeasurementBookAction();
ajaxMBAction.setPersistenceService(getPersistenceService());
ajaxMBAction.setAssignmentService(assignmentService);
ajaxMBAction.setPersonalInformationService(personalInformationService);
ajaxMBAction.setMeasurementBookService(measurementBookService);
Long woActId = null;
final Long mbHeaderId = mbHeader.getId() == null ? null : mbHeader.getId();
ajaxMBAction.setMbHeaderId(mbHeaderId);
for (final MBDetails mbDetails : mbHeader.getMbDetails())
if (mbDetails != null) {
woActId = mbDetails.getWorkOrderActivity().getId();
ajaxMBAction.setWoActivityId(woActId);
ajaxMBAction.activityDetails();
mbDetails.setTotalEstQuantity(ajaxMBAction.getTotalEstQuantity());
mbDetails.setPrevCumlvQuantity(ajaxMBAction.getPrevCulmEntry());
}
}
public String save() {
if (mbHeader.getEgwStatus() == null
|| WorksConstants.REJECTED.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())
|| NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode()) || canUserModify())
mbHeader.getMbDetails().clear();
mbHeader.setIsLegacyMB(isLegacyMB);
String actionName = "";
if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null)
actionName = parameters.get(ACTION_NAME)[0];
if (mbHeader.getEgwStatus() == null
|| WorksConstants.REJECTED.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())
|| NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode()) || canUserModify())
populateActivities();
final WorkOrderEstimate woe = (WorkOrderEstimate) persistenceService.findByNamedQuery(
"getWorkOrderEstimateByEstAndWO", estimateId, workOrderId);
mbHeader.setWorkOrderEstimate(woe);
if (id == null
|| mbHeader.getEgwStatus() != null
&& (mbHeader.getEgwStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || mbHeader.getEgwStatus()
.getCode().equalsIgnoreCase(WorksConstants.REJECTED))) {
if (workCommencedDate != null && workCommencedDate.after(mbHeader.getMbDate()))
throw new ValidationException(Arrays.asList(new ValidationError("mb.lessThan.wrk.cmmncd.date",
getText("mb.lessThan.wrk.cmmncd.date") + " "
+ new SimpleDateFormat("dd/MM/yyyy").format(workCommencedDate) + ". "
+ getText("pls.enter.valid.date"))));
if (latestMBDate != null && latestMBDate.after(mbHeader.getMbDate()))
throw new ValidationException(Arrays.asList(new ValidationError("mb.lessThan.latest.mbdate.date",
getText("mb.lessThan.latest.mbdate.date") + " "
+ new SimpleDateFormat("dd/MM/yyyy").format(latestMBDate) + ". "
+ getText("pls.enter.valid.date"))));
}
try {
if (mbHeader.getEgwStatus() == null
|| WorksConstants.REJECTED.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())
|| NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode()) || canUserModify())
validateMBAmount(woe);
} catch (final ValidationException e) {
throw e;
} catch (final Exception e) {
logger.debug("Error while validation of mb and wo amount" + e);
}
if (actionName.equalsIgnoreCase(MBHeader.Actions.SUBMIT_FOR_APPROVAL.toString())
&& mbHeader.getMbDetails().isEmpty()) {
setApprovedQtyAndPrevCumlVal();
throw new ValidationException(Arrays.asList(new ValidationError("measurementbook.item.mandatory",
"measurementbook.item.mandatory")));
}
/*
* if(!actionName.equalsIgnoreCase(MBHeader.Actions.APPROVAL.toString()) &&
* workOrderService.isMBInApprovalPendingForWO(workorderNo)) throw new ValidationException(Arrays.asList(new
* ValidationError("measurementbook.approvalpending", "measurementbook.approvalpending")));
*/
// if(measurementBookService.approvalLimitCrossed(mbHeader)){
if (mbHeader.getEgwStatus() == null
|| WorksConstants.REJECTED.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())
|| NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode()) || canUserModify())
for (final MBDetails details : mbHeader.getMbDetails()) {
final Boolean limitStatus = measurementBookService.approvalLimitCrossed(details);
if (limitStatus == null) {
final Double percentage = worksService.getConfigval() + 100;
setApprovedQtyAndPrevCumlVal();
if (isRCEstimate.equalsIgnoreCase(YES))
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.currMBEntry.quantityFactor.rcEstimate.complete.error", getText(
"measurementbook.currMBEntry.quantityFactor.rcEstimate.complete.error",
new String[] { percentage.toString() }))));
else
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.currMBEntry.quantityFactor.complete.error", getText(
"measurementbook.currMBEntry.quantityFactor.complete.error",
new String[] { percentage.toString() }))));
} else if (limitStatus) {
if (!StringUtils.isNotBlank(details.getOrderNumber())) {
setApprovedQtyAndPrevCumlVal();
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.currMBEntry.enter.order.no",
getText("measurementbook.currMBEntry.enter.order.no"))));
}
if (details.getMbdetailsDate() == null) {
setApprovedQtyAndPrevCumlVal();
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.currMBEntry.enter.order.dt",
getText("measurementbook.currMBEntry.enter.order.dt"))));
} else if (details.getMbdetailsDate() != null
&& DateConversionUtil.isBeforeByDate(new Date(), details.getMbdetailsDate())) {
setApprovedQtyAndPrevCumlVal();
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.currMBEntry.order.date.error",
getText("measurementbook.currMBEntry.order.date.error"))));
}
}
}
// }
if (SAVE_ACTION.equals(actionName) && mbHeader.getEgwStatus() == null)
mbHeader.setEgwStatus(egwStatusHibernateDAO.getStatusByModuleAndCode("MBHeader", "NEW"));
mbHeader = measurementBookService.persist(mbHeader);
if (!actionName.isEmpty())
mbHeader = workflowService.transition(actionName, mbHeader, approverComments);
if (mbHeader.getEgwStatus() == null
|| WorksConstants.REJECTED.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())
|| NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode()) || canUserModify())
mbHeader = calculateMBdetails(mbHeader, true);
if (mbHeader.getEgwStatus() != null
&& mbHeader.getEgwStatus().getCode() != null
&& MBHeader.MeasurementBookStatus.APPROVED.toString().equalsIgnoreCase(
mbHeader.getEgwStatus().getCode()))
messageKey = "measurementbook.approved";
else
messageKey = "measurementbook.save.success";
addActionMessage(getText(messageKey, messageKey));
getDesignation(mbHeader);
if (SAVE_ACTION.equals(actionName))
sourcepage = "inbox";
return SAVE_ACTION.equals(actionName) ? EDIT : SUCCESS;
}
private void validateMBAmount(final WorkOrderEstimate workOrderEstimate) {
double negoPerc = 0;
String tenderType = "";
BigDecimal totalMBAmount = BigDecimal.ZERO;
BigDecimal currMBTotal = BigDecimal.ZERO;
BigDecimal allMBsTotal = BigDecimal.ZERO;
Double woEstimateAmount = 0D;
Double totalWOAmount = 0D;
TenderEstimate tenderEstimate;
final Object[] obj = (Object[]) persistenceService
.find("select tr.percNegotiatedAmountRate,tr.tenderEstimate,tr.tenderNegotiatedValue from TenderResponse tr where tr.egwStatus.code = 'APPROVED' and tr.negotiationNumber = ? ",
workOrderEstimate.getWorkOrder().getNegotiationNumber());
tenderEstimate = (TenderEstimate) obj[1];
tenderType = tenderEstimate.getTenderType();
if (StringUtils.isNotBlank(tenderType) && tenderType.equalsIgnoreCase(WorksConstants.PERC_TENDER))
negoPerc = (Double) obj[0];
else {
final double negotiationValue = (Double) obj[2];
negoPerc = negotiationValue / tenderEstimate.getWorksPackage().getTotalAmount();
}
totalMBAmount = measurementBookService.getTotalMBAmountForPrevMBs(workOrderEstimate, negoPerc, tenderType);
currMBTotal = getAmountsForCurrentMB(mbHeader.getMbDetails(), negoPerc, tenderType);
allMBsTotal = totalMBAmount.add(currMBTotal);
final Double approvedRevisionWOAmount = (Double) persistenceService
.find(" select sum(woe.workOrder.workOrderAmount) from WorkOrderEstimate woe where woe.workOrder.parent is not null and woe.workOrder.egwStatus.code='APPROVED' and woe.estimate.parent.id=? ",
estimateId);
if (StringUtils.isNotBlank(tenderType) && tenderType.equalsIgnoreCase(WorksConstants.PERC_TENDER)) {
final Double estimateAmt = (Double) persistenceService
.find("select woe.estimate.workValue.value from WorkOrderEstimate woe where woe.workOrder.parent is null and woe.workOrder.egwStatus.code='APPROVED' and woe.estimate.id=? ",
estimateId);
woEstimateAmount = estimateAmt + estimateAmt * negoPerc / 100;
} else
for (final WorkOrderActivity woa : workOrderEstimate.getWorkOrderActivities())
woEstimateAmount = woEstimateAmount + woa.getApprovedAmount();
totalWOAmount = approvedRevisionWOAmount == null ? woEstimateAmount : approvedRevisionWOAmount
+ woEstimateAmount;
if (allMBsTotal.doubleValue() > totalWOAmount) {
setApprovedQtyAndPrevCumlVal();
throw new ValidationException(Arrays.asList(new ValidationError(
"measurementbook.workOrder.amount.exceeded", "measurementbook.workOrder.amount.exceeded")));
}
}
private BigDecimal getAmountsForCurrentMB(final List<MBDetails> mbDetailsList, final double negoPerc,
final String tenderType) {
BigDecimal currentMBTenderedAmt = BigDecimal.ZERO;
BigDecimal currMBAmount = BigDecimal.ZERO;
BigDecimal tenderedMBAmount = BigDecimal.ZERO;
BigDecimal currMBTotal = BigDecimal.ZERO;
if (tenderType.equalsIgnoreCase(WorksConstants.PERC_TENDER)) {
for (final MBDetails mbd : mbDetailsList)
if (mbd.getWorkOrderActivity().getActivity().getRevisionType() == null)
currentMBTenderedAmt = currentMBTenderedAmt.add(BigDecimal.valueOf(mbd.getAmount()));
currMBAmount = mbHeader.getTotalMBAmount();
// applying percentage on tendered items
if (currentMBTenderedAmt != null)
tenderedMBAmount = currentMBTenderedAmt.add(currentMBTenderedAmt.multiply(BigDecimal
.valueOf(negoPerc / 100)));
// adding tendered amount with the non tendered items amount, to get
// the total mb amount
currMBTotal = tenderedMBAmount.add(currMBAmount.subtract(currentMBTenderedAmt));
} else
currMBTotal = mbHeader.getTotalMBAmount();
return currMBTotal.setScale(2, RoundingMode.HALF_UP);
}
protected void populateActivities() {
for (final MBDetails mbDetails : actionMbDetailValues)
if (mbDetails != null) {
mbDetails.setMbHeader(mbHeader);
if (mbDetails.getWorkOrderActivity().getActivity().getId() == null)
mbDetails.setWorkOrderActivity((WorkOrderActivity) getPersistenceService().find(
"from WorkOrderActivity where id=?", mbDetails.getWorkOrderActivity().getId()));
mbHeader.addMbDetails(mbDetails);
}
}
// workflow for reject mb
/** reject */
public String reject() {
String actionName = "";
if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null)
actionName = parameters.get(ACTION_NAME)[0];
if (mbHeader != null && mbHeader.getId() != null && !actionName.isEmpty()) {
// calling workflow api
workflowService.transition(actionName, mbHeader, approverComments);
mbHeader = measurementBookService.persist(mbHeader);
getDesignation(mbHeader);
}
messageKey = "measurementbook.reject";
return SUCCESS;
}
// workflow for cancel mb
public String cancel() {
if (mbHeader != null && mbHeader.getEgBillregister() != null
&& mbHeader.getEgBillregister().getStatus() != null
&& !mbHeader.getEgBillregister().getStatus().getCode().equalsIgnoreCase("CANCELLED")) {
messageKey = "measurementbook.cancel.failure";
addActionError(getText(messageKey));
return EDIT;
}
String actionName = "";
if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null)
actionName = parameters.get(ACTION_NAME)[0];
if (mbHeader != null && mbHeader.getId() != null && !actionName.isEmpty()) {
workflowService.transition(actionName, mbHeader, approverComments);
mbHeader = measurementBookService.persist(mbHeader);
getDesignation(mbHeader);
}
messageKey = "measurementbook.cancel";
return SUCCESS;
}
protected void getDesignation(final MBHeader mbHeader) {
/* start for customizing workflow message display */
if (mbHeader.getEgwStatus() != null && !WorksConstants.NEW.equalsIgnoreCase(mbHeader.getEgwStatus().getCode())) {
final String result = worksService.getEmpNameDesignation(mbHeader.getState().getOwnerPosition(), mbHeader
.getState().getCreatedDate());
if (result != null && !"@".equalsIgnoreCase(result)) {
final String empName = result.substring(0, result.lastIndexOf('@'));
final String designation = result.substring(result.lastIndexOf('@') + 1, result.length());
setDispEmployeeName(empName);
setDispDesignation(designation);
}
}
/* end */
}
public String verify() {
// TODO save and show details for submit
return VERIFY;
}
public String submit() {
// TODO make status approval pending for all MBS
return SUBMITTED;
}
@Override
public Object getModel() {
return mbHeader;
}
public String cancelApprovedMB() {
final MBHeader mbHeader = measurementBookService.findById(mbId, false);
mbHeader.setEgwStatus(egwStatusHibernateDAO.getStatusByModuleAndCode("MBHeader",
MBHeader.MeasurementBookStatus.CANCELLED.toString()));
final PersonalInformation prsnlInfo = employeeServiceOld.getEmpForUserId(worksService.getCurrentLoggedInUserId());
String empName = "";
if (prsnlInfo.getEmployeeFirstName() != null)
empName = prsnlInfo.getEmployeeFirstName();
if (prsnlInfo.getEmployeeLastName() != null)
empName = empName.concat(" ").concat(prsnlInfo.getEmployeeLastName());
if (cancelRemarks != null && StringUtils.isNotBlank(cancelRemarks)) {
} else {
}
// TODO - The setter methods of variables in State.java are protected.
// Need to alternative way to solve this issue.
// Set the status and workflow state to cancelled
/*
* State oldEndState = mbHeader.getCurrentState(); Position owner = prsnlInfo.getAssignment(new Date()).getPosition();
* oldEndState.setCreatedBy(prsnlInfo.getUserMaster()); oldEndState.setModifiedBy(prsnlInfo.getUserMaster());
* oldEndState.setCreatedDate(new Date()); oldEndState.setModifiedDate(new Date()); oldEndState.setOwner(owner);
* oldEndState.setValue(WorksConstants.CANCELLED_STATUS); oldEndState.setText1(cancellationText);
* mbHeader.changeState("END", owner, null);
*/
mbRefNo = mbHeader.getMbRefNo();
messageKey = mbRefNo + " : " + getText("mb.cancel.success.message");
return SUCCESS;
}
public void setModel(final MBHeader mbHeader) {
this.mbHeader = mbHeader;
}
public List<MBDetails> getMbDetails() {
return mbDetails;
}
public void setMbDetails(final List<MBDetails> mbDetails) {
this.mbDetails = mbDetails;
}
public String getMessageKey() {
return messageKey;
}
public void setMessageKey(final String messageKey) {
this.messageKey = messageKey;
}
public Long getId() {
return id;
}
public void setId(final Long id) {
this.id = id;
}
public EmployeeView getMbPreparedByView() {
return mbPreparedByView;
}
public void setMbPreparedByView(final EmployeeView mbPreparedByView) {
this.mbPreparedByView = mbPreparedByView;
}
public void setMeasurementBookService(final MeasurementBookService measurementBookService) {
this.measurementBookService = measurementBookService;
}
public void setActionMbDetailValues(final List<MBDetails> actionMbDetailValues) {
this.actionMbDetailValues = actionMbDetailValues;
}
public List<WorkOrderActivity> getActivityList() {
return activityList;
}
public List<MBDetails> getActionMbDetailValues() {
return actionMbDetailValues;
}
public String getActivityCode() {
return activityCode;
}
public void setActivityCode(final String activityCode) {
this.activityCode = activityCode;
}
public String getActivityDesc() {
return activityDesc;
}
public void setActivityDesc(final String activityDesc) {
this.activityDesc = activityDesc;
}
public String getWorkorderNo() {
return workorderNo;
}
public void setWorkorderNo(final String workorderNo) {
this.workorderNo = workorderNo;
}
public void setWorkOrderService(final WorkOrderService workOrderService) {
this.workOrderService = workOrderService;
}
public double getQuantityFactor() {
return quantityFactor;
}
public void setQuantityFactor(final double quantityFactor) {
this.quantityFactor = quantityFactor;
}
public List<MBHeader> getMbList() {
return mbList;
}
public void setActivityList(final List<WorkOrderActivity> activityList) {
this.activityList = activityList;
}
public Long getContractorId() {
return contractorId;
}
public void setContractorId(final Long contractorId) {
this.contractorId = contractorId;
}
public String getMbRefNo() {
return mbRefNo;
}
public void setMbRefNo(final String mbRefNo) {
this.mbRefNo = mbRefNo;
}
public String getMbPages() {
return mbPages;
}
public void setMbPages(final String mbPages) {
this.mbPages = mbPages;
}
public String getMbStatus() {
return mbStatus;
}
public void setMbStatus(final String mbStatus) {
this.mbStatus = mbStatus;
}
// on jan 13 th workflow related
public List<WorkflowAction> getValidActions() {
return workflowService.getValidActions(mbHeader);
}
public void setMeasurementBookWorkflowService(final WorkflowService<MBHeader> workflow) {
workflowService = workflow;
}
public MeasurementBookWFService getMeasurementBookWFService() {
return measurementBookWFService;
}
public void setMeasurementBookWFService(final MeasurementBookWFService measurementBookWFService) {
this.measurementBookWFService = measurementBookWFService;
}
public String getSourcepage() {
return sourcepage;
}
public void setSourcepage(final String sourcepage) {
this.sourcepage = sourcepage;
}
public String getDispEmployeeName() {
return dispEmployeeName;
}
public void setDispEmployeeName(final String dispEmployeeName) {
this.dispEmployeeName = dispEmployeeName;
}
public String getDispDesignation() {
return dispDesignation;
}
public void setDispDesignation(final String dispDesignation) {
this.dispDesignation = dispDesignation;
}
public void setWorksService(final WorksService worksService) {
this.worksService = worksService;
}
public String getMode() {
return mode;
}
public void setMode(final String mode) {
this.mode = mode;
}
public Long getDepartmentId() {
return departmentId;
}
public void setDepartmentId(final Long departmentId) {
this.departmentId = departmentId;
}
public Integer getDesignationId() {
return designationId;
}
public void setDesignationId(final Integer designationId) {
this.designationId = designationId;
}
public String getApproverComments() {
return approverComments;
}
public void setApproverComments(final String approverComments) {
this.approverComments = approverComments;
}
public Integer getApproverUserId() {
return approverUserId;
}
public void setApproverUserId(final Integer approverUserId) {
this.approverUserId = approverUserId;
}
public String getMborderNumberRequired() {
mborderNumberRequired = worksService.getWorksConfigValue("ORDER_NUMBER_REQUIRED");
return mborderNumberRequired;
}
public String getWorkOrderEstimateRequired() {
return worksService.getWorksConfigValue("WORKORDER_ESTIMATE_REQUIRED");
}
public String getMBWorkflowModifyDesignation() {
return worksService.getWorksConfigValue("MB_WORKFLOW_MODIFY_DESIG");
}
public void setMborderNumberRequired(final String mborderNumberRequired) {
this.mborderNumberRequired = mborderNumberRequired;
}
public Long getWorkOrderId() {
return workOrderId;
}
public void setWorkOrderId(final Long workOrderId) {
this.workOrderId = workOrderId;
}
public Long getEstimateId() {
return estimateId;
}
public void setEstimateId(final Long estimateId) {
this.estimateId = estimateId;
}
public String getWorkName() {
return workName;
}
public void setWorkName(final String workName) {
this.workName = workName;
}
public Date getFromDate() {
return fromDate;
}
public void setFromDate(final Date fromDate) {
this.fromDate = fromDate;
}
public Date getToDate() {
return toDate;
}
public void setToDate(final Date toDate) {
this.toDate = toDate;
}
public List<WorkOrderEstimate> getWorkOrderEstimateList() {
return workOrderEstimateList;
}
public void setWorkOrderEstimateList(final List<WorkOrderEstimate> workOrderEstimateList) {
this.workOrderEstimateList = workOrderEstimateList;
}
public void setPersonalInformationService(final PersonalInformationService personalInformationService) {
this.personalInformationService = personalInformationService;
}
// end workflow related
public String getProjectCode() {
return projectCode;
}
public void setProjectCode(final String projectCode) {
this.projectCode = projectCode;
}
public void setUserService(final UserService userService) {
this.userService = userService;
}
public String getActivitySearchMode() {
return activitySearchMode;
}
public void setActivitySearchMode(final String activitySearchMode) {
this.activitySearchMode = activitySearchMode;
}
public boolean getIsLegacyMB() {
return isLegacyMB;
}
public void setIsLegacyMB(final boolean isLegacyMB) {
this.isLegacyMB = isLegacyMB;
}
public String getCancellationReason() {
return cancellationReason;
}
public void setCancellationReason(final String cancellationReason) {
this.cancellationReason = cancellationReason;
}
public Long getMbId() {
return mbId;
}
public void setMbId(final Long mbId) {
this.mbId = mbId;
}
public String getEstimateNo() {
return estimateNo;
}
public void setEstimateNo(final String estimateNo) {
this.estimateNo = estimateNo;
}
public Integer getExecDeptid() {
return execDeptid;
}
public void setExecDeptid(final Integer execDeptid) {
this.execDeptid = execDeptid;
}
public String getCancelRemarks() {
return cancelRemarks;
}
public void setCancelRemarks(final String cancelRemarks) {
this.cancelRemarks = cancelRemarks;
}
public Integer getPage() {
return page;
}
public Integer getPageSize() {
return pageSize;
}
public EgovPaginatedList getPagedResults() {
return pagedResults;
}
public void setPage(final Integer page) {
this.page = page;
}
public void setPageSize(final Integer pageSize) {
this.pageSize = pageSize;
}
public void setPagedResults(final EgovPaginatedList pagedResults) {
this.pagedResults = pagedResults;
}
public void setEisService(final EisUtilService eisService) {
}
public Integer getDefaultPreparedById() {
return defaultPreparedById;
}
public void setDefaultPreparedById(final Integer defaultPreparedById) {
this.defaultPreparedById = defaultPreparedById;
}
public String getDefaultDesgination() {
return defaultDesgination;
}
public String getIsRCEstimate() {
return isRCEstimate;
}
public void setIsRCEstimate(final String isRCEstimate) {
this.isRCEstimate = isRCEstimate;
}
public Date getWorkCommencedDate() {
return workCommencedDate;
}
public void setWorkCommencedDate(final Date workCommencedDate) {
this.workCommencedDate = workCommencedDate;
}
public Date getLatestMBDate() {
return latestMBDate;
}
public void setLatestMBDate(final Date latestMBDate) {
this.latestMBDate = latestMBDate;
}
public Long getWoId() {
return woId;
}
public void setWoId(final Long woId) {
this.woId = woId;
}
}