/*
* 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.masters;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
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.Bank;
import org.egov.commons.utils.BankAccountType;
import org.egov.infra.admin.master.entity.AppConfigValues;
import org.egov.infra.admin.master.service.AppConfigValueService;
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.actions.BaseFormAction;
import org.egov.infra.web.struts.annotation.ValidationErrorPage;
import org.egov.services.masters.BankService;
import org.egov.utils.Constants;
import org.hibernate.exception.ConstraintViolationException;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ParentPackage("egov")
@Results({
@Result(name = BankAction.MODIFY, location = "bank-modify.jsp"),
@Result(name = BankAction.SUCCESS, location = "bank.jsp"),
@Result(name = BankAction.VIEW, location = "bank-view.jsp"),
@Result(name = BankAction.SEARCH, location = "bank-search.jsp") })
public class BankAction extends BaseFormAction {
private static final long serialVersionUID = 1L;
private Bank bank = new Bank();
private boolean isActive;
public static final String MODIFY = "modify";
public static final String SEARCH = "search";
private String mode;
// For jquery BankName auto complete
private String term;
private BankService bankService;
@Autowired
private AppConfigValueService appConfigValuesService;
@Override
@SkipValidation
@Actions({
@Action(value = "/masters/bank"),
@Action(value = "/masters/bank-execute")
})
public String execute() {
if ("MODIFY".equals(mode) || "VIEW".equals(mode)) {
if (StringUtils.isBlank(bank.getName()))
{
addDropdownData("bankList",bankService.findAll("name"));
return SEARCH;
}
else {
bank = bankService.find("FROM Bank WHERE name = ?", bank.getName());
if (bank == null)
return SEARCH;
else {
if (bank.getIsactive() != false)
isActive = true;
else
isActive = false;
if("MODIFY".equals(mode))
return MODIFY;
else
return VIEW;
}
}
}
else if ("UNQ_NAME".equals(mode))
checkUniqueBankName();
else if ("UNQ_CODE".equals(mode))
checkUniqueBankCode();
else if ("AUTO_COMP_BANK_NAME".equals(mode))
populateBankNames();
return SUCCESS;
}
@Override
public Object getModel() {
return bank;
}
@ValidationErrorPage(value = MODIFY)
@Action(value = "/masters/bank-save")
public String save() {
try {
if (isActive)
bank.setIsactive(true);
else
bank.setIsactive(false);
if (bank.getId() == null) {
// TODO Dirty Code can be avoided by extending BaseModel for Bank
final Date currentDate = new Date();
bank.setCreated(currentDate);
bank.setLastmodified(currentDate);
bank.setModifiedby(BigDecimal.valueOf(Double.valueOf(ApplicationThreadLocals.getUserId())));
bankService.persist(bank);
} else {
final Date currentDate = new Date();
bank.setCreated(currentDate);
bank.setLastmodified(currentDate);
bank.setModifiedby(BigDecimal.valueOf(Double.valueOf(ApplicationThreadLocals.getUserId())));
bankService.update(bank);
}
addActionMessage(getText("Bank Saved Successfully"));
} catch (final ConstraintViolationException e) {
throw new ValidationException(Arrays.asList(new ValidationError("Duplicate Bank", "Duplicate Bank")));
} catch (final Exception e) {
addActionMessage(getText("Bank information can't be saved."));
throw new ValidationException(Arrays.asList(new ValidationError("An error occured contact Administrator",
"An error occured contact Administrator")));
}
return "modify";
}
private void checkUniqueBankCode() {
final Bank bank = bankService.find("from Bank where lower(code)=?", this.bank.getCode().toLowerCase());
writeToAjaxResponse(String.valueOf(bank == null));
}
private void checkUniqueBankName() {
final Bank bank = bankService.find("from Bank where lower(name)=?", this.bank.getName().toLowerCase());
writeToAjaxResponse(String.valueOf(bank == null));
}
private void populateBankNames() {
final JSONArray jsonArray = new JSONArray(persistenceService.findAllBy("select name FROM Bank WHERE lower(name) like ?",
StringUtils.lowerCase(term + "%")));
writeToAjaxResponse(jsonArray.toString());
}
public String getBankAccountTypesJSON() {
final StringBuilder bankAcTypesJson = new StringBuilder(":;");
for (final BankAccountType value : BankAccountType.values())
bankAcTypesJson.append(value.name()).append(":").append(value.name()).append(";");
bankAcTypesJson.deleteCharAt(bankAcTypesJson.lastIndexOf(";"));
return bankAcTypesJson.toString();
}
public Boolean isAutoBankAccountGLCodeEnabled(){
final AppConfigValues appConfigValue = appConfigValuesService.getConfigValuesByModuleAndKey(
Constants.EGF, "auto_bankaccount_glcode").get(0);
return "YES".equalsIgnoreCase(appConfigValue.getValue());
}
public String getFundsJSON() {
final List<Object[]> funds = persistenceService.findAllBy("SELECT id, name FROM Fund WHERE isactive=?", true);
final StringBuilder fundJson = new StringBuilder(":;");
for (final Object[] fund : funds)
fundJson.append(fund[0]).append(":").append(fund[1]).append(";");
fundJson.deleteCharAt(fundJson.lastIndexOf(";"));
return fundJson.toString();
}
public String getAccountTypesJSON() {
final List<Object[]> accounttypes = persistenceService
.findAllBy("SELECT name,id FROM CChartOfAccounts WHERE glcode LIKE '4502%' AND classification=2 ORDER BY glcode");
final StringBuilder accountdetailtypeJson = new StringBuilder("{\"\":\"\",");
for (final Object[] accType : accounttypes) {
accType[0] = org.egov.infra.utils.StringUtils.escapeJavaScript((String) accType[0]);
accountdetailtypeJson.append("\"").append(accType[1] + "#" + accType[0]).append("\"").append(":").append("\"")
.append(accType[0]).append("\"").append(",");
}
accountdetailtypeJson.deleteCharAt(accountdetailtypeJson.lastIndexOf(","));
return accountdetailtypeJson.append("}").toString();
}
@Override
public void validate() {
if (bank.getName().equals(""))
addFieldError("name", getText("bank.name.field.required"));
if (bank.getCode().equals(""))
addFieldError("code", getText("bank.code.field.required"));
}
private void writeToAjaxResponse(final String response) {
try {
final HttpServletResponse httpResponse = ServletActionContext.getResponse();
final Writer httpResponseWriter = httpResponse.getWriter();
IOUtils.write(response, httpResponseWriter);
IOUtils.closeQuietly(httpResponseWriter);
} catch (final IOException e) {
LOG.error("Error occurred while processing Ajax response", e);
}
}
public void setTerm(final String term) {
this.term = term;
}
public String getMode() {
return mode;
}
public void setMode(final String mode) {
this.mode = mode;
}
public void setBankService(final BankService bankService) {
this.bankService = bankService;
}
public boolean getIsActive() {
return isActive;
}
public void setIsActive(final boolean isActive) {
this.isActive = isActive;
}
}