/*
* 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.deduction;
import java.math.BigDecimal;
import java.text.DateFormat;
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.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
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.billsaccounting.services.CreateVoucher;
import org.egov.billsaccounting.services.VoucherConstant;
import org.egov.commons.Bankaccount;
import org.egov.commons.CFunction;
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.FinancialYearHibernateDAO;
import org.egov.commons.service.BankAccountService;
import org.egov.commons.service.FunctionService;
import org.egov.commons.utils.EntityType;
import org.egov.dao.voucher.VoucherHibernateDAO;
import org.egov.deduction.model.EgRemittance;
import org.egov.deduction.model.EgRemittanceDetail;
import org.egov.egf.commons.EgovCommon;
import org.egov.egf.web.actions.payment.BasePaymentAction;
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.DepartmentService;
import org.egov.infra.script.entity.Script;
import org.egov.infra.script.service.ScriptService;
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.State;
import org.egov.infra.workflow.entity.StateAware;
import org.egov.infra.workflow.matrix.entity.WorkFlowMatrix;
import org.egov.infra.workflow.service.SimpleWorkflowService;
import org.egov.infstr.services.PersistenceService;
import org.egov.infstr.utils.EgovMasterDataCaching;
import org.egov.model.bills.Miscbilldetail;
import org.egov.model.deduction.RemittanceBean;
import org.egov.model.instrument.InstrumentHeader;
import org.egov.model.payment.Paymentheader;
import org.egov.model.recoveries.Recovery;
import org.egov.model.service.RecoveryService;
import org.egov.model.voucher.CommonBean;
import org.egov.model.voucher.WorkflowBean;
import org.egov.payment.services.PaymentActionHelper;
import org.egov.pims.commons.Designation;
import org.egov.services.deduction.RemitRecoveryService;
import org.egov.services.masters.BankService;
import org.egov.services.payment.PaymentService;
import org.egov.services.voucher.VoucherService;
import org.egov.utils.Constants;
import org.egov.utils.FinancialConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.exilant.GLEngine.ChartOfAccounts;
import com.exilant.GLEngine.Transaxtion;
import com.opensymphony.xwork2.validator.annotations.Validation;
@ParentPackage("egov")
@Validation
@Results({
@Result(name = RemitRecoveryAction.NEW, location = "remitRecovery-" + RemitRecoveryAction.NEW + ".jsp"),
@Result(name = "messages", location = "remitRecovery-messages.jsp"),
@Result(name = "view", location = "remitRecovery-view.jsp"),
@Result(name = "remitDetail", location = "remitRecovery-remitDetail.jsp")
})
public class RemitRecoveryAction extends BasePaymentAction {
private static final String DESIGNATION_ID = "designationId";
private static final String DESIGNATION_NAME = "designationName";
private static final String DESIGNATION_LIST = "designationList";
private static final String UNCHECKED = "unchecked";
private static final String MESSAGES = "messages";
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(RemitRecoveryAction.class);
protected List<String> headerFields = new ArrayList<String>();
protected List<String> mandatoryFields = new ArrayList<String>();
private RemittanceBean remittanceBean = new RemittanceBean();
private FinancialYearHibernateDAO financialYearDAO;
private RemitRecoveryService remitRecoveryService;
private VoucherService voucherService;
private List<RemittanceBean> listRemitBean;
private String selectedRows;
private Long functionId;
@Autowired
@Qualifier("remittanceRecoveryService")
private RecoveryService recoveryService;
private Map<String, String> modeOfCollectionMap = new HashMap<String, String>();
private PaymentService paymentService;
private Paymentheader paymentheader = new Paymentheader();
private static final String PAYMENTID = "paymentid";
private static final String VIEW = "view";
private SimpleWorkflowService<Paymentheader> paymentWorkflowService;
public boolean showApprove = false;
private CommonBean commonBean;
private String modeOfPayment;
@Autowired
private DepartmentService departmentService;
@Autowired
private FunctionService functionService;
@Autowired
@Qualifier("persistenceService")
private PersistenceService persistenceService;
@Autowired
CreateVoucher createVoucher;
private Integer departmentId;
private String wfitemstate;
private String comments;
private static final String DD_MMM_YYYY = "dd-MMM-yyyy";
private static final String FAILED = "Transaction failed";
private static final String SAVE_EXCEPTION = "Exception while saving data";
// private String typeOfAccount;
private Recovery recovery;
private VoucherHibernateDAO voucherHibDAO;
private EgovCommon egovCommon;
private boolean showCancel = false;
private boolean showButtons = true;
private BigDecimal balance;
private String remittedTo = "";
private final boolean remit = false;
private List<InstrumentHeader> instrumentHeaderList = new ArrayList<InstrumentHeader>();
private String cutOffDate;
private final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Constants.LOCALE);
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
DateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy");
private final SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
Date date;
private ScriptService scriptService;
@Autowired
private PaymentActionHelper paymentActionHelper;
private ChartOfAccounts chartOfAccounts;
@Autowired
private EgovMasterDataCaching masterDataCache;
@Autowired
@Qualifier("bankService")
private BankService bankService;
@Autowired
@Qualifier("bankAccountService")
private BankAccountService bankAccountService;
public BigDecimal getBalance() {
return balance;
}
public void setBalance(final BigDecimal balance) {
this.balance = balance;
}
@Override
public StateAware getModel() {
voucherHeader = (CVoucherHeader) super.getModel();
voucherHeader.setType(FinancialConstants.STANDARD_VOUCHER_TYPE_PAYMENT);
return voucherHeader;
}
public RemitRecoveryAction()
{
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();
if (LOGGER.isDebugEnabled())
LOGGER.debug("Inside Prepare method");
final List<Recovery> listRecovery = recoveryService.getAllActiveRecoverys();
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | Tds list size : " + listRecovery.size());
addDropdownData("recoveryList", listRecovery);
addDropdownData("bankList", Collections.EMPTY_LIST);
addDropdownData("accNumList", Collections.EMPTY_LIST);
modeOfCollectionMap.put("cash", getText("cash.consolidated.cheque"));
}
@Override
@Action(value = "/deduction/remitRecovery-newform")
public String newform() {
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | newform | start");
reset();
loadDefalutDates();
return NEW;
}
private void reset() {
commonBean.reset();
voucherHeader.reset();
remittanceBean = new RemittanceBean();
if (remit)
listRemitBean = new ArrayList<RemittanceBean>();
}
@ValidationErrorPage(value = NEW)
@Action(value = "/deduction/remitRecovery-search")
public String search() {
listRemitBean = new ArrayList<RemittanceBean>();
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | Search | Start");
listRemitBean = remitRecoveryService.getRecoveryDetails(remittanceBean, voucherHeader);
if (listRemitBean == null || listRemitBean.isEmpty())
listRemitBean = new ArrayList<RemittanceBean>();
else{
departmentId = listRemitBean.get(0).getDepartmentId().intValue();
functionId = listRemitBean.get(0).getFunctionId();
}
return NEW;
}
public void prepareRemit()
{
addDropdownData("userList", Collections.EMPTY_LIST);
loadDefalutDates();
}
@ValidationErrorPage(value = "new")
@Action(value = "/deduction/remitRecovery-remit")
public String remit() {
prepareListRemitBean(selectedRows);
List<AppConfigValues> cutOffDateconfigValue = appConfigValuesService.getConfigValuesByModuleAndKey("EGF",
"DataEntryCutOffDate");
if (cutOffDateconfigValue != null && !cutOffDateconfigValue.isEmpty())
{
try {
date = df.parse(cutOffDateconfigValue.get(0).getValue());
setCutOffDate(formatter.format(date));
} catch (ParseException e) {
}
}
voucherHeader.setType(FinancialConstants.STANDARD_VOUCHER_TYPE_PAYMENT);
if(voucherHeader.getVouchermis().getDepartmentid()==null )
{
Department department=departmentService.getDepartmentById(departmentId.longValue());
voucherHeader.getVouchermis().setDepartmentid(department);
}
if(voucherHeader.getVouchermis().getFunction()==null)
{
CFunction function=functionService.findOne(functionId);
voucherHeader.getVouchermis().setFunction(function);
}
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | remit | start");
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | remit | size before filter" + listRemitBean.size());
final Recovery recov = (Recovery) persistenceService.find("from Recovery where id=?", remittanceBean.getRecoveryId());
if (recov != null)
remittedTo = recov.getRemitted();
for (final RemittanceBean rbean : listRemitBean)
rbean.setPartialAmount(rbean.getAmount());
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | remit | size after filter" + listRemitBean.size());
setModeOfPayment(FinancialConstants.MODEOFPAYMENT_CASH);
if (LOGGER.isDebugEnabled())
LOGGER.debug("RemitRecoveryAction | remit | end");
return "remitDetail";
}
private void prepareListRemitBean(String selectedRows) {
listRemitBean = remitRecoveryService.getRecoveryDetails(selectedRows);
if (listRemitBean == null)
listRemitBean = new ArrayList<RemittanceBean>();
}
@ValidationErrorPage(value = "remitDetail")
@Action(value = "/deduction/remitRecovery-create")
public String create()
{
try {
String vdate = parameters.get("voucherDate")[0];
Date date1 = sdf1.parse(vdate);
String voucherDate = formatter1.format(date1);
String cutOffDate1 = null;
validateFields();
voucherHeader.setType(FinancialConstants.STANDARD_VOUCHER_TYPE_PAYMENT);
voucherHeader.setName(FinancialConstants.PAYMENTVOUCHER_NAME_REMITTANCE);
final HashMap<String, Object> headerDetails = createHeaderAndMisDetails();
recovery = (Recovery) persistenceService.find("from Recovery where id=?", remittanceBean.getRecoveryId());
populateWorkflowBean();
paymentheader = paymentActionHelper.createRemittancePayment(paymentheader, voucherHeader,
Integer.valueOf(commonBean.getAccountNumberId()), getModeOfPayment(), remittanceBean.getTotalAmount(),
listRemitBean, recovery, remittanceBean, remittedTo, workflowBean, headerDetails, commonBean);
if (!cutOffDate.isEmpty() && cutOffDate != null)
{
try {
date = sdf1.parse(cutOffDate);
cutOffDate1 = formatter1.format(date);
} catch (ParseException e) {
//
}
}
if (cutOffDate1 != null && voucherDate.compareTo(cutOffDate1) <= 0
&& FinancialConstants.CREATEANDAPPROVE.equalsIgnoreCase(workflowBean.getWorkFlowAction()))
{
addActionMessage(getText("remittancepayment.transaction.success")
+ paymentheader.getVoucherheader().getVoucherNumber());
}
else
{
addActionMessage(getText("remittancepayment.transaction.success")
+ paymentheader.getVoucherheader().getVoucherNumber());
addActionMessage(getText("payment.voucher.approved",
new String[] { paymentService.getEmployeeNameForPositionId(paymentheader.getState().getOwnerPosition()) }));
}
} catch (final ValidationException e) {
loadAjaxedDropDowns();
LOGGER.error(e.getMessage(), e);
final List<ValidationError> errors = new ArrayList<ValidationError>();
errors.add(new ValidationError("exp", e.getErrors().get(0).getMessage()));
throw new ValidationException(errors);
} catch (final Exception e) {
loadAjaxedDropDowns();
LOGGER.error(e.getMessage());
throw new ValidationException(Arrays.asList(new ValidationError(e.getMessage(), e.getMessage())));
}
return MESSAGES;
}
/**
*
*
* 1.Creates one EgRemittance with paymentvoucher is set 2.updates every EgRemittanceGldtl for selected Bills 3.Creates
* EgRemittanceDetail per selected Bill
*
*/
private List<HashMap<String, Object>> addSubledgerGroupBy(final List<HashMap<String, Object>> subledgerDetails,
final String glcode) {
final Map<Integer, List<Integer>> detailTypesMap = new HashMap<Integer, List<Integer>>();
Integer detailTypeId = null;
final List<Integer> detailTypeList = new ArrayList<Integer>();
HashMap<String, Object> subledgertDetailMap = null;
for (final RemittanceBean rbean : listRemitBean)
{
detailTypeId = rbean.getDetailTypeId();
if (detailTypeList.contains(detailTypeId))
{
if (detailTypesMap.get(detailTypeId).contains(rbean.getDetailKeyid()))
continue;
else
detailTypesMap.get(detailTypeId).add(rbean.getDetailKeyid());
}
else
{
detailTypeList.add(detailTypeId);
detailTypesMap.put(detailTypeId, new ArrayList<Integer>());
detailTypesMap.get(detailTypeId).add(rbean.getDetailKeyid());
}
}
final Set<Entry<Integer, List<Integer>>> entrySet = detailTypesMap.entrySet();
final List<RemittanceBean> tempRemitBean = listRemitBean;
for (final Entry<Integer, List<Integer>> o : entrySet)
{
final List<Integer> value = o.getValue();
for (final Integer detailKey : value)
{
BigDecimal sumPerDetailKey = BigDecimal.ZERO;
// int lastIndexOf = tempRemitBean.lastIndexOf(detailKey);
for (final RemittanceBean remittanceBean2 : tempRemitBean)
if (remittanceBean2.getDetailKeyid() != null && remittanceBean2.getDetailKeyid().equals(detailKey))
sumPerDetailKey = sumPerDetailKey.add(remittanceBean2.getPartialAmount());
subledgertDetailMap = new HashMap<String, Object>();
subledgertDetailMap.put(VoucherConstant.DEBITAMOUNT, sumPerDetailKey);
subledgertDetailMap.put(VoucherConstant.CREDITAMOUNT, BigDecimal.ZERO);
subledgertDetailMap.put(VoucherConstant.DETAILTYPEID, o.getKey().toString());
subledgertDetailMap.put(VoucherConstant.DETAILKEYID, detailKey);
subledgertDetailMap.put(VoucherConstant.GLCODE, glcode);
subledgerDetails.add(subledgertDetailMap);
}
}
return subledgerDetails;
}
public Paymentheader getPayment() {
String paymentid = null;
if (parameters.get(PAYMENTID) == null)
{
final Object obj = getSession().get(PAYMENTID);
if (obj != null)
paymentid = (String) obj;
} else
paymentid = parameters.get(PAYMENTID)[0];
if (paymentheader == null && paymentid != null)
paymentheader = paymentService.find("from Paymentheader where id=?", Long.valueOf(paymentid));
if (paymentheader == null)
paymentheader = new Paymentheader();
return paymentheader;
}
@SuppressWarnings(UNCHECKED)
private void loadApproverUser(final String type) {
addDropdownData("userList", Collections.EMPTY_LIST);
final String scriptName = "paymentHeader.nextDesg";
String atype = type;
if (paymentheader != null && paymentheader.getPaymentAmount() != null)
{
if (LOGGER.isInfoEnabled())
LOGGER.info("paymentheader.getPaymentAmount() >>>>>>>>>>>>>>>>>>> :" + paymentheader.getPaymentAmount());
atype = atype + "|" + paymentheader.getPaymentAmount();
} else
atype = atype + "|";
departmentId = voucherService.getCurrentDepartment().getId().intValue();
if (LOGGER.isInfoEnabled())
LOGGER.info("departmentId :" + departmentId);
Map<String, Object> map = new HashMap<String, Object>();
if (paymentheader != null && paymentheader.getVoucherheader().getFiscalPeriodId() != null)
map = voucherService.getDesgByDeptAndTypeAndVoucherDate(atype, scriptName, paymentheader.getVoucherheader()
.getVoucherDate(), paymentheader);
else
map = voucherService.getDesgByDeptAndTypeAndVoucherDate(atype, scriptName, new Date(), paymentheader);
addDropdownData("departmentList", masterDataCache.get("egi-department"));
final List<Map<String, Object>> desgList = (List<Map<String, Object>>) map.get(DESIGNATION_LIST);
String strDesgId = "", dName = "";
boolean bDefaultDeptId = false;
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(DESIGNATION_NAME) != null)
desgFuncryMap.put(DESIGNATION_NAME, desgIdAndName.get(DESIGNATION_NAME));
if (desgIdAndName.get(DESIGNATION_ID) != null) {
strDesgId = (String) desgIdAndName.get(DESIGNATION_ID);
if (strDesgId.indexOf('~') != -1) {
strDesgId = strDesgId.substring(0, strDesgId.indexOf('~'));
dName = (String) desgIdAndName.get(DESIGNATION_ID);
dName = dName.substring(dName.indexOf('~') + 1);
bDefaultDeptId = true;
}
desgFuncryMap.put(DESIGNATION_ID, strDesgId);
}
designationList.add(desgFuncryMap);
}
map.put(DESIGNATION_LIST, designationList);
addDropdownData(DESIGNATION_LIST, (List<Designation>) map.get(DESIGNATION_LIST));
if (bDefaultDeptId && !"".equals(dName)) {
final Department dept = (Department) persistenceService.find("from Department where deptName like '%" + dName + "' ");
departmentId = dept.getId().intValue();
}
wfitemstate = map.get("wfitemstate") == null ? "" : map.get("wfitemstate").toString();
}
@ValidationErrorPage(value = VIEW)
@SkipValidation
@Action(value = "/deduction/remitRecovery-sendForApproval")
public String sendForApproval() {
paymentheader = paymentService.find("from Paymentheader where id=?", Long.valueOf(paymentid));
populateWorkflowBean();
paymentheader = paymentActionHelper.sendForApproval(paymentheader, workflowBean);
if (FinancialConstants.BUTTONREJECT.equalsIgnoreCase(workflowBean.getWorkFlowAction()))
addActionMessage(getText("payment.voucher.rejected",
new String[] { paymentService.getEmployeeNameForPositionId(paymentheader.getState()
.getOwnerPosition()) }));
if (FinancialConstants.BUTTONFORWARD.equalsIgnoreCase(workflowBean.getWorkFlowAction()))
addActionMessage(getText("payment.voucher.approved", new String[] { paymentService
.getEmployeeNameForPositionId(paymentheader.getState().getOwnerPosition()) }));
if (FinancialConstants.BUTTONCANCEL.equalsIgnoreCase(workflowBean.getWorkFlowAction()))
addActionMessage(getText("payment.voucher.cancelled"));
else if (FinancialConstants.BUTTONAPPROVE.equalsIgnoreCase(workflowBean.getWorkFlowAction())) {
if ("Closed".equals(paymentheader.getState().getValue()))
addActionMessage(getText("payment.voucher.final.approval"));
else
addActionMessage(getText("payment.voucher.approved",
new String[] { paymentService.getEmployeeNameForPositionId(paymentheader.getState()
.getOwnerPosition()) }));
setAction(workflowBean.getWorkFlowAction());
}
return MESSAGES;
}
/**
* @return messages
*/
/**
* @return
*/
private String cancelPayment() {
voucherHeader = paymentheader.getVoucherheader();
final int count = paymentService.backUpdateRemittanceDateInGL(voucherHeader.getId());
if (LOGGER.isDebugEnabled())
LOGGER.debug("Remittance Cancellation updated " + count + " generalledger entries");
voucherHeader.setStatus(FinancialConstants.CANCELLEDVOUCHERSTATUS);
// persistenceService.setType(CVoucherHeader.class);
persistenceService.persist(voucherHeader);
paymentheader.transition(true).end();
addActionMessage(getText("payment.voucher.cancelled"));
return MESSAGES;
}
@ValidationErrorPage(value = VIEW)
@SkipValidation
@Action(value = "/deduction/remitRecovery-viewInboxItem")
public String viewInboxItem() {
paymentheader = paymentService.find("from Paymentheader where id=?", Long.valueOf(paymentid));
/*
* if (paymentheader.getState().getValue() != null && !paymentheader.getState().getValue().isEmpty() &&
* paymentheader.getState().getValue().contains("Reject")) {
* voucherHeader.setId(paymentheader.getVoucherheader().getId()); showCancel = true; return beforeEdit(); }
*/
showApprove = true;
voucherHeader.setId(paymentheader.getVoucherheader().getId());
prepareForViewModifyReverse();
// loadApproverUser(voucherHeader.getType());
return VIEW;
}
/**
* @return
*/
public String beforeEdit() {
showApprove = true;
// voucherHeader.setId(paymentheader.getVoucherheader().getId());
prepareForViewModifyReverse();
// loadApproverUser(voucherHeader.getType());
return EDIT;
}
@ValidationErrorPage(value = EDIT)
@Action(value = "/deduction/remitRecovery-edit")
public String edit()
{
try {
validateFields();
voucherHeader = voucherService.updateVoucherHeader(voucherHeader);
reCreateLedger();
updateRemittanceDetail();
paymentheader = (Paymentheader) persistenceService.find("from Paymentheader where voucherheader=?", voucherHeader);
paymentService.updatePaymentHeader(paymentheader, voucherHeader, Integer.valueOf(commonBean.getAccountNumberId()),
getModeOfPayment(), remittanceBean.getTotalAmount());
final Miscbilldetail miscbillDetail = (Miscbilldetail) persistenceService.find(
" from Miscbilldetail where payVoucherHeader=?", voucherHeader);
miscbillDetail.setPaidto(remittedTo);
// persistenceService.setType(Miscbilldetail.class);
persistenceService.persist(miscbillDetail);
// updateMiscBillDetail();
sendForApproval();
addActionMessage(getText("remittancepayment.transaction.success") + voucherHeader.getVoucherNumber());
} catch (final ValidationException e) {
// loadApproverUser(voucherHeader.getType());
loadAjaxedDropDowns();
throw e;
}
return MESSAGES;
}
/**
*
*/
private void updateRemittanceDetail() {
for (final RemittanceBean rbean : listRemitBean)
{
final EgRemittanceDetail egrDetail = (EgRemittanceDetail) persistenceService.find(
"from EgRemittanceDetail where id=?",
rbean.getRemittanceId());
egrDetail.setRemittedamt(rbean.getPartialAmount());
// persistenceService.setType(EgRemittanceDetail.class);
persistenceService.persist(egrDetail);
}
}
/**
*
*
*/
private void reCreateLedger() {
try {
createVoucher.deleteVoucherdetailAndGL(voucherHeader);
persistenceService.getSession().flush();
HashMap<String, Object> detailMap = null;
final List<HashMap<String, Object>> accountdetails = new ArrayList<HashMap<String, Object>>();
List<HashMap<String, Object>> subledgerDetails = new ArrayList<HashMap<String, Object>>();
detailMap = new HashMap<String, Object>();
detailMap.put(VoucherConstant.CREDITAMOUNT, remittanceBean.getTotalAmount().toString());
detailMap.put(VoucherConstant.DEBITAMOUNT, ZERO);
final Bankaccount account = (Bankaccount) persistenceService.find("from Bankaccount where id=?",
Integer.valueOf(commonBean.getAccountNumberId()));
detailMap.put(VoucherConstant.GLCODE, account.getChartofaccounts().getGlcode());
accountdetails.add(detailMap);
detailMap = new HashMap<String, Object>();
detailMap.put(VoucherConstant.CREDITAMOUNT, ZERO);
detailMap.put(VoucherConstant.DEBITAMOUNT, remittanceBean.getTotalAmount().toString());
recovery = (Recovery) persistenceService.find("from Recovery where id=?", remittanceBean.getRecoveryId());
detailMap.put(VoucherConstant.GLCODE, recovery.getChartofaccounts().getGlcode());
accountdetails.add(detailMap);
subledgerDetails = addSubledgerGroupBy(subledgerDetails, recovery.getChartofaccounts().getGlcode());
final List<Transaxtion> transactions = createVoucher.createTransaction(null, accountdetails, subledgerDetails,
voucherHeader);
persistenceService.getSession().flush();
Transaxtion txnList[] = new Transaxtion[transactions.size()];
txnList = transactions.toArray(txnList);
final SimpleDateFormat formatter = new SimpleDateFormat(DD_MMM_YYYY);
if (!chartOfAccounts.postTransaxtions(txnList, formatter.format(voucherHeader.getVoucherDate())))
throw new ValidationException(Arrays.asList(new ValidationError("Exception While Saving Data",
"Transaction Failed")));
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ValidationException(Arrays.asList(new ValidationError(SAVE_EXCEPTION, FAILED)));
}
}
@Action(value = "/deduction/remitRecovery-beforeView")
public String beforeView()
{
prepareForViewModifyReverse();
wfitemstate = "END"; // requird to hide the approver drop down when view is form source
showApprove = true;
showButtons = false;
// loadApproverUser(voucherHeader.getType());
return VIEW;
}
@SuppressWarnings(UNCHECKED)
private void prepareForViewModifyReverse() {
final StringBuffer instrumentQuery = new StringBuffer(100);
instrumentQuery.append(
"select distinct ih from InstrumentHeader ih join ih.instrumentVouchers iv where iv.voucherHeaderId.id=?")
.append(" order by ih.id");
remittanceBean = new RemittanceBean();
voucherHeader = (CVoucherHeader) persistenceService.find("from CVoucherHeader where id=?", voucherHeader.getId());
paymentheader = (Paymentheader) persistenceService.find("from Paymentheader where voucherheader=?", voucherHeader);
final Miscbilldetail miscBill = (Miscbilldetail) persistenceService.find("from Miscbilldetail where payVoucherHeader=?",
voucherHeader);
remittedTo = miscBill.getPaidto();
commonBean.setAmount(paymentheader.getPaymentAmount());
commonBean.setAccountNumberId(paymentheader.getBankaccount().getId().toString());
commonBean.setAccnumnar(paymentheader.getBankaccount().getNarration());
final String bankBranchId = paymentheader.getBankaccount().getBankbranch().getBank().getId() + "-"
+ paymentheader.getBankaccount().getBankbranch().getId();
commonBean.setBankId(bankBranchId);
setModeOfPayment(paymentheader.getType());
remittanceBean.setTotalAmount(paymentheader.getPaymentAmount());
setComments(getText("payment.comments", new String[] { paymentheader.getPaymentAmount().toPlainString() }));
getRemittanceFromVoucher();
loadAjaxedDropDowns();
// find it last so that rest of the data loaded
if (!"view".equalsIgnoreCase(showMode)) {
// validateUser("balancecheck");
} else {
if (LOGGER.isDebugEnabled())
LOGGER.debug("fetching cheque detail ------------------------");
instrumentHeaderList = getPersistenceService()
.findAllBy(instrumentQuery.toString(), paymentheader.getVoucherheader().getId());
}
}
private void getRemittanceFromVoucher() {
listRemitBean = new ArrayList<RemittanceBean>();
final List<EgRemittance> remitList = persistenceService.findAllBy(
"from EgRemittance where voucherheader=?", voucherHeader);
for (final EgRemittance remit : remitList)
{
RemittanceBean rbean = null;
final Set<EgRemittanceDetail> egRemittanceDetail = remit.getEgRemittanceDetail();
for (final EgRemittanceDetail remitDtl : egRemittanceDetail)
{
rbean = new RemittanceBean();
rbean.setPartialAmount(remitDtl.getRemittedamt());
rbean.setAmount(remitDtl.getRemittedamt());
if (remitDtl.getEgRemittanceGldtl() != null) {
rbean.setDetailTypeId(remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail().getDetailTypeId().getId());
rbean.setDetailKeyid(remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail().getDetailKeyId().intValue());
rbean.setRemittance_gl_dtlId(remitDtl.getEgRemittanceGldtl().getId());
rbean.setDeductionAmount(remitDtl.getEgRemittanceGldtl().getGldtlamt());
} else
rbean.setDeductionAmount(remitDtl.getRemittedamt());
rbean.setRemittanceId(remitDtl.getId());
BigDecimal calculatedEarlierPayment = BigDecimal.ZERO;
if (remitDtl.getEgRemittanceGldtl() != null)
calculatedEarlierPayment = calculateEarlierPayment(remitDtl);
if (calculatedEarlierPayment.compareTo(BigDecimal.ZERO) == 0)
rbean.setEarlierPayment(BigDecimal.ZERO);
else if (remit.getVoucherheader().getStatus().intValue() == FinancialConstants.CANCELLEDVOUCHERSTATUS
.intValue()
|| remit.getVoucherheader().getStatus().intValue() == FinancialConstants.REVERSALVOUCHERSTATUS.intValue())
rbean.setEarlierPayment(calculatedEarlierPayment);
else
rbean.setEarlierPayment(calculatedEarlierPayment.subtract(remitDtl.getRemittedamt()));
final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
if (remitDtl.getEgRemittanceGldtl() != null) {
final EntityType entity = voucherHibDAO.getEntityInfo(remitDtl.getEgRemittanceGldtl()
.getGeneralledgerdetail()
.getDetailKeyId().intValue(), remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail()
.getDetailTypeId().getId());
rbean.setPartyCode(entity.getCode());
rbean.setPartyName(entity.getName());
rbean.setPanNo(entity.getPanno());
rbean.setVoucherDate(sdf.format(remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail().getGeneralLedgerId()
.getVoucherHeaderId().getVoucherDate()));
rbean.setVoucherNumber(remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail().getGeneralLedgerId()
.getVoucherHeaderId().getVoucherNumber());
rbean.setVoucherName(remitDtl.getEgRemittanceGldtl().getGeneralledgerdetail().getGeneralLedgerId()
.getVoucherHeaderId().getName());
} else if (remitDtl.getGeneralLedger().getVoucherHeaderId() != null) {
rbean.setVoucherDate(sdf.format(remitDtl.getGeneralLedger().getVoucherHeaderId().getVoucherDate()));
rbean.setVoucherNumber(remitDtl.getGeneralLedger().getVoucherHeaderId().getVoucherNumber());
rbean.setVoucherName(remitDtl.getGeneralLedger().getVoucherHeaderId().getName());
}
listRemitBean.add(rbean);
}
if (remittanceBean.getRecoveryId() == null)
remittanceBean.setRecoveryId(remit.getRecovery().getId());
}
}
/**
* @param remitDtl
* @return
*/
private BigDecimal calculateEarlierPayment(final EgRemittanceDetail remitDtl) {
final BigDecimal sum = (BigDecimal) persistenceService.find(
"select sum(egr.remittedamt) from EgRemittanceDetail egr where " +
" egr.egRemittanceGldtl=? and egr.egRemittance.voucherheader.status NOT in (?,?)",
remitDtl.getEgRemittanceGldtl(),
FinancialConstants.CANCELLEDVOUCHERSTATUS, FinancialConstants.REVERSEDVOUCHERSTATUS);
if (sum == null)
return BigDecimal.ZERO;
else
return sum;
}
@SuppressWarnings(UNCHECKED)
@SkipValidation
public boolean validateUser(final String purpose) {
final Script validScript = (Script) getPersistenceService().findAllByNamedQuery(Script.BY_NAME,
"Paymentheader.show.bankbalance").get(0);
final List<String> list = (List<String>) scriptService.executeScript(validScript,
ScriptService.createContext("persistenceService", paymentService, "purpose", purpose));
if (list.get(0).equals("true"))
try {
canCheckBalance = true;
commonBean.setAvailableBalance(egovCommon.getAccountBalance(new Date(), paymentheader.getBankaccount().getId(),
paymentheader.getPaymentAmount(), paymentheader.getId(), paymentheader.getBankaccount()
.getChartofaccounts().getId()));
balance = commonBean.getAvailableBalance();
return true;
} catch (final Exception e) {
balance = BigDecimal.valueOf(-1);
return true;
}
else
return false;
}
private void loadAjaxedDropDowns() {
loadSchemeSubscheme();
loadBankBranchForFundAndType();
loadBankAccountNumberForFundAndType();
}
private void loadBankBranchForFundAndType() {
addDropdownData("bankList", bankService.getBankByFundAndType(voucherHeader.getFundId().getId(), "RECEIPTS_PAYMENTS,PAYMENTS"));
}
private void loadBankAccountNumberForFundAndType()
{
Bankaccount bankaccount = null;
if (paymentheader != null && paymentheader.getBankaccount() != null)
{
bankaccount = paymentheader.getBankaccount();
} else if (commonBean.getAccountNumberId() != null && !commonBean.getAccountNumberId().equals("-1")
&& !commonBean.getAccountNumberId().equals(""))
{
bankaccount = (Bankaccount) persistenceService.find("from Bankaccount where id=?",
Integer.valueOf(commonBean.getAccountNumberId()));
}
if (bankaccount.getBankbranch().getId() != null)
{
addDropdownData("accNumList", bankAccountService.getBankAccounts(voucherHeader.getFundId().getId(), bankaccount.getBankbranch().getId(),
bankaccount.getBankbranch().getBank().getId(), "RECEIPTS_PAYMENTS,PAYMENTS"));
} else
addDropdownData("accNumList", Collections.EMPTY_LIST);
}
/*
* not used private void updateMiscBillDetail() { Miscbilldetail miscbillDetail = (Miscbilldetail)
* persistenceService.find(" from Miscbilldetail where payVoucherHeader=?", voucherHeader);
* miscbillDetail.setBillamount(remittanceBean.getTotalAmount());
* miscbillDetail.setPaidamount(remittanceBean.getTotalAmount());
* miscbillDetail.setPassedamount(remittanceBean.getTotalAmount()); miscbillDetail.setPayVoucherHeader(voucherHeader);
* //miscbillDetail.setBillVoucherHeader(vhid); miscbillDetail.setPaidto(recovery.getRemitted());
* //persistenceService.setType(Miscbilldetail.class); persistenceService.persist(miscbillDetail); }
*/
@Override
protected void loadDefalutDates() {
final Date currDate = new Date();
final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
voucherHeader.setVoucherDate(sdf.parse(sdf.format(currDate)));
} catch (final ParseException e) {
throw new ValidationException(Arrays.asList(new ValidationError("Exception while formatting voucher date",
"Transaction failed")));
}
}
public List<String> getValidActions() {
List<String> validActions = Collections.emptyList();
List<AppConfigValues> cutOffDateconfigValue = appConfigValuesService.getConfigValuesByModuleAndKey("EGF",
"DataEntryCutOffDate");
if (cutOffDateconfigValue != null && !cutOffDateconfigValue.isEmpty())
{
if (null == paymentheader || null == paymentheader.getId()
|| paymentheader.getCurrentState().getValue().endsWith("NEW")) {
validActions = Arrays.asList(FinancialConstants.BUTTONFORWARD, FinancialConstants.CREATEANDAPPROVE);
} else {
if (paymentheader.getCurrentState() != null) {
validActions = this.customizedWorkFlowService.getNextValidActions(paymentheader
.getStateType(), getWorkFlowDepartment(), getAmountRule(),
getAdditionalRule(), paymentheader.getCurrentState().getValue(),
getPendingActions(), paymentheader.getCreatedDate());
}
}
}
else
{
if (null == paymentheader || null == paymentheader.getId()
|| paymentheader.getCurrentState().getValue().endsWith("NEW")) {
validActions = Arrays.asList(FinancialConstants.BUTTONFORWARD);
} else {
if (paymentheader.getCurrentState() != null) {
validActions = this.customizedWorkFlowService.getNextValidActions(paymentheader
.getStateType(), getWorkFlowDepartment(), getAmountRule(),
getAdditionalRule(), paymentheader.getCurrentState().getValue(),
getPendingActions(), paymentheader.getCreatedDate());
}
}
}
return validActions;
}
public String getNextAction() {
WorkFlowMatrix wfMatrix = null;
if (paymentheader.getId() != null) {
if (paymentheader.getCurrentState() != null) {
wfMatrix = this.customizedWorkFlowService.getWfMatrix(paymentheader.getStateType(),
getWorkFlowDepartment(), getAmountRule(), getAdditionalRule(), paymentheader
.getCurrentState().getValue(), getPendingActions(), paymentheader
.getCreatedDate());
} else {
wfMatrix = this.customizedWorkFlowService.getWfMatrix(paymentheader.getStateType(),
getWorkFlowDepartment(), getAmountRule(), getAdditionalRule(),
State.DEFAULT_STATE_VALUE_CREATED, getPendingActions(), paymentheader
.getCreatedDate());
}
}
return wfMatrix == null ? "" : wfMatrix.getNextAction();
}
@Override
public CVoucherHeader getVoucherHeader() {
return voucherHeader;
}
@Override
public void setVoucherHeader(final CVoucherHeader voucherHeader) {
this.voucherHeader = voucherHeader;
}
public RemittanceBean getRemittanceBean() {
return remittanceBean;
}
public void setRemittanceBean(final RemittanceBean remittanceBean) {
this.remittanceBean = remittanceBean;
}
public void setRemitRecoveryService(final RemitRecoveryService remitRecoveryService) {
this.remitRecoveryService = remitRecoveryService;
}
public List<RemittanceBean> getListRemitBean() {
return listRemitBean;
}
public void setListRemitBean(final List<RemittanceBean> listRemitBean) {
this.listRemitBean = listRemitBean;
}
public Paymentheader getPaymentheader() {
return paymentheader;
}
public void setPaymentheader(final Paymentheader paymentheader) {
this.paymentheader = paymentheader;
}
public void setPaymentService(final PaymentService paymentService) {
this.paymentService = paymentService;
}
public void setPaymentWorkflowService(final SimpleWorkflowService<Paymentheader> paymentWorkflowService) {
this.paymentWorkflowService = paymentWorkflowService;
}
public void setVoucherService(final VoucherService voucherService) {
this.voucherService = voucherService;
}
public void setCommonBean(final CommonBean commonBean) {
this.commonBean = commonBean;
}
public CommonBean getCommonBean() {
return commonBean;
}
public void setFinancialYearDAO(final FinancialYearHibernateDAO financialYearDAO) {
this.financialYearDAO = financialYearDAO;
}
public Map<String, String> getModeOfCollectionMap() {
return modeOfCollectionMap;
}
public void setModeOfCollectionMap(final Map<String, String> modeOfCollectionMap) {
this.modeOfCollectionMap = modeOfCollectionMap;
}
public String getModeOfPayment() {
return modeOfPayment;
}
public void setModeOfPayment(final String modeOfPayment) {
this.modeOfPayment = modeOfPayment;
}
public void setVoucherHibDAO(final VoucherHibernateDAO voucherHibDAO) {
this.voucherHibDAO = voucherHibDAO;
}
public void setEgovCommon(final EgovCommon egovCommon) {
this.egovCommon = egovCommon;
}
public String getComments() {
return comments;
}
public void setComments(final String comments) {
this.comments = comments;
}
public String getWfitemstate() {
return wfitemstate;
}
public void setWfitemstate(final String wfitemstate) {
this.wfitemstate = wfitemstate;
}
public boolean isShowButtons() {
return showButtons;
}
public void setShowButtons(final boolean showButtons) {
this.showButtons = showButtons;
}
public boolean isShowCancel() {
return showCancel;
}
public void setShowCancel(final boolean showCancel) {
this.showCancel = showCancel;
}
public void setRemittedTo(final String remittedTo) {
this.remittedTo = remittedTo;
}
public String getRemittedTo() {
return remittedTo;
}
public List<InstrumentHeader> getInstrumentHeaderList() {
return instrumentHeaderList;
}
public void setInstrumentHeaderList(final List<InstrumentHeader> instrumentHeaderList) {
this.instrumentHeaderList = instrumentHeaderList;
}
public ScriptService getScriptService() {
return scriptService;
}
public void setScriptService(final ScriptService scriptService) {
this.scriptService = scriptService;
}
public ChartOfAccounts getChartOfAccounts() {
return chartOfAccounts;
}
public void setChartOfAccounts(ChartOfAccounts chartOfAccounts) {
this.chartOfAccounts = chartOfAccounts;
}
public WorkflowBean getWorkflowBean() {
return workflowBean;
}
public void setWorkflowBean(WorkflowBean workflowBean) {
this.workflowBean = workflowBean;
}
public String getCurrentState() {
return paymentheader.getState().getValue();
}
public String getCutOffDate() {
return cutOffDate;
}
public void setCutOffDate(String cutOffDate) {
this.cutOffDate = cutOffDate;
}
public String getSelectedRows() {
return selectedRows;
}
public Long getFunctionId() {
return functionId;
}
public Integer getDepartmentId() {
return departmentId;
}
public void setSelectedRows(String selectedRows) {
this.selectedRows = selectedRows;
}
public void setFunctionId(Long functionId) {
this.functionId = functionId;
}
public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
}
}