/*
* 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.voucher;
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.CVoucherHeader;
import org.egov.commons.Functionary;
import org.egov.commons.Fund;
import org.egov.commons.Fundsource;
import org.egov.commons.Scheme;
import org.egov.commons.SubScheme;
import org.egov.commons.Vouchermis;
import org.egov.commons.dao.FinancialYearDAO;
import org.egov.egf.commons.VoucherSearchUtil;
import org.egov.infra.admin.master.entity.AppConfig;
import org.egov.infra.admin.master.entity.AppConfigValues;
import org.egov.infra.admin.master.entity.Boundary;
import org.egov.infra.admin.master.entity.Department;
import org.egov.infra.admin.master.service.AppConfigValueService;
import org.egov.infra.exception.ApplicationException;
import org.egov.infra.validation.exception.ValidationError;
import org.egov.infra.validation.exception.ValidationException;
import org.egov.infra.web.struts.actions.BaseFormAction;
import org.egov.infra.web.struts.annotation.ValidationErrorPage;
import org.egov.infra.web.utils.EgovPaginatedList;
import org.egov.infstr.services.Page;
import org.egov.model.bills.EgBillregistermis;
import org.egov.utils.Constants;
import org.egov.utils.FinancialConstants;
import org.egov.utils.VoucherHelper;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
//import org.egov.commons.VoucherDetail;
@ParentPackage("egov")
@Results({
@Result(name = VoucherSearchAction.SEARCH, location = "voucherSearch-search.jsp"),
@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "redirect", location = "voucherSearch.action")
})
public class VoucherSearchAction extends BaseFormAction
{
private static final Logger LOGGER = Logger.getLogger(VoucherSearchAction.class);
private static final long serialVersionUID = 1L;
public CVoucherHeader voucherHeader = new CVoucherHeader();
public static final String SEARCH = "search";
public List<Map<String, Object>> voucherList;
private List<Object> schemeList;
public Map<String, String> nameList = new LinkedHashMap<String, String>();
public final SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Constants.LOCALE);
public final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Constants.LOCALE);
@Autowired
protected AppConfigValueService appConfigValuesService;
private final List<String> headerFields = new ArrayList<String>();
private final List<String> mandatoryFields = new ArrayList<String>();
public Date fromDate = new Date();
public Date toDate;
private String showMode;
private VoucherSearchUtil voucherSearchUtil;
private final Map<Integer, String> sourceMap = new HashMap<Integer, String>();
private Integer page = 1;
private Integer pageSize = 30;
private EgovPaginatedList pagedResults;
List<String> voucherTypes = VoucherHelper.VOUCHER_TYPES;
Map<String, List<String>> voucherNames = VoucherHelper.VOUCHER_TYPE_NAMES;
private FinancialYearDAO financialYearDAO;
@Override
public Object getModel() {
return voucherHeader;
}
public VoucherSearchAction()
{
LOGGER.error("creating instance of VoucherSearchAction ");
voucherHeader.setVouchermis(new Vouchermis());
addRelatedEntity("vouchermis.departmentid", Department.class);
addRelatedEntity("fundId", Fund.class);
addRelatedEntity("vouchermis.schemeid", Scheme.class);
addRelatedEntity("vouchermis.subschemeid", SubScheme.class);
addRelatedEntity("vouchermis.functionary", Functionary.class);
addRelatedEntity("fundsourceId", Fundsource.class);
addRelatedEntity("vouchermis.divisionid", Boundary.class);
}
@Override
public void prepare()
{
super.prepare();
getHeaderFields();
populateSourceMap();
if (headerFields.contains("department"))
addDropdownData("departmentList", persistenceService.findAllBy("from Department order by name"));
if (headerFields.contains("functionary"))
addDropdownData("functionaryList", persistenceService.findAllBy(" from Functionary where isactive=true order by name"));
if (headerFields.contains("fund"))
addDropdownData("fundList", persistenceService.findAllBy(" from Fund where isactive=true and isnotleaf=false order by name"));
if (headerFields.contains("fundsource"))
addDropdownData("fundsourceList",
persistenceService.findAllBy(" from Fundsource where isactive=true order by name"));
if (headerFields.contains("field"))
addDropdownData("fieldList",
persistenceService.findAllBy(" from Boundary b where lower(b.boundaryType.name)='ward' "));
if (headerFields.contains("scheme"))
addDropdownData("schemeList", Collections.EMPTY_LIST);
if (headerFields.contains("subscheme"))
addDropdownData("subschemeList", Collections.EMPTY_LIST);
if (null != parameters.get("showMode"))
{
showMode = parameters.get("showMode")[0];
if (LOGGER.isDebugEnabled())
LOGGER.debug("show mode :" + showMode);
if (showMode.equalsIgnoreCase("nonBillPayment"))
{
final List<String> typeList = new ArrayList<String>();
typeList.add(FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL);
addDropdownData("typeList", typeList);
voucherHeader.setType(FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL);
nameList = new LinkedHashMap<String, String>();
nameList.put(FinancialConstants.JOURNALVOUCHER_NAME_CONTRACTORJOURNAL,
FinancialConstants.JOURNALVOUCHER_NAME_CONTRACTORJOURNAL);
nameList.put(FinancialConstants.JOURNALVOUCHER_NAME_SUPPLIERJOURNAL,
FinancialConstants.JOURNALVOUCHER_NAME_SUPPLIERJOURNAL);
nameList.put(FinancialConstants.JOURNALVOUCHER_NAME_SALARYJOURNAL,
FinancialConstants.JOURNALVOUCHER_NAME_SALARYJOURNAL);
} else
addDropdownData("typeList", VoucherHelper.VOUCHER_TYPES);
// addDropdownData("typeList",
// persistenceService.findAllBy(" select distinct vh.type from CVoucherHeader vh where vh.status!=4 order by vh.type"));
} else
addDropdownData("typeList", VoucherHelper.VOUCHER_TYPES);
// addDropdownData("typeList",
// persistenceService.findAllBy(" select distinct vh.type from CVoucherHeader vh where vh.status!=4 order by vh.type"));
if (LOGGER.isDebugEnabled())
LOGGER.debug("Number of MIS attributes are :" + headerFields.size());
if (LOGGER.isDebugEnabled())
LOGGER.debug("Number of mandate MIS attributes are :" + mandatoryFields.size());
}
private void populateSourceMap() {
List<Object[]> sourceList = new ArrayList<Object[]>();
;
sourceList = persistenceService
.findAllBy(" select distinct m.id,m.name from CVoucherHeader vh, EgModules m where m.id=vh.moduleId and vh.status!=4 order by m.name");
for (final Object[] obj : sourceList)
sourceMap.put((Integer) obj[0], (String) obj[1]);
// For vouchers created from the financial module
sourceMap.put(-2, "Internal");
if (LOGGER.isDebugEnabled())
LOGGER.debug("Added sourceMap of size -" + sourceMap.size());
}
public Map<String, String> getVoucherNameMap(final String type) {
final List<Object> voucherNameList = getPersistenceService().findAllBy(
"select distinct name from CVoucherHeader where type=?", type);
nameList = new LinkedHashMap<String, String>();
for (final Object voucherName : voucherNameList)
nameList.put((String) voucherName, (String) voucherName);
return nameList;
}
@SkipValidation
@Action(value = "/voucher/voucherSearch-beforesearch")
public String beforesearch()
{
finYearDate();
if (showMode != null && showMode.equalsIgnoreCase("nonBillPayment"))
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("nonBillPayment");
} else if (voucherHeader.getType() != null && !voucherHeader.getType().equals("-1"))
getVoucherNameMap(voucherHeader.getType());
return SEARCH;
}
public void prepareSearch() {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Voucher Search Action | prepareSearch");
if (showMode != null && !showMode.equalsIgnoreCase("nonbillPayment"))
if (null != parameters.get("type") && !parameters.get("type")[0].equalsIgnoreCase("-1"))
nameList = getVoucherNameMap(parameters.get("type")[0]);
}
@ValidationErrorPage(value = SEARCH)
@Action(value = "/voucher/voucherSearch-search")
public String search() throws ApplicationException, ParseException
{
boolean ismodifyJv = false;
voucherList = new ArrayList<Map<String, Object>>();
Map<String, Object> voucherMap = null;
if (null != parameters.get("showMode"))
showMode = parameters.get("showMode")[0];
if (voucherHeader.getModuleId() != null && voucherHeader.getModuleId() == -1)
voucherHeader.setModuleId(null);
// validate if mode is edit and financial year is not active
if (null != showMode && showMode.equalsIgnoreCase("edit"))
{
final boolean validateFinancialYearForPosting = voucherSearchUtil.validateFinancialYearForPosting(fromDate, toDate);
if (!validateFinancialYearForPosting)
throw new ValidationException(Arrays.asList(new ValidationError(
"Financial Year Not active for Posting(either year or date within selected date range)",
"Financial Year Not active for Posting(either year or date within selected date range)")));
}
List<CVoucherHeader> list;
List<Query> qryObj;
// for view voucher implementing paginated result
if (null == showMode || showMode.equals("")) {
qryObj = voucherSearchUtil.voucherSearchQuery(voucherHeader, fromDate, toDate, showMode);
final Query qry = qryObj.get(0);
final Long count = (Long) persistenceService.find(qryObj.get(1).getQueryString());
final Page resPage = new Page(qry, page, pageSize);
pagedResults = new EgovPaginatedList(resPage, count.intValue());
list = pagedResults != null ? pagedResults.getList() : null;
} else if (showMode.equalsIgnoreCase("nonbillPayment"))
list = voucherSearchUtil.searchNonBillVouchers(voucherHeader, fromDate, toDate, showMode);
else
list = voucherSearchUtil.search(voucherHeader, fromDate, toDate, showMode);
if (null == showMode || showMode.equals("")) {
for (final CVoucherHeader voucherheader : list)
{
voucherMap = new HashMap<String, Object>();
final BigDecimal amt = voucherheader.getTotalAmount();
voucherMap.put("id", voucherheader.getId());
voucherMap.put("vouchernumber", voucherheader.getVoucherNumber());
voucherMap.put("type", voucherheader.getType());
voucherMap.put("name", voucherheader.getName());
voucherMap.put("deptName", voucherheader.getVouchermis().getDepartmentid().getName());
voucherMap.put("voucherdate", voucherheader.getVoucherDate());
voucherMap.put("fundname", voucherheader.getFundId().getName());
if (voucherheader.getModuleId() == null)
voucherMap.put("source", "Internal");
else
voucherMap.put("source", sourceMap.get(voucherheader.getModuleId()));
voucherMap.put("amount", amt.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString());
voucherMap.put("status", getVoucherStatus(voucherheader.getStatus()));
voucherList.add(voucherMap);
}
pagedResults.setList(voucherList);
} else
for (final CVoucherHeader voucherheader : list)
{
if (voucherheader.getState() != null) {
final EgBillregistermis billMis = (EgBillregistermis) persistenceService.find(
"from EgBillregistermis where voucherHeader.id=?", voucherheader.getId());
if (billMis != null) {
/*
* bill state will be null if created from create JV screen and voucher is in end state
*/
if (billMis.getEgBillregister().getState() == null && voucherheader.getState().getValue().contains("END"))
ismodifyJv = true;
else
ismodifyJv = false;
}
else if (voucherheader.getName().equalsIgnoreCase(FinancialConstants.JOURNALVOUCHER_NAME_GENERAL) &&
voucherheader.getState().getValue().contains("END"))
ismodifyJv = true;
} else
ismodifyJv = true;
if (ismodifyJv) {
voucherMap = new HashMap<String, Object>();
voucherMap.put("id", voucherheader.getId());
voucherMap.put("vouchernumber", voucherheader.getVoucherNumber());
voucherMap.put("type", voucherheader.getType());
voucherMap.put("name", voucherheader.getName());
voucherMap.put("deptName", voucherheader.getVouchermis().getDepartmentid().getName());
voucherMap.put("voucherdate", voucherheader.getVoucherDate());
voucherMap.put("fundname", voucherheader.getFundId().getName());
if (voucherheader.getModuleId() == null)
voucherMap.put("source", "Internal");
else
voucherMap.put("source", sourceMap.get(voucherheader.getModuleId()));
/*
* for(VoucherDetail detail:voucherheader.getVoucherDetail()) { amt = amt.add(detail.getDebitAmount()); }
*/
voucherMap.put("amount", voucherheader.getTotalAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN).toString());
voucherMap.put("status", getVoucherStatus(voucherheader.getStatus()));
voucherList.add(voucherMap);
}
}
return SEARCH;
}
private String getVoucherStatus(final int status)
{
if (FinancialConstants.CREATEDVOUCHERSTATUS.equals(status))
return "Approved";
if (FinancialConstants.REVERSEDVOUCHERSTATUS.equals(status))
return "Reversed";
if (FinancialConstants.REVERSALVOUCHERSTATUS.equals(status))
return "Reversal";
if (FinancialConstants.CANCELLEDVOUCHERSTATUS.equals(status))
return "Cancelled";
if (FinancialConstants.PREAPPROVEDVOUCHERSTATUS.equals(status))
return "Preapproved";
return "";
}
public void finYearDate() {
final String financialYearId = financialYearDAO.getCurrYearFiscalId();
if (financialYearId == null || financialYearId.equals(""))
fromDate = new Date();
else
fromDate = (Date) persistenceService.find("select startingDate from CFinancialYear where id=?",
Long.parseLong(financialYearId));
}
public void setFinancialYearDAO(final FinancialYearDAO financialYearDAO) {
this.financialYearDAO = financialYearDAO;
}
protected void getHeaderFields()
{
final List<AppConfigValues> appConfigList = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG, "DEFAULT_SEARCH_MISATTRRIBUTES");
for (final AppConfigValues appConfigVal :appConfigList)
{
final String value = appConfigVal.getValue();
final String header = value.substring(0, value.indexOf('|'));
headerFields.add(header);
final String mandate = value.substring(value.indexOf('|') + 1);
if (mandate.equalsIgnoreCase("M"))
mandatoryFields.add(header);
}
}
@Override
public void validate() {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Inside Validate Method");
if (voucherHeader.getVoucherNumber() == null || "".equals(voucherHeader.getVoucherNumber())) {
if (fromDate == null)
addFieldError("From Date", getText("Please Enter From Date"));
if (toDate == null)
addFieldError("To Date", getText("Please Enter To Date"));
checkMandatoryField("fundId", "fund", voucherHeader.getFundId(), "voucher.fund.mandatory");
checkMandatoryField("vouchermis.departmentid", "department", voucherHeader.getVouchermis().getDepartmentid(),
"voucher.department.mandatory");
checkMandatoryField("vouchermis.schemeid", "scheme", voucherHeader.getVouchermis().getSchemeid(),
"voucher.scheme.mandatory");
checkMandatoryField("vouchermis.subschemeid", "subscheme", voucherHeader.getVouchermis().getSubschemeid(),
"voucher.subscheme.mandatory");
checkMandatoryField("vouchermis.functionary", "functionary", voucherHeader.getVouchermis().getFunctionary(),
"voucher.functionary.mandatory");
checkMandatoryField("fundsourceId", "fundsource", voucherHeader.getVouchermis().getFundsource(),
"voucher.fundsource.mandatory");
checkMandatoryField("vouchermis.divisionId", "field", voucherHeader.getVouchermis().getDivisionid(),
"voucher.field.mandatory");
}
}
protected void checkMandatoryField(final String objectName, final String fieldName, final Object value, final String errorKey)
{
if (mandatoryFields.contains(fieldName) && value == null)
addFieldError(objectName, getText(errorKey));
}
public boolean isFieldMandatory(final String field) {
return mandatoryFields.contains(field);
}
public boolean shouldShowHeaderField(final String field) {
return headerFields.contains(field);
}
public List<Map<String, Object>> getVoucherList() {
return voucherList;
}
public String ajaxLoadSchemes()
{
schemeList = persistenceService.findAllBy(" from Scheme where fund=?", voucherHeader.getFundId());
return "schemes";
}
public String ajaxLoadSubSchemes()
{
schemeList = persistenceService.findAllBy(" from SubScheme where scheme=?", voucherHeader.getVouchermis()
.getSchemeid());
return "schemes";
}
public List<Object> getSchemeList() {
return schemeList;
}
public void setSchemeId(final Integer schemeId) {
voucherHeader.getVouchermis().setSchemeid((Scheme) persistenceService.find(" from Scheme where id=?", schemeId));
}
public void setVoucherHeader(final CVoucherHeader voucherHeader) {
this.voucherHeader = voucherHeader;
}
public void setVoucherSearchUtil(final VoucherSearchUtil voucherSearchUtil) {
this.voucherSearchUtil = voucherSearchUtil;
}
public Date getFromDate() {
return fromDate;
}
public void setFromDate(final Date fromDate) {
this.fromDate = fromDate;
}
public Date getToDate() {
return toDate;
}
public void setToDate(final Date toDate) {
this.toDate = toDate;
}
public Map<String, String> getNameList() {
return nameList;
}
public void setNameList(final Map<String, String> nameList) {
this.nameList = nameList;
}
public Map<Integer, String> getSourceMap() {
return sourceMap;
}
public String getShowMode() {
return showMode;
}
public void setShowMode(final String showMode) {
this.showMode = showMode;
}
public Integer getPage() {
return page;
}
public void setPage(final Integer page) {
this.page = page;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(final Integer pageSize) {
this.pageSize = pageSize;
}
public EgovPaginatedList getPagedResults() {
return pagedResults;
}
public void setPagedResults(final EgovPaginatedList pagedResults) {
this.pagedResults = pagedResults;
}
public List<String> getVoucherTypes() {
return voucherTypes;
}
public void setVoucherTypes(final List<String> voucherTypes) {
this.voucherTypes = voucherTypes;
}
public Map<String, List<String>> getVoucherNames() {
return voucherNames;
}
public void setVoucherNames(final Map<String, List<String>> voucherNames) {
this.voucherNames = voucherNames;
}
}