/*
* 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.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.egov.commons.CFinancialYear;
import org.egov.commons.CFunction;
import org.egov.egf.model.BudgetAmountView;
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.infstr.services.PersistenceService;
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.utils.Constants;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.hibernate.type.LongType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@ParentPackage("egov")
@Results({ @Result(name = "new-re", location = "budgetDetail-new-re.jsp"),
@Result(name = "budgets", location = "budgetDetail-budgets.jsp"),
@Result(name = "functions", location = "budgetDetail-functions.jsp"),
@Result(name = "budgetGroup", location = "budgetDetail-budgetGroup.jsp"),
@Result(name = "AJAX_RESULT", type = "stream", location = "returnStream", params = { "contentType",
"text/plain" }) })
public class BudgetDetailAction extends BaseBudgetDetailAction {
@Autowired
@Qualifier("persistenceService")
private PersistenceService persistenceService;
private static final long serialVersionUID = 1L;
private static final String ACTIONNAME = "actionName";
private Budget topBudget;
private Map<Long, BigDecimal> beNextYearAmounts = new HashMap<Long, BigDecimal>();
private static Logger LOGGER = Logger.getLogger(BudgetDetailAction.class);
String streamResult = "";
private Long function;
private Long budgetGroups;
List<CFunction> functionList = Collections.EMPTY_LIST;
List<BudgetGroup> budgetGroupList = Collections.EMPTY_LIST;
public void setBudgetGroupList(final List budgetGroupList) {
this.budgetGroupList = budgetGroupList;
}
/**
* @return the streamResult
*/
public InputStream getReturnStream() {
final ByteArrayInputStream is = new ByteArrayInputStream(streamResult.getBytes());
return is;
}
public BudgetDetailAction() {
super();
}
@Override
protected void saveAndStartWorkFlow(final BudgetDetail detail, final WorkflowBean workflowBean) {
try {
if (budgetDocumentNumber != null && budgetDetail.getBudget() != null) {
final Budget b = budgetService.findById(budgetDetail.getBudget().getId(), false);
b.setDocumentNumber(budgetDocumentNumber);
budgetService.persist(b);
persistenceService.getSession().flush();
}
final BudgetDetail persist = budgetDetailService.createBudgetDetail(detail, getPosition(),
getPersistenceService());
populateSavedbudgetDetailListFor(persist.getBudget());
headerDisabled = true;
} catch (final ValidationException e) {
LOGGER.error("Duplication in budget details" + e.getMessage(), e);
handleDuplicateBudgetDetailError(e);
populateSavedbudgetDetailListFor(budgetDetail.getBudget());
}
}
protected void handleDuplicateBudgetDetailError(final ValidationException e) {
for (final ValidationError error : e.getErrors())
if ("budgetDetail.duplicate".equals(error.getKey())) {
headerDisabled = true;
break;
}
throw e;
}
@Override
public void populateSavedbudgetDetailListFor(final Budget budget) {
if (budget != null)
savedbudgetDetailList = budgetDetailService
.findAllBy("from BudgetDetail where budget=? order by function.name,budgetGroup.name", budget);
}
@Override
public void populateSavedbudgetDetailListForDetail(final BudgetDetail bd) {
if (bd != null)
// find all RE for the functin
savedbudgetDetailList = budgetDetailService.findAllBy(
"from BudgetDetail where budget=? and function=? order by function.name,budgetGroup.name",
bd.getBudget(), bd.getFunction());
// find all next year be for the function
savedbudgetDetailList.addAll(budgetDetailService.findAllBy(
"from BudgetDetail where budget=(select bd from Budget bd where referenceBudget=?) and function=? order by function.name,budgetGroup.name",
bd.getBudget(), bd.getFunction()));
}
public String ajaxLoadBudgetDetailList() {
final Long id = (Long) request.get("id");
if (!Long.valueOf(0).equals(id)) {
savedbudgetDetailList = budgetDetailService.findAllBy("from BudgetDetail where budget.id=?", id);
final Budget budget = budgetService.findById(id, false);
re = budgetService.hasReForYear(budget.getFinancialYear().getId());
budgetDetail.setBudget(budget);
setReferenceBudget(budgetService.getReferenceBudgetFor(budget));
budgetDocumentNumber = budget.getDocumentNumber();
}
populateBeNextYearAmounts();
populateFinancialYear();
return Constants.SAVED_DATA;
}
@SkipValidation
public String loadBudgetDetailList() {
if (LOGGER.isInfoEnabled())
LOGGER.info("Initiating load budgets .....");
final Long id = budgetDetail.getBudget().getId();
showRe = true;
getDetailsFilterdBy();
final Budget budget = budgetService.findById(id, false);
re = budgetService.hasReForYear(budget.getFinancialYear().getId());
budgetDetail.setBudget(budget);
setReferenceBudget(budgetService.getReferenceBudgetFor(budget));
budgetDocumentNumber = budget.getDocumentNumber();
budgetAmountView = new ArrayList<BudgetAmountView>(savedbudgetDetailList.size());
for (int i = 0; i < savedbudgetDetailList.size(); i++)
budgetAmountView.add(new BudgetAmountView());
budgetDetailList = savedbudgetDetailList;
populateBeNextYearAmountsAndBEAmounts();
populateFinancialYear();
// loadAjaxedFunctionAndBudgetGroup();
if (LOGGER.isInfoEnabled())
LOGGER.info("Budgets Loadded Succesfully");
showDetails = true;
return "new-re";
}
@SuppressWarnings("unchecked")
private void loadAjaxedFunctionAndBudgetGroup() {
if (budgetDetail.getBudget() != null) {
String sqlStr = "select distinct (f.name) as name,f.id as id from function f,egf_budgetdetail bd where f.id=bd.function and bd.budget="
+ budgetDetail.getBudget().getId() + " order by f.name";
SQLQuery sqlQuery = persistenceService.getSession().createSQLQuery(sqlStr);
sqlQuery.addScalar("name").addScalar("id", LongType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(CFunction.class));
functionList = sqlQuery.list();
sqlStr = "select distinct (bg.name) as name ,bg.id as id from egf_budgetgroup bg,egf_budgetdetail bd where bg.id=bd.budgetgroup and bd.budget="
+ budgetDetail.getBudget().getId() + " order by bg.name";
sqlQuery = persistenceService.getSession().createSQLQuery(sqlStr);
sqlQuery.addScalar("name").addScalar("id", LongType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(BudgetGroup.class));
budgetGroupList = sqlQuery.list();
}
}
@Action(value = "/budget/budgetDetail-ajaxLoadBudgets")
public String ajaxLoadBudgets() {
final String bere = parameters.get("bere")[0];
loadBudgets(bere);
return "budgets";
}
@Action(value = "/budget/budgetDetail-ajaxLoadFunctions")
public String ajaxLoadFunctions() {
final Long id = (Long) request.get("id");
final String sqlStr = "select distinct (f.name) as name,f.id as id from function f,egf_budgetdetail bd where f.id=bd.function and bd.budget="
+ id + " order by f.name";
final SQLQuery sqlQuery = persistenceService.getSession().createSQLQuery(sqlStr);
sqlQuery.addScalar("name").addScalar("id", LongType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(CFunction.class));
functionList = sqlQuery.list();
return "functions";
}
@Action(value = "/budget/budgetDetail-ajaxLoadBudgetGroups")
public String ajaxLoadBudgetGroups() {
final Long id = (Long) request.get("id");
final String sqlStr = "select distinct (bg.name) as name ,bg.id as id from egf_budgetgroup bg,egf_budgetdetail bd where bg.id=bd.budgetgroup and bd.budget="
+ id + " order by bg.name";
final SQLQuery sqlQuery = persistenceService.getSession().createSQLQuery(sqlStr);
sqlQuery.addScalar("name").addScalar("id", LongType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(BudgetGroup.class));
budgetGroupList = sqlQuery.list();
return "budgetGroup";
}
public String saveAndNew() {
return create();
}
public String saveAndNewRe() {
return createRe();
}
@Override
public void prepare() {
super.prepare();
populateSavedbudgetDetailListFor(budgetDetail.getBudget());
if (parameters.containsKey("re"))
dropdownData.put("budgetList", Collections.EMPTY_LIST);
loadAjaxedFunctionAndBudgetGroup();
}
@Override
public boolean isShowMessage() {
return super.isShowMessage();
}
public String getActionMessage() {
if (getActionMessages() != null && getActionMessages().iterator() != null
&& getActionMessages().iterator().next() != null)
return getActionMessages().iterator().next().toString();
else
return "";
}
private void populateBeNextYearAmounts() {
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))
beNextYearAmounts.put(budgetDetail.getId(), row.getOriginalAmount().setScale(2));
}
}
private void populateBeNextYearAmountsAndBEAmounts() {
if (savedbudgetDetailList == null || savedbudgetDetailList.size() == 0)
return;
beAmounts = new ArrayList<BigDecimal>(savedbudgetDetailList.size());
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)) {
beNextYearAmounts.put(budgetDetail.getId(), row.getOriginalAmount().setScale(2));
beAmounts.add(row.getOriginalAmount());
}
}
}
@Override
protected void saveAndStartWorkFlowForRe(final BudgetDetail detail, final int index, final CFinancialYear finYear,
final Budget refBudget, final WorkflowBean workflowBean) {
try {
if (budgetDocumentNumber != null && budgetDetail.getBudget() != null) {
final Budget b = budgetService.findById(budgetDetail.getBudget().getId(), false);
b.setDocumentNumber(budgetDocumentNumber);
budgetService.persist(b);
persistenceService.getSession().flush();
}
detail.getBudget().setFinancialYear(finYear);
final BudgetDetail reCurrentYear = budgetDetailService.createBudgetDetail(detail, getPosition(),
getPersistenceService());
headerDisabled = true;
BudgetDetail beNextYear = new BudgetDetail();
// beNextYear=detail.clone();
beNextYear.copyFrom(detail);
beNextYear.setBudget(refBudget);
beNextYear.setOriginalAmount(beAmounts.get(index));
beNextYear.setDocumentNumber(detail.getDocumentNumber());
beNextYear.setAnticipatoryAmount(reCurrentYear.getAnticipatoryAmount());
beNextYear = budgetDetailService.createBudgetDetail(beNextYear, getPosition(), getPersistenceService());
} catch (final ValidationException e) {
LOGGER.error(e.getMessage(), e);
populateBeNextYearAmounts();
handleDuplicateBudgetDetailError(e);
populateSavedbudgetDetailListFor(budgetDetail.getBudget());
throw e;
}
}
@Override
public void approve() {
topBudget = savedbudgetDetailList.get(0).getBudget();
setTopBudget(topBudget);
Integer userId = null;
if (parameters.get(ACTIONNAME)[0] != null && parameters.get(ACTIONNAME)[0].contains("reject"))
userId = Integer.valueOf(parameters.get("approverUserId")[0]);
else if (null != parameters.get("approverUserId") && Integer.valueOf(parameters.get("approverUserId")[0]) != -1)
userId = Integer.valueOf(parameters.get("approverUserId")[0]);
else
userId = ApplicationThreadLocals.getUserId().intValue();
for (final BudgetDetail detail : savedbudgetDetailList)
if (new String("forward").equals(parameters.get(ACTIONNAME)[0]))
detail.transition(true).withStateValue("Forwarded by " + getPosition().getName())
.withOwner(getPositionByUserId(userId)).withComments(detail.getComment());
setTopBudget(budgetService.getReferenceBudgetFor(topBudget));
if (parameters.get("actionName")[0].contains("approve")) {
if (topBudget.getState().getValue().equals("END"))
addActionMessage(getMessage("budgetdetail.approved.end"));
else
addActionMessage(getMessage("budgetdetail.approved") + budgetService
.getEmployeeNameAndDesignationForPosition(topBudget.getState().getOwnerPosition()));
} else
addActionMessage(getMessage("budgetdetail.approved")
+ budgetService.getEmployeeNameAndDesignationForPosition(topBudget.getState().getOwnerPosition()));
}
@Action(value = "/budget/budgetDetail-newRe")
public String newRe() {
showRe = true;
// setFinancialYear(null);
return "new-re";
}
@ValidationErrorPage(value = "new-re")
@Action(value = "/budget/budgetDetail-loadActualsForRe")
public String loadActualsForRe() {
showRe = true;
try {
loadActuals();
showDetails = true;
} catch (final ValidationException e) {
LOGGER.error(e.getMessage(), e);
populateBudgetList();
throw e;
}
populateBudgetList();
return "new-re";
}
public void setShowRe(final boolean showRe) {
this.showRe = showRe;
}
public boolean isShowRe() {
return showRe;
}
protected String getMessage(final String key) {
return getText(key);
}
public Budget getTopBudget() {
return topBudget;
}
public void setTopBudget(final Budget topBudget) {
this.topBudget = topBudget;
}
public void setBeNextYearAmounts(final Map<Long, BigDecimal> beNextYearAmounts) {
this.beNextYearAmounts = beNextYearAmounts;
}
public Map<Long, BigDecimal> getBeNextYearAmounts() {
return beNextYearAmounts;
}
public List getFunctionList() {
return functionList;
}
public void setFunctionList(final List functionList) {
this.functionList = functionList;
}
public List getBudgetGroupList() {
return budgetGroupList;
}
public Long getFunction() {
return function;
}
public void setFunction(final Long function) {
this.function = function;
}
public Long getBudgetGroups() {
return budgetGroups;
}
public void setBudgetGroups(final Long budgetGroups) {
this.budgetGroups = budgetGroups;
}
}