/* * 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.services.budget; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.script.ScriptContext; import org.apache.log4j.Logger; import org.egov.commons.CFinancialYear; import org.egov.commons.EgwStatus; import org.egov.commons.dao.EgwStatusHibernateDAO; import org.egov.dao.budget.BudgetDetailsHibernateDAO; import org.egov.egf.autonumber.BudgetReAppropriationSequenceNumberGenerator; import org.egov.egf.autonumber.VouchernumberGenerator; import org.egov.egf.model.BudgetReAppropriationView; import org.egov.infra.admin.master.entity.AppConfigValues; import org.egov.infra.admin.master.service.AppConfigValueService; import org.egov.infra.persistence.utils.ApplicationSequenceNumberGenerator; import org.egov.infra.script.service.ScriptService; import org.egov.infra.utils.autonumber.AutonumberServiceBeanResolver; import org.egov.infra.validation.exception.ValidationError; import org.egov.infra.validation.exception.ValidationException; import org.egov.infra.workflow.service.WorkflowService; import org.egov.infstr.services.PersistenceService; import org.egov.model.budget.Budget; import org.egov.model.budget.BudgetDetail; import org.egov.model.budget.BudgetReAppropriation; import org.egov.model.budget.BudgetReAppropriationMisc; import org.egov.pims.commons.Position; import org.egov.utils.BudgetDetailConfig; import org.egov.utils.Constants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.transaction.annotation.Transactional; public class BudgetReAppropriationService extends PersistenceService<BudgetReAppropriation, Long> { private static final Logger LOGGER = Logger.getLogger(BudgetReAppropriationService.class); WorkflowService<BudgetReAppropriationMisc> miscWorkflowService; @Autowired @Qualifier("budgetDetailService") private BudgetDetailService budgetDetailService; protected WorkflowService<BudgetDetail> budgetDetailWorkflowService; @Autowired private BudgetDetailConfig budgetDetailConfig; @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired private ApplicationSequenceNumberGenerator sequenceGenerator; @Autowired private AppConfigValueService appConfigValuesService; @Autowired private BudgetDetailsHibernateDAO budgetDetailsDAO; @Autowired protected ScriptService scriptService; @Autowired @Qualifier("budgetReAppropriationMiscService") private BudgetReAppropriationMiscService budgetReAppropriationMiscService; @Autowired private EgwStatusHibernateDAO egwStatusDAO; @Autowired private AutonumberServiceBeanResolver beanResolver; public BudgetReAppropriationService() { super(BudgetReAppropriation.class); } public BudgetReAppropriationService(final Class<BudgetReAppropriation> type) { super(type); } public ApplicationSequenceNumberGenerator getSequenceGenerator() { return sequenceGenerator; } public void setSequenceGenerator(final ApplicationSequenceNumberGenerator sequenceGenerator) { this.sequenceGenerator = sequenceGenerator; } public void setBudgetDetailWorkflowService( final WorkflowService<BudgetDetail> budgetDetailWorkflowService) { this.budgetDetailWorkflowService = budgetDetailWorkflowService; } public void setBudgetDetailService(final BudgetDetailService budgetDetailService) { this.budgetDetailService = budgetDetailService; } public void setPersistenceService(final PersistenceService persistenceService) { this.persistenceService = persistenceService; } public void setMiscWorkflowService(final WorkflowService<BudgetReAppropriationMisc> miscWorkflowService) { this.miscWorkflowService = miscWorkflowService; } public boolean checkRowEmpty(final BudgetReAppropriationView appropriation) { if ((appropriation.getBudget() == null || appropriation.getBudget().getId() == 0) && (appropriation.getBudgetDetail().getBudgetGroup() == null || appropriation.getBudgetDetail().getBudgetGroup() .getId() == 0) && isMandatoryGridFieldEmpty(appropriation)) return true; return false; } @Transactional public BudgetDetail createApprovedBudgetDetail(final BudgetReAppropriationView appropriation, final Position position) { final BudgetDetail detail = new BudgetDetail(); final BudgetDetail budgetDetail = appropriation.getBudgetDetail(); detail.copyFrom(budgetDetail); final BudgetDetail savedBudgetDetail = budgetDetailService.createBudgetDetail(detail, position, persistenceService); budgetDetailService.applyAuditing(savedBudgetDetail); budgetDetailService.persist(savedBudgetDetail); // detail.transition(true).end().withOwner(position); return savedBudgetDetail; } public void validateMandatoryFields(final List<BudgetReAppropriationView> reAppropriationList) { for (final BudgetReAppropriationView entry : reAppropriationList) { entry.setBudgetDetail(setRelatedValues(entry.getBudgetDetail())); if (entry.getBudgetDetail().getBudgetGroup() == null || entry.getBudgetDetail().getBudgetGroup().getId() == 0L) throw new ValidationException(Arrays.asList(new ValidationError("budgetDetail.budgetGroup.mandatory", "budgetDetail.budgetGroup.mandatory"))); final Map<String, Object> valueMap = constructValueMap(entry.getBudgetDetail()); budgetDetailConfig.checkHeaderMandatoryField(valueMap); budgetDetailConfig.checkGridMandatoryField(valueMap); } } public BudgetDetail 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); return detail; } private Map<String, Object> constructValueMap(final BudgetDetail budgetDetail) { final Map<String, Object> valueMap = new HashMap<String, Object>(); valueMap.put(Constants.EXECUTING_DEPARTMENT, budgetDetail.getExecutingDepartment()); valueMap.put(Constants.FUNCTION, budgetDetail.getFunction()); valueMap.put(Constants.FUNCTIONARY, budgetDetail.getFunctionary()); valueMap.put(Constants.SCHEME, budgetDetail.getScheme()); valueMap.put(Constants.SUB_SCHEME, budgetDetail.getSubScheme()); valueMap.put(Constants.BOUNDARY, budgetDetail.getBoundary()); valueMap.put(Constants.FUND, budgetDetail.getFund()); return valueMap; } private boolean isMandatoryGridFieldEmpty(final BudgetReAppropriationView appropriation) { for (final String entry : budgetDetailConfig.getGridFields()) { if (Constants.FUNCTION.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.FUNCTION) && (appropriation.getBudgetDetail().getFunction() == null || appropriation.getBudgetDetail().getFunction() .getId() == 0)) return true; if (Constants.EXECUTING_DEPARTMENT.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.EXECUTING_DEPARTMENT) && (appropriation.getBudgetDetail().getExecutingDepartment() == null || appropriation.getBudgetDetail() .getExecutingDepartment().getId() == 0)) return true; if (Constants.FUND.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.FUND) && (appropriation.getBudgetDetail().getExecutingDepartment() == null || appropriation.getBudgetDetail() .getExecutingDepartment().getId() == 0)) return true; if (Constants.SCHEME.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.SCHEME) && (appropriation.getBudgetDetail().getScheme() == null || appropriation.getBudgetDetail().getScheme() .getId() == 0)) return true; if (Constants.SUB_SCHEME.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.SUB_SCHEME) && (appropriation.getBudgetDetail().getSubScheme() == null || appropriation.getBudgetDetail().getSubScheme() .getId() == 0)) return true; if (Constants.BOUNDARY.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.BOUNDARY) && (appropriation.getBudgetDetail().getBoundary() == null || appropriation.getBudgetDetail().getBoundary() .getBndryId() == 0)) return true; if (Constants.FUNCTIONARY.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.FUNCTIONARY) && (appropriation.getBudgetDetail().getFunctionary() == null || appropriation.getBudgetDetail() .getFunctionary().getId() == 0)) return true; if (Constants.FUND.equalsIgnoreCase(entry) && budgetDetailConfig.getMandatoryFields().contains(Constants.FUND) && (appropriation.getBudgetDetail().getFund() == null || appropriation.getBudgetDetail().getFund().getId() == 0)) return true; } return false; } public boolean rowsToAddExists(final List<BudgetReAppropriationView> reAppropriationList) { for (final BudgetReAppropriationView budgetReAppropriationView : reAppropriationList) { if (checkRowEmpty(budgetReAppropriationView)) return false; final BudgetDetail budgetDetail = budgetReAppropriationView.getBudgetDetail(); setRelatedValues(budgetDetail); if (budgetDetail.getBudgetGroup() != null && budgetDetail.getBudgetGroup().getId() == 0) budgetDetail.setBudgetGroup(null); if (!checkRowEmpty(budgetReAppropriationView)) return true; } return false; } public void validateDuplicates(final List<BudgetReAppropriationView> budgetReAppropriationList, final BudgetReAppropriationView appropriation) { for (final BudgetReAppropriationView budgetReAppropriationView : budgetReAppropriationList) if (appropriation.getBudgetDetail().compareTo(budgetReAppropriationView.getBudgetDetail())) throw new ValidationException( Arrays.asList(new ValidationError("reApp.duplicate.entry", "reApp.duplicate.entry"))); } public boolean rowsToAddForExistingDetails(final List<BudgetReAppropriationView> reAppropriationList) { for (final BudgetReAppropriationView budgetReAppropriationView : reAppropriationList) { final BudgetDetail budgetDetail = budgetReAppropriationView.getBudgetDetail(); setRelatedValues(budgetDetail); if (budgetDetail.getBudgetGroup() != null && budgetDetail.getBudgetGroup().getId() == 0) budgetDetail.setBudgetGroup(null); if (!(budgetReAppropriationView.getBudgetDetail().getBudgetGroup() == null && isMandatoryGridFieldEmpty(budgetReAppropriationView))) return true; } return false; } /** * This api checks whether the amount being deducted is greater than the budget available. If it is greater, a validation * exception is thrown. * @param reAppropriation - The budget reappropriation being created.(This could be the addition or the deduction * reappropriation) * @return */ public void validateDeductionAmount(final BudgetReAppropriation appropriation) { BigDecimal multiplicationFactor; if (appropriation.getBudgetDetail().getPlanningPercent() != null) { multiplicationFactor = appropriation.getBudgetDetail().getPlanningPercent() .divide(new BigDecimal(String.valueOf(100))); if (LOGGER.isDebugEnabled()) LOGGER.debug("Calculating multiplicationFactor from PlanningPercent : " + multiplicationFactor); } else { multiplicationFactor = new BigDecimal(Double.parseDouble(getAppConfigFor("EGF", "planning_budget_multiplication_factor"))); if (LOGGER.isDebugEnabled()) LOGGER.debug("MultiplicationFactor from AppConfig(planning_budget_multiplication_factor) : " + multiplicationFactor); } final BigDecimal deductionAmount = appropriation.getOriginalDeductionAmount(); if (deductionAmount != null && BigDecimal.ZERO.compareTo(deductionAmount) == -1) if (deductionAmount.compareTo(appropriation.getBudgetDetail().getBudgetAvailable().divide(multiplicationFactor)) == 1 || !canDeduct(appropriation)) throw new ValidationException(Arrays.asList(new ValidationError("budget.deduction.greater.than.available", "budget.deduction.greater.than.available"))); } // checks if the deduction amount is greater than the available amount(i.e, approved-actuals) private boolean canDeduct(final BudgetReAppropriation appropriation) { if (appropriation == null || appropriation.getOriginalDeductionAmount() == null || BigDecimal.ZERO.compareTo(appropriation.getOriginalDeductionAmount()) == 0) return true; final Map<String, Object> paramMap = new HashMap<String, Object>(); final BudgetDetail budgetDetail = appropriation.getBudgetDetail(); if (budgetDetail.getFund() != null && budgetDetail.getFund().getId() != null) paramMap.put("fundid", budgetDetail.getFund().getId()); if (budgetDetail.getExecutingDepartment() != null && budgetDetail.getExecutingDepartment().getId() != null) paramMap.put("deptid", budgetDetail.getExecutingDepartment().getId()); if (budgetDetail.getFunction() != null && budgetDetail.getFunction().getId() != null) paramMap.put("functionid", budgetDetail.getFunction().getId()); if (budgetDetail.getFunctionary() != null && budgetDetail.getFunctionary().getId() != null) paramMap.put("functionaryid", budgetDetail.getFunctionary().getId()); if (budgetDetail.getScheme() != null && budgetDetail.getScheme().getId() != null) paramMap.put("schemeid", budgetDetail.getScheme().getId()); if (budgetDetail.getSubScheme() != null && budgetDetail.getSubScheme().getId() != null) paramMap.put("subschemeid", budgetDetail.getSubScheme().getId()); if (budgetDetail.getBoundary() != null && budgetDetail.getBoundary().getId() != null) paramMap.put("boundaryid", budgetDetail.getBoundary().getId()); paramMap.put("budgetheadid", budgetDetail.getBudgetGroup().getId()); paramMap.put("glcodeid", budgetDetail.getBudgetGroup().getMinCode().getId()); paramMap.put(Constants.ASONDATE, appropriation.getAsOnDate()); final BigDecimal actualBudgetUtilized = budgetDetailsDAO.getActualBudgetUtilized(paramMap); final BigDecimal billAmount = budgetDetailsDAO.getBillAmountForBudgetCheck(paramMap); BigDecimal approvedAmount = appropriation.getBudgetDetail().getApprovedAmount(); approvedAmount = approvedAmount == null ? BigDecimal.ZERO : approvedAmount; BigDecimal reAppropriationsTotal = budgetDetail.getApprovedReAppropriationsTotal(); reAppropriationsTotal = reAppropriationsTotal == null ? BigDecimal.ZERO : reAppropriationsTotal; approvedAmount = approvedAmount.add(reAppropriationsTotal); // if(LOGGER.isInfoEnabled()) // LOGGER.info("*****************RIGHT side>"+approvedAmount.subtract(actualBudgetUtilized==null?BigDecimal.ZERO:actualBudgetUtilized).subtract( // billAmount==null?BigDecimal.ZERO:billAmount)); if (appropriation.getOriginalDeductionAmount().compareTo( approvedAmount.subtract(actualBudgetUtilized == null ? BigDecimal.ZERO : actualBudgetUtilized).subtract( billAmount == null ? BigDecimal.ZERO : billAmount)) > 0) return false; return true; } @Transactional public BudgetReAppropriationMisc createReAppropriationMisc(final String actionName, final BudgetReAppropriationMisc appropriationMisc, final BudgetDetail detail, final Position position) { BudgetReAppropriationMisc misc = new BudgetReAppropriationMisc(); misc.setReAppropriationDate(appropriationMisc.getReAppropriationDate()); misc.setRemarks(appropriationMisc.getRemarks()); misc.setSequenceNumber(getSequenceNumber(detail)); misc.setStatus(egwStatusDAO.getStatusByModuleAndCode("REAPPROPRIATIONMISC", "Approved")); budgetReAppropriationMiscService.applyAuditing(misc); budgetReAppropriationMiscService.persist(misc); /* * misc = (BudgetReAppropriationMisc) misc.start().withOwner(position); miscWorkflowService.transition(actionName, misc, * misc.getRemarks()); */ return misc; } protected String getSequenceNumber(final BudgetDetail detail) { BudgetReAppropriationSequenceNumberGenerator b = beanResolver.getAutoNumberServiceFor(BudgetReAppropriationSequenceNumberGenerator.class); final String sequenceNumber = b.getNextNumber(detail); final ScriptContext scriptContext = ScriptService.createContext("wfItem", detail, "sequenceGenerator", sequenceGenerator); return sequenceNumber; } public BudgetReAppropriation findBySequenceNumberAndBudgetDetail(final String sequenceNumber, final Long budgetDetailId) { return (BudgetReAppropriation) persistenceService.find( "from BudgetReAppropriation b where b.reAppropriationMisc.sequenceNumber=? and b.budgetDetail.id=?", sequenceNumber, budgetDetailId); } public BudgetReAppropriationMisc performActionOnMisc(final String action, final BudgetReAppropriationMisc reApp, final String comment) { final BudgetReAppropriationMisc misc = miscWorkflowService.transition(action, reApp, comment); getSession().flush(); return misc; } /** * This api updates the budget available amount for which the budget reappropriation is being done. The budget available is * calculated as, budget available = budget available + (additional amount * multiplication factor) for addition and budget * available = budget available - (deduction amount * multiplication factor) for deduction * @param reAppropriation - The budget reappropriation being created.(This could be the addition or the deduction * reappropriation) * @return */ @Transactional public void updatePlanningBudget(final BudgetReAppropriation reAppropriation) { getSession().flush(); // BigDecimal multiplicationFactor = new // BigDecimal(Double.parseDouble(getAppConfigFor("EGF","planning_budget_multiplication_factor"))); final BudgetDetail budgetDetail = budgetDetailService.find("from BudgetDetail where id=?", reAppropriation .getBudgetDetail().getId()); BigDecimal budgetAvailable = budgetDetail.getBudgetAvailable() == null ? BigDecimal.ZERO : budgetDetail .getBudgetAvailable(); BigDecimal Budgetapproved = BigDecimal.ZERO; BigDecimal planningBudgetApproved = BigDecimal.ZERO; BigDecimal planningBudgetUsage = BigDecimal.ZERO; // budgetAvailable= (be+addrelease)*planingpercent - consumption Budgetapproved = budgetDetail.getApprovedAmount().add(budgetDetail.getApprovedReAppropriationsTotal()); if (reAppropriation.getAdditionAmount() != null && reAppropriation.getAdditionAmount().compareTo(BigDecimal.ZERO) == 1) Budgetapproved = Budgetapproved.add(reAppropriation.getAdditionAmount()); else if (reAppropriation.getDeductionAmount() != null && reAppropriation.getDeductionAmount().compareTo(BigDecimal.ZERO) == 1) Budgetapproved = Budgetapproved.subtract(reAppropriation.getDeductionAmount()); if (budgetDetail.getPlanningPercent() == null) planningBudgetApproved = Budgetapproved; else planningBudgetApproved = Budgetapproved.multiply(budgetDetail.getPlanningPercent()).divide(new BigDecimal(String .valueOf(100))); planningBudgetUsage = budgetDetailsDAO.getPlanningBudgetUsage(budgetDetail); budgetAvailable = planningBudgetApproved.subtract(planningBudgetUsage); budgetDetail.setBudgetAvailable(budgetAvailable); budgetDetailService.update(budgetDetail); getSession().flush(); } protected BigDecimal zeroOrValue(final BigDecimal value) { return value == null ? BigDecimal.ZERO : value; } private String getAppConfigFor(final String module, final String key) { try { final List<AppConfigValues> list = appConfigValuesService.getConfigValuesByModuleAndKey(module, key); return list.get(0).getValue().toString(); } catch (final Exception e) { throw new ValidationException(Arrays.asList(new ValidationError(key + " not defined in appconfig", key + " not defined in appconfig"))); } } public List<BudgetReAppropriation> getNonApprovedReAppByUser(final Long userId, final BudgetDetail budgetDetail, final CFinancialYear financialYear) { StringBuffer query = new StringBuffer(); query.append("from BudgetReAppropriation where state.value='NEW' and createdBy.id=" + userId + " and budgetDetail.budget.financialYear.id=" + financialYear.getId()); if (budgetDetail.getExecutingDepartment() != null && budgetDetail.getExecutingDepartment().getId() != null && budgetDetail.getExecutingDepartment().getId() != 0) query.append(" and budgetDetail.executingDepartment.id=" + budgetDetail.getExecutingDepartment().getId()); if (budgetDetail.getFund() != null && budgetDetail.getFund().getId() != null && budgetDetail.getFund().getId() != 0) query.append(" and budgetDetail.fund.id=" + budgetDetail.getFund().getId()); if (budgetDetail.getFunction() != null && budgetDetail.getFunction().getId() != null && budgetDetail.getFunction().getId() != 0) query.append(" and budgetDetail.function.id=" + budgetDetail.getFunction().getId()); if (budgetDetail.getFunctionary() != null && budgetDetail.getFunctionary().getId() != null && budgetDetail.getFunctionary().getId() != 0) query.append(" and budgetDetail.functionary.id=" + budgetDetail.getFunctionary().getId()); if (budgetDetail.getScheme() != null && budgetDetail.getScheme().getId() != null && budgetDetail.getScheme().getId() != 0) query.append(" and budgetDetail.scheme.id=" + budgetDetail.getScheme().getId()); if (budgetDetail.getSubScheme() != null && budgetDetail.getSubScheme().getId() != null && budgetDetail.getSubScheme().getId() != 0) query.append(" and budgetDetail.subScheme.id=" + budgetDetail.getSubScheme().getId()); if (budgetDetail.getBoundary() != null && budgetDetail.getBoundary().getId() != null && budgetDetail.getBoundary().getId() != 0) query.append(" and budgetDetail.boundary.id=" + budgetDetail.getBoundary().getId()); query = query.append(" order by budgetDetail.budgetGroup "); return findAllBy(query.toString()); } public void setBudgetDetailsDAO(final BudgetDetailsHibernateDAO budgetDetailsDAO) { this.budgetDetailsDAO = budgetDetailsDAO; } @Transactional public boolean createReAppropriation(final String actionName, final List<BudgetReAppropriationView> budgetReAppropriationList, final Position position, final CFinancialYear financialYear, final String beRe, final BudgetReAppropriationMisc misc, final String asOnDate) { try { if (budgetReAppropriationList.isEmpty() || !rowsToAddForExistingDetails(budgetReAppropriationList)) return false; validateMandatoryFields(budgetReAppropriationList); final List<BudgetReAppropriationView> addedList = new ArrayList<BudgetReAppropriationView>(); for (final BudgetReAppropriationView appropriation : budgetReAppropriationList) { validateDuplicates(addedList, appropriation); saveAndStartWorkFlowForExistingdetails(actionName, appropriation, position, financialYear, beRe, misc, asOnDate); addedList.add(appropriation); } } catch (final ValidationException e) { throw new ValidationException(Arrays.asList(new ValidationError(e.getErrors().get(0).getMessage(), e.getErrors().get(0).getMessage()))); } catch (final Exception e) { throw new ValidationException(Arrays.asList(new ValidationError(e.getMessage(), e.getMessage()))); } return true; } @Transactional public void saveAndStartWorkFlowForExistingdetails(final String actionName, final BudgetReAppropriationView reAppView, final Position position, final CFinancialYear financialYear, final String beRe, final BudgetReAppropriationMisc misc, final String asOnDate) { final BudgetReAppropriation appropriation = new BudgetReAppropriation(); EgwStatus status = egwStatusDAO.getStatusByModuleAndCode("BUDGETDETAIL", "Approved"); reAppView.getBudgetDetail().setStatus(status); final List<BudgetDetail> searchBy = budgetDetailService.searchByCriteriaWithTypeAndFY(financialYear.getId(), beRe, reAppView.getBudgetDetail()); if (searchBy.size() != 1) throw new ValidationException(Arrays.asList(new ValidationError("budget.reappropriation.invalid.combination", "budget.reappropriation.invalid.combination"))); appropriation.setBudgetDetail(searchBy.get(0)); appropriation.setReAppropriationMisc(misc); appropriation.setAnticipatoryAmount(reAppView.getAnticipatoryAmount()); try { appropriation.setAsOnDate(Constants.DDMMYYYYFORMAT2.parse(asOnDate)); } catch (final Exception e) { LOGGER.error("Error while parsing date"); } if ("Addition".equalsIgnoreCase(reAppView.getChangeRequestType())) appropriation.setAdditionAmount(reAppView.getDeltaAmount()); else appropriation.setDeductionAmount(reAppView.getDeltaAmount()); appropriation.setStatus(egwStatusDAO.getStatusByModuleAndCode("BudgetReAppropriation", "Approved")); validateDeductionAmount(appropriation); /* * appropriation.start().withOwner(position); budgetReAppropriationWorkflowService.transition(actionName, appropriation, * ""); */ applyAuditing(appropriation); persist(appropriation); // Need to call on approve (After implementing workflow) updatePlanningBudget(appropriation); } @Transactional public BudgetReAppropriationMisc createBudgetReAppropriationMisc(final String actionName, final String beRe, final CFinancialYear financialYear, final BudgetReAppropriationMisc appropriationMisc, final Position position) { final Budget budget = new Budget(); budget.setIsbere(beRe); budget.setFinancialYear(financialYear); final BudgetDetail budgetDetail = new BudgetDetail(); budgetDetail.setBudget(budget); return createReAppropriationMisc(actionName, appropriationMisc, budgetDetail, position); } @Transactional public boolean createReAppropriationForNewBudgetDetail(final String actionName, final List<BudgetReAppropriationView> newBudgetReAppropriationList, final Position position, final BudgetReAppropriationMisc misc) { try { BudgetDetail detail = null; if (newBudgetReAppropriationList.isEmpty() || !newBudgetReAppropriationList.isEmpty() && !rowsToAddExists(newBudgetReAppropriationList)) return false; try { final List<BudgetReAppropriationView> addedList = new ArrayList<BudgetReAppropriationView>(); for (final BudgetReAppropriationView appropriation : newBudgetReAppropriationList) { if (budgetDetailService.getBudgetDetail(appropriation.getBudgetDetail().getFund().getId(), appropriation .getBudgetDetail().getFunction().getId(), appropriation.getBudgetDetail().getExecutingDepartment() .getId(), appropriation.getBudgetDetail().getBudgetGroup().getId(), appropriation.getBudgetDetail() .getBudget().getId()) == null) { detail = createApprovedBudgetDetail(appropriation, position); if (!checkRowEmpty(appropriation)) { validateMandatoryFields(newBudgetReAppropriationList); validateDuplicates(addedList, appropriation); saveAndStartWorkFlowForNewDetail(actionName, detail, appropriation, position, misc); addedList.add(appropriation); } } else throw new ValidationException(Arrays.asList(new ValidationError("budgetDetail.duplicate", "budgetdetail.exists"))); } } catch (final Exception e) { throw new ValidationException(Arrays.asList(new ValidationError("budgetDetail.duplicate", "budgetdetail.exists"))); } } catch (final ValidationException e) { throw new ValidationException(Arrays.asList(new ValidationError(e.getErrors().get(0).getMessage(), e.getErrors().get(0).getMessage()))); } catch (final Exception e) { throw new ValidationException(Arrays.asList(new ValidationError(e.getMessage(), e.getMessage()))); } return true; } @Transactional public void saveAndStartWorkFlowForNewDetail(final String actionName, final BudgetDetail detail, final BudgetReAppropriationView appropriation, final Position position, final BudgetReAppropriationMisc misc) { final BudgetReAppropriation reAppropriation = new BudgetReAppropriation(); detail.setPlanningPercent(appropriation.getPlanningPercent()); detail.setBudgetAvailable(appropriation.getDeltaAmount().multiply(detail.getPlanningPercent()) .divide(new BigDecimal(String .valueOf(100)))); reAppropriation.setBudgetDetail(detail); reAppropriation.setReAppropriationMisc(misc); reAppropriation.setAnticipatoryAmount(appropriation.getAnticipatoryAmount()); // Since it is a new budget detail, the amount will always be addition amount reAppropriation.setAdditionAmount(appropriation.getDeltaAmount()); reAppropriation.setStatus(egwStatusDAO.getStatusByModuleAndCode("BudgetReAppropriation", "Approved")); applyAuditing(reAppropriation); persist(reAppropriation); /* * reAppropriation.start().withOwner(position); budgetReAppropriationWorkflowService.transition(actionName, * reAppropriation, ""); */ } }