/* * 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.contractorBill; 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.convention.annotation.Results; import org.apache.struts2.interceptor.validation.SkipValidation; import org.egov.assets.model.Asset; import org.egov.assets.service.AssetService; import org.egov.commons.Accountdetailtype; import org.egov.commons.CChartOfAccounts; import org.egov.commons.CFunction; import org.egov.commons.EgPartytype; import org.egov.commons.EgwStatus; import org.egov.commons.EgwTypeOfWork; import org.egov.commons.Functionary; import org.egov.commons.Fund; import org.egov.commons.dao.ChartOfAccountsHibernateDAO; import org.egov.commons.dao.EgPartytypeHibernateDAO; import org.egov.commons.dao.EgwStatusHibernateDAO; import org.egov.commons.dao.FinancialYearHibernateDAO; import org.egov.commons.dao.FunctionHibernateDAO; import org.egov.commons.dao.FunctionaryHibernateDAO; import org.egov.commons.dao.FundHibernateDAO; import org.egov.commons.dao.SchemeHibernateDAO; import org.egov.commons.dao.SubSchemeHibernateDAO; import org.egov.egf.commons.EgovCommon; import org.egov.infra.admin.master.entity.AppConfigValues; 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.ApplicationException; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.reporting.engine.ReportOutput; import org.egov.infra.reporting.engine.ReportRequest; import org.egov.infra.reporting.engine.ReportService; import org.egov.infra.script.service.ScriptService; import org.egov.infra.utils.DateUtils; import org.egov.infra.utils.NumberUtil; 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.WorkflowAction; import org.egov.infra.workflow.service.WorkflowService; import org.egov.infstr.models.EgChecklists; import org.egov.infstr.services.PersistenceService; import org.egov.model.bills.EgBillPayeedetails; import org.egov.model.bills.EgBilldetails; import org.egov.model.bills.EgBillregistermis; import org.egov.model.budget.BudgetGroup; import org.egov.model.recoveries.Recovery; import org.egov.pims.service.EmployeeServiceOld; import org.egov.services.budget.BudgetService; import org.egov.services.recoveries.RecoveryService; import org.egov.services.voucher.VoucherService; import org.egov.works.abstractestimate.entity.FinancialDetail; import org.egov.works.contractorbill.entity.ContractorBillRegister; import org.egov.works.milestone.entity.TrackMilestone; import org.egov.works.models.contractorBill.AssetForBill; import org.egov.works.models.contractorBill.DeductionTypeForBill; import org.egov.works.models.contractorBill.StatutoryDeductionsForBill; import org.egov.works.models.contractorBill.WorkCompletionDetailInfo; import org.egov.works.models.contractorBill.WorkCompletionInfo; import org.egov.works.models.measurementbook.MBForCancelledBill; import org.egov.works.models.measurementbook.MBHeader; import org.egov.works.models.tender.TenderResponse; import org.egov.works.models.workorder.WorkOrder; import org.egov.works.models.workorder.WorkOrderEstimate; import org.egov.works.services.AbstractEstimateService; import org.egov.works.services.ContractorBillService; import org.egov.works.services.WorksService; import org.egov.works.services.contractoradvance.ContractorAdvanceService; import org.egov.works.services.impl.MeasurementBookServiceImpl; import org.egov.works.utils.WorksConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import javax.script.ScriptContext; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @ParentPackage("egov") @Results({ @Result(name = ContractorBillAction.PRINT, type = "stream", location = "CompletionCertificatePDF", params = { "inputName", "CompletionCertificatePDF", "contentType", "application/pdf", "contentDisposition", "no-cache;filename=ContractorBill_CompletionCertificate.pdf" }), @Result(name = ContractorBillAction.NEW, location = "contractorBill-new.jsp") }) public class ContractorBillAction extends BaseFormAction { private static final long serialVersionUID = -2842467886385709531L; private static final Logger logger = Logger.getLogger(ContractorBillAction.class); private ContractorBillService contractorBillService; private PersistenceService<MBForCancelledBill, Long> cancelBillService; private WorksService worksService; private ContractorBillRegister contractorBillRegister = new ContractorBillRegister(); private WorkOrder workOrder; private Long id; private Long workOrderId; @Autowired private EgwStatusHibernateDAO egwStatusHibernateDAO; @Autowired private EgPartytypeHibernateDAO egPartytypeHibernateDAO; @Autowired private ChartOfAccountsHibernateDAO chartOfAccountsHibernateDAO; @Autowired private AssetService assetService; private MeasurementBookServiceImpl measurementBookService; private EgovCommon egovCommon; @Autowired private UserService userService; private PersistenceService<EgChecklists, Long> checklistService; private List<StatutoryDeductionsForBill> actionStatutorydetails = new LinkedList<StatutoryDeductionsForBill>(); private List<AssetForBill> accountDetailsForBill = new ArrayList<AssetForBill>(); private Map<Long, String> contratorCoaPayableMap = new HashMap<Long, String>(); private String disp; private BigDecimal totalAdvancePaid = BigDecimal.ZERO; private BigDecimal totalPendingBalance = BigDecimal.ZERO; private BigDecimal advaceAdjustmentCreditAmount = BigDecimal.ZERO; private BigDecimal billAmount = BigDecimal.ZERO; private BigDecimal utilizedAmount = BigDecimal.ZERO; private BigDecimal sanctionedBudget = BigDecimal.ZERO; private PersistenceService<FinancialDetail, Long> financialDetailService; private Long netPayableCode; private BigDecimal netPayableAmount; private String partyBillNumber; private Date partyBillDate; private Date completionDate; private Integer partbillNo; private String sourcepage = ""; private List<String> checklistValues = new LinkedList<String>(); private List<AppConfigValues> finalBillChecklist = new LinkedList<AppConfigValues>(); private List<CChartOfAccounts> standardDeductionAccountList = new LinkedList<CChartOfAccounts>(); private List<CChartOfAccounts> customDeductionAccountList = new LinkedList<CChartOfAccounts>(); private List<CChartOfAccounts> retentionMoneyAccountList = new LinkedList<CChartOfAccounts>(); private List<String> standardDeductionConfValues = new LinkedList<String>(); private List<DeductionTypeForBill> standardDeductions = new LinkedList<DeductionTypeForBill>(); private List<EgBilldetails> customDeductions = new LinkedList<EgBilldetails>(); private List<EgBilldetails> retentionMoneyDeductions = new LinkedList<EgBilldetails>(); private List<MBHeader> mbHeaderList = new LinkedList<MBHeader>(); private Long[] appConfigValueId; private String[] selectedchecklistValue; private String[] remarks; private static final String ASSET_LIST = "assestList"; private static final String SOURCE_INBOX = "inbox"; private static final String COA_LIST = "coaList"; private static final String CAPITAL_WORKS = "Capital Works"; private static final String IMPROVEMENT_WORKS = "Improvement Works"; private static final String REPAIR_AND_MAINTENANCE = "Repairs and maintenance"; private static final String WORKS_NETPAYABLE_CODE = "WORKS_NETPAYABLE_CODE"; private static final String RETENTION_MONEY_PURPOSE = "RETENTION_MONEY_PURPOSE"; private static final String KEY_CWIP = "WORKS_CWIP_CODE"; private static final String KEY_REPAIRS = "WORKS_REPAIRS_AND_MAINTENANCE"; private static final String KEY_DEPOSIT = "WORKS_DEPOSIT_OTHER_WORKS"; private static final String BILL_STATUS = "APPROVED"; private static final String ACCOUNTDETAIL_TYPE_CONTRACTOR = "contractor"; private static final String EXPENDITURE_TYPE = "Works"; private static final String BILL_MODULE_KEY = "CONTRACTORBILL"; private static final String AMOUNT_ERROR = "amount.lessthan.zero"; @Autowired private DepartmentService departmentService; private WorkflowService<ContractorBillRegister> workflowService; private static final String SAVE_ACTION = "save"; private String messageKey; private static final String ACTION_NAME = "actionName"; private String nextEmployeeName; private String nextDesignation; @Autowired @Qualifier("recoveryPersistenceService") private RecoveryService recoveryService; private Long workOrderEstimateId; private List<WorkOrderEstimate> workOrderEstimateList = new ArrayList<WorkOrderEstimate>(); private WorkOrderEstimate workOrderEstimate = new WorkOrderEstimate(); public static final String PRINT = "print"; private InputStream completionCertificatePDF; private ReportService reportService; private static final String APPCONFIG_KEY_NAME = "SKIP_BUDGET_CHECK"; private VoucherService voucherService; private ScriptService scriptExecutionService; private WorkCompletionInfo completionInfo; private List<WorkCompletionDetailInfo> completionDetailInfoList = new ArrayList<WorkCompletionDetailInfo>(); private boolean skipBudget; private static final String CHECK_BUDGET = "CHECK_BUDGET"; private static final String ACCOUNTDETAIL_TYPE_PROJECTCODE = "PROJECTCODE"; private String isRetMoneyAutoCalculated; private String isRetMoneyEditable; private String percDeductForRetMoneyPartBill; private String percDeductForRetMoneyFinalBill; private String retMoneyFinalBillPerOnValue; private TenderResponse tenderResponse; private String rebatePremLevel; // Added for Automatic calculation of statutory recoveries in bill private List<EgPartytype> subPartyTypeDtls = new ArrayList<EgPartytype>(); private List<EgwTypeOfWork> typeOfWorkDtls = new ArrayList<EgwTypeOfWork>(); public static final String BILL_STATUTORYDEDUCTIONS_SHOW_PARTYSUBTYPE = "BILL_STATUTORYDEDUCTIONS_SHOW_PARTYSUBTYPE"; public static final String BILL_STATUTORYDEDUCTIONS_SHOW_SERVICETYPE = "BILL_STATUTORYDEDUCTIONS_SHOW_SERVICETYPE"; public static final String BILL_STATUTORYDEDUCTIONS_EDITABLE = "BILL_STATUTORYDEDUCTIONS_EDITABLE"; private String showSubPartyType; private String showTypeOfWork; private String editStatutoryAmount; public static final String PARTY_TYPE_CODE = "Contractor"; private Long estimateId; private String percTenderType; private String isRebatePremLevelBill; private BigDecimal grossAmount = BigDecimal.ZERO; private BigDecimal tenderedItemsAmount = BigDecimal.ZERO; @Autowired private FunctionaryHibernateDAO functionaryHibDao; private BudgetService budgetService; private final String PENDING_FOR_VERIFICATION = "Pending for Verification"; private final String PENDING_FOR_VALIDATION = "Pending for Validation"; private final String PENDING_FOR_APPROVAL = "Pending for Approval"; private final String PENDING_FOR_RECTIFICATION = "Pending for Rectification"; private final String PENDING_FOR_CHECK = "Pending for Check"; private Integer workflowFunctionaryId; private Long[] mbHeaderId; private List<MBHeader> mbHeaderListForBillId = new LinkedList<MBHeader>(); private ContractorAdvanceService contractorAdvanceService; @Autowired private EmployeeServiceOld employeeService; private String isRCEstimate = ""; private String dwCategory = ""; private Date restorationEndDate; private String showValidationMsg = ""; @Autowired private FundHibernateDAO fundHibernateDao; @Autowired private FunctionHibernateDAO functionHibernateDao; @Autowired private SchemeHibernateDAO schemeHibernateDAO; @Autowired private SubSchemeHibernateDAO subschemeHibernateDAO; @Autowired private FinancialYearHibernateDAO finHibernateDao; private String allowForward = ""; private Date latestMBDate; private String refNo; public ContractorBillAction() { } @Override public void prepare() { super.prepare(); if (id != null) { contractorBillRegister = contractorBillService.findById(id, false); if (contractorBillRegister.getBillstatus().equals("CANCELLED")) { for (final MBForCancelledBill mbCancelBillObj : contractorBillService.getMbListForCancelBill(id)) if (!mbHeaderListForBillId.contains(mbCancelBillObj.getMbHeader())) mbHeaderListForBillId.add(mbCancelBillObj.getMbHeader()); } else mbHeaderListForBillId = measurementBookService.findAllByNamedQuery("getAllMBsForBillId", WorksConstants.APPROVED, id); if (mbHeaderListForBillId != null && !mbHeaderListForBillId.isEmpty()) { workOrder = mbHeaderListForBillId.get(0).getWorkOrder(); workOrderId = workOrder.getId(); workOrderEstimate = mbHeaderListForBillId.get(0).getWorkOrderEstimate(); } } if (workOrderId != null) { workOrder = (WorkOrder) persistenceService.find("from WorkOrder where id=?", workOrderId); workOrderEstimateList.addAll(getPersistenceService().findAllByNamedQuery( "getWorkOrderEstimateByWorkOrderId", workOrderId)); loadTenderDetails(); } if (id != null) { if (StringUtils.isNotBlank(isRebatePremLevelBill) && isRebatePremLevelBill.equals("yes") || isRCEstimate.equalsIgnoreCase(WorksConstants.YES)) billAmount = contractorBillService.getApprovedMBAmountforBill(contractorBillRegister); if (!isRCEstimate.equalsIgnoreCase(WorksConstants.YES)) tenderedItemsAmount = contractorBillService .getApprovedMBAmountOfTenderedItemsForBill(contractorBillRegister); } if (workOrderEstimateId != null) workOrderEstimate = (WorkOrderEstimate) persistenceService.find("from WorkOrderEstimate where id=?", workOrderEstimateId); if (workOrderEstimateList.isEmpty()) addDropdownData("workOrderEstimateList", Collections.EMPTY_LIST); else { workOrderEstimateList = measurementBookService.getWOEstForBillExludingLegacyMB(workOrderEstimateList); addDropdownData("workOrderEstimateList", workOrderEstimateList); } if (workOrderEstimateList.size() == 1 && id == null) { workOrderEstimate = workOrderEstimateList.get(0); mbHeaderList = measurementBookService.getApprovedMBList(workOrder.getId(), workOrderEstimate.getId(), new Date()); } try { if (workOrderEstimate != null && workOrderEstimate.getId() != null) { isSkipBudgetCheck(); addDropdownData(ASSET_LIST, workOrderEstimate.getAssetValues()); final String accountCodeFromBudgetHead = worksService .getWorksConfigValue("BILL_DEFAULT_BUDGETHEAD_ACCOUNTCODE"); if (workOrderEstimate.getEstimate().getNatureOfWork().getCode().equals(CAPITAL_WORKS) || workOrderEstimate.getEstimate().getNatureOfWork().getCode().equals(IMPROVEMENT_WORKS)) { if (StringUtils.isNotBlank(accountCodeFromBudgetHead) && "no".equals(accountCodeFromBudgetHead) && StringUtils.isNotBlank(worksService.getWorksConfigValue(KEY_CWIP))) addDropdownData(COA_LIST, chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer.valueOf(worksService .getWorksConfigValue(KEY_CWIP)))); else if (StringUtils.isNotBlank(accountCodeFromBudgetHead) && "yes".equals(accountCodeFromBudgetHead)) { final List<BudgetGroup> budgetGroupList = new ArrayList<BudgetGroup>(); if (workOrderEstimate.getEstimate().getFinancialDetails().get(0).getBudgetGroup() != null) budgetGroupList.add(workOrderEstimate.getEstimate().getFinancialDetails().get(0) .getBudgetGroup()); final List<CChartOfAccounts> coaList = budgetService .getAccountCodeForBudgetHead(budgetGroupList); addDropdownData(COA_LIST, coaList); } else addDropdownData(COA_LIST, Collections.EMPTY_LIST); } else if (workOrderEstimate.getEstimate().getNatureOfWork().getCode().equals(REPAIR_AND_MAINTENANCE)) { if (StringUtils.isNotBlank(accountCodeFromBudgetHead) && "no".equals(accountCodeFromBudgetHead) && StringUtils.isNotBlank(worksService.getWorksConfigValue(KEY_REPAIRS))) addDropdownData(COA_LIST, chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer.valueOf(worksService .getWorksConfigValue(KEY_REPAIRS)))); else if (StringUtils.isNotBlank(accountCodeFromBudgetHead) && "yes".equals(accountCodeFromBudgetHead)) { final List<BudgetGroup> budgetGroupList = new ArrayList<BudgetGroup>(); if (workOrderEstimate.getEstimate().getFinancialDetails().get(0).getBudgetGroup() != null) budgetGroupList.add(workOrderEstimate.getEstimate().getFinancialDetails().get(0) .getBudgetGroup()); final List<CChartOfAccounts> coaList = budgetService .getAccountCodeForBudgetHead(budgetGroupList); addDropdownData(COA_LIST, coaList); } else addDropdownData(COA_LIST, Collections.EMPTY_LIST); } else if (getAppConfigValuesToSkipBudget().contains( workOrderEstimate.getEstimate().getNatureOfWork().getName())) if (StringUtils.isNotBlank(worksService.getWorksConfigValue(KEY_DEPOSIT)) && !skipBudget) // Story# 806 - Show all the CWIP codes in the // contractor bill screen where we show the deposit COA // code now // addDropdownData(COA_LIST, // commonsService.getAccountCodeByPurpose(Integer.valueOf(worksService.getWorksConfigValue(KEY_DEPOSIT)))); addDropdownData(COA_LIST, chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer.valueOf(worksService .getWorksConfigValue(KEY_CWIP)))); else addDropdownData(COA_LIST, Collections.EMPTY_LIST); } populateOtherDeductionList(); setRetentionMoneyConfigValues(); } catch (final ApplicationException v) { logger.error("Unable to COA for WorkOrder" + v); addFieldError("COA.notfound", "Unable to COA for WorkOrder"); } if (contractorBillRegister != null && contractorBillRegister.getBilldate() == null && workOrderEstimateList.size() == 1) { workOrderEstimateId = workOrderEstimateList.get(0).getId(); setBudgetDetails(workOrderId, workOrderEstimateId, new Date()); } if (workOrderEstimate.getId() != null && workOrderId != null && id == null) tenderedItemsAmount = contractorBillService.getApprovedMBAmountOfTenderedItems(workOrderId, workOrderEstimate.getId(), new Date()); /* * else if(contractorBillRegister!=null && workOrderEstimateList.size()>1) { * setBudgetDetails(workOrderId,workOrderEstimateId ,contractorBillRegister.getBilldate()); } */ addDropdownData("billTypeList", contractorBillService.getBillType()); final List<Recovery> statutoryDeductionsList = recoveryService.getAllTdsByPartyType("Contractor"); addDropdownData("statutoryDeductionsList", statutoryDeductionsList); addDropdownData("executingDepartmentList", departmentService.getAllDepartments()); /* * if (abstractEstimateService.getLatestAssignmentForCurrentLoginUser() != null) * contractorBillRegister.setWorkflowDepartmentId(abstractEstimateService * .getLatestAssignmentForCurrentLoginUser().getDepartment().getId()); */ // Setting the functionary as UAC for the workflow if (contractorBillRegister != null && contractorBillRegister.getId() != null && contractorBillRegister.getState() != null && contractorBillRegister.getState().getNextAction() != null && (contractorBillRegister.getState().getNextAction().equalsIgnoreCase(PENDING_FOR_VERIFICATION) || contractorBillRegister.getState().getNextAction().equalsIgnoreCase(PENDING_FOR_VALIDATION) || contractorBillRegister.getState().getNextAction().equalsIgnoreCase(PENDING_FOR_APPROVAL) || contractorBillRegister.getState().getNextAction() .equalsIgnoreCase(PENDING_FOR_RECTIFICATION) || contractorBillRegister.getState() .getNextAction().equalsIgnoreCase(PENDING_FOR_CHECK) && contractorBillRegister.getState().getValue().equalsIgnoreCase("REJECTED"))) { final Functionary func = (Functionary) persistenceService.find(" from Functionary where upper(name) = ?", "UAC"); workflowFunctionaryId = func.getId(); } showSubPartyType = worksService.getWorksConfigValue(BILL_STATUTORYDEDUCTIONS_SHOW_PARTYSUBTYPE); logger.debug("showSubPartyType>>>>>> " + showSubPartyType); showTypeOfWork = worksService.getWorksConfigValue(BILL_STATUTORYDEDUCTIONS_SHOW_SERVICETYPE); logger.debug("showTypeOfWork>>>>>> " + showTypeOfWork); editStatutoryAmount = worksService.getWorksConfigValue(BILL_STATUTORYDEDUCTIONS_EDITABLE); logger.debug("editStatutoryAmount>>>>>>> " + editStatutoryAmount); List<EgPartytype> subPartyTypeList = new ArrayList<EgPartytype>(); List<EgwTypeOfWork> typeOfWorkList = new ArrayList<EgwTypeOfWork>(); if (showSubPartyType != null && showSubPartyType != "") { subPartyTypeList = egPartytypeHibernateDAO.getSubPartyTypesForCode(PARTY_TYPE_CODE); addDropdownData("subPartyTypeList", subPartyTypeList); } else addDropdownData("subPartyTypeList", subPartyTypeList); if (showTypeOfWork != null && showTypeOfWork != "") { typeOfWorkList = getPersistenceService().findAllBy("from EgwTypeOfWork wt where wt.parentid is null"); addDropdownData("typeOfWorkList", typeOfWorkList); } else addDropdownData("typeOfWorkList", typeOfWorkList); getLastCreatedMBDate(); } private void getLastCreatedMBDate() { if (id == null && workOrderEstimateList.size() == 1 || contractorBillRegister.getStatus() != null && (contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || contractorBillRegister .getStatus().getCode().equalsIgnoreCase(WorksConstants.REJECTED))) { final Object[] mbDateRefNo = contractorBillService.getLatestMBCreatedDateAndRefNo(workOrderId, workOrderEstimate.getEstimate().getId()); if (mbDateRefNo != null && mbDateRefNo.length > 0) { refNo = (String) mbDateRefNo[0]; latestMBDate = (Date) mbDateRefNo[1]; } } } private void checkForBillsInWorkflowForDepositWorks() { allowForward = WorksConstants.YES; if (workOrderEstimate.getEstimate().getDepositCode() != null && skipBudget && StringUtils.isNotBlank(worksService.getWorksConfigValue(KEY_DEPOSIT))) // Checking for bills in workflow whether the account code selected // is same as in the mapping table. If different, set the // allowForward variable which will be used to hide the // forward/approve button if (!sourcepage.equalsIgnoreCase("search") && contractorBillRegister.getStatus() != null && !(contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || contractorBillRegister.getStatus().getCode() .equalsIgnoreCase(ContractorBillRegister.BillStatus.REJECTED.toString()) || contractorBillRegister.getStatus().getCode() .equalsIgnoreCase(ContractorBillRegister.BillStatus.APPROVED.toString()) || contractorBillRegister .getStatus().getCode() .equalsIgnoreCase(ContractorBillRegister.BillStatus.CANCELLED.toString()))) allowForward = contractorBillService.validateForBudgetHeadInWorkflow( contractorBillRegister.getEgBilldetailes(), workOrderEstimate.getEstimate()); } private void populateBudgetHeadForDepositWorksEstimate() { if (StringUtils.isNotBlank(worksService.getWorksConfigValue(KEY_DEPOSIT)) && skipBudget && workOrderEstimate.getEstimate() != null && workOrderEstimate.getEstimate().getFinancialDetails() != null && workOrderEstimate.getEstimate().getFinancialDetails().get(0) != null && workOrderEstimate.getEstimate().getFinancialDetails().get(0).getCoa() != null && workOrderEstimate.getEstimate().getDepositCode() != null) if (id == null || contractorBillRegister.getStatus() != null && (contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || contractorBillRegister .getStatus().getCode().equalsIgnoreCase(WorksConstants.REJECTED))) { final List<CChartOfAccounts> mappedBudgetHeadList = contractorBillService .getBudgetHeadForDepositCOA(workOrderEstimate.getEstimate()); if (mappedBudgetHeadList.isEmpty()) { showValidationMsg = WorksConstants.YES; addDropdownData(COA_LIST, Collections.EMPTY_LIST); addFieldError("contractoBill.depositCOA.budgetHead.mapping.error", getText("contractoBill.depositCOA.budgetHead.mapping.error")); } else addDropdownData(COA_LIST, mappedBudgetHeadList); } else addDropdownData(COA_LIST, chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer.valueOf(worksService .getWorksConfigValue(KEY_CWIP)))); } private void loadTenderDetails() { tenderResponse = (TenderResponse) persistenceService.find( "from TenderResponse tr where tr.negotiationNumber=? and " + " tr.egwStatus.code !=? ", workOrder.getNegotiationNumber(), TenderResponse.TenderResponseStatus.CANCELLED.toString()); rebatePremLevel = worksService.getWorksConfigValue("REBATE_PREMIUM_LEVEL"); if (rebatePremLevel.equalsIgnoreCase(WorksConstants.BILL)) isRebatePremLevelBill = WorksConstants.YES; else isRebatePremLevelBill = WorksConstants.NO; final List<String> tenderTypeList = worksService.getTendertypeList(); if (tenderTypeList != null && !tenderTypeList.isEmpty()) percTenderType = tenderTypeList.get(0); } private void setRetentionMoneyConfigValues() { isRetMoneyAutoCalculated = worksService.getWorksConfigValue("IS_RETENTION_MONEY_AUTOCALCULATED"); isRetMoneyEditable = worksService.getWorksConfigValue("IS_RETENTION_MONEY_EDITABLE"); percDeductForRetMoneyPartBill = worksService .getWorksConfigValue("PERCENTAGE_DEDUCTION_FOR_RETENTION_MONEY_PART_BILL"); percDeductForRetMoneyFinalBill = worksService .getWorksConfigValue("PERCENTAGE_DEDUCTION_FOR_RETENTION_MONEY_FINAL_BILL"); retMoneyFinalBillPerOnValue = worksService.getWorksConfigValue("RETENTION_MONEY_PERCENTAGE_ON_VALUE"); } @SkipValidation public String edit() throws Exception { if (SOURCE_INBOX.equalsIgnoreCase(sourcepage)) { final User user = userService.getUserById(worksService.getCurrentLoggedInUserId()); final boolean isValidUser = worksService.validateWorkflowForUser(contractorBillRegister, user); if (isValidUser) throw new ApplicationRuntimeException("Error: Invalid Owner - No permission to view this page."); } else if (StringUtils.isEmpty(sourcepage)) sourcepage = "search"; checklistValues.add("Yes"); checklistValues.add("No"); contractorBillRegister = getContractorbillregisterforbillnumber(contractorBillRegister.getBillnumber());// contractorBillService.findByNamedQuery("getContractorBillRegister",contractorBillRegister.getBillnumber()); if (contractorBillRegister != null) { setId(contractorBillRegister.getId()); if (!isRCEstimate.equalsIgnoreCase(WorksConstants.YES)) if (!(isRebatePremLevelBill.equals("yes") && tenderResponse.getTenderEstimate().getTenderType() .equals(getPercTenderType()))) setBillAmount(contractorBillRegister.getPassedamount()); setCompletionDate(workOrderEstimate.getWorkCompletionDate()); setPartyBillNumber(contractorBillRegister.getEgBillregistermis().getPartyBillNumber()); setPartyBillDate(contractorBillRegister.getEgBillregistermis().getPartyBillDate()); if (contractorBillRegister.getBillstatus().equals("CANCELLED")) { for (final MBForCancelledBill mbCancelBillObj : contractorBillService.getMbListForCancelBill(id)) if (!mbHeaderList.contains(mbCancelBillObj.getMbHeader())) mbHeaderList.add(mbCancelBillObj.getMbHeader()); } else for (final MBHeader mbObj : contractorBillService.getMbListForBillAndWorkordrId(workOrderId, id)) if (!mbHeaderList.contains(mbObj)) mbHeaderList.add(mbObj); workOrderEstimate = mbHeaderList.get(0).getWorkOrderEstimate(); populateBudgetHeadForDepositWorksEstimate(); checkForBillsInWorkflowForDepositWorks(); totalAdvancePaid = contractorAdvanceService.getTotalAdvancePaymentMadeByWOEstimateId( workOrderEstimate.getId(), contractorBillRegister.getBilldate()); setTotalPendingBalance(contractorBillService.calculateTotalPendingAdvance(totalAdvancePaid, contractorBillRegister.getBilldate(), workOrderEstimate, contractorBillRegister.getId())); setAdvaceAdjustmentCreditAmount(contractorBillService.getAdvanceAdjustmentAmountForBill(id, workOrderEstimate.getId())); setNetPayableCode(contractorBillService.getNetPaybleCode(id).longValue()); setNetPayableAmount(contractorBillService.getNetPayableAmountForGlCodeId(id)); disp = "yes"; // setUtilizedAmount(contractorBillService.getTotalUtilizedAmount(wortionStatutorydetails::"+actionStatutorydetails); contractorBillService.setAllViewLists(id, workOrderId, workOrderEstimate.getId(), actionStatutorydetails, standardDeductions, customDeductions, retentionMoneyDeductions, accountDetailsForBill); final List<EgChecklists> list = contractorBillService.getEgcheckList(id); int i = 0; selectedchecklistValue = new String[list.size()]; for (final EgChecklists egChecklists : list) { finalBillChecklist.add(egChecklists.getAppconfigvalue()); selectedchecklistValue[i] = egChecklists.getChecklistvalue(); i++; } } return EDIT; } @SkipValidation public String viewCompletionCertificate() { ReportRequest reportRequest = null; final Map<String, Object> reportParams = new HashMap<String, Object>(); reportParams.put(WorksConstants.PARAMETERNAME_WORKCOMPLETIONINFO, getWorkcompletionInfo()); reportRequest = new ReportRequest(WorksConstants.TEMPLATENAME_COMPLETIONCERTIFICATE, getWorkCompletionDetailInfo(), reportParams); final ReportOutput reportOutput = reportService.createReport(reportRequest); if (reportOutput != null && reportOutput.getReportOutputData() != null) completionCertificatePDF = new ByteArrayInputStream(reportOutput.getReportOutputData()); return PRINT; } public List<WorkCompletionDetailInfo> getWorkCompletionDetailInfo() { final List<MBHeader> mbHeaderList = persistenceService.findAllByNamedQuery( WorksConstants.QUERY_GETALLMBHEADERSBYBILLID, contractorBillRegister.getId()); if (!mbHeaderList.isEmpty()) return contractorBillService.setWorkCompletionDetailInfoList(mbHeaderList.get(0).getWorkOrderEstimate()); return new ArrayList<WorkCompletionDetailInfo>(); } public WorkCompletionInfo getWorkcompletionInfo() { final List<MBHeader> mbHeaderList = persistenceService.findAllByNamedQuery( WorksConstants.QUERY_GETALLMBHEADERSBYBILLID, contractorBillRegister.getId()); if (!mbHeaderList.isEmpty()) return contractorBillService.setWorkCompletionInfoFromBill(contractorBillRegister, mbHeaderList.get(0) .getWorkOrderEstimate()); return new WorkCompletionInfo(); } public ContractorBillRegister getContractorbillregisterforbillnumber(final String billNumber) { return contractorBillService.findByNamedQuery("getContractorBillRegister", billNumber); } @Override public Object getModel() { return contractorBillRegister; } @SkipValidation public String view() { return "view"; } public void setModel(final ContractorBillRegister contractorBillRegister) { this.contractorBillRegister = contractorBillRegister; } @Override public String execute() { return SUCCESS; } @SkipValidation @Action(value = "/contractorBill/contractorBill-newform") public String newform() { if (!contractorBillService.getBillType().isEmpty()) { final List<MBHeader> objList = measurementBookService.getPartBillList(workOrderId, contractorBillService .getBillType().get(0).toString()); contractorBillRegister.setBillSequenceNumber(objList.size() + 1); } populateBudgetHeadForDepositWorksEstimate(); return NEW; } private void validateMilestoneCompletion() { if (id == null) { List<TrackMilestone> tm = null; if (contractorBillRegister.getBilltype().equals(contractorBillService.getBillType().get(1).toString())) { tm = persistenceService .findAllBy( " select trmls from WorkOrderEstimate as woe left join woe.milestone mls left join mls.trackMilestone trmls where trmls.egwStatus.code='APPROVED' and woe.workOrder.id = ? and trmls.total=100 ", workOrderId); if (tm == null || tm.isEmpty() || tm.get(0) == null) addActionError(getText("contactor.final.bill.milestone.ajaxmsg")); } if (contractorBillRegister.getBilltype().equals(contractorBillService.getBillType().get(0).toString())) { tm = persistenceService .findAllBy( " select trmls from WorkOrderEstimate as woe left join woe.milestone mls left join mls.trackMilestone trmls where trmls.egwStatus.code='APPROVED' and woe.workOrder.id = ? and trmls.total>0 ", workOrderId); if (tm == null || tm.isEmpty() || tm.get(0) == null) addActionError(getText("contactor.final.bill.milestone.ajaxmsg")); } } } public String save() throws Exception { String actionName = ""; if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null) actionName = parameters.get(ACTION_NAME)[0]; if (contractorBillRegister.getStatus() == null || WorksConstants.REJECTED.equalsIgnoreCase(contractorBillRegister.getStatus().getCode()) && StringUtils.isBlank(contractorBillRegister.getState().getNextAction()) || NEW.equalsIgnoreCase(contractorBillRegister.getStatus().getCode())) { contractorBillRegister.getEgBilldetailes().clear(); contractorBillRegister.getStatutoryDeductionsList().clear(); contractorBillRegister.getDeductionTypeList().clear(); contractorBillRegister.getAssetDetailsList().clear(); } workOrderEstimate = (WorkOrderEstimate) persistenceService.find("from WorkOrderEstimate where id=?", workOrderEstimateId); validateMilestoneCompletion(); if (id == null) mbHeaderList = measurementBookService.getApprovedMBList(workOrderId, workOrderEstimateId, contractorBillRegister.getBilldate()); else mbHeaderList = contractorBillService.getMbListForBillAndWorkordrId(workOrderId, id); if (mbHeaderList == null || mbHeaderList.isEmpty()) throw new ValidationException(Arrays.asList(new ValidationError("error", getText( "no.approved.mb.for.billdate", new String[] { new SimpleDateFormat("dd/MM/yyyy").format(contractorBillRegister.getBilldate()) })))); if (!actionName.equalsIgnoreCase("reject")) { validateARFInWorkflow(); // Validation is done only for deposit works estimates on save and // submit if (workOrderEstimate.getEstimate() != null && workOrderEstimate.getEstimate().getDepositCode() != null) { validateExpenditureForDepositCode(actionName); validateBudgetHeadForBillsInWorkflow(); } } ContractorBillRegister contractorBill = null; try { contractorBill = setEgBillRegister(); } catch (final ValidationException sequenceException) { final List<ValidationError> errorList = sequenceException.getErrors(); for (final ValidationError error : errorList) if (error.getMessage().contains("DatabaseSequenceFirstTimeException")) { prepare(); throw new ValidationException(Arrays.asList(new ValidationError("error", error.getMessage()))); } throw sequenceException; } // Story #806 - IF the budget check is enabled to the CWIP code then // budget check should happen for Deposit works // if(!skipBudget) final User user = userService.getUserById(worksService.getCurrentLoggedInUserId()); if (contractorBillRegister.getStatus() == null || contractorBillRegister.getStatus() != null && (contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || contractorBillRegister .getStatus().getCode().equalsIgnoreCase(WorksConstants.REJECTED) && user == contractorBillRegister.getCreatedBy())) { if (logger.isDebugEnabled()) logger.debug("entered condition for budgetary appropriation >>>>>>>>>>>>>> "); isSkipBudgetCheck(); checkBudgetandGenerateNumber(contractorBill); } if (contractorBillRegister.getStatus() == null) contractorBillRegister.setStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(BILL_MODULE_KEY, WorksConstants.NEW)); contractorBillService.persist(contractorBillRegister); if (contractorBillRegister.getBilltype().equals(contractorBillService.getBillType().get(1).toString())) { workOrderEstimate.setWorkCompletionDate(getCompletionDate()); // workOrder.setWorkCompletionDate(getCompletionDate()); contractorBillRegister.setBillSequenceNumber(null); int i = 0; for (final WorkCompletionDetailInfo workCompletionDetailInfo : getWorkCompletionDetailInfo()) { if (getRemarks() != null && getRemarks().length > i && getRemarks()[i] != null) workCompletionDetailInfo.getWorkOrderActivity().setRemarks(getRemarks()[i]); i++; } } for (final MBHeader mbObj : mbHeaderList) mbObj.setEgBillregister(contractorBillRegister); if (appConfigValueId != null && selectedchecklistValue != null && appConfigValueId.length > 0 && selectedchecklistValue.length > 0) for (int i = 0; i < appConfigValueId.length; i++) if (appConfigValueId[i] != null && !selectedchecklistValue[i].equals("-1")) { final EgChecklists checklist = new EgChecklists(); checklist.setAppconfigvalue((AppConfigValues) getPersistenceService().find( "from AppConfigValues where id=?", Integer.valueOf(appConfigValueId[i].toString()))); checklist.setChecklistvalue(selectedchecklistValue[i]); checklist.setObjectid(contractorBillRegister.getId()); checklistService.persist(checklist); } /* * contractorBillRegister = workflowService.transition(actionName, contractorBillRegister, * contractorBillRegister.getWorkflowapproverComments()); */ // TODO - Need to know alternative for how to find previous when // workflow ended /* * if(contractorBillRegister.getCurrentState()!=null && contractorBillRegister.getCurrentState().getPrevious()!=null && * contractorBillRegister.getCurrentState().getValue()!=null && (APPROVED * .equalsIgnoreCase(contractorBillRegister.getCurrentState().getPrevious ().getValue()) || * CANCELLED.equalsIgnoreCase(contractorBillRegister.getCurrentState ().getPrevious().getValue()))){ * messageKey="bill.approved"; contractorBillRegister .setBillstatus(contractorBillRegister.getCurrentState * ().getPrevious().getValue()); contractorBillRegister.setStatus(commonsService * .getStatusByModuleAndCode(BILL_MODULE_KEY, contractorBillRegister.getCurrentState().getPrevious().getValue())); } else */ { messageKey = "bill.save.success"; contractorBillRegister.setBillstatus(contractorBillRegister.getCurrentState().getValue()); contractorBillRegister.setStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(BILL_MODULE_KEY, contractorBillRegister.getCurrentState().getValue())); } getPersistenceService().getSession().flush(); getPersistenceService().getSession().refresh(contractorBillRegister); contractorBillRegister.getEgBillregistermis().setSourcePath( "/egworks/contractorBill/contractorBill!edit.action?id=" + contractorBillRegister.getId() + "&workOrderId=" + workOrderId + "&billnumber=" + contractorBillRegister.getBillnumber() + "&sourcepage=search"); addActionMessage(getText(messageKey, messageKey)); getDesignation(contractorBillRegister); if (SAVE_ACTION.equals(actionName)) sourcepage = "inbox"; return SAVE_ACTION.equals(actionName) ? edit() : SUCCESS; } private String isSkipBudgetCheck() { final List<AppConfigValues> appConfigValuesList = worksService.getAppConfigValue("Works", APPCONFIG_KEY_NAME); logger.info("lenght of appconfig values>>>>>> " + appConfigValuesList.size()); if (workOrderEstimate != null && workOrderEstimate.getId() != null) { for (final AppConfigValues appValues : appConfigValuesList) if (appValues.getValue().equals(workOrderEstimate.getEstimate().getNatureOfWork().getName())) { skipBudget = true; return CHECK_BUDGET; } skipBudget = false; } return CHECK_BUDGET; } private void validateBudgetHeadForBillsInWorkflow() { if (StringUtils.isNotBlank(allowForward) && allowForward.equalsIgnoreCase(WorksConstants.NO)) { populateBudgetHeadForDepositWorksEstimate(); throw new ValidationException(Arrays.asList(new ValidationError( "contractoBill.depositCOA.budgetHead.mapping.workflow.error", getText( "contractoBill.depositCOA.budgetHead.mapping.workflow.error", new String[] { workOrderEstimate.getEstimate().getEstimateNumber() })))); } } private ContractorBillRegister checkBudgetandGenerateNumber(final ContractorBillRegister contractorBill) { final ScriptContext scriptContext = ScriptService.createContext("voucherService", voucherService, "bill", contractorBill); scriptExecutionService.executeScript("egf.bill.budgetcheck", scriptContext); return contractorBill; } public void getDesignation(final ContractorBillRegister bill) { if (contractorBillRegister.getCurrentState() != null && !"NEW".equalsIgnoreCase(bill.getCurrentState().getValue())) { final String result = worksService.getEmpNameDesignation(contractorBillRegister.getState() .getOwnerPosition(), contractorBillRegister.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 String cancel() { parameters.get("actionName"); if (contractorBillRegister.getId() != null) { /* * contractorBillRegister = workflowService.transition(actionName, contractorBillRegister, * contractorBillRegister.getWorkflowapproverComments()); */ contractorBillRegister.setBillstatus(WorksConstants.CANCELLED_STATUS); contractorBillRegister.setStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(BILL_MODULE_KEY, WorksConstants.CANCELLED_STATUS)); contractorBillService.persist(contractorBillRegister); final List<MBHeader> mbHeaderListForBillIdForCancellingBill = measurementBookService.findAllByNamedQuery( "getAllMBsForBillId", WorksConstants.APPROVED, contractorBillRegister.getId()); if (StringUtils.isNotBlank(isRebatePremLevelBill) && isRebatePremLevelBill.equals("yes") && tenderResponse.getTenderEstimate().getTenderType().equals(getPercTenderType()) || isRCEstimate.equalsIgnoreCase(WorksConstants.YES)) { contractorBillRegister.setPassedamount(grossAmount); contractorBillRegister.setBillamount(grossAmount); } else contractorBillRegister.setPassedamount(contractorBillRegister.getBillamount()); for (final MBHeader mbObj : mbHeaderListForBillIdForCancellingBill) { final MBForCancelledBill mbCB = new MBForCancelledBill(); mbCB.setEgBillregister(mbObj.getEgBillregister()); mbCB.setMbHeader(mbObj); cancelBillService.persist(mbCB); } } return SUCCESS; } @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 (contractorBillRegister.getBilltype().equals("-1")) addFieldError("billType", getText("billType.not.found")); else if (contractorBillRegister.getBilltype().equals(contractorBillService.getBillType().get(1).toString()) && completionDate == null) addFieldError("completionDate", getText("completionDate.not.found")); if (StringUtils.isBlank(partyBillNumber)) addFieldError("partyBillNumber", getText("partyBillNumber.not.found")); if (!worksService.checkBigDecimalValue(contractorBillRegister.getBillamount(), BigDecimal.valueOf(0.00))) addFieldError("billamount", getText("no.pending.bills")); if (partyBillDate == null) addFieldError("partyBillDate", getText("partyBillDate.not.found")); if (!DateUtils.compareDates(new Date(), partyBillDate)) addFieldError("partyBillDate", getText("partyBillDate.greaterthan.currentDate")); if (!DateUtils.compareDates(contractorBillRegister.getBilldate(), completionDate)) addFieldError("completionDate", getText("billdate.lessthan.completionDate")); if (!DateUtils.compareDates(contractorBillRegister.getBilldate(), workOrder.getWorkOrderDate())) addFieldError("workorderdate", getText("billdate.lessthan.workorderdate")); if (contractorBillRegister.getId() == null) if (!DateUtils.compareDates(contractorBillRegister.getBilldate(), partyBillDate)) addFieldError("partyBillDate", getText("partybilldate.greaterthan.billdate")); if (contractorBillRegister.getId() == null) validateMBAmountAndBillAmount(mbHeaderList); if (contractorBillRegister.getStatus() != null && contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW)) validateMBAmountAndBillAmount(mbHeaderListForBillId); // validation to avoid duplication of bill generation if (contractorBillRegister.getId() == null && contractorBillRegister.getStatus() == null) if (mbHeaderId != null && mbHeaderId.length > 0) { final List<MBHeader> mbHeaderWithBill = new ArrayList<MBHeader>(); for (final Long mbId : mbHeaderId) { final MBHeader mbHeader = measurementBookService.findById(mbId, false); if (mbHeader.getEgBillregister() != null && !mbHeader.getEgBillregister().getStatus().getCode().equalsIgnoreCase("CANCELLED")) mbHeaderWithBill.add(mbHeader); } final StringBuilder billStr = new StringBuilder(200); final StringBuilder mbStr = new StringBuilder(200); for (final MBHeader mbh : mbHeaderWithBill) { if (!billStr.toString().contains(mbh.getEgBillregister().getBillnumber())) billStr.append(mbh.getEgBillregister().getBillnumber()).append(","); mbStr.append(mbh.getMbRefNo()).append(","); if (mbHeaderWithBill.size() == 1) addActionError(getText("contractorBill.uniqueCheck.message1", new String[] { mbh.getEgBillregister().getBillnumber(), mbh.getMbRefNo() })); } if (mbHeaderWithBill.size() > 1) addActionError(getText("contractorBill.uniqueCheck.message2", new String[] { billStr.toString(), mbStr.toString() })); } if (contractorBillRegister.getId() == null) { Date latestBillDate = null; if (workOrderEstimate != null && workOrderEstimate.getId() != null) latestBillDate = measurementBookService.getLatestBillDateForMBPassingWOEstimate(workOrderEstimate .getId()); else latestBillDate = measurementBookService.getLatestBillDateForMB(workOrderId); if (latestBillDate != null && !DateUtils.compareDates(contractorBillRegister.getBilldate(), latestBillDate)) addFieldError("billdate", getText("billdate.lessthan.olderbill")); } if (Long.valueOf(0).equals(netPayableCode)) addFieldError("netPayableCode", getText("netPayableCode.not.found")); if (!worksService.checkBigDecimalValue(netPayableAmount, BigDecimal.valueOf(0.00))) addFieldError("netPayableAmount", getText("netPayableAmount.lessthan.zero")); validateAssetDetails(); validateStatutoryDeduction(); validateStandardDeduction(); validateCustomDeduction(); // Story# 806 - Application should not check for deposit code // appropriation /* * String actionName = ""; if (parameters.get(ACTION_NAME) != null && parameters.get(ACTION_NAME)[0] != null) * actionName = parameters.get(ACTION_NAME)[0]; if(skipBudget && ((contractorBillRegister.getStatus()==null && * !actionName.equalsIgnoreCase("save")) || (contractorBillRegister.getStatus()!=null && (contractorBillRegister * .getStatus().getCode().equalsIgnoreCase("NEW")|| contractorBillRegister * .getStatus().getCode().equalsIgnoreCase("REJECTED")) && (!actionName.equalsIgnoreCase("save") && * !actionName.equalsIgnoreCase("Cancel"))))){ validateGlcodeBalForDepositWorks(); } */ if (!checkForCOADuplicatesInAccDet()) addFieldError("accountcode", getText("duplicate.accountcode")); if (!checkForCOADuplicatesInCustomDed()) addFieldError("glcodeId", getText("duplicate.glcodeId")); // to re-populate the form data if any field error- only for edit // mode if (id == null || contractorBillRegister.getStatus() != null && (contractorBillRegister.getStatus().getCode().equalsIgnoreCase(WorksConstants.NEW) || contractorBillRegister .getStatus().getCode().equalsIgnoreCase(WorksConstants.REJECTED)) && StringUtils.isNotBlank(contractorBillRegister.getBilltype()) && contractorBillRegister.getBilltype().equalsIgnoreCase(WorksConstants.FINAL_BILL)) if (latestMBDate != null && completionDate != null && latestMBDate.after(completionDate)) addFieldError("work.compltion.date.less.than.lstMB.date", getText("work.compltion.date.less.than.lstMB.date") + " " + refNo + ", " + new SimpleDateFormat("dd/MM/yyyy").format(latestMBDate) + getText("pls.enter.valid.date")); if (id != null && !getFieldErrors().isEmpty()) try { edit(); } catch (final Exception e) { logger.error(e.getMessage()); } } } private void validateARFInWorkflow() { final AjaxContractorBillAction ajaxContractorBillAction = new AjaxContractorBillAction(); ajaxContractorBillAction.setPersistenceService(getPersistenceService()); ajaxContractorBillAction.setEmployeeService(employeeService); ajaxContractorBillAction.setContractorAdvanceService(contractorAdvanceService); ajaxContractorBillAction.setWorkOrderEstimateId(workOrderEstimate.getId()); ajaxContractorBillAction.advanceRequisitionInWorkflowCheck(); if (ajaxContractorBillAction.getArfInWorkFlowCheck().equalsIgnoreCase("invalid")) throw new ValidationException(Arrays.asList(new ValidationError("arf.workflow.verification.for.bill.msg", getText("arf.workflow.verification.for.bill.msg", new String[] { ajaxContractorBillAction.getAdvanceRequisitionNo(), ajaxContractorBillAction.getEstimateNo(), ajaxContractorBillAction.getOwner() })))); } private void validateExpenditureForDepositCode(final String actionName) { if (workOrderEstimate.getEstimate() != null && workOrderEstimate.getEstimate().getDepositCode() != null) if (StringUtils.isNotBlank(actionName) && (actionName.equalsIgnoreCase(WorksConstants.ACTION_SUBMIT_FOR_APPROVAL) || actionName.equalsIgnoreCase(WorksConstants.ACTION_APPROVAL) || actionName .equalsIgnoreCase(WorksConstants.ACTION_APPROVE))) { final FinancialDetail financialDetails = workOrderEstimate.getEstimate().getFinancialDetails().get(0); if (financialDetails != null) { BigDecimal expenditureAmount = BigDecimal.ZERO; BigDecimal totalExpAmount = BigDecimal.ZERO; final Fund fund = financialDetails.getFund(); final CChartOfAccounts coa = financialDetails.getCoa(); final Accountdetailtype accountdetailtype = (Accountdetailtype) persistenceService.find( "from Accountdetailtype where name=?", "DEPOSITCODE"); if (fund != null && fund.getId() != null && coa != null && coa.getId() != null && workOrderEstimate.getEstimate().getDepositCode().getId() != null) { final BigDecimal totalAmountDeposited = egovCommon.getDepositAmountForDepositCode(new Date(), coa.getGlcode(), fund.getCode(), accountdetailtype.getId(), workOrderEstimate .getEstimate().getDepositCode().getId().intValue()); final List<Integer> projectCodeIdsList = contractorBillService .getProjCodeIdsListForDepositCode(fund.getId(), coa.getId(), workOrderEstimate .getEstimate().getDepositCode().getId()); if (!projectCodeIdsList.isEmpty()) expenditureAmount = contractorBillService.getTotalExpenditure(projectCodeIdsList, WorksConstants.PROJECTCODE); // In case id is null, include the current bill amount if (id == null) totalExpAmount = expenditureAmount.add(contractorBillRegister.getBillamount()); else totalExpAmount = expenditureAmount; final BigDecimal finalExpenditureAmount = totalExpAmount.setScale(2, RoundingMode.HALF_UP); final BigDecimal totalDepositedAmount = totalAmountDeposited.setScale(2, RoundingMode.HALF_UP); if (totalDepositedAmount.compareTo(finalExpenditureAmount) == -1) { populateBudgetHeadForDepositWorksEstimate(); throw new ValidationException(Arrays.asList(new ValidationError( "contractoBill.dwEstimate.expenditure.amount.insufficient", getText( "contractoBill.dwEstimate.expenditure.amount.insufficient", new String[] { workOrderEstimate.getEstimate().getDepositCode().getCode(), NumberUtil.formatNumber(finalExpenditureAmount), NumberUtil.formatNumber(totalDepositedAmount) })))); } } } } } private void validateMBAmountAndBillAmount(final List<MBHeader> mbHeaderList) { BigDecimal totalMBAmount = BigDecimal.ZERO; for (final MBHeader mbh : mbHeaderList) totalMBAmount = totalMBAmount.add(mbh.getTotalMBAmount()); if (!(billAmount.setScale(2, RoundingMode.HALF_UP).compareTo(totalMBAmount.setScale(2, RoundingMode.HALF_UP)) == 0)) addFieldError("billAmount.compare.total.mbAmount", getText("billAmount.compare.total.mbAmount")); } protected void validateStandardDeduction() { for (final DeductionTypeForBill stanDetails : standardDeductions) if (stanDetails != null) { if (stanDetails.getDeductionType() == null || stanDetails.getGlcodeid().equals(BigDecimal.valueOf(0))) addFieldError("standardDeductions", getText("please.select.standardDeductions")); if (!worksService.checkBigDecimalValue(stanDetails.getCreditamount(), BigDecimal.valueOf(0.00))) addFieldError("amount", getText(AMOUNT_ERROR)); } } protected void validateCustomDeduction() { for (final EgBilldetails customDetails : customDeductions) if (customDetails != null) { if (customDetails.getGlcodeid().equals(BigDecimal.valueOf(0))) addFieldError("customDeductions", getText("please.select.customDeductions")); if (!worksService.checkBigDecimalValue(customDetails.getCreditamount(), BigDecimal.valueOf(0.00))) addFieldError("customDeductions.amount", getText(AMOUNT_ERROR)); } } protected void validateRetentionDeduction() { for (final EgBilldetails retentionMoney : retentionMoneyDeductions) if (retentionMoney != null) { if (retentionMoney.getGlcodeid().equals(BigDecimal.valueOf(0))) addFieldError("customDeductions", getText("please.select.retentionMoney")); if (!worksService.checkBigDecimalValue(retentionMoney.getCreditamount(), BigDecimal.valueOf(0.00))) addFieldError("retentionMoney.amount", getText(AMOUNT_ERROR)); } } protected void validateAssetDetails() { for (final AssetForBill adb : accountDetailsForBill) { if (workOrderEstimate.getAssetValues().isEmpty()) { if (adb != null && (adb.getCoa() == null || adb.getCoa().getId() == 0L)) addFieldError("coa", getText("please.select.asset")); } else if (adb != null && (adb.getAsset() == null || adb.getAsset().getId() == 0L) && (adb.getCoa() == null || adb.getCoa().getId() == 0L)) addFieldError("asset", getText("please.select.asset")); if (adb != null && !worksService.checkBigDecimalValue(adb.getAmount(), BigDecimal.valueOf(0.00))) addFieldError("asset.amount", getText(AMOUNT_ERROR)); } } protected void validateStatutoryDeduction() { for (final StatutoryDeductionsForBill adb : actionStatutorydetails) if (adb != null) { if (adb.getEgBillPayeeDtls().getRecovery() == null || adb.getEgBillPayeeDtls().getRecovery().getId() == 0) addFieldError("actionStatutorydetails", getText("please.select.actionStatutorydetails")); if (!worksService.checkBigDecimalValue(adb.getEgBillPayeeDtls().getCreditAmount(), BigDecimal.valueOf(0.00))) addFieldError("actionStatutorydetails.amount", getText(AMOUNT_ERROR)); } } public boolean checkForCOADuplicatesInAccDet() { final Collection<AssetForBill> assetAndAccountDetails = contractorBillService .getAssetAndAccountDetails(accountDetailsForBill); if (!assetAndAccountDetails.isEmpty() && workOrderEstimate.getAssetValues().isEmpty()) { final Set<Long> coaSet = new HashSet<Long>(); for (final AssetForBill assetForBill : assetAndAccountDetails) if (assetForBill.getCoa() != null && assetForBill.getCoa().getId() > 0L) { if (coaSet.contains(assetForBill.getCoa().getId())) return false; coaSet.add(assetForBill.getCoa().getId()); } } return true; } public boolean checkForCOADuplicatesInCustomDed() { final Collection<EgBilldetails> customDeductionTypes = contractorBillService.getCustomDeductionTypes(customDeductions); if (!customDeductionTypes.isEmpty()) { final Set<BigDecimal> coaSet = new HashSet<BigDecimal>(); for (final EgBilldetails egBilldetails : customDeductionTypes) if (egBilldetails.getGlcodeid() != null && worksService.checkBigDecimalValue(egBilldetails.getGlcodeid(), BigDecimal.valueOf(0))) { if (coaSet.contains(egBilldetails.getGlcodeid())) return false; coaSet.add(egBilldetails.getGlcodeid()); } } return true; } private ContractorBillRegister setEgBillRegister() throws Exception { boolean shouldAddAccountDetails = false; if (contractorBillRegister.getStatus() == null || WorksConstants.REJECTED.equalsIgnoreCase(contractorBillRegister.getStatus().getCode()) && StringUtils.isBlank(contractorBillRegister.getState().getNextAction()) || NEW.equalsIgnoreCase(contractorBillRegister.getStatus().getCode())) shouldAddAccountDetails = true; if (contractorBillRegister.getBillnumber() == null) contractorBillRegister.setBillnumber(contractorBillService.generateContractorBillNumber( contractorBillRegister)); contractorBillRegister.setBillstatus(BILL_STATUS); if (StringUtils.isNotBlank(isRebatePremLevelBill) && isRebatePremLevelBill.equals("yes") && tenderResponse.getTenderEstimate().getTenderType().equals(getPercTenderType()) || isRCEstimate.equalsIgnoreCase(WorksConstants.YES)) { contractorBillRegister.setPassedamount(grossAmount); contractorBillRegister.setBillamount(grossAmount); } else contractorBillRegister.setPassedamount(contractorBillRegister.getBillamount()); contractorBillRegister.setExpendituretype(EXPENDITURE_TYPE); contractorBillRegister.setWorkordernumber(workOrder.getWorkOrderNumber()); contractorBillRegister.setWorkorderdate(workOrder.getWorkOrderDate()); if (advaceAdjustmentCreditAmount.intValue() > 0) contractorBillRegister.setAdvanceadjusted(advaceAdjustmentCreditAmount); final List<FinancialDetail> fdList = financialDetailService.findAllByNamedQuery( "FINANCIALDETAILS_BY_ESTIMATEID", workOrderEstimate.getEstimate().getId()); contractorBillRegister.setEgBillregistermis(setEgBillregistermis(fdList)); if (shouldAddAccountDetails) addAccountDetails(fdList); return contractorBillRegister; } private void addAccountDetails(final List<FinancialDetail> fdList) throws Exception { final Map<String, BigDecimal> debitAmountMap = getGlcodesForDebit(); for (final Map.Entry<String, BigDecimal> entry : debitAmountMap.entrySet()) contractorBillRegister.getEgBilldetailes().add( getBillDetailsRegister(contractorBillRegister, fdList, entry.getKey(), entry.getValue(), true, false)); final Map<String, BigDecimal> creditAmountMap = getGlcodesForstanDed(); for (final Map.Entry<String, BigDecimal> entry : creditAmountMap.entrySet()) contractorBillRegister.getEgBilldetailes().add( getBillDetailsRegister(contractorBillRegister, fdList, entry.getKey(), entry.getValue(), false, false)); for (final EgBilldetails rbillDetails : contractorBillService.getRetentionMoneyTypes(retentionMoneyDeductions)) if (rbillDetails != null && worksService.checkBigDecimalValue(rbillDetails.getGlcodeid(), BigDecimal.valueOf(0))) { final EgBilldetails egbillDetails = getBillDetailsRegister(contractorBillRegister, fdList, rbillDetails .getGlcodeid().toString(), rbillDetails.getCreditamount(), false, false); egbillDetails.setNarration(rbillDetails.getNarration()); contractorBillRegister.getEgBilldetailes().add(egbillDetails); } for (final EgBilldetails billDetails : customDeductions) if (billDetails != null && worksService.checkBigDecimalValue(billDetails.getGlcodeid(), BigDecimal.valueOf(0))) { final EgBilldetails egbillDetails = getBillDetailsRegister(contractorBillRegister, fdList, billDetails .getGlcodeid().toString(), billDetails.getCreditamount(), false, false); egbillDetails.setNarration(billDetails.getNarration()); contractorBillRegister.getEgBilldetailes().add(egbillDetails); } final CChartOfAccounts advanceCOA = contractorAdvanceService .getContractorAdvanceAccountcodeForWOE(workOrderEstimate.getId()); if (advaceAdjustmentCreditAmount != null && advaceAdjustmentCreditAmount.intValue() > 0 && advanceCOA != null) contractorBillRegister.getEgBilldetailes().add( getBillDetailsRegister(contractorBillRegister, fdList, advanceCOA.getId().toString(), advaceAdjustmentCreditAmount, false, false)); final Map<String, BigDecimal> creditAmountStatMap = getGlcodesForStatDed(); for (final Map.Entry<String, BigDecimal> entry : creditAmountStatMap.entrySet()) contractorBillRegister.getEgBilldetailes().add( getBillDetailsRegister(contractorBillRegister, fdList, entry.getKey(), entry.getValue(), false, true)); contractorBillRegister.getEgBilldetailes().add( getBillDetailsRegister(contractorBillRegister, fdList, getNetPayableCode().toString(), getNetPayableAmount(), false, false)); } private EgBilldetails getBillDetailsRegister(final ContractorBillRegister billregister, final List<FinancialDetail> fdList, final String glcode, final BigDecimal amount, final boolean isDebit, final boolean isTds) throws Exception { final EgBilldetails billDetails = new EgBilldetails(); if (fdList != null && !fdList.isEmpty() && fdList.get(0).getFunction() != null && fdList.get(0).getFunction().getId() != null) { final CFunction fun = functionHibernateDao.getFunctionById(fdList.get(0).getFunction().getId()); billDetails.setFunctionid(BigDecimal.valueOf(fun.getId())); } CChartOfAccounts coa = null; if (StringUtils.isNotBlank(glcode) && Long.parseLong(glcode) > 0) coa = chartOfAccountsHibernateDAO.findById(Long.valueOf(glcode), false); if (coa != null && coa.getId() != null) billDetails.setGlcodeid(BigDecimal.valueOf(coa.getId())); if (isDebit) billDetails.setDebitamount(amount); else billDetails.setCreditamount(amount); billDetails.setEgBillregister(billregister); if (coa != null && coa.getGlcode() != null) { final List<Accountdetailtype> detailCode = chartOfAccountsHibernateDAO .getAccountdetailtypeListByGLCode(coa.getGlcode()); if (detailCode != null && !detailCode.isEmpty()) { Accountdetailtype adt1 = null; final Accountdetailtype adt2 = null; Accountdetailtype adt3 = null; if (isDebit) // Story# 806 - Enable code to create an contractor // bill // with project code as sub-ledger for the debit COA for // Deposit Works /* * if(skipBudget) { adt2 = chartOfAccountsHibernateDAO.getAccountDetailTypeIdByName (coa.getGlcode(), * ACCOUNTDETAIL_TYPE_DEPOSITCODE); if(adt2!=null){ if(isTds) addTdsDetails(amount, isDebit, isTds, billDetails, * adt2, Integer.valueOf(workOrderEstimate .getEstimate().getDepositCode().getId().toString())); else * billDetails.getEgBillPaydetailes().add(getEgPayeeDetails (billDetails * ,adt2.getId(),amount,isDebit,false,null,null,Integer .valueOf * (workOrderEstimate.getEstimate().getDepositCode(). getId().toString()))); } } else */ { adt3 = chartOfAccountsHibernateDAO.getAccountDetailTypeIdByName(coa.getGlcode(), ACCOUNTDETAIL_TYPE_PROJECTCODE); if (adt3 != null) if (isTds) addTdsDetails(amount, isDebit, isTds, billDetails, adt3, Integer.valueOf(workOrderEstimate .getEstimate().getProjectCode().getId().toString())); else billDetails.getEgBillPaydetailes().add( getEgPayeeDetails( billDetails, adt3.getId(), amount, isDebit, false, null, null, Integer.valueOf(workOrderEstimate.getEstimate().getProjectCode().getId() .toString()))); } else { adt1 = chartOfAccountsHibernateDAO.getAccountDetailTypeIdByName(coa.getGlcode(), ACCOUNTDETAIL_TYPE_CONTRACTOR); if (adt1 != null) if (isTds) addTdsDetails(amount, isDebit, isTds, billDetails, adt1, Integer.valueOf(workOrder.getContractor().getId().toString())); else billDetails.getEgBillPaydetailes().add( getEgPayeeDetails(billDetails, adt1.getId(), amount, isDebit, false, null, null, Integer.valueOf(workOrder.getContractor().getId().toString()))); } if (adt1 == null && adt2 == null && adt3 == null) { final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("contractorBill.validate_glcode_for_subledger", getText( "contractorBill.validate_glcode_for_subledger", new String[] { coa.getGlcode() }))); throw new ValidationException(errors); } } } return billDetails; } private void addTdsDetails(final BigDecimal amount, final boolean isDebit, final boolean isTds, final EgBilldetails billDetails, final Accountdetailtype adt, final Integer adkId) { for (final StatutoryDeductionsForBill payeeDetails : getActionStatutorydetails()) if (payeeDetails != null && payeeDetails.getEgBillPayeeDtls().getRecovery() != null && payeeDetails.getEgBillPayeeDtls().getRecovery().getId() != null && payeeDetails.getEgBillPayeeDtls().getRecovery().getChartofaccounts() != null && payeeDetails.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() != null && payeeDetails.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() .equals(Long.valueOf(billDetails.getGlcodeid().toString()))) { // Added for card 1078 : Automatic calculation of statutory // recoveries in bill final EgBillPayeedetails egPayeeDtls = getEgPayeeDetails(billDetails, adt.getId(), amount, isDebit, isTds, payeeDetails.getEgBillPayeeDtls().getRecovery().getId(), payeeDetails .getEgBillPayeeDtls().getNarration(), adkId); billDetails.getEgBillPaydetailes().add(egPayeeDtls); addStatutoryDeductionsForBill(payeeDetails, egPayeeDtls); } } private void addStatutoryDeductionsForBill(final StatutoryDeductionsForBill statutoryDeductionBill, final EgBillPayeedetails egPayeeDtls) { final StatutoryDeductionsForBill sdb = new StatutoryDeductionsForBill(); if (statutoryDeductionBill.getSubPartyType().getId() != null) sdb.setSubPartyType((EgPartytype) persistenceService.find("from EgPartytype where id=?", statutoryDeductionBill.getSubPartyType().getId())); if (statutoryDeductionBill.getTypeOfWork().getId() != null) sdb.setTypeOfWork((EgwTypeOfWork) persistenceService.find("from EgwTypeOfWork where id=?", statutoryDeductionBill.getTypeOfWork().getId())); sdb.setEgBillPayeeDtls(egPayeeDtls); sdb.setEgBillReg(contractorBillRegister); contractorBillRegister.addStatutoryDeductions(sdb); } private EgBillPayeedetails getEgPayeeDetails(final EgBilldetails billDetails, final Integer adtId, final BigDecimal amount, final boolean isDebit, final boolean isTds, final Long tdsId, final String narration, final Integer adkId) { final EgBillPayeedetails egBillPaydetail = new EgBillPayeedetails(); egBillPaydetail.setAccountDetailKeyId(adkId); egBillPaydetail.setAccountDetailTypeId(adtId); if (isDebit) egBillPaydetail.setDebitAmount(amount); else egBillPaydetail.setCreditAmount(amount); if (isTds) egBillPaydetail.setRecovery(recoveryService.getTdsById(tdsId)); if (narration != null) egBillPaydetail.setNarration(narration); egBillPaydetail.setEgBilldetailsId(billDetails); return egBillPaydetail; } private EgBillregistermis setEgBillregistermis(final List<FinancialDetail> fdList) throws ApplicationException { EgBillregistermis egBillRegisterMis = null; if (id == null) egBillRegisterMis = new EgBillregistermis(); else egBillRegisterMis = contractorBillRegister.getEgBillregistermis(); egBillRegisterMis.setEgBillregister(contractorBillRegister); egBillRegisterMis.setPayto(workOrder.getContractor().getName()); egBillRegisterMis.setFieldid(workOrderEstimate.getEstimate().getWard()); egBillRegisterMis.setPartyBillDate(partyBillDate); egBillRegisterMis.setPartyBillNumber(partyBillNumber); if (fdList != null && !fdList.isEmpty()) { if (fdList.get(0).getFund() != null && fdList.get(0).getFund().getId() != null) egBillRegisterMis.setFund(fundHibernateDao.fundById(fdList.get(0).getFund().getId(), false)); if (fdList.get(0).getFunctionary() != null && fdList.get(0).getFunctionary().getId() != null) egBillRegisterMis.setFunctionaryid(functionaryHibDao.functionaryById(fdList.get(0).getFunctionary() .getId().intValue())); if (fdList.get(0).getScheme() != null && fdList.get(0).getScheme().getId() != null) egBillRegisterMis.setScheme(schemeHibernateDAO.getSchemeById(fdList.get(0).getScheme().getId())); if (fdList.get(0).getSubScheme() != null && fdList.get(0).getSubScheme().getId() != null) egBillRegisterMis.setSubScheme(subschemeHibernateDAO.getSubSchemeById(fdList.get(0).getSubScheme().getId())); if (!fdList.get(0).getFinancingSources().isEmpty()) egBillRegisterMis.setFundsource(fdList.get(0).getFinancingSources().get(0).getFundSource()); if (fdList.get(0).getFunction() != null) egBillRegisterMis.setFunction(fdList.get(0).getFunction()); } egBillRegisterMis.setEgDepartment(workOrderEstimate.getEstimate().getUserDepartment()); final String finyearId = finHibernateDao.getFinancialYearByDate(contractorBillRegister.getBilldate()).getId() .toString(); egBillRegisterMis.setFinancialyear(finHibernateDao.getFinancialYearById(Long.valueOf(finyearId))); egBillRegisterMis.setLastupdatedtime(new Date()); return egBillRegisterMis; } public Map<String, BigDecimal> getGlcodesForDebit() { final Map<String, BigDecimal> debitGlcodeAndAmountMap = new HashMap<String, BigDecimal>(); final Set<Long> coaSet = new HashSet<Long>(); for (final AssetForBill assetBill : accountDetailsForBill) if (assetBill != null && assetBill.getCoa() != null && assetBill.getCoa().getId() != null) { if (coaSet.contains(assetBill.getCoa().getId())) { if (debitGlcodeAndAmountMap.containsKey(assetBill.getCoa().getId().toString())) { BigDecimal amount = debitGlcodeAndAmountMap.get(assetBill.getCoa().getId().toString()); amount = amount.add(assetBill.getAmount()); debitGlcodeAndAmountMap.put(assetBill.getCoa().getId().toString(), amount); } } else { debitGlcodeAndAmountMap.put(assetBill.getCoa().getId().toString(), assetBill.getAmount()); coaSet.add(assetBill.getCoa().getId()); } addAssetForBill(assetBill); } return debitGlcodeAndAmountMap; } private void addAssetForBill(final AssetForBill adb) { if (!workOrderEstimate.getAssetValues().isEmpty() && adb.getAsset() != null) { final AssetForBill assetForBill = new AssetForBill(); final Asset assetNew = assetService.findOne(adb.getAsset().getId()); final String value = worksService.getWorksConfigValue("WORKS_ASSET_STATUS"); if (StringUtils.isBlank(value)) { final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("asset.status", "asset.status.configvalue")); throw new ValidationException(errors); } if (assetNew.getStatus().getDescription().equals(value.split(",")[0])) { final EgwStatus status = egwStatusHibernateDAO.getStatusByModuleAndCode("ASSET", value.split(",")[1]); assetNew.setStatus(status); } assetForBill.setEgbill(contractorBillRegister); assetForBill.setCoa(chartOfAccountsHibernateDAO.findById(adb.getCoa().getId(), false)); assetForBill.setWorkOrderEstimate(workOrderEstimate); assetForBill.setAmount(adb.getAmount()); assetForBill.setDescription(adb.getDescription()); assetForBill.setAsset(assetNew); contractorBillRegister.addAssetDetails(assetForBill); } } public Map<String, BigDecimal> getGlcodesForstanDed() { final Map<String, BigDecimal> debitGlcodeAndAmountMap = new HashMap<String, BigDecimal>(); final Set<BigDecimal> coaSet = new HashSet<BigDecimal>(); for (final DeductionTypeForBill deductionBill : standardDeductions) if (deductionBill != null && deductionBill.getGlcodeid() != null) { if (coaSet.contains(deductionBill.getGlcodeid())) { if (debitGlcodeAndAmountMap.containsKey(deductionBill.getGlcodeid().toString())) { BigDecimal amount = debitGlcodeAndAmountMap.get(deductionBill.getGlcodeid().toString()); amount = amount.add(deductionBill.getCreditamount()); debitGlcodeAndAmountMap.put(deductionBill.getGlcodeid().toString(), amount); } } else { debitGlcodeAndAmountMap .put(deductionBill.getGlcodeid().toString(), deductionBill.getCreditamount()); coaSet.add(deductionBill.getGlcodeid()); } addDeductionTypeBill(deductionBill); } return debitGlcodeAndAmountMap; } private void addDeductionTypeBill(final DeductionTypeForBill deductionBill) { final DeductionTypeForBill deductionTypeForBill = new DeductionTypeForBill(); deductionTypeForBill.setEgbill(contractorBillRegister); deductionTypeForBill.setWorkOrder(workOrder); deductionTypeForBill.setNarration(deductionBill.getNarration()); deductionTypeForBill.setCoa(chartOfAccountsHibernateDAO.findById(Long.valueOf(deductionBill.getGlcodeid() .toString()), false)); deductionTypeForBill.setCreditamount(deductionBill.getCreditamount()); deductionTypeForBill.setDeductionType(deductionBill.getDeductionType()); contractorBillRegister.addDeductionType(deductionTypeForBill); } public Map<String, BigDecimal> getGlcodesForStatDed() { final Map<String, BigDecimal> debitGlcodeAndAmountMap = new HashMap<String, BigDecimal>(); final Set<Long> coaSet = new HashSet<Long>(); for (final StatutoryDeductionsForBill bpd : contractorBillService.getStatutoryDeductions(actionStatutorydetails)) if (bpd != null && bpd.getEgBillPayeeDtls().getRecovery() != null && bpd.getEgBillPayeeDtls().getRecovery().getId() != null && bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts() != null && bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() != null) if (coaSet.contains(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId())) { if (debitGlcodeAndAmountMap.containsKey(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts() .getId().toString())) { BigDecimal amount = debitGlcodeAndAmountMap.get(bpd.getEgBillPayeeDtls().getRecovery() .getChartofaccounts().getId().toString()); amount = amount.add(bpd.getEgBillPayeeDtls().getCreditAmount()); debitGlcodeAndAmountMap.put(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() .toString(), amount); } } else { debitGlcodeAndAmountMap.put(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() .toString(), bpd.getEgBillPayeeDtls().getCreditAmount()); coaSet.add(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId()); } return debitGlcodeAndAmountMap; } public void populateOtherDeductionList() throws ApplicationException { final char[] charTypes = getBillAccountTypesFromConfig(); if (charTypes != null) for (final char charType : charTypes) { final List<CChartOfAccounts> pList = chartOfAccountsHibernateDAO.getActiveAccountsForType(charType); final List<CChartOfAccounts> coaContPayableList = chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer .valueOf(worksService.getWorksConfigValue(WORKS_NETPAYABLE_CODE))); if (pList != null && coaContPayableList != null) pList.removeAll(coaContPayableList); if (pList != null) customDeductionAccountList.addAll(pList); } if (!contractorBillService.getStandardDeductionsFromConfig().isEmpty()) standardDeductionConfValues = new LinkedList<String>(contractorBillService .getStandardDeductionsFromConfig().keySet()); if (StringUtils.isNotBlank(worksService.getWorksConfigValue(RETENTION_MONEY_PURPOSE))) retentionMoneyAccountList = chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer.valueOf(worksService .getWorksConfigValue(RETENTION_MONEY_PURPOSE))); } private char[] getBillAccountTypesFromConfig() { final String strTypes = worksService.getWorksConfigValue("CUSTOM_DEDUCTION"); char[] charArr = null; if (StringUtils.isNotBlank(strTypes)) { final String[] strArrayTypes = strTypes.split(","); charArr = new char[strArrayTypes.length]; for (int i = 0; i < strArrayTypes.length; i++) charArr[i] = strArrayTypes[i].charAt(0); } return charArr; } public void setBudgetDetails(final Long workOrderId, final Long workOrderEstimateId, final Date billDate) { billAmount = contractorBillService.getApprovedMBAmount(workOrderId, workOrderEstimateId, billDate); // utilizedAmount = // contractorBillService.getTotalUtilizedAmount(workOrderId, billDate); // sanctionedBudget = // contractorBillService.getBudgetedAmtForYear(workOrderId, billDate); } public Map<Long, String> getContratorCoaPayableMap() throws NumberFormatException, ApplicationException { if (StringUtils.isNotBlank(worksService.getWorksConfigValue(WORKS_NETPAYABLE_CODE))) { final List<CChartOfAccounts> coaPayableList = chartOfAccountsHibernateDAO.getAccountCodeByPurpose(Integer .valueOf(worksService.getWorksConfigValue(WORKS_NETPAYABLE_CODE))); for (final CChartOfAccounts coa : coaPayableList) contratorCoaPayableMap.put(coa.getId(), coa.getGlcode() + "-" + coa.getName()); } return contratorCoaPayableMap; } public void setContratorCoaPayableMap(final Map<Long, String> contratorCoaPayableMap) { this.contratorCoaPayableMap = contratorCoaPayableMap; } public String getDisp() { return disp; } public void setDisp(final String disp) { this.disp = disp; } public List<AssetForBill> getAccountDetailsForBill() { return accountDetailsForBill; } public void setAccountDetailsForBill(final List<AssetForBill> accountDetailsForBill) { this.accountDetailsForBill = accountDetailsForBill; } public Long getId() { return id; } public void setId(final Long id) { this.id = id; } public Long getWorkOrderId() { return workOrderId; } public void setWorkOrderId(final Long workOrderId) { this.workOrderId = workOrderId; } public WorkOrder getWorkOrder() { return workOrder; } public void setWorkOrder(final WorkOrder workOrder) { this.workOrder = workOrder; } public void setContractorBillService(final ContractorBillService contractorBillService) { this.contractorBillService = contractorBillService; } public void setWorksService(final WorksService worksService) { this.worksService = worksService; } public List<CChartOfAccounts> getStandardDeductionAccountList() { return standardDeductionAccountList; } public List<CChartOfAccounts> getCustomDeductionAccountList() { return customDeductionAccountList; } public List<String> getStandardDeductionConfValues() { return standardDeductionConfValues; } public List<StatutoryDeductionsForBill> getActionStatutorydetails() { return actionStatutorydetails; } public void setActionStatutorydetails(final List<StatutoryDeductionsForBill> actionStatutorydetails) { this.actionStatutorydetails = actionStatutorydetails; } public List<DeductionTypeForBill> getStandardDeductions() { return standardDeductions; } public void setStandardDeductions(final List<DeductionTypeForBill> standardDeductions) { this.standardDeductions = standardDeductions; } public List<EgBilldetails> getCustomDeductions() { return customDeductions; } public void setCustomDeductions(final List<EgBilldetails> customDeductions) { this.customDeductions = customDeductions; } public BigDecimal getBillAmount() { return billAmount; } public void setBillAmount(final BigDecimal billAmount) { this.billAmount = billAmount; } public BigDecimal getUtilizedAmount() { return utilizedAmount; } public void setUtilizedAmount(final BigDecimal utilizedAmount) { this.utilizedAmount = utilizedAmount; } public BigDecimal getSanctionedBudget() { return sanctionedBudget; } public void setSanctionedBudget(final BigDecimal sanctionedBudget) { this.sanctionedBudget = sanctionedBudget; } public void setFinancialDetailService(final PersistenceService<FinancialDetail, Long> financialDetailService) { this.financialDetailService = financialDetailService; } public Long getNetPayableCode() { return netPayableCode; } public void setNetPayableCode(final Long netPayableCode) { this.netPayableCode = netPayableCode; } public BigDecimal getNetPayableAmount() { return netPayableAmount; } public void setNetPayableAmount(final BigDecimal netPayableAmount) { this.netPayableAmount = netPayableAmount; } public BigDecimal getAdvaceAdjustmentCreditAmount() { return advaceAdjustmentCreditAmount; } public void setAdvaceAdjustmentCreditAmount(final BigDecimal advaceAdjustmentCreditAmount) { this.advaceAdjustmentCreditAmount = advaceAdjustmentCreditAmount; } public String getPartyBillNumber() { return partyBillNumber; } public void setPartyBillNumber(final String partyBillNumber) { this.partyBillNumber = partyBillNumber; } public Date getPartyBillDate() { return partyBillDate; } public void setPartyBillDate(final Date partyBillDate) { this.partyBillDate = partyBillDate; } public Date getCompletionDate() { return completionDate; } public void setCompletionDate(final Date completionDate) { this.completionDate = completionDate; } public void setCommonAssetsService(final AssetService assetService) { this.assetService = assetService; } public ContractorBillRegister getContractorBillRegister() { return contractorBillRegister; } public void setContractorBillRegister(final ContractorBillRegister contractorBillRegister) { this.contractorBillRegister = contractorBillRegister; } public void setMeasurementBookService(final MeasurementBookServiceImpl measurementBookService) { this.measurementBookService = measurementBookService; } public Integer getPartbillNo() { return partbillNo; } public void setPartbillNo(final Integer partbillNo) { this.partbillNo = partbillNo; } public void setStandardDeductionAccountList(final List<CChartOfAccounts> standardDeductionAccountList) { this.standardDeductionAccountList = standardDeductionAccountList; } public void setCustomDeductionAccountList(final List<CChartOfAccounts> customDeductionAccountList) { this.customDeductionAccountList = customDeductionAccountList; } public BigDecimal getTotalPendingBalance() { return totalPendingBalance; } public void setTotalPendingBalance(final BigDecimal totalPendingBalance) { this.totalPendingBalance = totalPendingBalance; } public String getSourcepage() { return sourcepage; } public void setSourcepage(final String sourcepage) { this.sourcepage = sourcepage; } public List<MBHeader> getMbHeaderList() { return mbHeaderList; } public void setMbHeaderList(final List<MBHeader> mbHeaderList) { this.mbHeaderList = mbHeaderList; } public Long[] getAppConfigValueId() { return appConfigValueId; } public void setAppConfigValueId(final Long[] appConfigValueId) { this.appConfigValueId = appConfigValueId; } public String[] getSelectedchecklistValue() { return selectedchecklistValue; } public void setSelectedchecklistValue(final String[] selectedchecklistValue) { this.selectedchecklistValue = selectedchecklistValue; } public void setChecklistService(final PersistenceService<EgChecklists, Long> checklistService) { this.checklistService = checklistService; } public List<AppConfigValues> getFinalBillChecklist() { return finalBillChecklist; } public void setFinalBillChecklist(final List<AppConfigValues> finalBillChecklist) { this.finalBillChecklist = finalBillChecklist; } public List<String> getChecklistValues() { return checklistValues; } public void setChecklistValues(final List<String> checklistValues) { this.checklistValues = checklistValues; } public void setDepartmentService(final DepartmentService departmentService) { this.departmentService = departmentService; } public List<WorkflowAction> getValidActions() { return workflowService.getValidActions(contractorBillRegister); } public void setContractorBillWorkflowService(final WorkflowService<ContractorBillRegister> workflow) { workflowService = workflow; } 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 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 ReportService getReportService() { return reportService; } public void setReportService(final ReportService reportService) { this.reportService = reportService; } public InputStream getCompletionCertificatePDF() { return completionCertificatePDF; } public void setCompletionCertificatePDF(final InputStream completionCertificatePDF) { this.completionCertificatePDF = completionCertificatePDF; } public void setVoucherService(final VoucherService voucherService) { this.voucherService = voucherService; } public void setScriptExecutionService(final ScriptService scriptExecutionService) { this.scriptExecutionService = scriptExecutionService; } public void setAbstractEstimateService(final AbstractEstimateService abstractEstimateService) { } public WorkCompletionInfo getCompletionInfo() { return completionInfo; } public void setCompletionInfo(final WorkCompletionInfo completionInfo) { this.completionInfo = completionInfo; } public List<WorkCompletionDetailInfo> getCompletionDetailInfoList() { return completionDetailInfoList; } public void setCompletionDetailInfoList(final List<WorkCompletionDetailInfo> completionDetailInfoList) { this.completionDetailInfoList = completionDetailInfoList; } public String[] getRemarks() { return remarks; } public void setRemarks(final String[] remarks) { this.remarks = remarks; } public boolean getSkipBudget() { return skipBudget; } public void setSkipBudget(final boolean skipBudget) { this.skipBudget = skipBudget; } public void setEgovCommon(final EgovCommon egovCommon) { this.egovCommon = egovCommon; } public List<CChartOfAccounts> getRetentionMoneyAccountList() { return retentionMoneyAccountList; } public void setRetentionMoneyAccountList(final List<CChartOfAccounts> retentionMoneyAccountList) { this.retentionMoneyAccountList = retentionMoneyAccountList; } public List<EgBilldetails> getRetentionMoneyDeductions() { return retentionMoneyDeductions; } public void setRetentionMoneyDeductions(final List<EgBilldetails> retentionMoneyDeductions) { this.retentionMoneyDeductions = retentionMoneyDeductions; } public String getIsRetMoneyAutoCalculated() { return isRetMoneyAutoCalculated; } public void setIsRetMoneyAutoCalculated(final String isRetMoneyAutoCalculated) { this.isRetMoneyAutoCalculated = isRetMoneyAutoCalculated; } public String getIsRetMoneyEditable() { return isRetMoneyEditable; } public void setIsRetMoneyEditable(final String isRetMoneyEditable) { this.isRetMoneyEditable = isRetMoneyEditable; } public String getPercDeductForRetMoneyPartBill() { return percDeductForRetMoneyPartBill; } public void setPercDeductForRetMoneyPartBill(final String percDeductForRetMoneyPartBill) { this.percDeductForRetMoneyPartBill = percDeductForRetMoneyPartBill; } public String getPercDeductForRetMoneyFinalBill() { return percDeductForRetMoneyFinalBill; } public void setPercDeductForRetMoneyFinalBill(final String percDeductForRetMoneyFinalBill) { this.percDeductForRetMoneyFinalBill = percDeductForRetMoneyFinalBill; } public String getRetMoneyFinalBillPerOnValue() { return retMoneyFinalBillPerOnValue; } public void setRetMoneyFinalBillPerOnValue(final String retMoneyFinalBillPerOnValue) { this.retMoneyFinalBillPerOnValue = retMoneyFinalBillPerOnValue; } public TenderResponse getTenderResponse() { return tenderResponse; } public void setTenderResponse(final TenderResponse tenderResponse) { this.tenderResponse = tenderResponse; } public String getRebatePremLevel() { return rebatePremLevel; } public void setRebatePremLevel(final String rebatePremLevel) { this.rebatePremLevel = rebatePremLevel; } public List<EgPartytype> getSubPartyTypeDtls() { return subPartyTypeDtls; } public void setSubPartyTypeDtls(final List<EgPartytype> subPartyTypeDtls) { this.subPartyTypeDtls = subPartyTypeDtls; } public List<EgwTypeOfWork> getTypeOfWorkDtls() { return typeOfWorkDtls; } public void setTypeOfWorkDtls(final List<EgwTypeOfWork> typeOfWorkDtls) { this.typeOfWorkDtls = typeOfWorkDtls; } public String getShowSubPartyType() { return showSubPartyType; } public void setShowSubPartyType(final String showSubPartyType) { this.showSubPartyType = showSubPartyType; } public String getShowTypeOfWork() { return showTypeOfWork; } public void setShowTypeOfWork(final String showTypeOfWork) { this.showTypeOfWork = showTypeOfWork; } public String getEditStatutoryAmount() { return editStatutoryAmount; } public void setEditStatutoryAmount(final String editStatutoryAmount) { this.editStatutoryAmount = editStatutoryAmount; } public Long getEstimateId() { return estimateId; } public void setEstimateId(final Long estimateId) { this.estimateId = estimateId; } public String getPercTenderType() { return percTenderType; } public void setPercTenderType(final String percTenderType) { this.percTenderType = percTenderType; } public String getIsRebatePremLevelBill() { return isRebatePremLevelBill; } public void setIsRebatePremLevelBill(final String isRebatePremLevelBill) { this.isRebatePremLevelBill = isRebatePremLevelBill; } public void setCancelBillService(final PersistenceService<MBForCancelledBill, Long> cancelBillService) { this.cancelBillService = cancelBillService; } public BigDecimal getGrossAmount() { return grossAmount; } public void setGrossAmount(final BigDecimal grossAmount) { this.grossAmount = grossAmount; } public void setBudgetService(final BudgetService budgetService) { this.budgetService = budgetService; } public List<String> getAppConfigValuesToSkipBudget() { return worksService.getNatureOfWorkAppConfigValues("Works", APPCONFIG_KEY_NAME); } public void setUserService(final UserService userService) { this.userService = userService; } public BigDecimal getTenderedItemsAmount() { return tenderedItemsAmount; } public void setTenderedItemsAmount(final BigDecimal tenderedItemsAmount) { this.tenderedItemsAmount = tenderedItemsAmount; } public Integer getWorkflowFunctionaryId() { return workflowFunctionaryId; } public Long[] getMbHeaderId() { return mbHeaderId; } public void setMbHeaderId(final Long[] mbHeaderId) { this.mbHeaderId = mbHeaderId; } public List<MBHeader> getMbHeaderListForBillId() { return mbHeaderListForBillId; } public void setMbHeaderListForBillId(final List<MBHeader> mbHeaderListForBillId) { this.mbHeaderListForBillId = mbHeaderListForBillId; } public BigDecimal getTotalAdvancePaid() { return totalAdvancePaid; } public void setTotalAdvancePaid(final BigDecimal totalAdvancePaid) { this.totalAdvancePaid = totalAdvancePaid; } public void setContractorAdvanceService(final ContractorAdvanceService contractorAdvanceService) { this.contractorAdvanceService = contractorAdvanceService; } public void setEmployeeService(final EmployeeServiceOld employeeService) { this.employeeService = employeeService; } public String getIsRCEstimate() { return isRCEstimate; } public void setIsRCEstimate(final String isRCEstimate) { this.isRCEstimate = isRCEstimate; } public Date getRestorationEndDate() { return restorationEndDate; } public void setRestorationEndDate(final Date restorationEndDate) { this.restorationEndDate = restorationEndDate; } public String getDwCategory() { return dwCategory; } public void setDwCategory(final String dwCategory) { this.dwCategory = dwCategory; } public String getAllowForward() { return allowForward; } public void setAllowForward(final String allowForward) { this.allowForward = allowForward; } public String getShowValidationMsg() { return showValidationMsg; } public void setShowValidationMsg(final String showValidationMsg) { this.showValidationMsg = showValidationMsg; } public Date getLatestMBDate() { return latestMBDate; } public void setLatestMBDate(final Date latestMBDate) { this.latestMBDate = latestMBDate; } public String getRefNo() { return refNo; } public void setRefNo(final String refNo) { this.refNo = refNo; } }