/*
* 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.ptis.actions.reports;
import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.egov.commons.Installment;
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.utils.StringUtils;
import org.egov.infra.web.struts.actions.BaseFormAction;
import org.egov.infra.web.struts.annotation.ValidationErrorPage;
import org.egov.ptis.bean.DemandCollInfo;
import org.egov.ptis.bean.ReportInfo;
import org.hibernate.SQLQuery;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static java.util.Calendar.APRIL;
import static java.util.Calendar.DAY_OF_MONTH;
import static java.util.Calendar.MARCH;
import static org.egov.ptis.constants.PropertyTaxConstants.EDU_EGS_CESS_GLCODE_LIST;
import static org.egov.ptis.constants.PropertyTaxConstants.GLCODE_FOR_EDU_CESS_ARREARS;
import static org.egov.ptis.constants.PropertyTaxConstants.GLCODE_FOR_EDU_CESS_CURRENT;
import static org.egov.ptis.constants.PropertyTaxConstants.GLCODE_FOR_EGS_CESS_ARREARS;
import static org.egov.ptis.constants.PropertyTaxConstants.GLCODE_FOR_EGS_CESS_CURRENT;
import static org.egov.ptis.constants.PropertyTaxConstants.MONTHS_MAP;
import static org.egov.ptis.constants.PropertyTaxConstants.REPORT_START_DATE;
import static org.egov.ptis.constants.PropertyTaxConstants.REPORT_TEMPLATENAME_EGS_EDU_CESS_COLLECTION;
import static org.egov.ptis.constants.PropertyTaxConstants.STR_EDU_CESS;
import static org.egov.ptis.constants.PropertyTaxConstants.STR_EGS_CESS;
/**
*
* Used to generate EGS&EDU Cess Collection Report
*
* @author subhash
*
*/
public class EgsEduCessCollectionReportAction extends BaseFormAction {
private static final Logger LOGGER = Logger
.getLogger(EgsEduCessCollectionReportAction.class);
private ReportService reportService;
private static final String SRCH_FORM = "searchForm";
private static final String REPORT = "report";
private String reportId;
private Map<Integer, String> monthsMap;
private Date day;
private Integer month;
private String year;
ReportInfo reportInfo = new ReportInfo();
private Date fromDate = new Date();
private Date toDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
private List<Object[]> list;
private Boolean recordsExist = TRUE;
@Autowired
private ReportViewerUtil reportViewerUtil;
public void validate() {
LOGGER.debug("Inside Validate Method, Day : " + day + "-Month : "
+ month + "-Year : " + year);
if ((day == null || day.equals("")) && (month == null || month == -1)
&& (year == null || year.equals("-1"))) {
addActionError("Please select anyone of the search criteria");
}
if (month != null && month != -1) {
if (year == null || year.equals("-1")) {
addActionError("Please select year for month");
}
}
LOGGER.debug("Exit from validate method");
}
@Override
public Object getModel() {
return null;
}
public void prepare() {
setMonthsMap(MONTHS_MAP);
addDropdownData("yearsList", prepareYearsList());
}
@ValidationErrorPage(value = SRCH_FORM)
public String generateReport() {
LOGGER.debug("Inside generateReport method");
Map<String, String> srchParams = new HashMap<String, String>();
StringTokenizer yearTokenizer = new StringTokenizer(year, "-");
String years[] = new String[2];
int i = 0;
while (yearTokenizer.hasMoreTokens()) {
years[i++] = yearTokenizer.nextToken();
}
StringBuffer qryStr = new StringBuffer(
"select ca.glcode, sum(ch.totalamount) "
+ "from EGCL_COLLECTIONDETAILS cd, egcl_collectionheader ch, chartofaccounts ca "
+ "where cd.id_collectionheader = ch.id "
+ "and ca.glcode in (:glcodeList) "
+ "and cd.id_accounthead = ca.id ");
if (day != null && !day.equals("")) {
String dateStr = new SimpleDateFormat("dd/MM/yyyy").format(day);
qryStr.append("and to_char(ch.created_date, 'dd/MM/yyyy') = :day ");
srchParams.put("day", dateStr);
reportInfo.setDateString("Dated : " + dateStr);
} else if (month != null && month != -1) {
String yearStr;
StringBuffer dateStr = new StringBuffer();
if (month.intValue() < APRIL) {
yearStr = String
.valueOf(Integer.valueOf(years[0]).intValue() + 1);
} else {
yearStr = years[0];
}
String monthStr = StringUtils.leftPad(String.valueOf(month + 1), 2,
"0");
dateStr.append(monthStr).append("/");
dateStr.append(yearStr);
qryStr.append("and to_char(ch.created_date, 'MM') || '/' || to_char(ch.created_date, 'yyyy') = :month ");
srchParams.put("month", dateStr.toString());
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.valueOf(yearStr), month, 01);
int maxDay = calendar.getActualMaximum(DAY_OF_MONTH);
int minDay = calendar.getActualMinimum(DAY_OF_MONTH);
StringBuffer fromDate = new StringBuffer();
StringBuffer toDate = new StringBuffer();
fromDate.append(minDay).append("/").append(monthStr).append("/")
.append(yearStr);
toDate.append(maxDay).append("/").append(monthStr).append("/")
.append(yearStr);
reportInfo.setDateString("From : " + fromDate.toString()
+ " To : " + toDate.toString());
} else {
fromDate.setYear(Integer.valueOf(years[0]).intValue());
fromDate.setMonth(APRIL);
fromDate.setDate(1);
toDate.setYear(Integer.valueOf(years[0]).intValue() + 1);
toDate.setMonth(MARCH);
toDate.setDate(31);
qryStr.append("and to_date(to_char(ch.created_date,'dd/MM/yy'),'dd/MM/yy') >= to_date(:fromDate,'dd/MM/yy') ");
qryStr.append("and to_date(to_char(ch.created_date,'dd/MM/yy'),'dd/MM/yy') <= to_date(:toDate,'dd/MM/yy') ");
srchParams.put("fromDate", dateFormat.format(fromDate));
srchParams.put("toDate", dateFormat.format(toDate));
reportInfo.setDateString("From : " + dateFormat.format(fromDate)
+ " To : " + dateFormat.format(toDate));
}
qryStr.append("group by ca.glcode");
SQLQuery qry = getPersistenceService().getSession().createSQLQuery(
qryStr.toString());
qry.setParameterList("glcodeList", EDU_EGS_CESS_GLCODE_LIST);
for (String srchParam : srchParams.keySet()) {
qry.setParameter(srchParam, srchParams.get(srchParam));
}
list = qry.list();
if (list != null && !list.isEmpty()) {
ReportRequest reportInput = prepareReportData();
reportInput.setPrintDialogOnOpenReport(true);
reportId = reportViewerUtil.addReportToTempCache(
reportService.createReport(reportInput));
} else {
recordsExist = FALSE;
return SRCH_FORM;
}
LOGGER.debug("Exit from generateReport method");
return REPORT;
}
private ReportRequest prepareReportData() {
LOGGER.debug("Inside prepareReportData method");
List<DemandCollInfo> dmdCollInfoList = new ArrayList<DemandCollInfo>();
DemandCollInfo dmdCollInfoEgs = new DemandCollInfo();
dmdCollInfoEgs.setTaxType(STR_EGS_CESS);
DemandCollInfo dmdCollInfoEdu = new DemandCollInfo();
dmdCollInfoEdu.setTaxType(STR_EDU_CESS);
for (Object[] obj : list) {
if (obj[0].equals(GLCODE_FOR_EGS_CESS_ARREARS)) {
dmdCollInfoEgs.setArrColl(new BigDecimal(obj[1].toString()));
} else if (obj[0].equals(GLCODE_FOR_EGS_CESS_CURRENT)) {
dmdCollInfoEgs.setCurColl(new BigDecimal(obj[1].toString()));
} else if (obj[0].equals(GLCODE_FOR_EDU_CESS_ARREARS)) {
dmdCollInfoEdu.setArrColl(new BigDecimal(obj[1].toString()));
} else if (obj[0].equals(GLCODE_FOR_EDU_CESS_CURRENT)) {
dmdCollInfoEdu.setCurColl(new BigDecimal(obj[1].toString()));
}
}
dmdCollInfoList.add(dmdCollInfoEdu);
dmdCollInfoList.add(dmdCollInfoEgs);
if (dmdCollInfoList != null && !dmdCollInfoList.isEmpty()) {
reportInfo.setDemandCollInfoList(dmdCollInfoList);
}
LOGGER.debug("Exit from prepareReportData method");
return new ReportRequest(REPORT_TEMPLATENAME_EGS_EDU_CESS_COLLECTION,
reportInfo, null);
}
private List<String> prepareYearsList() {
StringBuffer qryStr = new StringBuffer(
"select * from eg_installment_master "
+ "where id_module = (select id_module from eg_module where module_name = 'Property Tax') "
+ "and start_date >= to_date('" + REPORT_START_DATE
+ "','dd/MM/yyyy') " + "and start_date <= sysdate");
SQLQuery qry = getPersistenceService().getSession()
.createSQLQuery(qryStr.toString()).addEntity(Installment.class);
return qry.list();
}
@SkipValidation
public String searchForm() {
return SRCH_FORM;
}
public Map<Integer, String> getMonthsMap() {
return monthsMap;
}
public void setMonthsMap(Map<Integer, String> monthsMap) {
this.monthsMap = monthsMap;
}
public Date getDay() {
return day;
}
public void setDay(Date day) {
this.day = day;
}
public Integer getMonth() {
return month;
}
public void setMonth(Integer month) {
this.month = month;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public ReportService getReportService() {
return reportService;
}
public void setReportService(ReportService reportService) {
this.reportService = reportService;
}
public String getReportId() {
return reportId;
}
public ReportInfo getReportInfo() {
return reportInfo;
}
public void setReportInfo(ReportInfo reportInfo) {
this.reportInfo = reportInfo;
}
public Date getFromDate() {
return fromDate;
}
public void setFromDate(Date fromDate) {
this.fromDate = fromDate;
}
public Date getToDate() {
return toDate;
}
public void setToDate(Date toDate) {
this.toDate = toDate;
}
public Boolean getRecordsExist() {
return recordsExist;
}
public void setRecordsExist(Boolean recordsExist) {
this.recordsExist = recordsExist;
}
}