/* * 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.services; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.poi.ss.formula.functions.T; import org.egov.common.entity.UOM; import org.egov.commons.Accountdetailkey; import org.egov.commons.Accountdetailtype; import org.egov.commons.CFinancialYear; import org.egov.commons.dao.AccountdetailkeyHibernateDAO; import org.egov.commons.dao.EgwStatusHibernateDAO; import org.egov.commons.dao.FinancialYearHibernateDAO; import org.egov.dao.budget.BudgetDetailsDAO; import org.egov.dao.budget.BudgetGroupDAO; import org.egov.egf.commons.EgovCommon; import org.egov.eis.entity.Assignment; import org.egov.eis.service.AssignmentService; import org.egov.infra.admin.master.entity.AppConfigValues; import org.egov.infra.admin.master.service.AppConfigValueService; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.persistence.entity.component.Money; import org.egov.infra.utils.autonumber.AutonumberServiceBeanResolver; import org.egov.infra.validation.exception.ValidationException; import org.egov.infstr.services.PersistenceService; import org.egov.model.budget.BudgetGroup; import org.egov.model.budget.BudgetUsage; import org.egov.works.abstractestimate.entity.AbstractEstimate; import org.egov.works.abstractestimate.entity.AbstractEstimateAppropriation; import org.egov.works.abstractestimate.entity.FinancialDetail; import org.egov.works.abstractestimate.entity.MultiYearEstimate; import org.egov.works.autonumber.EstimateNumberGenerator; import org.egov.works.models.estimate.BudgetFolioDetail; import org.egov.works.models.estimate.BudgetNumberGenerator; import org.egov.works.models.estimate.DepositWorksUsage; import org.egov.works.models.estimate.ProjectCode; import org.egov.works.models.estimate.ProjectCodeGenerator; import org.egov.works.utils.WorksConstants; import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; public class AbstractEstimateService extends PersistenceService<AbstractEstimate, Long> { private static final Logger logger = Logger.getLogger(AbstractEstimateService.class); @Autowired private AutonumberServiceBeanResolver beanResolver; private BudgetNumberGenerator budgetNumberGenerator; @Autowired private ProjectCodeGenerator projectcodeGenerator; @Autowired private FinancialYearHibernateDAO financialYearHibernateDAO; @Autowired private ProjectCodeService projectCodeService; private PersistenceService<AbstractEstimateAppropriation, Long> estimateAppropriationService; private DepositWorksUsageService depositWorksUsageService; private BudgetDetailsDAO budgetDetailsDAO; @Autowired private AppConfigValueService appConfigValuesService; @Autowired private AssignmentService assignmentService; private BudgetGroupDAO budgetGroupDAO; private WorksService worksService; public static final String APPROVED = "APPROVED"; public static final String UNAPPROVED = "UNAPPROVED"; private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US); private EgovCommon egovCommon; private static final String FROM_DATE = "fromDate"; private static final String TO_DATE = "toDate"; private PersistenceService<BudgetUsage, Long> budgetUsageService; private WorkOrderService workOrderService; private WorksPackageService workspackageService; @Autowired private EgwStatusHibernateDAO egwStatusHibernateDAO; @Autowired private AccountdetailkeyHibernateDAO accountdetailkeyHibernateDAO; public void setBudgetDetailsDAO(final BudgetDetailsDAO budgetDetailsDAO) { this.budgetDetailsDAO = budgetDetailsDAO; } public void setBudgetNumberGenerator(final BudgetNumberGenerator budgetNumberGenerator) { this.budgetNumberGenerator = budgetNumberGenerator; } public AbstractEstimateService(Class<AbstractEstimate> type) { super(type); } public AbstractEstimateService() { super(AbstractEstimate.class); } /** * This method invokes the script service to generate the budget appropriation number. This method is invoked from the work * flow rules. * * @param entity an instance of <code>AbstractEstimate</code> * @return a <code>String<code> containing the generated the budget appropriation number. */ public String getBudgetAppropriationNumber(final AbstractEstimate entity) { CFinancialYear finYear = null; try { if (isPreviousYearApprRequired(entity.getFinancialDetails().get(0))) finYear = getPreviousFinancialYear(); else finYear = getCurrentFinancialYear(new Date()); return budgetNumberGenerator.getBudgetApprNo(entity, finYear); } catch (final ValidationException sequenceException) { throw sequenceException; } } /** * The method return true if the estimate number has to be re-generated * * @param entity an instance of <code>AbstractEstimate</code> containing the estimate date * @param financialYear an instance of <code>CFinancialYear</code> representing the financial year for the estimate date. * @return a boolean value indicating if the estimate number change is required. */ private boolean estimateNumberChangeRequired(final AbstractEstimate entity, final CFinancialYear financialYear) { final String[] estNum = entity.getEstimateNumber().split("/"); if (estNum[0].equals(entity.getExecutingDepartment().getCode()) && estNum[1].equals(financialYear.getFinYearRange())) return false; return true; } public void setEstimateNumber(final AbstractEstimate entity) { final CFinancialYear financialYear = getCurrentFinancialYear(entity.getEstimateDate()); if (entity.getEstimateNumber() == null || entity.getEstimateNumber() != null && estimateNumberChangeRequired(entity, financialYear)){ EstimateNumberGenerator e = beanResolver.getAutoNumberServiceFor(EstimateNumberGenerator.class); final String estimateNumber = e.getEstimateNumber(entity, financialYear); entity.setEstimateNumber(estimateNumber); } } /** * This method generates and set the project code for the estimate * * @param entity an instance of <code>AbstractEstimate</code> for the project code is to be generated. */ public void setProjectCode(final AbstractEstimate entity) { final CFinancialYear finYear = getCurrentFinancialYear(entity.getEstimateDate()); final ProjectCode projectCode = new ProjectCode(entity, null); projectCode.setCode(projectcodeGenerator.generateProjectcode(entity, finYear)); projectCode.setCodeName(entity.getName()); projectCode.setDescription(entity.getName()); projectCode.setActive(true); projectCode.setEgwStatus(egwStatusHibernateDAO.getStatusByModuleAndCode(ProjectCode.class.getSimpleName(), WorksConstants.DEFAULT_PROJECTCODE_STATUS)); entity.setProjectCode(projectCode); projectCode.addEstimate(entity); projectCodeService.persist(projectCode); createAccountDetailKey(projectCode); } protected void createAccountDetailKey(final ProjectCode proj) { final Accountdetailtype accountdetailtype = worksService.getAccountdetailtypeByName("PROJECTCODE"); final Accountdetailkey adk = new Accountdetailkey(); adk.setGroupid(1); adk.setDetailkey(proj.getId().intValue()); adk.setDetailname(accountdetailtype.getAttributename()); adk.setAccountdetailtype(accountdetailtype); accountdetailkeyHibernateDAO.create(adk); } /** * This method performs the required validations and persists the <code>FinancialDetail</code> object * * @param financialDetail the <code>FinancialDetail</code> object to be persisted. * @param estimate the parent <code>AbstractEstimate</code> object * @return the persisted <code>AbstractEstimate</code> object */ public AbstractEstimate persistFinancialDetail(final FinancialDetail financialDetail, final AbstractEstimate estimate) { super.validate(estimate); estimate.getFinancialDetails().clear(); estimate.addFinancialDetails(financialDetail); return super.persist(estimate); } public List<AppConfigValues> getAppConfigValue(final String moduleName, final String key) { return appConfigValuesService.getConfigValuesByModuleAndKey(moduleName, key); } public boolean checkForBudgetaryAppropriation(final FinancialDetail financialDetail, final String appropriationNumber) throws ValidationException { Long finyrId; double budgApprAmnt; Date budgetAppDate = null; if (isPreviousYearApprRequired(financialDetail)) budgetAppDate = getPreviousFinancialYear().getEndingDate(); else budgetAppDate = new Date(); // CFinancialYear // estimateDate_finYear=financialYearHibernateDAO.getFinYearByDate(financialDetail.getAbstractEstimate().getEstimateDate()); final CFinancialYear budgetApprDate_finYear = financialYearHibernateDAO.getFinYearByDate(budgetAppDate); final List<Long> budgetheadid = new ArrayList<Long>(); budgetheadid.add(financialDetail.getBudgetGroup().getId()); boolean flag = false; finyrId = budgetApprDate_finYear.getId(); if (budgetAppDate.compareTo(financialDetail.getAbstractEstimate().getEstimateDate()) >= 0) for (final MultiYearEstimate multiYearEstimate : financialDetail.getAbstractEstimate() .getMultiYearEstimates()) if (multiYearEstimate != null && multiYearEstimate.getFinancialYear().getId().compareTo(finyrId) == 0 && multiYearEstimate.getPercentage() > 0) { budgApprAmnt = financialDetail.getAbstractEstimate().getTotalAmount().getValue(); final double percAmt = budgApprAmnt * multiYearEstimate.getPercentage() / 100; flag = checkConsumeEncumbranceBudget(financialDetail, finyrId, percAmt, budgetheadid, appropriationNumber); if (flag != true) return flag; } return flag; } public boolean checkConsumeEncumbranceBudget(final FinancialDetail financialDetail, final Long finyrId, final double budgApprAmnt, final List<Long> budgetheadid, final String appropriationNumber) { final boolean flag = true; final BudgetUsage budgetUsage = budgetDetailsDAO.consumeEncumbranceBudget( appropriationNumber == null ? null : appropriationNumber, finyrId, Integer.valueOf(11), financialDetail.getAbstractEstimate().getEstimateNumber(), Integer.parseInt(financialDetail.getAbstractEstimate().getUserDepartment().getId().toString()), financialDetail.getFunction() == null ? null : financialDetail.getFunction().getId(), financialDetail.getFunctionary() == null ? null : financialDetail.getFunctionary().getId(), financialDetail.getScheme() == null ? null : financialDetail.getScheme().getId(), financialDetail.getSubScheme() == null ? null : financialDetail.getSubScheme().getId(), financialDetail.getAbstractEstimate().getWard() == null ? null : Integer.parseInt(financialDetail .getAbstractEstimate().getWard().getId().toString()), financialDetail.getBudgetGroup() == null ? null : budgetheadid, financialDetail.getFund() == null ? null : financialDetail.getFund().getId(), budgApprAmnt); if (budgetUsage != null) persistBudgetAppropriationDetails(financialDetail.getAbstractEstimate(), budgetUsage); else return false; return flag; } public boolean releaseBudgetOnReject(final FinancialDetail financialDetail) throws ValidationException { final AbstractEstimateAppropriation estimateAppropriation = estimateAppropriationService.findByNamedQuery( "getLatestBudgetUsageForEstimate", financialDetail.getAbstractEstimate().getId()); final List<Long> budgetheadid = new ArrayList<Long>(); budgetheadid.add(financialDetail.getBudgetGroup().getId()); BudgetUsage budgetUsage = null; final boolean flag = false; // Generate Budget Rejection no here final String budgetRejectionNumber = "BC/" + estimateAppropriation.getBudgetUsage().getAppropriationnumber(); budgetUsage = budgetDetailsDAO.releaseEncumbranceBudget( budgetRejectionNumber == null ? null : budgetRejectionNumber, estimateAppropriation.getBudgetUsage().getFinancialYearId().longValue(), Integer.valueOf(11), financialDetail.getAbstractEstimate().getEstimateNumber(), Integer.parseInt(financialDetail.getAbstractEstimate().getUserDepartment().getId().toString()), financialDetail.getFunction() == null ? null : financialDetail.getFunction().getId(), financialDetail.getFunctionary() == null ? null : financialDetail.getFunctionary().getId(), financialDetail.getScheme() == null ? null : financialDetail.getScheme().getId(), financialDetail.getSubScheme() == null ? null : financialDetail.getSubScheme().getId(), financialDetail.getAbstractEstimate().getWard() == null ? null : Integer.parseInt(financialDetail .getAbstractEstimate().getWard().getId().toString()), financialDetail.getBudgetGroup() == null ? null : budgetheadid, financialDetail.getFund() == null ? null : financialDetail.getFund().getId(), estimateAppropriation .getBudgetUsage().getConsumedAmount()); if (financialDetail.getAbstractEstimate() != null) persistBudgetReleaseDetails(financialDetail.getAbstractEstimate(), budgetUsage); return flag; } /** * returns the sanctioned budget for the year * * @param paramMap * @return * @throws ValidationException */ public BigDecimal getTotalGrantForYear(final FinancialDetail fd) throws ValidationException { BigDecimal val = BigDecimal.ZERO; final Map<String, Object> searchMap = new HashMap<String, Object>(); CFinancialYear finYear = null; if (fd != null) { finYear = fd.getAbstractEstimate().getLeastFinancialYearForEstimate(); searchMap.put("financialyearid", Long.valueOf(finYear.getId())); } if (fd != null) { final List<BudgetGroup> budgetheadid = new ArrayList<BudgetGroup>(); budgetheadid.add(fd.getBudgetGroup()); if (fd.getFunction() != null && fd.getFunction().getId() != null) searchMap.put("functionid", fd.getFunction().getId()); if (fd.getFunctionary() != null && fd.getFunctionary().getId() != null) searchMap.put("functionaryid", fd.getFunctionary().getId()); if (fd.getFund() != null && fd.getFund().getId() != null) searchMap.put("fundid", fd.getFund().getId()); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) searchMap.put("budgetheadid", budgetheadid); if (fd.getScheme() != null && fd.getScheme().getId() != null) searchMap.put("schemeid", fd.getScheme().getId()); if (fd.getSubScheme() != null && fd.getSubScheme().getId() != null) searchMap.put("subschemeid", fd.getSubScheme().getId()); if (fd.getAbstractEstimate().getUserDepartment() != null) searchMap.put("deptid", fd.getAbstractEstimate().getUserDepartment().getId()); if (fd.getAbstractEstimate().getWard().getId() != null) searchMap.put("boundaryid", fd.getAbstractEstimate().getWard().getId()); } try { val = budgetDetailsDAO.getBudgetedAmtForYear(searchMap); } catch (final ValidationException valEx) { logger.error(valEx); } return val; } /** * returns the sanctioned budget for the year * * @param paramMap * @return * @throws ValidationException */ public BigDecimal getTotalGrantForYear(final FinancialDetail fd, final Long financialyearid) throws ValidationException { BigDecimal val = BigDecimal.ZERO; final Map<String, Object> searchMap = new HashMap<String, Object>(); searchMap.put("financialyearid", financialyearid); if (fd != null) { final List<BudgetGroup> budgetheadid = new ArrayList<BudgetGroup>(); budgetheadid.add(fd.getBudgetGroup()); if (fd.getFunction() != null && fd.getFunction().getId() != null) searchMap.put("functionid", fd.getFunction().getId()); if (fd.getFunctionary() != null && fd.getFunctionary().getId() != null) searchMap.put("functionaryid", fd.getFunctionary().getId()); if (fd.getFund() != null && fd.getFund().getId() != null) searchMap.put("fundid", fd.getFund().getId()); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) searchMap.put("budgetheadid", budgetheadid); if (fd.getScheme() != null && fd.getScheme().getId() != null) searchMap.put("schemeid", fd.getScheme().getId()); if (fd.getSubScheme() != null && fd.getSubScheme().getId() != null) searchMap.put("subschemeid", fd.getSubScheme().getId()); if (fd.getAbstractEstimate().getUserDepartment() != null) searchMap.put("deptid", fd.getAbstractEstimate().getUserDepartment().getId()); if (fd.getAbstractEstimate().getWard().getId() != null) searchMap.put("boundaryid", fd.getAbstractEstimate().getWard().getId()); } try { val = budgetDetailsDAO.getBudgetedAmtForYear(searchMap); } catch (final ValidationException valEx) { logger.error(valEx); } return val; } /** * returns the sanctioned budget for the year * * @param paramMap * @return * @throws ValidationException */ public BigDecimal getTotalGrantForYear(final FinancialDetail fd, final Long financialyearid, final Integer deptid) throws ValidationException { BigDecimal val = BigDecimal.ZERO; final Map<String, Object> searchMap = new HashMap<String, Object>(); searchMap.put("financialyearid", financialyearid); searchMap.put("deptid", deptid); if (fd != null) { final List<BudgetGroup> budgetheadid = new ArrayList<BudgetGroup>(); budgetheadid.add(fd.getBudgetGroup()); if (fd.getFunction() != null && fd.getFunction().getId() != null) searchMap.put("functionid", fd.getFunction().getId()); if (fd.getFunctionary() != null && fd.getFunctionary().getId() != null) searchMap.put("functionaryid", fd.getFunctionary().getId()); if (fd.getFund() != null && fd.getFund().getId() != null) searchMap.put("fundid", fd.getFund().getId()); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) searchMap.put("budgetheadid", budgetheadid); if (fd.getScheme() != null && fd.getScheme().getId() != null) searchMap.put("schemeid", fd.getScheme().getId()); if (fd.getSubScheme() != null && fd.getSubScheme().getId() != null) searchMap.put("subschemeid", fd.getSubScheme().getId()); if (fd.getAbstractEstimate().getWard().getId() != null) searchMap.put("boundaryid", fd.getAbstractEstimate().getWard().getId()); } try { val = budgetDetailsDAO.getBudgetedAmtForYear(searchMap); } catch (final ValidationException valEx) { logger.error(valEx); } return val; } /** * returns the sanctioned budget for the year as on the date passed * * @param paramMap * @return * @throws ValidationException */ public BigDecimal getTotalGrantForYearAsOnDate(final FinancialDetail fd, final Long financialyearid, final Integer deptid, final Date asOnDate) throws ValidationException { BigDecimal val = BigDecimal.ZERO; final Map<String, Object> searchMap = new HashMap<String, Object>(); searchMap.put("financialyearid", financialyearid); searchMap.put("deptid", deptid); if (fd != null) { final List<BudgetGroup> budgetheadid = new ArrayList<BudgetGroup>(); budgetheadid.add(fd.getBudgetGroup()); if (fd.getFunction() != null && fd.getFunction().getId() != null) searchMap.put("functionid", fd.getFunction().getId()); if (fd.getFunctionary() != null && fd.getFunctionary().getId() != null) searchMap.put("functionaryid", fd.getFunctionary().getId()); if (fd.getFund() != null && fd.getFund().getId() != null) searchMap.put("fundid", fd.getFund().getId()); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) searchMap.put("budgetheadid", budgetheadid); if (fd.getScheme() != null && fd.getScheme().getId() != null) searchMap.put("schemeid", fd.getScheme().getId()); if (fd.getSubScheme() != null && fd.getSubScheme().getId() != null) searchMap.put("subschemeid", fd.getSubScheme().getId()); if (fd.getAbstractEstimate().getWard().getId() != null) searchMap.put("boundaryid", fd.getAbstractEstimate().getWard().getId()); } try { val = budgetDetailsDAO.getBudgetedAmtForYearAsOnDate(searchMap, asOnDate); } catch (final ValidationException valEx) { logger.error(valEx); } return val; } /** * returns the planning budget percentage * * @param paramMap * @return * @throws ValidationException */ public BigDecimal getPlanningBudgetPercentage(final FinancialDetail fd, final Long financialyearid, final Integer deptid) throws ValidationException { BigDecimal val = BigDecimal.ZERO; final Map<String, Object> searchMap = new HashMap<String, Object>(); searchMap.put("financialyearid", financialyearid); searchMap.put("deptid", deptid); if (fd != null) { final List<BudgetGroup> budgetheadid = new ArrayList<BudgetGroup>(); budgetheadid.add(fd.getBudgetGroup()); if (fd.getFunction() != null && fd.getFunction().getId() != null) searchMap.put("functionid", fd.getFunction().getId()); if (fd.getFunctionary() != null && fd.getFunctionary().getId() != null) searchMap.put("functionaryid", fd.getFunctionary().getId()); if (fd.getFund() != null && fd.getFund().getId() != null) searchMap.put("fundid", fd.getFund().getId()); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) searchMap.put("budgetheadid", budgetheadid); if (fd.getScheme() != null && fd.getScheme().getId() != null) searchMap.put("schemeid", fd.getScheme().getId()); if (fd.getSubScheme() != null && fd.getSubScheme().getId() != null) searchMap.put("subschemeid", fd.getSubScheme().getId()); if (fd.getAbstractEstimate().getWard().getId() != null) searchMap.put("boundaryid", fd.getAbstractEstimate().getWard().getId()); } try { val = budgetDetailsDAO.getPlanningPercentForYear(searchMap); } catch (final ValidationException valEx) { logger.error(valEx); } return val; } /** * This method will return budgetary appropriation done estimate list for budgetHead * * @param */ public Map<String, List> getApprovedAppropriationDetailsForBugetHead(final AbstractEstimate viewEstimate, final BigDecimal totalGrantPerc) { if (logger.isDebugEnabled()) logger.debug("1---inside getApprovedAppropriationDetailsForBugetHead------"); final List<BudgetFolioDetail> approvedBudgetFolioResultList = new ArrayList<BudgetFolioDetail>(); final Map<String, Object> queryParamMap = new HashMap<String, Object>(); FinancialDetail fd = null; Long deptId = null; Long functionId = null; Integer fundId = null; Long budgetHeadId = null; Long financialYearId = null; Map<String, List> budgetFolioMap = null; // fundId,ExecutionDepartmentId,functionId,moduleId,financialYearId,budgetgroupId,fromDate,toDate // and Order By if (viewEstimate != null && viewEstimate.getFinancialDetails().get(0) != null) fd = viewEstimate.getFinancialDetails().get(0); if (fd != null) { if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getId() != null) { budgetHeadId = viewEstimate.getFinancialDetails().get(0).getBudgetGroup().getId(); queryParamMap.put("budgetgroupId", budgetHeadId); } if (fd.getAbstractEstimate().getUserDepartment() != null) { deptId = fd.getAbstractEstimate().getUserDepartment().getId(); queryParamMap.put("ExecutionDepartmentId", deptId); } if (fd.getFunction() != null && fd.getFunction().getId() != null) { functionId = fd.getFunction().getId(); queryParamMap.put("functionId", functionId); } if (fd.getFund() != null && fd.getFund() != null && fd.getFund().getId() != null) { fundId = fd.getFund().getId(); queryParamMap.put("fundId", fundId); } if (fd.getAbstractEstimate() != null && fd.getAbstractEstimate().getLeastFinancialYearForEstimate() != null && fd.getAbstractEstimate().getLeastFinancialYearForEstimate().getId() != null) { financialYearId = fd.getAbstractEstimate().getLeastFinancialYearForEstimate().getId(); queryParamMap.put("financialYearId", financialYearId); addFinancialYearToQuery(fd, queryParamMap); } } final Integer moduleId = 11; queryParamMap.put("moduleId", moduleId); final List<BudgetUsage> budgetUsageList = egovCommon.getListBudgetUsage(queryParamMap); if (budgetUsageList != null && !budgetUsageList.isEmpty()) budgetFolioMap = addApprovedEstimateResultList(approvedBudgetFolioResultList, budgetUsageList, totalGrantPerc); return budgetFolioMap; } public Map<String, List> getApprovedAppropriationDetailsForBugetHead(final Map<String, Object> queryParamMap) { final List<BudgetFolioDetail> approvedBudgetFolioResultList = new ArrayList<BudgetFolioDetail>(); final Map<String, Object> paramMap = new HashMap<String, Object>(); if (queryParamMap.get("budgetheadid") != null) { final List<BudgetGroup> budgetheadid = (List) queryParamMap.get("budgetheadid"); final BudgetGroup bg = budgetheadid.get(0); paramMap.put("budgetgroupId", bg.getId()); } if (queryParamMap.get("deptid") != null) paramMap.put("ExecutionDepartmentId", queryParamMap.get("deptid")); if (queryParamMap.get("functionid") != null) paramMap.put("functionId", queryParamMap.get("functionid")); if (queryParamMap.get("fundid") != null) paramMap.put("fundId", queryParamMap.get("fundid")); if (queryParamMap.get("financialyearid") != null) paramMap.put("financialYearId", queryParamMap.get("financialyearid")); if (queryParamMap.get(FROM_DATE) != null) paramMap.put(FROM_DATE, queryParamMap.get(FROM_DATE)); if (queryParamMap.get(TO_DATE) != null) paramMap.put(TO_DATE, queryParamMap.get(TO_DATE)); final Integer moduleId = 11; paramMap.put("moduleId", moduleId); final List<BudgetUsage> budgetUsageList = budgetDetailsDAO.getListBudgetUsage(paramMap); if (budgetUsageList != null && !budgetUsageList.isEmpty()) return addApprovedEstimateResultList(approvedBudgetFolioResultList, budgetUsageList, new BigDecimal( queryParamMap.get("totalGrantPerc").toString())); return new HashMap<String, List>(); } public void addFinancialYearToQuery(final FinancialDetail fd, final Map<String, Object> queryParamMap) { if (fd.getAbstractEstimate().getLeastFinancialYearForEstimate().getStartingDate() != null) queryParamMap.put(FROM_DATE, fd.getAbstractEstimate().getLeastFinancialYearForEstimate().getStartingDate()); queryParamMap.put(TO_DATE, new Date()); } public Map<String, List> addApprovedEstimateResultList(final List<BudgetFolioDetail> budgetFolioResultList, final List<BudgetUsage> budgetUsageList, final BigDecimal totalGrantPerc) { int srlNo = 1; Double cumulativeTotal = 0.00D; BigDecimal balanceAvailable = BigDecimal.ZERO; final Map<String, List> budgetFolioMap = new HashMap<String, List>(); for (final BudgetUsage budgetUsage : budgetUsageList) { final BudgetFolioDetail budgetFolioDetail = new BudgetFolioDetail(); budgetFolioDetail.setSrlNo(srlNo++); final AbstractEstimate estimate = find("from AbstractEstimate ae where ae.estimateNumber=?", budgetUsage.getReferenceNumber()); if (estimate != null) { budgetFolioDetail.setEstimateNo(estimate.getEstimateNumber()); budgetFolioDetail.setNameOfWork(estimate.getName()); budgetFolioDetail.setWorkValue(estimate.getTotalAmount().getValue()); budgetFolioDetail.setEstimateDate(sdf.format(estimate.getEstimateDate())); } budgetFolioDetail.setBudgetApprNo(budgetUsage.getAppropriationnumber()); budgetFolioDetail.setCumulativeTotal(cumulativeTotal); balanceAvailable = totalGrantPerc.subtract(new BigDecimal(cumulativeTotal)); budgetFolioDetail.setBalanceAvailable(balanceAvailable); budgetFolioDetail.setAppDate(sdf.format(new Date(budgetUsage.getUpdatedTime().getTime()))); budgetFolioDetail.setAppType(getApporpriationType(budgetUsage.getId())); budgetFolioResultList.add(budgetFolioDetail); if (budgetUsage.getReleasedAmount() > 0) { cumulativeTotal = cumulativeTotal - budgetUsage.getReleasedAmount(); budgetFolioDetail.setAppropriatedValue(0.0 - budgetUsage.getReleasedAmount()); } else { cumulativeTotal = cumulativeTotal + budgetUsage.getConsumedAmount(); budgetFolioDetail.setAppropriatedValue(budgetUsage.getConsumedAmount()); } } final List calculatedValuesList = new ArrayList(); calculatedValuesList.add(cumulativeTotal); calculatedValuesList.add(totalGrantPerc.subtract(new BigDecimal(cumulativeTotal))); budgetFolioMap.put("budgetFolioList", budgetFolioResultList); budgetFolioMap.put("calculatedValues", calculatedValuesList); return budgetFolioMap; } public Map<String, Object> createBudgetFolioHeaderJasperObject(final AbstractEstimate ae, final BigDecimal totalGrant, final BigDecimal totalGrantPer) { final HashMap<String, Object> budgetFolioMapObject = new HashMap<String, Object>(); String departmentName = ""; String functionCenter = ""; String budgetHead = ""; String fund = ""; FinancialDetail fd = null; if (ae != null && ae.getExecutingDepartment() != null && ae.getExecutingDepartment().getName() != null) departmentName = ae.getExecutingDepartment().getName(); if (ae != null && ae.getFinancialDetails() != null && ae.getFinancialDetails().get(0) != null) fd = ae.getFinancialDetails().get(0); if (fd != null) { if (fd.getFunction() != null && fd.getFunction() != null && fd.getFunction().getName() != null) functionCenter = ae.getFinancialDetails().get(0).getFunction().getName(); if (fd.getBudgetGroup() != null && fd.getBudgetGroup().getName() != null) budgetHead = fd.getBudgetGroup().getName(); if (fd.getFund() != null && fd.getFund().getName() != null) fund = fd.getFund().getName(); } budgetFolioMapObject.put("departmentName", departmentName); budgetFolioMapObject.put("functionCenter", functionCenter); budgetFolioMapObject.put("budgetHead", budgetHead); budgetFolioMapObject.put("fund", fund); budgetFolioMapObject.put("totalGrant", totalGrant); budgetFolioMapObject.put("totalGrantPer", totalGrantPer); return budgetFolioMapObject; } public String getApporpriationType(final long budgetUsageId) { String appType = "Regular"; if (estimateAppropriationService != null) { final List allReadyAppropriatedBudgetUsageList = estimateAppropriationService .findAllBy( "from AbstractEstimateAppropriation where abstractEstimate.id=(select max(abstractEstimate.id) from AbstractEstimateAppropriation where budgetUsage.id=?) and budgetUsage.id<?", budgetUsageId, budgetUsageId); if (allReadyAppropriatedBudgetUsageList.size() != 0) appType = "Re-Appropriation"; } return appType; } public BudgetGroupDAO getBudgetGroupDAO() { return budgetGroupDAO; } public void setBudgetGroupDAO(final BudgetGroupDAO budgetGroupDAO) { this.budgetGroupDAO = budgetGroupDAO; } public BudgetDetailsDAO getBudgetDetailsDAO() { return budgetDetailsDAO; } public void setWorksService(final WorksService worksService) { this.worksService = worksService; } public Assignment getLatestAssignmentForCurrentLoginUser() { final Long currentLoginUserId = worksService.getCurrentLoggedInUserId(); Assignment assignment = null; if (currentLoginUserId != null) assignment = assignmentService.getPrimaryAssignmentForEmployee(currentLoginUserId); return assignment; } public CFinancialYear getCurrentFinancialYear(final Date estimateDate) { return financialYearHibernateDAO.getFinYearByDate(estimateDate); } public CFinancialYear getPreviousFinancialYear() { return financialYearHibernateDAO.getFinancialYearById(Long.parseLong(financialYearHibernateDAO.getPrevYearFiscalId())); } public Date getLatestApprYearEndDate(final FinancialDetail financialDetail) { final AbstractEstimateAppropriation estimateAppropriation = estimateAppropriationService.findByNamedQuery( "getLatestBudgetUsageForEstimate", financialDetail.getAbstractEstimate().getId()); if (estimateAppropriation != null) return financialYearHibernateDAO.getFinancialYearById( estimateAppropriation.getBudgetUsage().getFinancialYearId().longValue()).getEndingDate(); else return new Date(); } public BigDecimal getBudgetAvailable(final AbstractEstimate estimate, final Date date) throws ValidationException { final BigDecimal budgetAvailable = BigDecimal.ZERO; Long finYearId = null; final List<Long> budgetheadid = new ArrayList<Long>(); if (date == null) finYearId = financialYearHibernateDAO.getFinYearByDate(new Date()).getId(); else finYearId = financialYearHibernateDAO.getFinYearByDate(date).getId(); if (estimate.getFinancialDetails() != null && estimate.getFinancialDetails().size() > 0) { final FinancialDetail financialDetail = estimate.getFinancialDetails().get(0); budgetheadid.add(financialDetail.getBudgetGroup().getId()); return budgetDetailsDAO.getPlanningBudgetAvailable(finYearId, Integer.parseInt(estimate.getUserDepartment() .getId().toString()), financialDetail.getFunction() == null ? null : financialDetail.getFunction() .getId(), null, financialDetail.getScheme() == null ? null : financialDetail.getScheme().getId(), financialDetail.getSubScheme() == null ? null : financialDetail.getSubScheme().getId(), Integer .parseInt(estimate.getWard().getId().toString()), financialDetail.getBudgetGroup() == null ? null : budgetheadid, financialDetail.getFund() == null ? null : financialDetail.getFund().getId()); } else return budgetAvailable; } public Boolean isPreviousYearApprRequired(final FinancialDetail financialDetail) { if ("yes".equalsIgnoreCase(worksService.getWorksConfigValue("PREVIOUS_YEAR_APPROPRIATION_ALLOWED")) && financialDetail != null && financialDetail.getApprYear() != null && WorksConstants.PREVIOUS_APPROPRIATION_YEAR.equalsIgnoreCase(financialDetail.getApprYear())) return Boolean.TRUE; else return Boolean.FALSE; } public BigDecimal getBudgetAvailable(final Integer departmentId, final Long functionId, final Integer fundId, final Long budgetGroupId, final Long finYearId) throws ValidationException { if (logger.isDebugEnabled()) logger.debug( "Start of getBudgetAvailable(Long functionId,Integer fundId,Long budgetGroupId,Long finYearId) : functionId=" + functionId + "fundId:" + fundId + "budgetGroupId=" + budgetGroupId + "finYearId=" + finYearId); final List<Long> budgetheadid = new ArrayList<Long>(); if (functionId == null || fundId == null || budgetGroupId == null || finYearId == null || departmentId == null) throw new ApplicationRuntimeException( "Error:Invalid Argument passed to getBudgetAvailable(Integer departmentId,Long functionId,Integer fundId,Long budgetGroupId,Long finYearId)"); budgetheadid.add(budgetGroupId); return budgetDetailsDAO.getPlanningBudgetAvailable(finYearId, departmentId, functionId, null, null, null, null, budgetheadid, fundId); } public List<AbstractEstimate> getAbEstimateListById(final String estId) { final String[] estValues = estId.split("`~`"); final Long[] estIdLong = new Long[estValues.length]; final Set<Long> abIdentifierSet = new HashSet<Long>(); int j = 0; for (final String estValue : estValues) if (StringUtils.isNotBlank(estValue)) { estIdLong[j] = Long.valueOf(estValue); j++; } abIdentifierSet.addAll(Arrays.asList(estIdLong)); return findAllByNamedQuery("ABSTRACTESTIMATELIST_BY_ID", abIdentifierSet); } public Money getWorkValueIncludingTaxesForEstList(final List<AbstractEstimate> abList) { double amt = 0; if (!abList.isEmpty()) for (final AbstractEstimate ab : abList) amt += ab.getWorkValueIncludingTaxes().getValue(); return new Money(amt); } public void setEgovCommon(final EgovCommon egovCommon) { this.egovCommon = egovCommon; } public EgovCommon getEgovCommon() { return egovCommon; } public boolean checkForBudgetaryAppropriationForDepositWorks(final FinancialDetail financialDetail, final String appropriationNumber) throws ValidationException { boolean flag = false; final Date appDate = new Date(); double depApprAmnt = 0.0; final Accountdetailtype accountdetailtype = worksService.getAccountdetailtypeByName("DEPOSITCODE"); // In case of deposit work whole amount will be appropriated at once. if (appDate.compareTo(financialDetail.getAbstractEstimate().getEstimateDate()) >= 0) depApprAmnt = financialDetail.getAbstractEstimate().getTotalAmount().getValue(); final BigDecimal creditBalance = egovCommon.getDepositAmountForDepositCode(new Date(), financialDetail.getCoa() .getGlcode(), financialDetail.getFund().getCode(), accountdetailtype.getId(), financialDetail .getAbstractEstimate().getDepositCode().getId().intValue()); BigDecimal utilizedAmt = depositWorksUsageService.getTotalUtilizedAmountForDepositWorks(financialDetail, appDate); BigDecimal balance = BigDecimal.ZERO; if (utilizedAmt == null) { balance = creditBalance; utilizedAmt = BigDecimal.ZERO; } else balance = creditBalance.subtract(utilizedAmt); if (balance.doubleValue() >= depApprAmnt) { DepositWorksUsage depositWorksUsage = new DepositWorksUsage(); final CFinancialYear budgetApprDate_finYear = financialYearHibernateDAO.getFinYearByDate(appDate); depositWorksUsage.setTotalDepositAmount(creditBalance); depositWorksUsage.setConsumedAmount(new BigDecimal(depApprAmnt)); depositWorksUsage.setReleasedAmount(BigDecimal.ZERO); depositWorksUsage.setAppropriationNumber(appropriationNumber); depositWorksUsage.setAbstractEstimate(financialDetail.getAbstractEstimate()); depositWorksUsage.setAppropriationDate(appDate); depositWorksUsage.setFinancialYear(budgetApprDate_finYear); depositWorksUsage.setDepositCode(financialDetail.getAbstractEstimate().getDepositCode()); depositWorksUsage.setCoa(financialDetail.getCoa()); depositWorksUsage = depositWorksUsageService.persist(depositWorksUsage); persistDepositCodeAppDetails(depositWorksUsage); flag = true; } return flag; } public boolean releaseDepositWorksAmountOnReject(final FinancialDetail financialDetail) throws ValidationException { boolean flag = false; final Accountdetailtype accountdetailtype = worksService.getAccountdetailtypeByName("DEPOSITCODE"); final AbstractEstimateAppropriation estimateAppropriation = estimateAppropriationService.findByNamedQuery( "getLatestDepositWorksUsageForEstimate", financialDetail.getAbstractEstimate().getId()); final BigDecimal creditBalance = egovCommon.getDepositAmountForDepositCode(new Date(), financialDetail.getCoa() .getGlcode(), financialDetail.getFund().getCode(), accountdetailtype.getId(), financialDetail .getAbstractEstimate().getDepositCode().getId().intValue()); // Generate Budget Rejection no here final String budgetRejectionNumber = "BC/" + estimateAppropriation.getDepositWorksUsage().getAppropriationNumber(); final double releaseAmount = estimateAppropriation.getDepositWorksUsage().getConsumedAmount().doubleValue(); DepositWorksUsage depositWorksUsage = new DepositWorksUsage(); depositWorksUsage.setTotalDepositAmount(creditBalance); depositWorksUsage.setConsumedAmount(BigDecimal.ZERO); depositWorksUsage.setReleasedAmount(new BigDecimal(releaseAmount)); depositWorksUsage.setAppropriationNumber(budgetRejectionNumber); depositWorksUsage.setAbstractEstimate(financialDetail.getAbstractEstimate()); depositWorksUsage.setAppropriationDate(new Date()); depositWorksUsage.setFinancialYear(estimateAppropriation.getDepositWorksUsage().getFinancialYear()); depositWorksUsage.setCoa(financialDetail.getCoa()); depositWorksUsage.setDepositCode(financialDetail.getAbstractEstimate().getDepositCode()); depositWorksUsage = depositWorksUsageService.persist(depositWorksUsage); persistReleaseDepositWorksAmountDetails(depositWorksUsage); flag = true; return flag; } public void setDepositWorksUsageService(final DepositWorksUsageService depositWorksUsageService) { this.depositWorksUsageService = depositWorksUsageService; } public DepositWorksUsageService getDepositWorksUsageService() { return depositWorksUsageService; } private void persistBudgetAppropriationDetails(final AbstractEstimate abstractEstimate, final BudgetUsage budgetUsage) { AbstractEstimateAppropriation estimateAppropriation = null; final Integer finYearId = budgetUsage.getFinancialYearId(); final Date endingDate = financialYearHibernateDAO.getFinancialYearById(finYearId.longValue()).getEndingDate(); estimateAppropriation = estimateAppropriationService.findByNamedQuery("getBudgetUsageForEstimateByFinYear", abstractEstimate.getId(), finYearId.intValue()); if (estimateAppropriation != null) { estimateAppropriation.setBalanceAvailable(getBudgetAvailable(abstractEstimate, endingDate)); estimateAppropriation.setBudgetUsage(budgetUsage); } else { estimateAppropriation = new AbstractEstimateAppropriation(); estimateAppropriation.setAbstractEstimate(abstractEstimate); estimateAppropriation.setBalanceAvailable(getBudgetAvailable(abstractEstimate, endingDate)); estimateAppropriation.setBudgetUsage(budgetUsage); } estimateAppropriationService.persist(estimateAppropriation); } private void persistDepositCodeAppDetails(final DepositWorksUsage depositWorksUsage) { AbstractEstimateAppropriation estimateAppropriation = null; final int finYearId = financialYearHibernateDAO.getFinYearByDate(new Date()).getId().intValue(); final BigDecimal creditBalance = depositWorksUsage.getTotalDepositAmount(); final AbstractEstimate abstractEstimate = depositWorksUsage.getAbstractEstimate(); BigDecimal utilizedAmt = depositWorksUsageService.getTotalUtilizedAmountForDepositWorks(abstractEstimate .getFinancialDetails().get(0), depositWorksUsage.getCreatedDate()); BigDecimal balance = BigDecimal.ZERO; if (utilizedAmt == null) { balance = creditBalance; utilizedAmt = BigDecimal.ZERO; } else balance = creditBalance.subtract(utilizedAmt); estimateAppropriation = estimateAppropriationService.findByNamedQuery( "getDepositWorksUsageForEstimateByFinYear", abstractEstimate.getId(), finYearId); if (estimateAppropriation != null) { estimateAppropriation.setBalanceAvailable(balance); estimateAppropriation.setDepositWorksUsage(depositWorksUsage); } else { estimateAppropriation = new AbstractEstimateAppropriation(); estimateAppropriation.setAbstractEstimate(abstractEstimate); estimateAppropriation.setBalanceAvailable(balance); estimateAppropriation.setDepositWorksUsage(depositWorksUsage); } estimateAppropriationService.persist(estimateAppropriation); } private void persistBudgetReleaseDetails(final AbstractEstimate abstractEstimate, final BudgetUsage budgetUsage) { AbstractEstimateAppropriation estimateAppropriation = null; estimateAppropriation = estimateAppropriationService.findByNamedQuery("getLatestBudgetUsageForEstimate", abstractEstimate.getId()); final Integer finYearId = estimateAppropriation.getBudgetUsage().getFinancialYearId(); final Date endingDate = financialYearHibernateDAO.getFinancialYearById(finYearId.longValue()).getEndingDate(); estimateAppropriation.setBalanceAvailable(getBudgetAvailable(abstractEstimate, endingDate)); estimateAppropriation.setBudgetUsage(budgetUsage); estimateAppropriationService.persist(estimateAppropriation); } private void persistReleaseDepositWorksAmountDetails(final DepositWorksUsage depositWorksUsage) { AbstractEstimateAppropriation estimateAppropriation = null; final BigDecimal creditBalance = depositWorksUsage.getTotalDepositAmount(); final AbstractEstimate abstractEstimate = depositWorksUsage.getAbstractEstimate(); final BigDecimal utilizedAmt = depositWorksUsageService.getTotalUtilizedAmountForDepositWorks(abstractEstimate .getFinancialDetails().get(0), new Date()); final BigDecimal balance = creditBalance.subtract(utilizedAmt); estimateAppropriation = estimateAppropriationService.findByNamedQuery("getLatestDepositWorksUsageForEstimate", abstractEstimate.getId()); estimateAppropriation.setBalanceAvailable(balance); estimateAppropriation.setDepositWorksUsage(depositWorksUsage); estimateAppropriationService.persist(estimateAppropriation); } /* * This API will return amount to be appropriated for estimate in the given financial year. * @param estimate,finYearId * @return 0 if no appropriation required otherwise appropriation amount */ public Double getEstimateAppropriationAmountForFinyear(final AbstractEstimate estimate, final Integer finYearId) { Double percentage = 0.0; Double appropriationAmount = 0.0; if (logger.isDebugEnabled()) logger.debug("start of getEstimateAppropriationAmountByFinyear() || estimate number=" + estimate.getEstimateNumber()); if (estimate == null || finYearId == null) throw new ApplicationRuntimeException("Invalid argument passed to getEstimateAppropriationAmountForFinyear()"); for (final MultiYearEstimate multiYearEstimate : estimate.getMultiYearEstimates()) if (multiYearEstimate.getFinancialYear().getId().intValue() == finYearId) { percentage = multiYearEstimate.getPercentage(); break; } if (percentage != 0.0) appropriationAmount = estimate.getTotalAmount().getValue() * (percentage / 100); if (logger.isDebugEnabled()) logger.debug("end of getEstimateAppropriationAmountByFinyear() ||appropariation amount=" + appropriationAmount + "||estimate number ||" + estimate.getEstimateNumber() + " Finyear ||" + finYearId); return appropriationAmount; } public void setEstimateAppropriationService( final PersistenceService<AbstractEstimateAppropriation, Long> estimateAppropriationService) { this.estimateAppropriationService = estimateAppropriationService; } public PersistenceService<AbstractEstimateAppropriation, Long> getEstimateAppropriationService() { return estimateAppropriationService; } public List<UOM> prepareUomListByExcludingSpecialUoms(final List<UOM> uomList) { final Set<String> exceptionSor = worksService.getExceptionSOR().keySet(); final List<UOM> newList = new ArrayList<UOM>(); for (final UOM uom : uomList) if (!exceptionSor.contains(uom.getUom())) newList.add(uom); return newList; } public List<BudgetUsage> getBudgetUsageListForEstNo(final String estNumber) { List<BudgetUsage> buList = new ArrayList<BudgetUsage>(); buList = budgetUsageService.findAllBy("from BudgetUsage where referenceNumber = ?) ", estNumber); return buList; } /** * This function returns List of objects containing workOder Id and WorkOrder number. This method in turn calls * getWorkOrderDetails() by passing estimateId as parameter which runs the query to get the list of objects. * * @param estimateId * @return List<Object> containing workOder Id and WorkOrder number */ public List<Object> getWODetailsForEstimateId(final Long estimateId) { List<Object> woDetails = new ArrayList<Object>(); woDetails = workOrderService.getWorkOrderDetails(estimateId); return woDetails; } /** * This function returns List of objects containing worksPackage Id and worksPackage number. This method in turn calls * getWorksPackageDetails() by passing estimateId as parameter which runs the query to get the list of objects. * * @param estimateId * @return List<Object> containing worksPackage Id and worksPackage number */ public List<Object> getWPDetailsForEstimateId(final Long estimateId) { List<Object> wpDetails = new ArrayList<Object>(); wpDetails = workspackageService.getWorksPackageDetails(estimateId); return wpDetails; } public String getLatestEstimateAppropriationNumber(final AbstractEstimate estimate) { String appropriationNumber = null; final AbstractEstimateAppropriation estimateAppropriation = estimateAppropriationService.findByNamedQuery( "getLatestBudgetUsageForEstimate", estimate.getId()); if (estimateAppropriation != null) if (estimateAppropriation.getBudgetUsage() != null) appropriationNumber = estimateAppropriation.getBudgetUsage().getAppropriationnumber(); else appropriationNumber = estimateAppropriation.getDepositWorksUsage().getAppropriationNumber(); return appropriationNumber; } public PersistenceService<BudgetUsage, Long> getBudgetUsageService() { return budgetUsageService; } public void setBudgetUsageService(final PersistenceService<BudgetUsage, Long> budgetUsageService) { this.budgetUsageService = budgetUsageService; } public WorkOrderService getWorkOrderService() { return workOrderService; } public void setWorkOrderService(final WorkOrderService workOrderService) { this.workOrderService = workOrderService; } public WorksPackageService getWorkspackageService() { return workspackageService; } public void setWorkspackageService(final WorksPackageService workspackageService) { this.workspackageService = workspackageService; } }