/*
* 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.payment;
import org.apache.log4j.Logger;
import org.egov.billsaccounting.services.VoucherConstant;
import org.egov.commons.Bankaccount;
import org.egov.commons.CFunction;
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.egf.commons.EgovCommon;
import org.egov.egf.web.actions.voucher.BaseVoucherAction;
import org.egov.infra.admin.master.entity.Boundary;
import org.egov.infra.admin.master.entity.Department;
import org.egov.infra.config.core.ApplicationThreadLocals;
import org.egov.infra.exception.ApplicationRuntimeException;
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.infra.workflow.entity.StateAware;
import org.egov.infra.workflow.service.SimpleWorkflowService;
import org.egov.infstr.utils.EgovMasterDataCaching;
import org.egov.model.advance.EgAdvanceReqPayeeDetails;
import org.egov.model.advance.EgAdvanceRequisition;
import org.egov.model.advance.EgAdvanceRequisitionDetails;
import org.egov.model.advance.EgAdvanceRequisitionMis;
import org.egov.model.bills.Miscbilldetail;
import org.egov.model.payment.Paymentheader;
import org.egov.services.payment.PaymentService;
import org.egov.services.voucher.VoucherService;
import org.egov.utils.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AdvanceRequisitionPaymentAction extends BaseVoucherAction {
/**
*
*/
private static final long serialVersionUID = 6620866171442917883L;
private EgAdvanceRequisition advanceRequisition = new EgAdvanceRequisition();
private static final Logger LOGGER = Logger.getLogger(AdvanceRequisitionPaymentAction.class);
private Bankaccount bankaccount = new Bankaccount();
private PaymentService paymentService;
private SimpleWorkflowService<Paymentheader> paymentWorkflowService;
private Paymentheader paymentheader;
private Date voucherDate = new Date();
private Map<String, String> modeOfCollectionMap = new HashMap<String, String>();
private String paymentMode = "cheque";
private String narration;
private VoucherService voucherService;
private EgovCommon egovCommon;
private Fund fund;
@Autowired
private EgovMasterDataCaching masterDataCache;
@Override
public void prepare() {
super.prepare();
modeOfCollectionMap.put("others", "Others");
modeOfCollectionMap.put("cash", "Cash");
modeOfCollectionMap.put("cheque", "Cheque");
addDropdownData("designationList", Collections.EMPTY_LIST);
addDropdownData("userList", Collections.EMPTY_LIST);
addDropdownData("bankList", egovCommon.getActiveBankBranchForActiveBanks());
addDropdownData("accNumList", Collections.EMPTY_LIST);
addDropdownData("fundList", masterDataCache.get("egi-fund"));
loadApproverUser();
}
@Override
public String execute() {
if (advanceRequisition != null && advanceRequisition.getId() != null) {
advanceRequisition = (EgAdvanceRequisition) persistenceService.find("from EgAdvanceRequisition where id=?",
advanceRequisition.getId());
populateFund();
}
return "form";
}
private void populateFund() {
if (advanceRequisition != null && advanceRequisition.getEgAdvanceReqMises() != null)
fund = advanceRequisition.getEgAdvanceReqMises().getFund();
}
@ValidationErrorPage(value = "form")
public String create() {
try {
if (bankaccount.getId() == null || bankaccount.getId() == -1)
throw new ValidationException(Arrays.asList(new ValidationError("invalid.bank", "invalid.bank")));
if (advanceRequisition != null && advanceRequisition.getId() != null)
advanceRequisition = (EgAdvanceRequisition) persistenceService.find("from EgAdvanceRequisition where id=?",
advanceRequisition.getId());
bankaccount = (Bankaccount) persistenceService.find("from Bankaccount where id=?", bankaccount.getId());
final List<HashMap<String, Object>> accountcodedetails = new ArrayList<HashMap<String, Object>>();
final List<HashMap<String, Object>> subledgerdetails = new ArrayList<HashMap<String, Object>>();
final HashMap<String, Object> headerdetails = new HashMap<String, Object>();
populateHeaderDetails(headerdetails);
populateAccountCodeDetails(accountcodedetails);
populateSubledgerDetails(subledgerdetails);
parameters.put("paymentMode", new String[] { paymentMode });
parameters.put("grandTotal", new String[] { advanceRequisition.getAdvanceRequisitionAmount().toPlainString() });
paymentheader = paymentService.createPayment(parameters, headerdetails, accountcodedetails, subledgerdetails,
bankaccount);
paymentheader.start().withOwner(paymentService.getPosition()).withComments(narration);
Integer userId = null;
if (null != parameters.get("approverUserId") && Integer.valueOf(parameters.get("approverUserId")[0]) != -1)
userId = Integer.valueOf(parameters.get("approverUserId")[0]);
else
userId = ApplicationThreadLocals.getUserId().intValue();
/* if (narration != null)
paymentWorkflowService.transition(getValidActions().get(0).getName() + "|" + userId, paymentheader, narration);
else
paymentWorkflowService.transition(getValidActions().get(0).getName() + "|" + userId, paymentheader, paymentheader
.getVoucherheader().getDescription());*/
paymentService.persist(paymentheader);
createMiscBill(paymentheader, advanceRequisition);
advanceRequisition.getEgAdvanceReqMises().setVoucherheader(paymentheader.getVoucherheader());
advanceRequisition.withComments(narration).end();
addActionMessage(getText("payment.transaction.success", new String[] { paymentheader.getVoucherheader()
.getVoucherNumber() }));
} catch (final ValidationException e) {
LOGGER.error("ERROR" + e.getMessage(), e);
populateData();
throw new ValidationException(e.getErrors());
} catch (final ApplicationRuntimeException e) {
LOGGER.error("ERROR" + e.getMessage(), e);
populateData();
final List<ValidationError> errors = new ArrayList<ValidationError>();
errors.add(new ValidationError("exception", e.getMessage()));
throw new ValidationException(errors);
} catch (final ParseException e) {
LOGGER.error("ERROR" + e.getMessage(), e);
populateData();
}
return "result";
}
private void createMiscBill(final Paymentheader paymentheader, final EgAdvanceRequisition advanceRequisition) {
final Miscbilldetail miscbilldetail = new Miscbilldetail();
miscbilldetail.setBillnumber(advanceRequisition.getAdvanceRequisitionNumber());
miscbilldetail.setBilldate(advanceRequisition.getAdvanceRequisitionDate());
miscbilldetail.setBillamount(advanceRequisition.getAdvanceRequisitionAmount());
miscbilldetail.setPassedamount(advanceRequisition.getAdvanceRequisitionAmount());
miscbilldetail.setPaidamount(advanceRequisition.getAdvanceRequisitionAmount());
miscbilldetail.setPaidto(advanceRequisition.getEgAdvanceReqMises().getPayto());
miscbilldetail.setPayVoucherHeader(paymentheader.getVoucherheader());
//persistenceService.setType(Miscbilldetail.class);
persistenceService.persist(miscbilldetail);
}
private void populateData() {
populateBanks();
populateBankAccounts();
populateFund();
}
private void populateBanks() {
if (bankaccount.getId() != null)
addDropdownData("bankList", persistenceService.findAllBy("from Bankbranch bb where " +
"bb.isactive=true and bb.bank.isactive=true order by bb.bank.name"));
}
private void populateBankAccounts() {
if (bankaccount.getId() != null)
addDropdownData("accNumList", persistenceService.findAllBy(
"from Bankaccount ba where ba.bankbranch.id=? and ba.fund.id=? " +
"and ba.isactive=true order by ba.chartofaccounts.glcode", bankaccount.getBankbranch().getId(),
bankaccount.getFund().getId()));
}
void loadApproverUser() {
final String scriptName = "paymentHeader.nextDesg";
final String type = "Payment" + "|";
Map<String, Object> map = new HashMap<String, Object>();
if (paymentheader != null && paymentheader.getVoucherheader().getFiscalPeriodId() != null)
map = voucherService.getDesgByDeptAndTypeAndVoucherDate(type, scriptName, paymentheader.getVoucherheader()
.getVoucherDate(), paymentheader);
else
map = voucherService.getDesgByDeptAndTypeAndVoucherDate(type, scriptName, new Date(), paymentheader);
addDropdownData("departmentList", masterDataCache.get("egi-department"));
final List<Map<String, Object>> desgList = (List<Map<String, Object>>) map.get("designationList");
String strDesgId = "", dName = "";
final List<Map<String, Object>> designationList = new ArrayList<Map<String, Object>>();
Map<String, Object> desgFuncryMap;
for (final Map<String, Object> desgIdAndName : desgList) {
desgFuncryMap = new HashMap<String, Object>();
if (desgIdAndName.get("designationName") != null)
desgFuncryMap.put("designationName", desgIdAndName.get("designationName"));
if (desgIdAndName.get("designationId") != null) {
strDesgId = (String) desgIdAndName.get("designationId");
if (strDesgId.indexOf("~") != -1) {
strDesgId = strDesgId.substring(0, strDesgId.indexOf('~'));
dName = (String) desgIdAndName.get("designationId");
dName = dName.substring(dName.indexOf('~') + 1);
}
desgFuncryMap.put("designationId", strDesgId);
}
designationList.add(desgFuncryMap);
}
addDropdownData("designationList", designationList);
}
private void populateSubledgerDetails(final List<HashMap<String, Object>> subledgerdetails) {
HashMap<String, Object> subledgertDetailMap = null;
for (final EgAdvanceRequisitionDetails voucherDetail : advanceRequisition.getEgAdvanceReqDetailses())
for (final EgAdvanceReqPayeeDetails payeeDetail : voucherDetail.getEgAdvanceReqpayeeDetailses()) {
subledgertDetailMap = new HashMap<String, Object>();
subledgertDetailMap.put(VoucherConstant.DEBITAMOUNT, payeeDetail.getDebitAmount());
subledgertDetailMap.put(VoucherConstant.CREDITAMOUNT, payeeDetail.getCreditAmount());
subledgertDetailMap.put(VoucherConstant.DETAILTYPEID, payeeDetail.getAccountDetailType().getId());
subledgertDetailMap.put(VoucherConstant.DETAILKEYID, payeeDetail.getAccountdetailKeyId());
subledgertDetailMap.put(VoucherConstant.GLCODE, voucherDetail.getChartofaccounts().getGlcode());
subledgerdetails.add(subledgertDetailMap);
}
}
private void populateHeaderDetails(final HashMap<String, Object> headerdetails) throws ParseException {
headerdetails.put(VoucherConstant.VOUCHERNAME, "Advance Payment");
headerdetails.put(VoucherConstant.VOUCHERTYPE, "Payment");
if (parameters.get(VoucherConstant.DESCRIPTION) != null)
headerdetails.put(VoucherConstant.DESCRIPTION, parameters.get(VoucherConstant.DESCRIPTION)[0]);
if (voucherDate != null)
headerdetails.put(VoucherConstant.VOUCHERDATE, voucherDate);
else
throw new ValidationException(Arrays.asList(new ValidationError("invalid.date", "invalid.date")));
if (shouldShowHeaderField(VoucherConstant.VOUCHERNUMBER)
&& (parameters.get(VoucherConstant.VOUCHERNUMBER) == null || "".equals(parameters
.get(VoucherConstant.VOUCHERNUMBER)[0])))
throw new ValidationException(Arrays.asList(new ValidationError("invalid.voucher.number", "invalid.voucher.number")));
else
headerdetails.put(VoucherConstant.VOUCHERNUMBER, parameters.get(VoucherConstant.VOUCHERNUMBER)[0]);
final EgAdvanceRequisitionMis egAdvanceReqMises = advanceRequisition.getEgAdvanceReqMises();
if (egAdvanceReqMises != null) {
if (egAdvanceReqMises.getFund() != null && egAdvanceReqMises.getFund().getId() != null) {
voucherHeader.setFundId((Fund) persistenceService.find("from Fund where id=?", egAdvanceReqMises.getFund()
.getId()));
headerdetails.put(VoucherConstant.FUNDCODE, egAdvanceReqMises.getFund().getCode());
}
if (egAdvanceReqMises.getEgDepartment() != null && egAdvanceReqMises.getEgDepartment().getId() != null) {
voucherHeader.getVouchermis().setDepartmentid(
(Department) persistenceService.find("from Department where id=?", egAdvanceReqMises.getEgDepartment()
.getId()));
headerdetails.put(VoucherConstant.DEPARTMENTCODE, egAdvanceReqMises.getEgDepartment().getCode());
}
if (egAdvanceReqMises.getFundsource() != null && egAdvanceReqMises.getFundsource().getId() != null) {
voucherHeader.getVouchermis().setFundsource(
(Fundsource) persistenceService.find("from Fundsource where id=?", egAdvanceReqMises.getFundsource()
.getId()));
headerdetails.put(VoucherConstant.FUNDSOURCECODE, egAdvanceReqMises.getFundsource().getCode());
}
if (egAdvanceReqMises.getScheme() != null && egAdvanceReqMises.getScheme().getId() != null) {
voucherHeader.getVouchermis().setSchemeid(
(Scheme) persistenceService.find("from Scheme where id=?", egAdvanceReqMises.getScheme().getId()));
headerdetails.put(VoucherConstant.SCHEMECODE, egAdvanceReqMises.getScheme().getCode());
}
if (egAdvanceReqMises.getSubScheme() != null && egAdvanceReqMises.getSubScheme().getId() != null) {
voucherHeader.getVouchermis().setSubschemeid(
(SubScheme) persistenceService
.find("from SubScheme where id=?", egAdvanceReqMises.getSubScheme().getId()));
headerdetails.put(VoucherConstant.SUBSCHEMECODE, egAdvanceReqMises.getSubScheme().getCode());
}
if (egAdvanceReqMises.getFunctionaryId() != null && egAdvanceReqMises.getFunctionaryId().getId() != null) {
voucherHeader.getVouchermis().setFunctionary(
(Functionary) persistenceService.find("from Functionary where id=?", egAdvanceReqMises.getFunctionaryId()
.getId()));
headerdetails.put(VoucherConstant.FUNCTIONARYCODE, egAdvanceReqMises.getFunctionaryId().getCode());
}
if (egAdvanceReqMises.getFunction() != null && egAdvanceReqMises.getFunction().getId() != null) {
voucherHeader.getVouchermis()
.setFunction(
(CFunction) persistenceService.find("from CFunction where id=?", egAdvanceReqMises.getFunction()
.getId()));
headerdetails.put(VoucherConstant.FUNCTIONCODE, egAdvanceReqMises.getFunction().getCode());
}
if (egAdvanceReqMises.getSubFieldId() != null && egAdvanceReqMises.getSubFieldId().getId() != null) {
voucherHeader.getVouchermis()
.setDivisionid(
(Boundary) persistenceService.find("from Boundary where id=?", egAdvanceReqMises.getSubFieldId()
.getId()));
headerdetails.put(VoucherConstant.DIVISIONID, egAdvanceReqMises.getSubFieldId().getId());
}
}
}
private void populateAccountCodeDetails(final List<HashMap<String, Object>> accountcodedetails) {
final HashMap<String, Object> accdetailsMap = new HashMap<String, Object>();
accdetailsMap.put(VoucherConstant.GLCODE, bankaccount.getChartofaccounts().getGlcode());
accdetailsMap.put(VoucherConstant.NARRATION, bankaccount.getChartofaccounts().getName());
accdetailsMap.put(VoucherConstant.DEBITAMOUNT, 0);
accdetailsMap.put(VoucherConstant.CREDITAMOUNT, advanceRequisition.getAdvanceRequisitionAmount());
accountcodedetails.add(accdetailsMap);
final HashMap<String, Object> accdetailsMap1 = new HashMap<String, Object>();
for (final EgAdvanceRequisitionDetails row : advanceRequisition.getEgAdvanceReqDetailses()) {
accdetailsMap1.put(VoucherConstant.GLCODE, row.getChartofaccounts().getGlcode());
accdetailsMap1.put(VoucherConstant.NARRATION, row.getChartofaccounts().getName());
}
accdetailsMap1.put(VoucherConstant.DEBITAMOUNT, advanceRequisition.getAdvanceRequisitionAmount());
accdetailsMap1.put(VoucherConstant.CREDITAMOUNT, 0);
accountcodedetails.add(accdetailsMap1);
}
@Override
public StateAware getModel() {
return voucherHeader;
}
public void setAdvanceRequisition(final EgAdvanceRequisition advanceRequisition) {
this.advanceRequisition = advanceRequisition;
}
public EgAdvanceRequisition getAdvanceRequisition() {
return advanceRequisition;
}
@Override
public boolean shouldShowHeaderField(final String field) {
return super.shouldShowHeaderField(field);
}
public void setBankaccount(final Bankaccount bankaccount) {
this.bankaccount = bankaccount;
}
public Bankaccount getBankaccount() {
return bankaccount;
}
public void setPaymentService(final PaymentService paymentService) {
this.paymentService = paymentService;
}
public void setPaymentWorkflowService(final SimpleWorkflowService<Paymentheader> paymentWorkflowService) {
this.paymentWorkflowService = paymentWorkflowService;
}
public void setVoucherDate(final Date voucherdate) {
voucherDate = voucherdate;
}
public Date getVoucherDate() {
return voucherDate;
}
public void setModeOfCollectionMap(final Map<String, String> modeOfCollectionMap) {
this.modeOfCollectionMap = modeOfCollectionMap;
}
public Map<String, String> getModeOfCollectionMap() {
return modeOfCollectionMap;
}
public void setPaymentMode(final String paymentMode) {
this.paymentMode = paymentMode;
}
public String getPaymentMode() {
return paymentMode;
}
public void setNarration(final String narration) {
this.narration = narration;
}
public String getNarration() {
return narration;
}
public void setVoucherService(final VoucherService voucherService) {
this.voucherService = voucherService;
}
public VoucherService getVoucherService() {
return voucherService;
}
public void setEgovCommon(final EgovCommon egovCommon) {
this.egovCommon = egovCommon;
}
public EgovCommon getEgovCommon() {
return egovCommon;
}
public List<String> getValidActions() {
return null;
}
public String formatDate(final Date date) {
return Constants.DDMMYYYYFORMAT2.format(date);
}
public void setFund(final Fund fund) {
this.fund = fund;
}
public Fund getFund() {
return fund;
}
}