/*
* 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.contractoradvance;
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.apache.struts2.interceptor.validation.SkipValidation;
import org.egov.eis.entity.Assignment;
import org.egov.eis.entity.DrawingOfficer;
import org.egov.infra.admin.master.entity.User;
import org.egov.infra.admin.master.service.DepartmentService;
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.workflow.entity.StateAware;
import org.egov.infra.workflow.entity.WorkflowAction;
import org.egov.infra.workflow.service.WorkflowService;
import org.egov.model.advance.EgAdvanceRequisitionDetails;
import org.egov.works.contractorbill.entity.ContractorBillRegister;
import org.egov.works.models.contractoradvance.ContractorAdvanceRequisition;
import org.egov.works.models.measurementbook.MBHeader;
import org.egov.works.models.workorder.WorkOrderEstimate;
import org.egov.works.services.AbstractEstimateService;
import org.egov.works.services.WorksService;
import org.egov.works.services.contractoradvance.ContractorAdvanceService;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ParentPackage("egov")
@Result(name = ContractorAdvanceRequisitionAction.NEW, location = "contractorAdvanceRequisition-new.jsp")
public class ContractorAdvanceRequisitionAction extends BaseFormAction {
private static final Logger LOGGER = Logger.getLogger(ContractorAdvanceRequisitionAction.class);
private static final long serialVersionUID = 1L;
private ContractorAdvanceRequisition contractorAdvanceRequisition = new ContractorAdvanceRequisition();
private Long workOrderEstimateId;
private Long id;
private WorkOrderEstimate workOrderEstimate = new WorkOrderEstimate();
private BigDecimal advancePaid = BigDecimal.ZERO;
private WorksService worksService;
private ContractorAdvanceService contractorAdvanceService;
private static final String ADVANCE_COA_LIST = "advanceAccountCodeList";
private static final String ARF_TYPE = "Contractor";
private Long advanceAccountCode;
private static final String CANCEL_ACTION = "cancel";
private static final Object REJECT_ACTION = "reject";
private static final String SAVE_ACTION = "save";
private static final String SOURCE_INBOX = "inbox";
private static final String ACTION_NAME = "actionName";
private Integer logedInUserDept = -1;
private AbstractEstimateService abstractEstimateService;
private WorkflowService<ContractorAdvanceRequisition> workflowService;
@Autowired
private UserService userService;
private String sourcepage = "";
private Integer workflowFunctionaryId;
@Autowired
private DepartmentService departmentService;
private String messageKey;
private String nextEmployeeName;
private String nextDesignation;
private String drawingOfficerName;
public ContractorAdvanceRequisitionAction() {
addRelatedEntity("drawingOfficer", DrawingOfficer.class);
}
@Override
public StateAware getModel() {
return contractorAdvanceRequisition;
}
@Override
public void prepare() {
if (workOrderEstimateId != null) {
contractorAdvanceRequisition.setWorkOrderEstimate((WorkOrderEstimate) persistenceService.find(
"from WorkOrderEstimate where id = ?", workOrderEstimateId));
if (id == null)
// Approved ARF amount
advancePaid = contractorAdvanceService.getAdvancePaidByWOEstimateId(workOrderEstimateId);
}
addDropdownData(ADVANCE_COA_LIST, contractorAdvanceService.getContractorAdvanceAccountcodes());
if (id != null) {
contractorAdvanceRequisition = contractorAdvanceService.getContractorAdvanceRequisitionById(id);
for (final EgAdvanceRequisitionDetails advanceRequisitionDetails : contractorAdvanceRequisition
.getEgAdvanceReqDetailses())
advanceAccountCode = advanceRequisitionDetails.getChartofaccounts().getId();
workOrderEstimateId = contractorAdvanceRequisition.getWorkOrderEstimate().getId();
if (StringUtils.isBlank(drawingOfficerName))
drawingOfficerName = contractorAdvanceRequisition.getDrawingOfficer().getCode() + " - "
+ contractorAdvanceRequisition.getDrawingOfficer().getName();
}
if (workOrderEstimateId != null && id != null)
// Approved ARF amount for View mode
advancePaid = contractorAdvanceService.getAdvancePaidByWOEstIdForView(workOrderEstimateId, id);
if (advancePaid == null)
advancePaid = new BigDecimal(0.00);
super.prepare();
// Load workflow related data here
addDropdownData("executingDepartmentList", departmentService.getAllDepartments());
final Assignment loggedInUserAssignment = abstractEstimateService.getLatestAssignmentForCurrentLoginUser();
if (loggedInUserAssignment != null)
contractorAdvanceRequisition.setWorkflowDepartmentId(loggedInUserAssignment.getDepartment().getId());
workflowFunctionaryId = contractorAdvanceService.getFunctionaryForWorkflow(contractorAdvanceRequisition);
}
@SkipValidation
@Action(value = "/contractoradvance/contractorAdvanceRequisition-newform")
public String newform() {
return NEW;
}
@SkipValidation
public String edit() throws Exception {
if (SOURCE_INBOX.equalsIgnoreCase(sourcepage)) {
final User user = userService.getUserById(worksService.getCurrentLoggedInUserId());
final boolean isValidUser = worksService.validateWorkflowForUser(contractorAdvanceRequisition, user);
if (isValidUser)
throw new ApplicationRuntimeException("Error: Invalid Owner - No permission to view this page.");
} else if (StringUtils.isEmpty(sourcepage))
sourcepage = "search";
return EDIT;
}
public String save() {
String actionName = "";
try {
if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null)
actionName = parameters.get(ACTION_NAME)[0];
if (!(CANCEL_ACTION.equals(actionName) || REJECT_ACTION.equals(actionName))) {
final BigDecimal totalEstimateValueIncludingREValue = contractorAdvanceService
.getTotalEstimateValueIncludingRE(contractorAdvanceRequisition.getWorkOrderEstimate()
.getEstimate());
if (advancePaid.add(contractorAdvanceRequisition.getAdvanceRequisitionAmount())
.longValue() > totalEstimateValueIncludingREValue
.longValue())
throw new ValidationException(Arrays.asList(new ValidationError(
"advancerequisition.validate.advancepaid.estimatevalue",
"advancerequisition.validate.advancepaid.estimatevalue")));
}
contractorAdvanceRequisition.setArftype(ARF_TYPE);
contractorAdvanceService.save(contractorAdvanceRequisition, actionName, advanceAccountCode);
} catch (final ValidationException validationException) {
final List<ValidationError> errorList = validationException.getErrors();
for (final ValidationError error : errorList)
if (error.getMessage().contains("DatabaseSequenceFirstTimeException")) {
prepare();
throw new ValidationException(Arrays.asList(new ValidationError("error", error.getMessage())));
} else
throw new ValidationException(validationException.getErrors());
}
if (SAVE_ACTION.equals(actionName))
messageKey = "advancerequisition.save.success";
else
messageKey = "advancerequisition." + actionName;
addActionMessage(getText(messageKey, messageKey));
getDesignation(contractorAdvanceRequisition);
if (SAVE_ACTION.equals(actionName))
sourcepage = "inbox";
return SAVE_ACTION.equals(actionName) ? EDIT : SUCCESS;
}
public String cancel() {
final String actionName = parameters.get("actionName")[0];
contractorAdvanceService.cancelContractorAdvanceRequisition(contractorAdvanceRequisition, actionName);
messageKey = "advancerequisition.cancel";
getDesignation(contractorAdvanceRequisition);
return SUCCESS;
}
private void getDesignation(final ContractorAdvanceRequisition contractorAdvanceRequisition) {
if (contractorAdvanceRequisition.getCurrentState() != null
&& !"NEW".equalsIgnoreCase(contractorAdvanceRequisition.getCurrentState().getValue())) {
final String result = worksService.getEmpNameDesignation(contractorAdvanceRequisition.getState()
.getOwnerPosition(), contractorAdvanceRequisition.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());
setNextEmployeeName(empName);
setNextDesignation(designation);
}
}
}
public List<WorkflowAction> getValidActions() {
return workflowService.getValidActions(contractorAdvanceRequisition);
}
@Override
public void validate() {
String actionName = "";
if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null)
actionName = parameters.get(ACTION_NAME)[0];
if (!(actionName.equalsIgnoreCase("reject") || actionName.equalsIgnoreCase("cancel"))) {
if (contractorAdvanceRequisition.getAdvanceRequisitionDate() == null)
addFieldError("advanceRequisitionDate", getText("advancerequisition.date.required"));
if (!DateUtils.compareDates(contractorAdvanceRequisition.getAdvanceRequisitionDate(),
contractorAdvanceRequisition.getWorkOrderEstimate().getWorkOrder().getApprovedDate()))
addFieldError("advanceRequisitionDate",
getText("advancerequisition.date.lessthan.workorder.approveddate"));
if (!DateUtils.compareDates(new Date(), contractorAdvanceRequisition.getAdvanceRequisitionDate()))
addFieldError("advanceRequisitionDate",
getText("advancerequisition.validate.date.greaterthan.currentDate"));
if (advanceAccountCode == null || advanceAccountCode == -1 || advanceAccountCode == 0)
addFieldError("advanceAccountCode", getText("advancerequisition.advanceaccountcode.required"));
if (contractorAdvanceRequisition.getDrawingOfficer() == null
|| contractorAdvanceRequisition.getDrawingOfficer().getId() == null
|| contractorAdvanceRequisition.getDrawingOfficer().getId() == -1
|| contractorAdvanceRequisition.getDrawingOfficer().getId() == 0)
addFieldError("drawingOfficer", getText("advancerequisition.drawingofficer.required"));
if (!worksService.checkBigDecimalValue(contractorAdvanceRequisition.getAdvanceRequisitionAmount(),
BigDecimal.valueOf(0.00)))
addFieldError("advanceRequisitionAmount", getText("advancerequisition.valid.amount.greaterthan.zero"));
if (!sourcepage.equals("search")) {
// Check for any bill is created for this estimate
checkForBills();
// Check is there already a ARF for this estimate is in workflow
if (id == null)
checkARFInWorkflowForEstimate();
}
}
}
protected void checkForBills() {
final Long billCount = (Long) persistenceService.find(
"select count(*) from MBHeader mbh where mbh.workOrderEstimate.id = ? and mbh.egwStatus.code = ? "
+ "and (mbh.egBillregister is not null and mbh.egBillregister.billstatus <> ?)",
contractorAdvanceRequisition.getWorkOrderEstimate().getId(),
MBHeader.MeasurementBookStatus.APPROVED.toString(),
ContractorBillRegister.BillStatus.CANCELLED.toString());
if (billCount != null && billCount > 0)
addActionError(getText("advancerequisition.validate.billcreated.message"));
}
protected void checkARFInWorkflowForEstimate() {
final ContractorAdvanceRequisition arf = (ContractorAdvanceRequisition) persistenceService
.find(" from ContractorAdvanceRequisition arf where arf.workOrderEstimate.id = ? and arf.status.code not in(?, ?) ",
contractorAdvanceRequisition.getWorkOrderEstimate().getId(),
ContractorAdvanceRequisition.ContractorAdvanceRequisitionStatus.APPROVED.toString(),
ContractorAdvanceRequisition.ContractorAdvanceRequisitionStatus.CANCELLED.toString());
if (arf != null)
addActionError(getText("advancerequisition.validate.arf.in.workflow.message",
new String[] { arf.getAdvanceRequisitionNumber() }));
}
public ContractorAdvanceRequisition getContractorAdvanceRequisition() {
return contractorAdvanceRequisition;
}
public void setContractorAdvanceRequisition(final ContractorAdvanceRequisition contractorAdvanceRequisition) {
this.contractorAdvanceRequisition = contractorAdvanceRequisition;
}
public Long getWorkOrderEstimateId() {
return workOrderEstimateId;
}
public void setWorkOrderEstimateId(final Long workOrderEstimateId) {
this.workOrderEstimateId = workOrderEstimateId;
}
public WorkOrderEstimate getWorkOrderEstimate() {
return workOrderEstimate;
}
public void setWorkOrderEstimate(final WorkOrderEstimate workOrderEstimate) {
this.workOrderEstimate = workOrderEstimate;
}
public BigDecimal getAdvancePaid() {
return advancePaid;
}
public void setAdvancePaid(final BigDecimal advancePaid) {
this.advancePaid = advancePaid;
}
public WorksService getWorksService() {
return worksService;
}
public void setWorksService(final WorksService worksService) {
this.worksService = worksService;
}
public Long getAdvanceAccountCode() {
return advanceAccountCode;
}
public void setAdvanceAccountCode(final Long advanceAccountCode) {
this.advanceAccountCode = advanceAccountCode;
}
public void setContractorAdvanceService(final ContractorAdvanceService contractorAdvanceService) {
this.contractorAdvanceService = contractorAdvanceService;
}
public Long getId() {
return id;
}
public void setId(final Long id) {
this.id = id;
}
public Integer getLogedInUserDept() {
return logedInUserDept;
}
public void setLogedInUserDept(final Integer logedInUserDept) {
this.logedInUserDept = logedInUserDept;
}
public AbstractEstimateService getAbstractEstimateService() {
return abstractEstimateService;
}
public void setAbstractEstimateService(final AbstractEstimateService abstractEstimateService) {
this.abstractEstimateService = abstractEstimateService;
}
public String getSourcepage() {
return sourcepage;
}
public void setSourcepage(final String sourcepage) {
this.sourcepage = sourcepage;
}
public void setUserService(final UserService userService) {
this.userService = userService;
}
public Integer getWorkflowFunctionaryId() {
return workflowFunctionaryId;
}
public void setWorkflowFunctionaryId(final Integer workflowFunctionaryId) {
this.workflowFunctionaryId = workflowFunctionaryId;
}
public void setDepartmentService(final DepartmentService departmentService) {
this.departmentService = departmentService;
}
public String getMessageKey() {
return messageKey;
}
public void setMessageKey(final String messageKey) {
this.messageKey = messageKey;
}
public String getNextEmployeeName() {
return nextEmployeeName;
}
public void setNextEmployeeName(final String nextEmployeeName) {
this.nextEmployeeName = nextEmployeeName;
}
public String getNextDesignation() {
return nextDesignation;
}
public void setNextDesignation(final String nextDesignation) {
this.nextDesignation = nextDesignation;
}
public void setContractorAdvanceWorkflowService(final WorkflowService<ContractorAdvanceRequisition> workflow) {
workflowService = workflow;
}
public String getDrawingOfficerName() {
return drawingOfficerName;
}
public void setDrawingOfficerName(final String drawingOfficerName) {
this.drawingOfficerName = drawingOfficerName;
}
}