/* * 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.report; 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.egov.commons.CFinancialYear; import org.egov.commons.dao.FinancialYearHibernateDAO; import org.egov.infra.reporting.engine.ReportConstants.FileFormat; import org.egov.infra.reporting.engine.ReportOutput; import org.egov.infra.reporting.engine.ReportRequest; import org.egov.infra.reporting.engine.ReportService; import org.egov.infra.reporting.viewer.ReportViewerUtil; import org.egov.infra.web.struts.actions.BaseFormAction; import org.egov.model.budget.BudgetProposalBean; import org.egov.services.budget.BudgetDetailService; import org.egov.utils.ReportHelper; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @ParentPackage("egov") /* * @Results(value={ * @Result(name="PDF",type="stream",location=Constants.INPUT_STREAM, * params={Constants.INPUT_NAME,Constants.INPUT_STREAM,Constants. * CONTENT_TYPE,"application/pdf",Constants.CONTENT_DISPOSITION,"no-cache;filename=ConsolidatedBudgetReport.pdf"}), * @Result(name="XLS",type="stream",location=Constants.INPUT_STREAM, * params={Constants.INPUT_NAME,Constants.INPUT_STREAM,Constants. * CONTENT_TYPE,"application/xls",Constants.CONTENT_DISPOSITION,"no-cache;filename=ConsolidatedBudgetReport.xls"}) }) */ @Results({ @Result(name = "reportSearch", location = "consolidatedBudgetReport-reportSearch.jsp"), @Result(name = "reportview", type = "stream", location = "inputStream", params = { "contentType", "${contentType}", "contentDisposition", "attachment; filename=${fileName}" }) }) public class ConsolidatedBudgetReportAction extends BaseFormAction { /** * */ private static final long serialVersionUID = 1L; private CFinancialYear financialYear; private String fundType; private String budgetType; private CFinancialYear prevFinYear; private String prevFinYearRange; private String currentFinYearRange; private String nextFinYearRange; private static final String DETAIL = "detail"; private static final String HEADING = "heading"; private static final Logger LOGGER = Logger.getLogger(ConsolidatedBudgetReportAction.class); protected BudgetDetailService budgetDetailService; protected FinancialYearHibernateDAO financialYearDAO; private String contentType; private String fileName; private ReportService reportService; private final Map<String, String> majorCodeAndNameMap = new TreeMap<String, String>(); private final Map<String, String> glCodeAndNameMap = new TreeMap<String, String>(); private List<BudgetProposalBean> bpBeanMajList; private List<BudgetProposalBean> bpBeanDetList; private List<BudgetProposalBean> bpBeanList; private final Map<String, BigDecimal> previousYearBudgetDetailIdsAndAmount = new HashMap<String, BigDecimal>(); private ReportHelper reportHelper; private InputStream inputStream; @Override public Object getModel() { return null; } @Action(value = "/report/consolidatedBudgetReport-consolidatedReport") public String consolidatedReport() { addDropdownData("financialYearList", getPersistenceService().findAllBy("from CFinancialYear where isActive=true order by finYearRange desc ")); return "reportSearch"; } @Action(value = "/report/consolidatedBudgetReport-search") public String search() { addDropdownData("financialYearList", getPersistenceService().findAllBy("from CFinancialYear where isActive=true order by finYearRange desc ")); populateData(); return "reportSearch"; } public void populateData() { financialYear = (CFinancialYear) persistenceService.find("from CFinancialYear where id=?", financialYear.getId()); prevFinYear = getFinancialYearDAO().getPreviousFinancialYearByDate(financialYear.getStartingDate()); prevFinYearRange = prevFinYear.getFinYearRange(); currentFinYearRange = financialYear.getFinYearRange(); nextFinYearRange = getFinancialYearDAO().getNextFinancialYearByDate(financialYear.getStartingDate()).getFinYearRange(); bpBeanMajList = new ArrayList<BudgetProposalBean>(); bpBeanDetList = new ArrayList<BudgetProposalBean>(); getMajorCodeData(); populateMajorCodewiseDetailDataForReport(); } void getMajorCodeData() { final Map<String, BigDecimal> majorCodePreviousYearActuals = new HashMap<String, BigDecimal>(); final Map<String, BigDecimal> majorCodeBEMap = new HashMap<String, BigDecimal>(); final Map<String, BigDecimal> majorCodeREMap = new HashMap<String, BigDecimal>(); final Map<String, BigDecimal> majorCodeNextYrBEMap = new HashMap<String, BigDecimal>(); final List<Object[]> resultMajorCode = budgetDetailService.fetchMajorCodeAndNameForReport(financialYear, fundType, budgetType); addToMap(resultMajorCode, majorCodeAndNameMap); final List<Object[]> resultCurrentActuals = budgetDetailService.fetchMajorCodeAndActualsForReport(financialYear, prevFinYear, fundType, budgetType); addToMapStringBigDecimal(resultCurrentActuals, majorCodePreviousYearActuals); final List<Object[]> resultMajorCodeBE = budgetDetailService.fetchMajorCodeAndBEAmountForReport(financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeBE, majorCodeBEMap); final List<Object[]> resultMajorCodeApproved = budgetDetailService.fetchMajorCodeAndApprovedAmountForReport( financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeApproved, majorCodeREMap); final List<Object[]> resultMajorCodeBENextYrApproved = budgetDetailService.fetchMajorCodeAndBENextYrApprovedForReport( financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeBENextYrApproved, majorCodeNextYrBEMap); final BudgetProposalBean bpbeanTotal = new BudgetProposalBean(); final BigDecimal bigThousand = new BigDecimal(1000); Integer i = 1; for (final Map.Entry<String, String> entry : majorCodeAndNameMap.entrySet()) { final BudgetProposalBean bpbean = new BudgetProposalBean(); bpbean.setAccountCode(i.toString()); bpbean.setBudgetGroup(entry.getValue()); bpbean.setPreviousYearActuals(majorCodePreviousYearActuals.get(entry.getKey()) == null ? BigDecimal.ZERO.toString() : majorCodePreviousYearActuals.get(entry.getKey()).divide(bigThousand).setScale(0, BigDecimal.ROUND_HALF_UP) .toString()); bpbean.setCurrentYearBE(majorCodeBEMap.get(entry.getKey()) == null ? BigDecimal.ZERO.toString() : majorCodeBEMap .get(entry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP).toString()); bpbean.setApprovedRE(majorCodeREMap.get(entry.getKey()) == null ? BigDecimal.ZERO : majorCodeREMap .get(entry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP)); bpbean.setApprovedBE(majorCodeNextYrBEMap.get(entry.getKey()) == null ? BigDecimal.ZERO : majorCodeNextYrBEMap.get( entry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP)); bpbean.setRowType(DETAIL); bpBeanMajList.add(bpbean); i++; computeTotal(bpbeanTotal, bpbean); } bpbeanTotal.setRowType(HEADING); bpbeanTotal.setAccountCode(null); bpBeanMajList.add(bpbeanTotal); } void populateMajorCodewiseDetailDataForReport() { if (LOGGER.isInfoEnabled()) LOGGER.info("Starting populateMajorCodewiseDetailData()................"); final Map<String, BigDecimal> glCodeBEMap = new HashMap<String, BigDecimal>(); final Map<String, BigDecimal> glCodeREMap = new HashMap<String, BigDecimal>(); final Map<String, BigDecimal> glCodeNextYrBEMap = new HashMap<String, BigDecimal>(); final List<Object[]> resultMajorCode = budgetDetailService.fetchGlCodeAndNameForReport(financialYear, fundType, budgetType); addToMap(resultMajorCode, glCodeAndNameMap); final List<Object[]> resultPreviousActuals = budgetDetailService.fetchActualsForReport(financialYear, prevFinYear, fundType, budgetType); addToMapStringBigDecimal(resultPreviousActuals, previousYearBudgetDetailIdsAndAmount); final List<Object[]> resultMajorCodeBE = budgetDetailService.fetchGlCodeAndBEAmountForReport(financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeBE, glCodeBEMap); final List<Object[]> resultMajorCodeApproved = budgetDetailService.fetchGlCodeAndApprovedAmountForReport(financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeApproved, glCodeREMap); final List<Object[]> resultMajorCodeBENextYrApproved = budgetDetailService.fetchGlCodeAndBENextYrApprovedForReport( financialYear, fundType, budgetType); addToMapStringBigDecimal(resultMajorCodeBENextYrApproved, glCodeNextYrBEMap); final BigDecimal bigThousand = new BigDecimal(1000); for (final Map.Entry<String, String> entry : majorCodeAndNameMap.entrySet()) { bpBeanDetList.add(new BudgetProposalBean(entry.getValue(), HEADING)); final BudgetProposalBean bpbeanTotal = new BudgetProposalBean(); for (final Map.Entry<String, String> glEntry : glCodeAndNameMap.entrySet()) if (entry.getKey().equals(glEntry.getKey().substring(0, 3))) { final BudgetProposalBean bpbean = new BudgetProposalBean(); bpbean.setAccountCode(glEntry.getKey()); bpbean.setBudgetGroup(glEntry.getValue()); bpbean.setPreviousYearActuals(previousYearBudgetDetailIdsAndAmount.get(glEntry.getKey()) == null ? BigDecimal.ZERO .toString() : previousYearBudgetDetailIdsAndAmount.get(glEntry.getKey()).divide(bigThousand) .setScale(0, BigDecimal.ROUND_HALF_UP).toString()); bpbean.setCurrentYearBE(glCodeBEMap.get(glEntry.getKey()) == null ? BigDecimal.ZERO.toString() : glCodeBEMap .get(glEntry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP).toString()); bpbean.setApprovedRE(glCodeREMap.get(glEntry.getKey()) == null ? BigDecimal.ZERO : glCodeREMap.get( glEntry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP)); bpbean.setApprovedBE(glCodeNextYrBEMap.get(glEntry.getKey()) == null ? BigDecimal.ZERO : glCodeNextYrBEMap .get(glEntry.getKey()).setScale(0, BigDecimal.ROUND_HALF_UP)); bpbean.setRowType(DETAIL); bpBeanDetList.add(bpbean); computeTotal(bpbeanTotal, bpbean); } bpbeanTotal.setRowType(HEADING); bpBeanDetList.add(bpbeanTotal); bpBeanDetList.add(new BudgetProposalBean("", DETAIL)); } if (LOGGER.isInfoEnabled()) LOGGER.info("Finished populateMajorCodewiseDetailData()"); } private Map<String, String> addToMap(final List<Object[]> tempList, final Map<String, String> resultMap) { for (final Object[] row : tempList) resultMap.put(row[0].toString(), row[1].toString()); return resultMap; } private Map<String, BigDecimal> addToMapStringBigDecimal(final List<Object[]> tempList, final Map<String, BigDecimal> resultMap) { for (final Object[] row : tempList) resultMap.put(row[0].toString(), ((BigDecimal) row[1]).setScale(2)); return resultMap; } void computeTotal(final BudgetProposalBean bpbeanTotal, final BudgetProposalBean bpbean) { if (LOGGER.isInfoEnabled()) LOGGER.info("Starting computeTotal................"); bpbeanTotal.setPreviousYearActuals(bpbeanTotal.getPreviousYearActuals() == null ? bpbean.getPreviousYearActuals() : new BigDecimal(bpbeanTotal.getPreviousYearActuals()).add(new BigDecimal(bpbean.getPreviousYearActuals())) .toString()); bpbeanTotal.setCurrentYearBE(bpbeanTotal.getCurrentYearBE() == null ? bpbean.getCurrentYearBE() : new BigDecimal( bpbeanTotal.getCurrentYearBE()).add(new BigDecimal(bpbean.getCurrentYearBE())).toString()); bpbeanTotal.setApprovedRE(bpbeanTotal.getApprovedRE() == null ? bpbean.getApprovedRE() : bpbeanTotal.getApprovedRE() .add(bpbean.getApprovedRE()).setScale(0)); bpbeanTotal.setApprovedBE(bpbeanTotal.getApprovedBE() == null ? bpbean.getApprovedBE() : bpbeanTotal.getApprovedBE() .add(bpbean.getApprovedBE()).setScale(0)); bpbeanTotal.setBudgetGroup("TOTAL"); if (LOGGER.isInfoEnabled()) LOGGER.info("Finished computeTotal"); } /* * public String generatePdf() throws Exception{ bpBeanList=new ArrayList<BudgetProposalBean>(); populateData(); * bpBeanList.addAll(bpBeanMajList); bpBeanList.addAll(bpBeanDetList); //String title=getUlbName() ; String title = * this.fundType.toUpperCase()+" "+this.budgetType.toUpperCase(); //String * subtitle=getTopBudget().getName()!=null?"Budget-:"+getTopBudget().getName():""; String subtitle = "Amount in Thousands"; * JasperPrint jasper = * reportHelper.generateConsolidatedBudgetReport(bpBeanList,title,subtitle,prevFinYearRange,currentFinYearRange * ,nextFinYearRange); inputStream = reportHelper.exportPdf(inputStream, jasper); return "PDF"; } public String generateXls() * throws Exception{ bpBeanList=new ArrayList<BudgetProposalBean>(); populateData(); bpBeanList.addAll(bpBeanMajList); * bpBeanList.addAll(bpBeanDetList); //String title=getUlbName() ; String title = * "Consolidated Budget Report "+this.currentFinYearRange+"\n"+this.fundType.toUpperCase()+" "+this.budgetType.toUpperCase(); * //String subtitle=getTopBudget().getName()!=null?"Budget-:"+getTopBudget().getName():""; String subtitle = * "Amount in Thousands"; JasperPrint jasper = * reportHelper.generateConsolidatedBudgetReport(bpBeanList,title,subtitle,prevFinYearRange * ,currentFinYearRange,nextFinYearRange); inputStream = reportHelper.exportXls(inputStream, jasper); return "XLS"; } */ @Action(value = "/report/consolidatedBudgetReport-exportPDF") public String exportPDF() { final Map<String, Object> reportParams = new HashMap<String, Object>(); reportParams.put("title", fundType + " " + budgetType); bpBeanList = new ArrayList<BudgetProposalBean>(); populateData(); reportParams.put("prevFinYearRange", prevFinYearRange); reportParams.put("currentFinYearRange", currentFinYearRange); reportParams.put("nextFinYearRange", nextFinYearRange); bpBeanList.addAll(bpBeanMajList); bpBeanList.add(new BudgetProposalBean("", DETAIL)); // this for jasper report final BudgetProposalBean bpbean = new BudgetProposalBean("Account Head", HEADING); bpbean.setAccountCode("D.P.Code"); bpbean.setPreviousYearActuals("Actuals\n" + prevFinYearRange); bpbean.setCurrentYearBE("Budget Estimate\n" + currentFinYearRange); bpbean.setFund("Revised Estimate\n" + currentFinYearRange); bpbean.setFunction("Budget Estimate\n" + nextFinYearRange); bpbean.setRowType("jrxml"); bpBeanList.add(bpbean); // this for jasper report bpBeanList.addAll(bpBeanDetList); final ReportRequest reportInput = new ReportRequest("consolidatedBudgetReport", bpBeanList, reportParams); reportInput.setReportFormat(FileFormat.PDF); contentType = ReportViewerUtil.getContentType(FileFormat.PDF); fileName = "ConsolidatedBudgetReport." + FileFormat.PDF.toString().toLowerCase(); final ReportOutput reportOutput = reportService.createReport(reportInput); if (reportOutput != null && reportOutput.getReportOutputData() != null) inputStream = new ByteArrayInputStream(reportOutput.getReportOutputData()); return "reportview"; } @Action(value = "/report/consolidatedBudgetReport-exportExcel") public String exportExcel() { final Map<String, Object> reportParams = new HashMap<String, Object>(); reportParams.put("title", fundType + " " + budgetType); bpBeanList = new ArrayList<BudgetProposalBean>(); populateData(); reportParams.put("prevFinYearRange", prevFinYearRange); reportParams.put("currentFinYearRange", currentFinYearRange); reportParams.put("nextFinYearRange", nextFinYearRange); bpBeanList.addAll(bpBeanMajList); // this for jasper report final BudgetProposalBean bpbean = new BudgetProposalBean("Account Head", HEADING); bpbean.setAccountCode("D.P.Code"); bpbean.setPreviousYearActuals("Actuals\n" + prevFinYearRange); bpbean.setCurrentYearBE("Budget Estimate\n" + currentFinYearRange); bpbean.setFund("Revised Estimate\n" + currentFinYearRange); bpbean.setFunction("Budget Estimate\n" + nextFinYearRange); bpbean.setRowType("jrxml"); bpBeanList.add(bpbean); // this for jasper report bpBeanList.addAll(bpBeanDetList); final ReportRequest reportInput = new ReportRequest("consolidatedBudgetReport", bpBeanList, reportParams); reportInput.setReportFormat(FileFormat.XLS); contentType = ReportViewerUtil.getContentType(FileFormat.XLS); fileName = "ConsolidatedBudgetReport." + FileFormat.XLS.toString().toLowerCase(); final ReportOutput reportOutput = reportService.createReport(reportInput); if (reportOutput != null && reportOutput.getReportOutputData() != null) inputStream = new ByteArrayInputStream(reportOutput.getReportOutputData()); return "reportview"; } public CFinancialYear getFinancialYear() { return financialYear; } public void setFinancialYear(final CFinancialYear financialYear) { this.financialYear = financialYear; } public String getFundType() { return fundType; } public void setFundType(final String fundType) { this.fundType = fundType; } public String getBudgetType() { return budgetType; } public void setBudgetType(final String budgetType) { this.budgetType = budgetType; } public BudgetDetailService getBudgetDetailService() { return budgetDetailService; } public void setBudgetDetailService(final BudgetDetailService budgetDetailService) { this.budgetDetailService = budgetDetailService; } public FinancialYearHibernateDAO getFinancialYearDAO() { return financialYearDAO; } public void setFinancialYearDAO(final FinancialYearHibernateDAO financialYearDAO) { this.financialYearDAO = financialYearDAO; } public List<BudgetProposalBean> getBpBeanMajList() { return bpBeanMajList; } public void setBpBeanMajList(final List<BudgetProposalBean> bpBeanMajList) { this.bpBeanMajList = bpBeanMajList; } public List<BudgetProposalBean> getBpBeanDetList() { return bpBeanDetList; } public void setBpBeanDetList(final List<BudgetProposalBean> bpBeanDetList) { this.bpBeanDetList = bpBeanDetList; } public String getPrevFinYearRange() { return prevFinYearRange; } public void setPrevFinYearRange(final String prevFinYearRange) { this.prevFinYearRange = prevFinYearRange; } public String getCurrentFinYearRange() { return currentFinYearRange; } public void setCurrentFinYearRange(final String currentFinYearRange) { this.currentFinYearRange = currentFinYearRange; } public String getNextFinYearRange() { return nextFinYearRange; } public void setNextFinYearRange(final String nextFinYearRange) { this.nextFinYearRange = nextFinYearRange; } public List<BudgetProposalBean> getBpBeanList() { return bpBeanList; } public void setBpBeanList(final List<BudgetProposalBean> bpBeanList) { this.bpBeanList = bpBeanList; } public ReportHelper getReportHelper() { return reportHelper; } public void setReportHelper(final ReportHelper reportHelper) { this.reportHelper = reportHelper; } public InputStream getInputStream() { return inputStream; } public void setInputStream(final InputStream inputStream) { this.inputStream = inputStream; } public String getContentType() { return contentType; } public void setContentType(final String contentType) { this.contentType = contentType; } public String getFileName() { return fileName; } public void setFileName(final String fileName) { this.fileName = fileName; } public void setReportService(final ReportService reportService) { this.reportService = reportService; } }