/* * 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.egf.web.actions.budget; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; import org.egov.commons.CFinancialYear; import org.egov.commons.CFunction; import org.egov.commons.Functionary; import org.egov.commons.Fund; import org.egov.commons.Scheme; import org.egov.commons.SubScheme; import org.egov.commons.service.CFinancialYearService; import org.egov.egf.model.BudgetAmountView; import org.egov.eis.entity.Assignment; import org.egov.eis.service.AssignmentService; import org.egov.eis.service.EisCommonService; import org.egov.eis.web.actions.workflow.GenericWorkFlowAction; import org.egov.infra.admin.master.entity.AppConfigValues; import org.egov.infra.admin.master.entity.Boundary; import org.egov.infra.admin.master.entity.Department; import org.egov.infra.admin.master.entity.User; import org.egov.infra.admin.master.service.AppConfigValueService; import org.egov.infra.config.core.ApplicationThreadLocals; import org.egov.infra.validation.exception.ValidationError; import org.egov.infra.validation.exception.ValidationException; import org.egov.infra.web.struts.annotation.ValidationErrorPage; import org.egov.infra.workflow.entity.StateAware; import org.egov.infra.workflow.service.WorkflowService; import org.egov.infstr.services.PersistenceService; import org.egov.infstr.utils.EgovMasterDataCaching; import org.egov.model.budget.Budget; import org.egov.model.budget.BudgetDetail; import org.egov.model.budget.BudgetGroup; import org.egov.model.voucher.WorkflowBean; import org.egov.pims.commons.Position; import org.egov.services.budget.BudgetDetailService; import org.egov.services.budget.BudgetService; import org.egov.utils.BudgetDetailConfig; import org.egov.utils.BudgetDetailHelper; import org.egov.utils.Constants; import org.egov.utils.FinancialConstants; import org.hibernate.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.util.ValueStack; public abstract class BaseBudgetDetailAction extends GenericWorkFlowAction { private static final long serialVersionUID = 1L; protected BudgetDetail budgetDetail = new BudgetDetail(); protected List<BudgetDetail> budgetDetailList = new ArrayList<BudgetDetail>(); protected List<BudgetDetail> savedbudgetDetailList = new ArrayList<BudgetDetail>(); @Autowired @Qualifier("budgetDetailService") protected BudgetDetailService budgetDetailService; @Autowired @Qualifier("budgetService") protected BudgetService budgetService; protected List<String> headerFields = new ArrayList<String>(); protected List<String> gridFields = new ArrayList<String>(); protected List<String> mandatoryFields = new ArrayList<String>(); public WorkflowBean workflowBean = new WorkflowBean(); protected WorkflowService<Budget> budgetWorkflowService; protected WorkflowService<BudgetDetail> budgetDetailWorkflowService; protected boolean headerDisabled = false; protected List<BudgetAmountView> budgetAmountView = new ArrayList<BudgetAmountView>(); protected String currentYearRange; protected String previousYearRange; private String nextYearRange; protected String lastButOneYearRange; protected List<Scheme> subSchemes; protected Integer schemeId; protected Date asOnDate; @Autowired private EisCommonService eisCommonService; protected BudgetDetailHelper budgetDetailHelper; protected boolean addNewDetails = false; private static final String NEWRE = "new-re"; private static final String BUDGETLIST = "budgetList"; private static final String RE = "RE"; private static final String NEWDETAIL = "newDetail-re"; private static final String SAVE = "budgetdetail.save"; private static final String BUDGETPRIMARY = "budget.not.primary"; private static final String BUDGETRE = "budgetDetail.re.amount"; private static final String BUDGETBE = "budgetDetail.be.amount"; @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired protected BudgetDetailConfig budgetDetailConfig; private static final String BUDGETMANDATORY = "budgetDetail.budget.mandatory"; private static final String REFERENCEBUDGET = "no.reference.budget"; @Autowired private CFinancialYearService financialYearService; @Autowired private AppConfigValueService appConfigValueService; @Autowired private AssignmentService assignmentService; @Autowired private EgovMasterDataCaching masterDataCache; protected boolean re = false; private boolean showMessage = false; protected List<BigDecimal> beAmounts = new ArrayList<BigDecimal>(); private Budget referenceBudget; private CFinancialYear financialYear; protected List<Budget> budgetList = new ArrayList<Budget>(); protected boolean showRe; public Long budgetDocumentNumber; protected boolean showDetails; protected Long searchfunctionid; protected Long searchbudgetGroupid; private static Logger LOGGER = Logger.getLogger(BaseBudgetDetailAction.class); public abstract void populateSavedbudgetDetailListFor(Budget budget); public abstract void populateSavedbudgetDetailListForDetail( BudgetDetail bd); protected abstract void saveAndStartWorkFlow(BudgetDetail detail, WorkflowBean workflowBean); protected abstract void saveAndStartWorkFlowForRe(BudgetDetail detail, int index, CFinancialYear finYear, Budget refBudget, WorkflowBean workflowBean); protected abstract void approve(); @Override public String execute() { return NEW; } public String create() { validateMandatoryFields(); budgetDetailHelper.removeEmptyBudgetDetails(budgetDetailList); saveBudgetDetails(false, financialYear, budgetDetail.getBudget(), workflowBean); setAsOnDateOnSelectedBudget(); showMessage = true; addActionMessage(getText(SAVE)); return NEW; } @ValidationErrorPage(value = NEWRE) @Action(value = "/budget/budgetProposalDetail-createRE") public String createRe() { showRe = true; try { getActionMessages().clear(); validateMandatoryFields(); budgetDetailHelper.removeEmptyBudgetDetails(budgetDetailList); if (!addNewDetails) deleteExisting(); validateAmounts(budgetDetailList); Assignment assignment = new Assignment(); if (!FinancialConstants.BUTTONSAVE .equalsIgnoreCase(workflowBean.getWorkFlowAction())) { assignment = assignmentService .findAllAssignmentsByHODDeptAndDates( budgetDetail.getExecutingDepartment().getId(), asOnDate) .get(0); approverPositionId = assignment.getPosition().getId(); } else approverPositionId = getPosition().getId(); populateWorkflowBean(); financialYear = financialYearService.findOne(financialYear.getId()); saveBudgetDetails(true, financialYear, budgetDetail.getBudget(), workflowBean); setAsOnDateOnSelectedBudget(); showMessage = true; if (FinancialConstants.BUTTONSAVE .equalsIgnoreCase(workflowBean.getWorkFlowAction())) addActionMessage(getText(SAVE)); else addActionMessage(getText("budgetdetail.approved") + assignment.getEmployee().getName()); dropdownData.put(BUDGETLIST, Collections.EMPTY_LIST); budgetDetail = new BudgetDetail(); budgetDetail.setExecutingDepartment(null); // financialYear = null; } catch (final ValidationException e) { loadBudgets(RE); dropdownData.put(BUDGETLIST, budgetList); referenceBudget = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); throw e; } return NEWRE; } @ValidationErrorPage(value = NEWDETAIL) public String createBudgetDetail() { showRe = true; re = budgetService.hasReForYear( budgetDetail.getBudget().getFinancialYear().getId()); try { getActionMessages().clear(); removeEmptyBudgetDetails(budgetDetailList); validateIsPrimary(); if (!rowsEmpty()) { if (!addNewDetails) deleteExisting(); validateMandatoryFields(); saveNewBudgetDetailItems(true, financialYear, budgetDetail.getBudget()); } setAsOnDateOnSelectedBudget(); // approve(); showMessage = true; addActionMessage(getText(SAVE)); dropdownData.put(BUDGETLIST, Collections.EMPTY_LIST); budgetDetail = new BudgetDetail(); budgetDetail.setExecutingDepartment(null); } catch (final ValidationException e) { loadBudgets(RE); dropdownData.put(BUDGETLIST, budgetList); referenceBudget = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); throw e; } return NEWDETAIL; } @ValidationErrorPage(value = NEWRE) public String createReAndForward() { showRe = true; try { getActionMessages().clear(); removeEmptyBudgetDetails(budgetDetailList); validateIsPrimary(); if (!rowsEmpty()) { if (!addNewDetails) deleteExisting(); validateMandatoryFields(); // validateAmounts(budgetDetailList); saveBudgetDetails(true, financialYear, budgetDetail.getBudget(), workflowBean); } setAsOnDateOnSelectedBudget(); approve(); showMessage = true; addActionMessage(getText(SAVE)); dropdownData.put(BUDGETLIST, Collections.EMPTY_LIST); budgetDetail = new BudgetDetail(); budgetDetail.setExecutingDepartment(null); // financialYear = null; } catch (final ValidationException e) { loadBudgets(RE); dropdownData.put(BUDGETLIST, budgetList); referenceBudget = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); throw e; } return NEWRE; } /** * @param budget deletes the existing selected budgets from db */ private void deleteExisting() { if (LOGGER.isInfoEnabled()) LOGGER.info("Initiating deletion .........."); final Budget referenceBudgetFor = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); final StringBuffer addlCondtion = new StringBuffer(50); addlCondtion.append("delete from egf_budgetdetail where budget=:budgetid or budget=:referenceBudget "); if ((searchfunctionid != null) && (searchfunctionid != 0)) addlCondtion.append("and function.id=:functionid"); if ((searchbudgetGroupid != null) && (searchbudgetGroupid != 0)) addlCondtion.append("and budgetGroup.id=:budgetGroupid"); new ArrayList<BudgetDetail>(); final Query qry = persistenceService.getSession() .createSQLQuery( addlCondtion.toString()); qry.setLong("budgetid", budgetDetail.getBudget().getId()); qry.setLong("referenceBudget", referenceBudgetFor.getId()); if ((searchfunctionid != null) && (searchfunctionid != 0)) qry.setLong("functionid", searchfunctionid); if ((searchbudgetGroupid != null) && (searchbudgetGroupid != 0)) qry.setLong("budgetGroupid", searchbudgetGroupid); qry.executeUpdate(); persistenceService.getSession().flush(); } private void validateIsPrimary() { if ((budgetDetail.getBudget() != null) && !budgetDetail.getBudget().getIsPrimaryBudget()) throw new ValidationException( Arrays.asList(new ValidationError(BUDGETPRIMARY, BUDGETPRIMARY))); final Budget referenceBudgetFor = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); if ((budgetDetail.getBudget() != null) && (referenceBudgetFor != null) && !referenceBudgetFor.getIsPrimaryBudget()) throw new ValidationException( Arrays.asList(new ValidationError(BUDGETPRIMARY, BUDGETPRIMARY))); } private boolean rowsEmpty() { if (budgetDetailList == null) return true; for (final BudgetDetail row : budgetDetailList) { if (gridFields.contains(Constants.EXECUTING_DEPARTMENT) && (row.getExecutingDepartment().getId() != -1) && (row.getExecutingDepartment().getId() != 0)) return false; if (gridFields.contains(Constants.FUNCTION) && (row.getFunction().getId() != -1) && (row.getFunction().getId() != 0)) return false; if (gridFields.contains(Constants.FUND) && (row.getFund().getId() != -1) && (row.getFund().getId() != 0)) return false; if (gridFields.contains(Constants.SCHEME) && (row.getScheme().getId() != -1) && (row.getScheme().getId() != 0)) return false; if (gridFields.contains(Constants.SUB_SCHEME) && (row.getSubScheme().getId() != -1) && (row.getSubScheme().getId() != 0)) return false; if (gridFields.contains(Constants.BOUNDARY) && (row.getBoundary().getId() != -1) && (row.getBoundary().getId() != 0)) return false; if ((row.getBudgetGroup().getId() != -1) && (row.getBudgetGroup().getId() != 0)) return false; } return true; } private void validateAmounts(final List<BudgetDetail> detailList) { for (int i = 0; i < detailList.size(); i++) { if (beAmounts.get(i) == null) throw new ValidationException( Arrays.asList( new ValidationError(BUDGETRE, BUDGETRE))); if (detailList.get(i).getOriginalAmount() == null) throw new ValidationException( Arrays.asList( new ValidationError(BUDGETBE, BUDGETBE))); } } protected void validateMandatoryFields() { final String deptMandatory = "budgetDetail.executingDepartment.mandatory"; final String functionMandatory = "budgetDetail.function.mandatory"; final String functionaryMandatory = "budgetDetail.functionary.mandatory"; final String fundMandatory = "budgetDetail.fund.mandatory"; checkHeaderMandatoryField(Constants.EXECUTING_DEPARTMENT, budgetDetail.getExecutingDepartment(), deptMandatory); checkHeaderMandatoryField(Constants.FUNCTION, budgetDetail.getFunction(), functionMandatory); checkHeaderMandatoryField(Constants.FUNCTIONARY, budgetDetail.getFunctionary(), functionaryMandatory); checkHeaderMandatoryField(Constants.FUND, budgetDetail.getFund(), fundMandatory); for (final BudgetDetail detail : budgetDetailList) { setRelatedValues(detail); checkGridMandatoryField(Constants.EXECUTING_DEPARTMENT, detail.getExecutingDepartment(), deptMandatory); checkGridMandatoryField(Constants.FUNCTION, detail.getFunction(), functionMandatory); checkGridMandatoryField(Constants.FUNCTIONARY, detail.getFunctionary(), functionaryMandatory); checkGridMandatoryField(Constants.FUND, detail.getFund(), fundMandatory); } } private void setRelatedValues(final BudgetDetail detail) { if ((detail.getExecutingDepartment() != null) && (detail.getExecutingDepartment().getId() == 0)) detail.setExecutingDepartment(null); if ((detail.getFunction() != null) && (detail.getFunction().getId() == 0)) detail.setFunction(null); if ((detail.getScheme() != null) && (detail.getScheme().getId() == 0)) detail.setScheme(null); if ((detail.getSubScheme() != null) && (detail.getSubScheme().getId() == 0)) detail.setSubScheme(null); if ((detail.getFunctionary() != null) && (detail.getFunctionary().getId() == 0)) detail.setFunctionary(null); if ((detail.getBoundary() != null) && (detail.getBoundary().getId() == 0)) detail.setBoundary(null); if ((detail.getFund() != null) && (detail.getFund().getId() == 0)) detail.setFund(null); } protected void checkHeaderMandatoryField(final String fieldName, final Object value, final String errorKey) { if (headerFields.contains(fieldName) && mandatoryFields.contains(fieldName) && (value == null)) throw new ValidationException( Arrays.asList(new ValidationError(errorKey, errorKey))); } protected void checkGridMandatoryField(final String fieldName, final Object value, final String errorKey) { if (gridFields.contains(fieldName) && mandatoryFields.contains(fieldName) && (value == null)) throw new ValidationException( Arrays.asList(new ValidationError(errorKey, errorKey))); } public boolean isFieldMandatory(final String field) { return mandatoryFields.contains(field); } private void saveBudgetDetails(final boolean withRe, final CFinancialYear finYear, final Budget budget, final WorkflowBean workflowBean) { int index = 0; Budget refBudget = null; if (withRe) { refBudget = budgetService.getReferenceBudgetFor(budget); if (refBudget == null) throw new ValidationException( Arrays.asList(new ValidationError(REFERENCEBUDGET, REFERENCEBUDGET))); } int i = 0; for (final BudgetDetail detail : budgetDetailList) { if (detail != null) { // update only if it is new budgetdetail Item else it is taken // care by budget load if (detail.getId() == null) detail.setUniqueNo(detail.getFund().getId() + "-" + detail.getExecutingDepartment().getId() + "-" + detail.getFunction().getId() + "-" + detail.getBudgetGroup().getId()); else detail.setId(null); if (withRe) saveAndStartWorkFlowForRe(detail, index, finYear, refBudget, workflowBean); else saveAndStartWorkFlow(detail, workflowBean); } index++; if ((++i % 5) == 0) persistenceService.getSession().flush(); LOGGER.error("saved" + i + "Item"); } populateSavedbudgetDetailListForDetail(budgetDetailList.get(0)); budgetDetailList.clear(); } private void saveNewBudgetDetailItems(final boolean withRe, final CFinancialYear finYear, final Budget budget) { int index = 0; Budget refBudget = null; if (withRe) { refBudget = budgetService.getReferenceBudgetFor(budget); if (refBudget == null) throw new ValidationException( Arrays.asList(new ValidationError(REFERENCEBUDGET, REFERENCEBUDGET))); } int i = 0; for (final BudgetDetail detail : budgetDetailList) { if (detail != null) { // update only if it is new budgetdetail Item else it is taken // care by budget load detail.transition(true).withStateValue("END") .withOwner(getPosition()).withComments(""); if (detail.getId() == null) detail.setUniqueNo(detail.getFund().getId() + "-" + detail.getExecutingDepartment().getId() + "-" + detail.getFunction().getId() + "-" + detail.getBudgetGroup().getId()); else detail.setId(null); if (withRe) saveAndStartWorkFlowForRe(detail, index, finYear, refBudget, workflowBean); else saveAndStartWorkFlow(detail, workflowBean); } index++; if ((++i % 5) == 0) persistenceService.getSession().flush(); LOGGER.error("saved" + i + "Item"); } populateSavedbudgetDetailListForDetail(budgetDetailList.get(0)); budgetDetailList.clear(); } private void setAsOnDateOnSelectedBudget() { if ((budgetDetail.getBudget() != null) && (budgetDetail.getBudget().getId() != null)) { final Budget selectedBudget = (Budget) getPersistenceService().find( "from Budget where id=?", budgetDetail.getBudget().getId()); selectedBudget.setAsOnDate(getAsOnDate()); budgetService.update(selectedBudget); } } public void loadBudgets(final String bere) { budgetList = new ArrayList<Budget>(); if (!addNewDetails) budgetList.addAll(persistenceService .findAllBy( "from Budget where id not in (select parent from Budget where parent is not null) " + "and isactivebudget = true and state.type='Budget' and isbere='" + bere.toUpperCase() + "' and status.code!='Approved' and financialYear.id = " + getFinancialYear().getId() + " order by name")); else budgetList.addAll(persistenceService .findAllBy( "from Budget where id not in (select parent from Budget where parent is not null) " + "and isactivebudget = true and state.type='Budget' and isbere='" + bere.toUpperCase() + "' and financialYear.id = " + getFinancialYear().getId() + " order by name")); } @Override public void prepare() { super.prepare(); populateFinancialYear(); headerFields = budgetDetailConfig.getHeaderFields(); gridFields = budgetDetailConfig.getGridFields(); mandatoryFields = budgetDetailConfig.getMandatoryFields(); addRelatedEntity("budget", Budget.class); addRelatedEntity(Constants.BUDGET_GROUP, BudgetGroup.class); if (shouldShowField(Constants.FUNCTIONARY)) addRelatedEntity(Constants.FUNCTIONARY, Functionary.class); if (shouldShowField(Constants.FUNCTION)) addRelatedEntity(Constants.FUNCTION, CFunction.class); if (shouldShowField(Constants.SCHEME)) addRelatedEntity(Constants.SCHEME, Scheme.class); if (shouldShowField(Constants.SUB_SCHEME)) addRelatedEntity(Constants.SUB_SCHEME, SubScheme.class); if (shouldShowField(Constants.FUND)) addRelatedEntity(Constants.FUND, Fund.class); if (shouldShowField(Constants.EXECUTING_DEPARTMENT)) addRelatedEntity(Constants.EXECUTING_DEPARTMENT, Department.class); if (shouldShowField(Constants.BOUNDARY)) addRelatedEntity(Constants.BOUNDARY, Boundary.class); setupDropdownsInHeader(); re = budgetService.hasReForYear( Long.valueOf(financialYearService.getFinancialYearByDate(new Date()).getId().toString())); } private void setupDropdownsInHeader() { setupDropdownDataExcluding(Constants.SUB_SCHEME); setBudgetDropDown(); dropdownData.put("budgetGroupList", masterDataCache.get("egf-budgetGroup")); if (shouldShowField(Constants.SUB_SCHEME)) dropdownData.put("subSchemeList", Collections.EMPTY_LIST); if (shouldShowField(Constants.FUNCTIONARY)) dropdownData.put("functionaryList", masterDataCache.get("egi-functionary")); if (shouldShowField(Constants.FUNCTION)) dropdownData.put("functionList", masterDataCache.get("egi-function")); if (shouldShowField(Constants.SCHEME)) dropdownData.put("schemeList", persistenceService.findAllBy( "from Scheme where isActive=true order by name")); if (shouldShowField(Constants.EXECUTING_DEPARTMENT)) dropdownData.put("executingDepartmentList", masterDataCache.get("egi-department")); if (shouldShowField(Constants.FUND)) dropdownData.put("fundList", persistenceService.findAllBy( "from Fund where isNotLeaf=false and isActive=true order by name")); if (shouldShowField(Constants.BOUNDARY)) dropdownData.put("boundaryList", persistenceService .findAllBy("from Boundary order by name")); addDropdownData("financialYearList", getPersistenceService() .findAllBy("from CFinancialYear where isActive=true order by " + "finYearRange desc ")); dropdownData.put("departmentList", masterDataCache.get("egi-department")); dropdownData.put("designationList", Collections.EMPTY_LIST); dropdownData.put("userList", Collections.EMPTY_LIST); } protected void populateFinancialYear() { final Budget budget = budgetDetail.getBudget(); if (budget != null) { populateYearRange(budget); return; } if (request.get("id") != null) { final Long id = (Long) request.get("id"); if (!Long.valueOf(0).equals(id)) { final Budget b = budgetService.findById(id, false); populateYearRange(b); return; } } final CFinancialYear finYear = financialYearService .findOne(budgetDetailHelper.getFinancialYear()); currentYearRange = finYear.getFinYearRange(); computePreviousYearRange(); computeLastButOneYearRange(); computeNextYearRange(); } private void populateYearRange(final Budget budget) { if (budget != null) { if (budget.getFinancialYear() != null) currentYearRange = budget.getFinancialYear().getFinYearRange(); else currentYearRange = financialYearService .findOne(budgetDetailHelper.getFinancialYear()) .getFinYearRange(); computePreviousYearRange(); computeLastButOneYearRange(); computeNextYearRange(); } } public String computeYearRange(final String range) { if (StringUtils.isNotBlank(range)) { final String[] list = range.split("-"); return subtract(list[0]) + "-" + subtract(list[1]); } return ""; } public String addYearRange(final String range) { if (StringUtils.isNotBlank(range)) { final String[] list = range.split("-"); return add(list[0]) + "-" + add(list[1]); } return ""; } private void computeLastButOneYearRange() { if (StringUtils.isNotBlank(previousYearRange)) { final String[] list = previousYearRange.split("-"); lastButOneYearRange = subtract(list[0]) + "-" + subtract(list[1]); } } protected void computePreviousYearRange() { if (StringUtils.isNotBlank(currentYearRange)) { final String[] list = currentYearRange.split("-"); previousYearRange = subtract(list[0]) + "-" + subtract(list[1]); } } protected void computeNextYearRange() { if (StringUtils.isNotBlank(currentYearRange)) { final String[] list = currentYearRange.split("-"); nextYearRange = add(list[0]) + "-" + add(list[1]); } } protected String subtract(final String value) { final int val = Integer.parseInt(value) - 1; if (val < 10) return "0" + val; return String.valueOf(val); } protected String add(final String value) { final int val = Integer.parseInt(value) + 1; if (val < 10) return "0" + val; return String.valueOf(val); } public void populateWorkflowBean() { workflowBean.setApproverPositionId(approverPositionId); workflowBean.setApproverComments(approverComments); workflowBean.setWorkFlowAction(workFlowAction); workflowBean.setCurrentState(currentState); } public String getCurrentYearRange() { return currentYearRange; } public String getPreviousYearRange() { return previousYearRange; } public String getLastButOneYearRange() { return lastButOneYearRange; } protected void setBudgetDropDown() { if (addNewDetails) { if ((getFinancialYear() != null) && (getFinancialYear().getId() != null)) { budgetList.addAll(persistenceService .findAllBy( "from Budget where id not in (select parent from Budget where parent is not null) " + "and isactivebudget = true and state.type='Budget' and isbere='RE' and financialYear.id = " + getFinancialYear().getId() + " order by name")); dropdownData.put(BUDGETLIST, budgetList); } else dropdownData.put(BUDGETLIST, Collections.EMPTY_LIST); } else dropdownData.put(BUDGETLIST, persistenceService.findAllBy( "from Budget where id not in (select parent from Budget where parent is not null) and isactivebudget = true and state.type='Budget' and (state.value='NEW' or lower(state.value) like lower('Forwarded by SMADMIN%')) order by name")); } public List<BudgetDetail> getSavedbudgetDetailList() { return savedbudgetDetailList; } public List<BudgetDetail> getBudgetDetailList() { return budgetDetailList; } public void setBudgetDetailList(final List<BudgetDetail> budgetDetailList) { this.budgetDetailList = budgetDetailList; } public List<BudgetAmountView> getBudgetAmountView() { return budgetAmountView; } protected User getUser() { return (User) persistenceService.find("from User where id=?", ApplicationThreadLocals.getUserId()); } protected Position getPosition() { return eisCommonService .getPositionByUserId(ApplicationThreadLocals.getUserId()); } protected Position getPositionByUserId(final Integer userId) { return eisCommonService.getPositionByUserId(userId.longValue()); } public List<String> getHeaderFields() { return headerFields; } public void setBudgetDetailWorkflowService( final WorkflowService<BudgetDetail> budgetDetailWorkflowService) { this.budgetDetailWorkflowService = budgetDetailWorkflowService; } @Override public StateAware getModel() { return budgetDetail; } public BudgetDetail getBudgetDetail() { return budgetDetail; } public void setBudgetDetail(final BudgetDetail budgetDetails) { budgetDetail = budgetDetails; } public void setBudgetDetailService( final BudgetDetailService budgetDetailsService) { budgetDetailService = budgetDetailsService; } public String loadActuals() { validateAsOnDate(); getDetailsFilterdBy(); re = budgetService.hasReForYear( budgetDetail.getBudget().getFinancialYear().getId()); budgetDetailHelper.removeEmptyBudgetDetails(budgetDetailList); budgetAmountView.addAll( populateAmountData(budgetDetailList, getAsOnDate(), budgetDetail.getBudget().getFinancialYear())); loadBeAmounts(budgetDetailList); return NEW; } protected void getDetailsFilterdBy() { final StringBuffer mainQry = new StringBuffer(100); mainQry.append( "from BudgetDetail where budget.id=? order by function.name,budgetGroup.name "); if ((budgetDetail.getBudget() != null) && (budgetDetail.getBudget().getId() != 0)) savedbudgetDetailList = budgetDetailService.findAllBy( mainQry.toString(), budgetDetail.getBudget().getId()); } /** * @param savedbudgetDetailList2 */ protected void loadBeAmounts( final List<BudgetDetail> savedbudgetDetailList2) { beAmounts = new ArrayList<BigDecimal>(savedbudgetDetailList2.size()); // int i=0; if ((savedbudgetDetailList == null) || (savedbudgetDetailList.size() == 0)) return; final Budget referenceBudgetFor = budgetService.getReferenceBudgetFor( savedbudgetDetailList.get(0).getBudget()); if (referenceBudgetFor != null) { final List<BudgetDetail> result = budgetDetailService.findAllBy( "from BudgetDetail where budget.id=?", referenceBudgetFor.getId()); for (final BudgetDetail budgetDetail : savedbudgetDetailList) for (final BudgetDetail row : result) if (compareDetails(row, budgetDetail)) beAmounts.add(row.getOriginalAmount()); } } protected boolean compareDetails(final BudgetDetail nextYear, final BudgetDetail current) { if ((nextYear.getExecutingDepartment() != null) && (current.getExecutingDepartment() != null) && (current.getExecutingDepartment().getId() != nextYear .getExecutingDepartment().getId())) return false; if ((nextYear.getFunction() != null) && (current.getFunction() != null) && (current.getFunction().getId() != nextYear.getFunction() .getId())) return false; if ((nextYear.getFund() != null) && (current.getFund() != null) && (current.getFund().getId() != nextYear.getFund().getId())) return false; if ((nextYear.getFunctionary() != null) && (current.getFunctionary() != null) && (current.getFunctionary().getId() != nextYear .getFunctionary() .getId())) return false; if ((nextYear.getScheme() != null) && (current.getScheme() != null) && (current.getScheme().getId() != nextYear.getScheme() .getId())) return false; if ((nextYear.getSubScheme() != null) && (current.getSubScheme() != null) && (current.getSubScheme().getId() != nextYear.getSubScheme() .getId())) return false; if ((nextYear.getBoundary() != null) && (current.getBoundary() != null) && (current.getBoundary().getId() != nextYear.getBoundary() .getId())) return false; if ((nextYear.getBudgetGroup() != null) && (current.getBudgetGroup() != null) && (current.getBudgetGroup().getId() != nextYear .getBudgetGroup() .getId())) return false; if ((nextYear.getBudget() != null) && (current.getBudget() != null) && (current.getBudget().getId() == nextYear.getBudget() .getId())) return false; return true; } protected boolean compareREandBEDetails(final BudgetDetail nextYear, final BudgetDetail current) { if ((nextYear.getExecutingDepartment() != null) && (current.getExecutingDepartment() != null) && (current .getExecutingDepartment().getId().intValue() != nextYear .getExecutingDepartment().getId().intValue())) return false; if ((nextYear.getFunction() != null) && (current.getFunction() != null) && (current.getFunction().getId().intValue() != nextYear .getFunction().getId().intValue())) return false; if ((nextYear.getFund() != null) && (current.getFund() != null) && (current.getFund().getId().intValue() != nextYear.getFund() .getId().intValue())) return false; if ((nextYear.getFunctionary() != null) && (current.getFunctionary() != null) && (current.getFunctionary().getId().intValue() != nextYear .getFunctionary().getId().intValue())) return false; if ((nextYear.getScheme() != null) && (current.getScheme() != null) && (current.getScheme().getId().intValue() != nextYear .getScheme().getId().intValue())) return false; if ((nextYear.getSubScheme() != null) && (current.getSubScheme() != null) && (current.getSubScheme().getId().intValue() != nextYear .getSubScheme().getId().intValue())) return false; if ((nextYear.getBoundary() != null) && (current.getBoundary() != null) && (current.getBoundary().getId().intValue() != nextYear .getBoundary().getId().intValue())) return false; if ((nextYear.getBudgetGroup() != null) && (current.getBudgetGroup() != null) && (current.getBudgetGroup().getId().intValue() != nextYear .getBudgetGroup().getId().intValue())) return false; return true; } protected void populateBudgetList() { loadBudgets(RE); dropdownData.put(BUDGETLIST, budgetList); if ((budgetDetail.getBudget() != null) && (budgetDetail.getBudget().getId() != null)) referenceBudget = budgetService .getReferenceBudgetFor(budgetDetail.getBudget()); } private void validateAsOnDate() { if (budgetDetail.getBudget() == null) throw new ValidationException(Arrays .asList(new ValidationError(BUDGETMANDATORY, BUDGETMANDATORY))); financialYearService .findOne(budgetDetail.getBudget().getFinancialYear().getId()) .getStartingDate(); financialYearService .findOne(budgetDetail.getBudget().getFinancialYear().getId()) .getEndingDate(); } public Date getPreviousYearFor(final Date date) { final GregorianCalendar previousYearToDate = new GregorianCalendar(); previousYearToDate.setTime(date); final int prevYear = previousYearToDate.get(Calendar.YEAR) - 1; previousYearToDate.set(Calendar.YEAR, prevYear); return previousYearToDate.getTime(); } public List<String> getGridFields() { return gridFields; } public List<String> getMandatoryFields() { return mandatoryFields; } public boolean isHeaderDisabled() { return headerDisabled; } public final boolean shouldShowHeaderField(final String field) { return headerFields.isEmpty() || headerFields.contains(field); } public final boolean shouldShowField(final String field) { if (headerFields.isEmpty() && gridFields.isEmpty()) return true; return shouldShowHeaderField(field) || shouldShowGridField(field); } public final boolean shouldShowGridField(final String field) { return gridFields.isEmpty() || gridFields.contains(field); } public String ajaxLoadSubSchemes() { subSchemes = getPersistenceService() .findAllBy( "from SubScheme where scheme.id=? and isActive=true order by name", schemeId); return Constants.SUBSCHEMES; } public void setBudgetService(final BudgetService budgetService) { this.budgetService = budgetService; } public void setEisCommonService(final EisCommonService eisCommonService) { this.eisCommonService = eisCommonService; } protected ValueStack getValueStack() { return ActionContext.getContext().getValueStack(); } public List<BudgetAmountView> populateAmountData( final List<BudgetDetail> budgetDetails, final Date asOnDate, final CFinancialYear finYear) { final List<BudgetAmountView> list = new ArrayList<BudgetAmountView>(); Map<String, Object> paramMap; final Long finYearId = finYear.getId(); final List<AppConfigValues> appList = appConfigValueService .getConfigValuesByModuleAndKey( FinancialConstants.MODULE_NAME_APPCONFIG, FinancialConstants.APPCONFIG_COA_MAJORCODE_LENGTH); if (appList.isEmpty()) throw new ValidationException(StringUtils.EMPTY, "coa.majorcode.not.defined"); final int majorcodelength = Integer.valueOf(appList.get(0).getValue()); final List<AppConfigValues> appListExcludeStatus = appConfigValueService .getConfigValuesByModuleAndKey( FinancialConstants.MODULE_NAME_APPCONFIG, FinancialConstants.APPCONFIG_EXCLUDE_STATUS); if (appListExcludeStatus.isEmpty()) throw new ValidationException(StringUtils.EMPTY, "exclude.status.not.defined"); final CFinancialYear finyear = financialYearService .getFinancialYearByDate(asOnDate); final Date fromdate = finyear.getStartingDate(); final String voucherstatusExclude = appListExcludeStatus.get(0) .getValue(); for (final BudgetDetail detail : budgetDetails) { paramMap = budgetDetailHelper.constructParamMap(getValueStack(), detail); paramMap.put("MAJORCODELENGTH", majorcodelength); paramMap.put("VOUCHERSTATUSEXCLUDE", voucherstatusExclude); paramMap.put("FYFROMDATE", fromdate); final BudgetAmountView view = new BudgetAmountView(); budgetDetailHelper.populateData(view, paramMap, asOnDate, re); final BudgetDetail detailWithoutBudget = new BudgetDetail(); detailWithoutBudget.copyFrom(detail); detailWithoutBudget.setBudget(null); final List<BudgetDetail> budgetDetail = budgetDetailService .searchByCriteriaWithTypeAndFY(finYearId, "BE", detailWithoutBudget); if ((budgetDetail != null) && (budgetDetail.size() > 0)) { final BigDecimal approvedAmount = budgetDetail.get(0) .getApprovedAmount(); view.setCurrentYearBeApproved( approvedAmount == null ? BigDecimal.ZERO.toString() : approvedAmount.toString()); view.setReappropriation(budgetDetail.get(0) .getApprovedReAppropriationsTotal().toString()); } view.setTotal(new BigDecimal(view.getCurrentYearBeApproved()) .add(new BigDecimal(view.getReappropriation())) .toString()); list.add(view); } return list; } public void setShowMessage(final boolean showMessage) { this.showMessage = showMessage; } public boolean isShowMessage() { return showMessage; } public void setBeAmounts(final List<BigDecimal> beAmounts) { this.beAmounts = beAmounts; } public List<BigDecimal> getBeAmounts() { return beAmounts; } public void setNextYearRange(final String nextYearRange) { this.nextYearRange = nextYearRange; } public String getNextYearRange() { return nextYearRange; } public void setReferenceBudget(final Budget referenceBudget) { this.referenceBudget = referenceBudget; } public Budget getReferenceBudget() { return referenceBudget; } public void setFinancialYear(final CFinancialYear financialYear) { this.financialYear = financialYear; } public CFinancialYear getFinancialYear() { return financialYear; } public void setBudgetList(final List<Budget> budgetList) { this.budgetList = budgetList; } public List<Budget> getBudgetList() { return budgetList; } public void setBudgetWorkflowService( final WorkflowService<Budget> budgetWorkflowService) { this.budgetWorkflowService = budgetWorkflowService; } public void removeEmptyBudgetDetails( final List<BudgetDetail> budgetDetailList) { int i = 0; for (final Iterator<BudgetDetail> detail = budgetDetailList .iterator(); detail.hasNext();) { if (detail.next() == null) detail.remove(); if (beAmounts.get(i) == null) throw new ValidationException( Arrays.asList( new ValidationError(BUDGETRE, BUDGETRE))); if (budgetDetailList.get(i).getOriginalAmount() == null) throw new ValidationException( Arrays.asList( new ValidationError(BUDGETBE, BUDGETBE))); i++; } } /** * @return the showDetails */ public boolean isShowDetails() { return showDetails; } /** * @param showDetails the showDetails to set */ public void setShowDetails(final boolean showDetails) { this.showDetails = showDetails; } public Long getSearchfunctionid() { return searchfunctionid; } public void setSearchfunctionid(final Long searchfunctionid) { this.searchfunctionid = searchfunctionid; } public Long getSearchbudgetGroupid() { return searchbudgetGroupid; } public void setSearchbudgetGroupid(final Long searchbudgetGroupid) { this.searchbudgetGroupid = searchbudgetGroupid; } public WorkflowBean getWorkflowBean() { return workflowBean; } public void setWorkflowBean(final WorkflowBean workflowBean) { this.workflowBean = workflowBean; } public boolean isAddNewDetails() { return addNewDetails; } public void setAddNewDetails(final boolean addDetails) { addNewDetails = addDetails; } public void setBudgetDocumentNumber(final Long documentNumber) { budgetDocumentNumber = documentNumber; } public Long getBudgetDocumentNumber() { return budgetDocumentNumber; } public boolean isRe() { return re; } public void setBudgetDetailHelper(final BudgetDetailHelper budgetHelper) { budgetDetailHelper = budgetHelper; } public Date getAsOnDate() { return asOnDate == null ? new Date() : asOnDate; } public void setAsOnDate(final Date date) { asOnDate = date; } public Integer getSchemeId() { return schemeId; } public void setSchemeId(final Integer scheme) { schemeId = scheme; } public List<Scheme> getSubSchemes() { return subSchemes; } }