/*
* 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.services.contra;
import com.exilant.GLEngine.Transaxtion;
import org.apache.log4j.Logger;
import org.egov.commons.Bankaccount;
import org.egov.commons.Bankreconciliation;
import org.egov.commons.CChartOfAccounts;
import org.egov.commons.CVoucherHeader;
import org.egov.commons.EgwStatus;
import org.egov.commons.dao.BankaccountDAO;
import org.egov.commons.dao.ChartOfAccountsDAO;
import org.egov.egf.commons.EgovCommon;
import org.egov.eis.entity.Assignment;
import org.egov.eis.entity.Employee;
import org.egov.eis.service.EisCommonService;
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.entity.User;
import org.egov.infra.admin.master.service.AppConfigValueService;
import org.egov.infra.exception.ApplicationRuntimeException;
import org.egov.infra.config.core.ApplicationThreadLocals;
import org.egov.infstr.services.PersistenceService;
import org.egov.model.contra.ContraBean;
import org.egov.model.contra.ContraJournalVoucher;
import org.egov.model.instrument.InstrumentHeader;
import org.egov.model.instrument.InstrumentOtherDetails;
import org.egov.model.instrument.InstrumentVoucher;
import org.egov.model.voucher.PayInBean;
import org.egov.pims.commons.Position;
import org.egov.pims.service.EmployeeServiceOld;
import org.egov.services.instrument.BankReconciliationService;
import org.egov.services.instrument.InstrumentService;
import org.egov.services.voucher.ContraJournalVoucherService;
import org.egov.utils.Constants;
import org.egov.utils.FinancialConstants;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
*
* @author msahoo
*
*/
public class ContraService extends PersistenceService<ContraJournalVoucher, Long>
{
private static final Logger LOGGER = Logger.getLogger(ContraService.class);
@Autowired
@Qualifier("persistenceService")
private PersistenceService persistenceService;
@Autowired
@Qualifier("contraJournalVoucherService")
private ContraJournalVoucherService contraJournalVoucherService;
@Autowired
@Qualifier("bankReconciliationService")
private BankReconciliationService bankReconciliationService;
@Autowired
private ChartOfAccountsDAO coaDAO;
@Autowired
private BankaccountDAO bankAccountDAO;
private InstrumentService instrumentService;
private static SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
@Autowired
protected EisCommonService eisCommonService;
@Autowired
private AppConfigValueService appConfigValuesService;
private EmployeeServiceOld employeeServiceOld;
private int preapprovalStatus = 0;
private @Autowired EgovCommon egovCommon;
public ContraService() {
super(ContraJournalVoucher.class);
}
public ContraService(Class<ContraJournalVoucher> type) {
super(type);
}
public Position getPositionForWfItem(final ContraJournalVoucher rv)
{
return eisCommonService.getPositionByUserId(rv.getCreatedBy().getId());
}
public Department getDepartmentForUser(final User user)
{
return egovCommon.getDepartmentForUser(user, eisCommonService, employeeServiceOld, persistenceService);
}
public ContraJournalVoucher updateIntoContraJournal(final CVoucherHeader voucherHeader, final ContraBean contraBean) {
ContraJournalVoucher existingCJV;
try {
existingCJV = contraJournalVoucherService.find("from ContraJournalVoucher where voucherHeaderId=?", voucherHeader);
existingCJV.setToBankAccountId(bankAccountDAO.getBankaccountById(Integer.valueOf(contraBean.getAccountNumberId())));
contraJournalVoucherService.update(existingCJV);
} catch (final HibernateException e) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Exception occuerd while postiong into contractorJournal");
throw new HibernateException(e);
} catch (final Exception e) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Exception occuerd while postiong into contractorJournal");
throw new HibernateException(e);
}
return existingCJV;
}
public Bankreconciliation updateBankreconciliation(final InstrumentHeader instrHeader, final ContraBean contraBean) {
Bankreconciliation existingBR;
try {
final Long iHeaderId = instrHeader.getId();
if (LOGGER.isDebugEnabled())
LOGGER.debug("instrHeader.getId() = " + iHeaderId);
existingBR = bankReconciliationService.find("from Bankreconciliation where instrumentHeaderId=?", iHeaderId);
existingBR.setAmount(contraBean.getAmount());
existingBR.setBankaccount(bankAccountDAO.getBankaccountById(Integer.valueOf(contraBean.getAccountNumberId())));
bankReconciliationService.update(existingBR);
} catch (final HibernateException e) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Exception occuerd while updateBankreconciliation" + e);
throw new HibernateException(e);
} catch (final Exception e) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Exception occuerd while updateBankreconciliation" + e);
throw new HibernateException(e);
}
return existingBR;
}
public List<Transaxtion> postInTransaction(final CVoucherHeader voucherHeader, final ContraBean contraBean) {
final List<Transaxtion> transaxtionList = new ArrayList<Transaxtion>();
// VoucherDetail vDetailBank = new VoucherDetail();
final Transaxtion transactionBank = new Transaxtion();
final CChartOfAccounts bankAccountCode = bankAccountDAO.getBankaccountById(
Integer.valueOf(contraBean.getAccountNumberId()))
.getChartofaccounts();
/*
* vDetailBank.setLineId(1); vDetailBank.setVoucherHeaderId(voucherHeader);
* vDetailBank.setGlCode(bankAccountCode.getGlcode()); vDetailBank.setAccountName(bankAccountCode.getName());
* vDetailBank.setDebitAmount(contraBean.getAmount()); vDetailBank.setCreditAmount(BigDecimal.ZERO);
* vDetailBank.setNarration(voucherHeader.getDescription());
*/
transactionBank.setVoucherLineId("1");
transactionBank.setGlCode(bankAccountCode.getGlcode());
transactionBank.setGlName(bankAccountCode.getName());
transactionBank.setVoucherHeaderId(voucherHeader.getId().toString());
transactionBank.setDrAmount(contraBean.getAmount().toString());
transactionBank.setCrAmount("0");
// VoucherDetail vDetailCash = new VoucherDetail();
final Transaxtion transactionCash = new Transaxtion();
final CChartOfAccounts cashAccountCode = coaDAO.getCChartOfAccountsByGlCode(contraBean.getCashInHand());
/*
* vDetailCash.setLineId(2); vDetailCash.setVoucherHeaderId(voucherHeader);
* vDetailCash.setGlCode(cashAccountCode.getGlcode()); vDetailCash.setAccountName(cashAccountCode.getName());
* vDetailCash.setDebitAmount(BigDecimal.ZERO); vDetailCash.setCreditAmount(contraBean.getAmount());
* vDetailCash.setNarration(voucherHeader.getDescription());
*/
transactionCash.setVoucherLineId("2");
transactionCash.setGlCode(cashAccountCode.getGlcode());
transactionCash.setGlName(cashAccountCode.getName());
transactionCash.setVoucherHeaderId(voucherHeader.getId().toString());
transactionCash.setDrAmount("0");
transactionCash.setCrAmount(contraBean.getAmount().toString());
/*
* try { vdPersitSer.persist(vDetailBank); vdPersitSer.persist(vDetailCash); } catch (HibernateException e) {
* if(LOGGER.isDebugEnabled()) LOGGER.debug("Exception Occured in Contra Service while preparing transaction"+e); throw
* new HibernateException(e); }
*/
transaxtionList.add(transactionBank);
transaxtionList.add(transactionCash);
return transaxtionList;
}
public Map<String, Object> getCTBVoucher(final String voucherId, final ContraBean contraBean) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("ContraService | getCTBVoucher | Start");
final Map<String, Object> voucherMap = new HashMap<String, Object>();
final CVoucherHeader voucherHeader = (CVoucherHeader) persistenceService.find("from CVoucherHeader where id=?",
Long.valueOf(voucherId));
voucherMap.put(Constants.VOUCHERHEADER, voucherHeader);
final InstrumentVoucher iVoucher = (InstrumentVoucher) persistenceService.find(
"from InstrumentVoucher where voucherHeaderId=?", voucherHeader);
final Bankaccount bankAccount = iVoucher.getInstrumentHeaderId().getBankAccountId();
contraBean.setAccountNumberId(bankAccount.getId().toString());
contraBean.setAccnumnar(bankAccount.getNarration());
contraBean.setBankBranchId(bankAccount.getBankbranch().getBank().getId() + "-" +
bankAccount.getBankbranch().getId().toString());
if (LOGGER.isDebugEnabled())
LOGGER.debug("Cash amount = " + iVoucher.getInstrumentHeaderId().getInstrumentAmount());
contraBean.setAmount(iVoucher.getInstrumentHeaderId().getInstrumentAmount());
contraBean.setChequeNumber(iVoucher.getInstrumentHeaderId().getTransactionNumber());
if (iVoucher.getInstrumentHeaderId().getTransactionDate() != null)
contraBean.setChequeDate(Constants.DDMMYYYYFORMAT2.format(iVoucher.getInstrumentHeaderId().getTransactionDate()));
voucherMap.put("contrabean", contraBean);
return voucherMap;
}
public Map<String, Object> getpayInSlipVoucher(final Long voucherId, final ContraBean contraBean, List<PayInBean> iHeaderList) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("ContraService | getpayInSlipVoucher | Start");
final SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
final Map<String, Object> voucherMap = new HashMap<String, Object>();
iHeaderList = new ArrayList<PayInBean>();
final CVoucherHeader voucherHeader = (CVoucherHeader) persistenceService
.find("from CVoucherHeader where id=?", voucherId);
voucherMap.put(Constants.VOUCHERHEADER, voucherHeader);
final List<InstrumentOtherDetails> iOther = persistenceService.findAllBy(
"from InstrumentOtherDetails where payinslipId=?", voucherHeader);
final Bankaccount bankAccount = iOther.get(0).getInstrumentHeaderId().getBankAccountId();
contraBean.setAccountNumberId(bankAccount.getId().toString());
contraBean.setAccnumnar(bankAccount.getNarration());
contraBean.setBankBranchId(bankAccount.getBankbranch().getBank().getId() + "-" +
bankAccount.getBankbranch().getId().toString());
voucherMap.put("contraBean", contraBean);
PayInBean payInBean;
BigDecimal totalInstrAmt = BigDecimal.ZERO;
for (final InstrumentOtherDetails instrumentOtherDetails : iOther) {
final InstrumentHeader iHeader = instrumentOtherDetails.getInstrumentHeaderId();
int index = 0;
payInBean = new PayInBean();
payInBean.setInstId(Long.valueOf(iHeader.getId().toString()));
payInBean.setInstrumentNumber(iHeader.getInstrumentNumber());
try {
payInBean.setInstrumentDate(formatter.format(formatter1.parse(iHeader.getInstrumentDate().toString())));
final InstrumentVoucher iVoucher = (InstrumentVoucher) persistenceService.find(
"from InstrumentVoucher where instrumentHeaderId=?", iHeader);
payInBean.setVoucherDate(formatter.format(formatter1.parse(iVoucher.getVoucherHeaderId().getVoucherDate()
.toString())));
} catch (final ParseException e) {
LOGGER.error("Exception Occured while Parsing instrument date" + e.getMessage());
}
payInBean.setInstrumentAmount(iHeader.getInstrumentAmount().toString());
payInBean.setVoucherNumber(instrumentOtherDetails.getPayinslipId().getVoucherNumber());
payInBean.setSelectChq(true);
payInBean.setSerialNo(++index);
iHeaderList.add(payInBean);
totalInstrAmt = totalInstrAmt.add(iHeader.getInstrumentAmount());
}
voucherMap.put("iHeaderList", iHeaderList);
voucherMap.put("totalInstrAmt", totalInstrAmt.toString());
if (LOGGER.isDebugEnabled())
LOGGER.debug("ContraService | getpayInSlipVoucher | End");
return voucherMap;
}
/**
* This method will be called for remit to bank in case of cheque/dd/card/atm/online deposit where a Contra Voucher is
* generated
* @param payInId
* @param toBankaccountGlcode
* @param instrumentHeader
*/
public void updateCheque_DD_Card_Deposit(final Long payInId, final String toBankaccountGlcode,
final InstrumentHeader instrumentHeader,
final Map valuesMap)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit | Start");
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit for" + instrumentHeader + "and payin id" + payInId);
final CVoucherHeader payIn = (CVoucherHeader) persistenceService.find("from CVoucherHeader where id=?", payInId);
updateInstrumentAndPayin(
payIn,
(Bankaccount) valuesMap.get("depositedBankAccount"),
instrumentHeader,
(EgwStatus) persistenceService.find("from EgwStatus where id = ?",
Integer.valueOf(valuesMap.get("instrumentDepositedStatus").toString())));
final ContraJournalVoucher cjv = addToContra(payIn, (Bankaccount) valuesMap.get("depositedBankAccount"), instrumentHeader);
addToBankRecon(payIn, instrumentHeader, (EgwStatus) persistenceService.find("from EgwStatus where id = ?",
Integer.valueOf(valuesMap.get("instrumentReconciledStatus").toString())));
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit | End");
}
/**
* Call this api before calling followin apis and send the map returned by this api into updateCheque_DD_Card_Deposit
* updateCheque_DD_Card_Deposit_Receipt updateCashDeposit and
* @param toBankaccountGlcode
* @return
*/
public Map prepareForUpdateInstrumentDeposit(final String toBankaccountGlcode)
{
final Map<String, Object> valuesMap = new HashMap<String, Object>();
final List<AppConfigValues> configValuesByModuleAndKey = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG,
"PREAPPROVEDVOUCHERSTATUS");
preapprovalStatus = Integer.valueOf(configValuesByModuleAndKey.get(0).getValue());
final EgwStatus instrumentDepositedStatus = (EgwStatus) persistenceService.find(
"from EgwStatus where upper(moduletype)=upper('Instrument') and upper(description)=upper(?)",
FinancialConstants.INSTRUMENT_DEPOSITED_STATUS);
final EgwStatus instrumentReconciledStatus = (EgwStatus) persistenceService.find(
"from EgwStatus where upper(moduletype)=upper('Instrument') and upper(description)=upper(?)",
FinancialConstants.INSTRUMENT_RECONCILED_STATUS);
final Bankaccount depositedBankAccount = (Bankaccount) persistenceService.find(
"from Bankaccount where chartofaccounts.glcode=?", toBankaccountGlcode);
valuesMap.put("preapprovalStatus", preapprovalStatus);
valuesMap.put("instrumentDepositedStatus", instrumentDepositedStatus);
valuesMap.put("instrumentReconciledStatus", instrumentReconciledStatus);
valuesMap.put("depositedBankAccount", depositedBankAccount);
return valuesMap;
}
/**
* This method will be called for remit to bank in case of cheque/dd/card/atm/online deposit where a Receipt Voucher is
* generated
* @param payInId
* @param toBankaccountGlcode
* @param instrumentHeader
*/
@Transactional
public void updateCheque_DD_Card_Deposit_Receipt(final Long receiptId, final String toBankaccountGlcode,
final InstrumentHeader instrumentHeader, final Map valuesMap)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit_Receipt | Start");
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit_Receipt for" + instrumentHeader + "and receiptId" + receiptId);
final CVoucherHeader payIn = (CVoucherHeader) persistenceService.find("from CVoucherHeader where id=?", receiptId);
// Bankaccount depositedBankAccount=(Bankaccount)
// persistenceService.find("from Bankaccount where chartofaccounts.glcode=?",toBankaccountGlcode);
updateInstrumentAndPayin(payIn, (Bankaccount) valuesMap.get("depositedBankAccount"), instrumentHeader,
(EgwStatus) valuesMap.get("instrumentDepositedStatus"));
addToBankRecon(payIn, instrumentHeader, (EgwStatus) valuesMap.get("instrumentReconciledStatus"));
if (LOGGER.isDebugEnabled())
LOGGER.debug(" updateCheque_DD_Card_Deposit_Receipt | End");
}
/**
* used by modules which are integrating
* @return
*/
@Transactional
public void updateCashDeposit(final Long payInId, final String toBankaccountGlcode, final InstrumentHeader instrumentHeader,
final Map valuesMap)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("Contra Service | updateCashDeposit | Start");
final List<AppConfigValues> appConfigList = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG,"PREAPPROVEDVOUCHERSTATUS");
if (null != appConfigList && !appConfigList.isEmpty())
for (final AppConfigValues appConfigVal : appConfigList)
preapprovalStatus = Integer.valueOf(appConfigVal.getValue());
else
throw new ApplicationRuntimeException("Appconfig value for PREAPPROVEDVOUCHERSTATUS is not defined in the system");
final CVoucherHeader payIn = (CVoucherHeader) persistenceService.find("from CVoucherHeader where id=?", payInId);
// Bankaccount depositedBankAccount=(Bankaccount)
// persistenceService.find("from Bankaccount where chartofaccounts.glcode=?",toBankaccountGlcode);
updateInstrumentAndPayin(
payIn,
(Bankaccount) valuesMap.get("depositedBankAccount"),
instrumentHeader,
(EgwStatus) persistenceService.find("from EgwStatus where id = ?",
Integer.valueOf(valuesMap.get("instrumentReconciledStatus").toString())));
final ContraJournalVoucher cjv = addToContra(payIn, (Bankaccount) valuesMap.get("depositedBankAccount"), instrumentHeader);
addToBankRecon(
payIn,
instrumentHeader,
(EgwStatus) persistenceService.find("from EgwStatus where id = ?",
Integer.valueOf(valuesMap.get("instrumentReconciledStatus").toString())));
if (LOGGER.isDebugEnabled())
LOGGER.debug("Contra Service | updateCashDeposit | End");
}
public void createVoucherfromPreApprovedVoucher(final ContraJournalVoucher cjv) {
final List<AppConfigValues> appList = appConfigValuesService
.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG, "APPROVEDVOUCHERSTATUS");
final String approvedVoucherStatus = appList.get(0).getValue();
cjv.getVoucherHeaderId().setStatus(Integer.valueOf(approvedVoucherStatus));
}
public void cancelVoucher(final ContraJournalVoucher cjv) {
final List<AppConfigValues> appList = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG, "cancelledstatus");
final String approvedVoucherStatus = appList.get(0).getValue();
cjv.getVoucherHeaderId().setStatus(Integer.valueOf(approvedVoucherStatus));
}
public String getDesginationName()
{
// TODO: Now employee is extending user so passing userid to get assingment -- changes done by Vaibhav
final Assignment assignment = eisCommonService.getLatestAssignmentForEmployeeByToDate(ApplicationThreadLocals.getUserId(),
new Date());
return assignment.getDesignation().getName();
}
public Department getDepartmentForWfItem(final ContraJournalVoucher cjv)
{
// TODO: Now employee is extending user so passing userid to get assingment -- changes done by Vaibhav
final Assignment assignment = eisCommonService.getLatestAssignmentForEmployeeByToDate(cjv.getCreatedBy().getId(),
new Date());
return assignment.getDepartment();
}
public Boundary getBoundaryForUser(final ContraJournalVoucher rv)
{
return egovCommon.getBoundaryForUser(rv.getCreatedBy());
}
public Position getPositionForEmployee(final Employee emp) throws ApplicationRuntimeException
{
return eisCommonService.getPrimaryAssignmentPositionForEmp(emp.getId());
}
@Transactional
public void addToBankRecon(final CVoucherHeader payIn, final InstrumentHeader instrumentHeader,
final EgwStatus instrumentReconciledStatus) {
instrumentService.addToBankReconcilationWithLoop(payIn, instrumentHeader, instrumentReconciledStatus);
}
@Transactional
public ContraJournalVoucher addToContra(final CVoucherHeader payIn, final Bankaccount depositedBank,
final InstrumentHeader instrumentHeader) {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Adding to contra");
final ContraJournalVoucher cjv = new ContraJournalVoucher();
cjv.setToBankAccountId(depositedBank);
cjv.setInstrumentHeaderId(instrumentHeader);
cjv.setVoucherHeaderId(payIn);
contraJournalVoucherService.applyAuditing(cjv);
contraJournalVoucherService.persist(cjv);
if (LOGGER.isDebugEnabled())
LOGGER.debug("Adding to contra completed");
return cjv;
}
@Transactional
private void updateInstrumentAndPayin(final CVoucherHeader payIn, final Bankaccount account,
final InstrumentHeader instrumentHeader,
final EgwStatus status)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("updateInstrumentAndPayin | Start");
final Map<String, Object> iMap = new HashMap<String, Object>();
final List<Map<String, Object>> iList = new ArrayList<Map<String, Object>>();
// List<InstrumentHeader> iHeaderList = createInstruements();
iMap.put("Instrument header", instrumentHeader);
iMap.put("Payin slip id", payIn);
iMap.put("Instrument status date", payIn.getVoucherDate());
iMap.put("Status id", status);
iMap.put("Bank account id", account);
iList.add(iMap);
instrumentService.updateInstrumentOtherDetails(iList);
if (LOGGER.isDebugEnabled())
LOGGER.debug("updateInstrumentAndPayin | End");
}
public Map prepareForUpdateInstrumentDepositSQL()
{
final Map<String, Object> valuesMap = new HashMap<String, Object>();
final List<AppConfigValues> configValuesByModuleAndKey = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG,
"PREAPPROVEDVOUCHERSTATUS");
preapprovalStatus = Integer.valueOf(configValuesByModuleAndKey.get(0).getValue());
final Integer instrumentDepositedStatusId = (Integer) persistenceService.find(
"select id from EgwStatus where upper(moduletype)=upper('Instrument') and upper(description)=upper(?)",
FinancialConstants.INSTRUMENT_DEPOSITED_STATUS);
final Integer instrumentReconciledStatusId = (Integer) persistenceService.find(
"select id from EgwStatus where upper(moduletype)=upper('Instrument') and upper(description)=upper(?)",
FinancialConstants.INSTRUMENT_RECONCILED_STATUS);
valuesMap.put("preapprovalStatus", preapprovalStatus);
valuesMap.put("instrumentDepositedStatus", instrumentDepositedStatusId.longValue());
valuesMap.put("instrumentReconciledStatus", instrumentReconciledStatusId.longValue());
return valuesMap;
}
/**
* This method will be called for remit to bank in case of cheque/dd/card/atm/online deposit where a Receipt Voucher is
* generated This api will be used for only when it is called in loop
*
* @param isntrumentDetailsMap Map should contain with following No. key value 1. "instrumentheader" InstrumentHeader -
* org.egov.model.instrument.InstrumentHeader 2. "bankaccountid" Integer - id of the BankAccount 3. "instrumentamount"
* BigDecimal - instrumentamount 4. "instrumenttype" String - type of instrument (eg. Cheque,DD....) 5. "depositdate" Date -
* Date of remittance 6. "createdby" Integer - userid who is depositing 7. "ispaycheque" boolean - saying whether it is
* paymentcheque or receipt cheque 8. "payinid" Long - Voucher header id Map will also contain data returned by
* prepareForUpdateInstrumentDepositSQL which should be called only once
*/
public void updateCheque_DD_Card_Deposit_Receipt(final Map instrumentDetailsMap)
{
// if(LOGGER.isDebugEnabled()) LOGGER.debug("Starting updateCheque_DD_Card_Deposit_ReceiptSql ");
updateInstrumentAndPayinSql(instrumentDetailsMap);
addToBankReconcilationSQL(instrumentDetailsMap);
}
/**
*
* @param isntrumentDetailsMap
* @see public void updateCheque_DD_Card_Deposit_Receipt(Map isntrumentDetailsMap) fordetails
*/
public void updateCheque_DD_Card_Deposit(final Map instrumentDetailsMap)
{
// if(LOGGER.isDebugEnabled()) LOGGER.debug(" updateCheque_DD_Card_Deposit | start");
updateInstrumentAndPayinSql(instrumentDetailsMap);
addToBankReconcilationSQL(instrumentDetailsMap);
addToContraSql(instrumentDetailsMap);
// if(LOGGER.isDebugEnabled()) LOGGER.debug(" updateCheque_DD_Card_Deposit | End"+instrumentCount);
}
public void updateCheque_DD_Card_Deposit(final Map instrumentDetailsMap, CVoucherHeader cVoucherHeader, InstrumentHeader instrumentHeader, Bankaccount bankaccount)
{
updateInstrumentAndPayinSql(instrumentDetailsMap);
addToBankReconcilationSQL(instrumentDetailsMap);
addToContraJournal(cVoucherHeader,instrumentHeader,bankaccount);
}
/**
* @see public void updateCheque_DD_Card_Deposit_Receipt(Map isntrumentDetailsMap) fordetails
* @param isntrumentDetailsMap
*/
public void updateCashDeposit(final Map instrumentDetailsMap)
{
updateInstrumentAndPayinSql(instrumentDetailsMap);
addToBankReconcilationSQL(instrumentDetailsMap);
addToContraSql(instrumentDetailsMap);
}
@Transactional
public void updateCashDeposit(final Map instrumentDetailsMap, CVoucherHeader cVoucherHeader, InstrumentHeader instrumentHeader, Bankaccount bankaccount)
{
updateInstrumentAndPayinSql(instrumentDetailsMap);
addToBankReconcilationSQL(instrumentDetailsMap);
addToContraJournal(cVoucherHeader,instrumentHeader,bankaccount);
}
private void updateInstrumentAndPayinSql(final Map instrumentDetailsMap) {
final String ioSql = "update EGF_INSTRUMENTOTHERDETAILS set PAYINSLIPID=:payinId,INSTRUMENTSTATUSDATE=:ihStatusDate," +
" LASTMODIFIEDBY=:modifiedBy, LASTMODIFIEDDATE =:modifiedDate where INSTRUMENTHEADERID=:ihId";
final SQLQuery ioSQLQuery = getSession().createSQLQuery(ioSql);
ioSQLQuery.setLong("payinId", (Long) instrumentDetailsMap.get("payinid"))
.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"))
.setDate("ihStatusDate", (Date) instrumentDetailsMap.get("depositdate"))
.setDate("modifiedDate", new Date())
.setLong("modifiedBy", (Long) instrumentDetailsMap.get("createdby"));
ioSQLQuery.executeUpdate();
final String ihSql = "update EGF_instrumentheader set ID_STATUS=:statusId,BANKACCOUNTID=:bankAccId,LASTMODIFIEDBY=:modifiedBy,"
+ " LASTMODIFIEDDATE =:modifiedDate where id=:ihId";
final SQLQuery ihSQLQuery = getSession().createSQLQuery(ihSql);
ihSQLQuery.setLong("statusId", (Long) instrumentDetailsMap.get("instrumentDepositedStatus"))
.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"))
.setLong("bankAccId", (Long) instrumentDetailsMap.get("bankaccountid"))
.setDate("modifiedDate", new Date())
.setLong("modifiedBy", (Long) instrumentDetailsMap.get("createdby"));
ihSQLQuery.executeUpdate();
}
/**
*
* @param instrumentDetailsMap
* @throws ApplicationRuntimeException
*
* Will update bank reconcilation and set isreconciled to true for the type 1. cash 2.ECS 3. bank challan 4. bank
*/
public void addToBankReconcilationSQL(final Map instrumentDetailsMap)
throws ApplicationRuntimeException {
final String brsSql = "Insert into bankreconciliation (ID,BANKACCOUNTID,AMOUNT,TRANSACTIONTYPE,INSTRUMENTHEADERID) values "
+
" (nextVal('seq_bankreconciliation'),:bankAccId,:amount,:trType,:ihId)";
final SQLQuery brsSQLQuery = getSession().createSQLQuery(brsSql);
brsSQLQuery.setLong("bankAccId", (Long) instrumentDetailsMap.get("bankaccountid"))
.setBigDecimal("amount", (BigDecimal) instrumentDetailsMap.get("instrumentamount"))
.setString("trType", "1".equalsIgnoreCase((String) instrumentDetailsMap.get("ispaycheque")) ? "Cr" : "Dr")
.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"));
brsSQLQuery.executeUpdate();
if (FinancialConstants.INSTRUMENT_TYPE_CASH.equalsIgnoreCase((String) instrumentDetailsMap.get("instrumenttype"))
||
FinancialConstants.INSTRUMENT_TYPE_BANK.equalsIgnoreCase((String) instrumentDetailsMap.get("instrumenttype"))
||
FinancialConstants.INSTRUMENT_TYPE_BANK_TO_BANK.equalsIgnoreCase((String) instrumentDetailsMap
.get("instrumenttype")) ||
FinancialConstants.INSTRUMENT_TYPE_ECS.equalsIgnoreCase((String) instrumentDetailsMap.get("instrumenttype")))
{
final String ioSql = "update EGF_instrumentOtherdetails set reconciledamount=:reconciledAmt,INSTRUMENTSTATUSDATE=:ihStatusDate,LASTMODIFIEDBY=:modifiedBy,"
+
" LASTMODIFIEDDATE =:modifiedDate where INSTRUMENTHEADERID=:ihId";
final SQLQuery ioSQLQuery = getSession().createSQLQuery(ioSql);
ioSQLQuery.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"))
.setBigDecimal("reconciledAmt", (BigDecimal) instrumentDetailsMap.get("instrumentamount"))
.setDate("ihStatusDate", (Date) instrumentDetailsMap.get("depositdate"))
.setDate("modifiedDate", new Date())
.setLong("modifiedBy", (Long) instrumentDetailsMap.get("createdby"));
ioSQLQuery.executeUpdate();
final String ihSql = "update EGF_instrumentheader set ID_STATUS=:statusId,LASTMODIFIEDBY=:modifiedBy," +
" LASTMODIFIEDDATE =:modifiedDate where id=:ihId";
final SQLQuery ihSQLQuery = getSession().createSQLQuery(ihSql);
ihSQLQuery.setLong("statusId", (Long) instrumentDetailsMap.get("instrumentReconciledStatus"))
.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"))
.setDate("modifiedDate", new Date())
.setLong("modifiedBy", (Long) instrumentDetailsMap.get("createdby"));
ihSQLQuery.executeUpdate();
}
}
private void addToContraSql(final Map instrumentDetailsMap) {
final String ioSql = "Insert into contrajournalvoucher (ID,VOUCHERHEADERID,FROMBANKACCOUNTID,TOBANKACCOUNTID,INSTRUMENTHEADERID"
+
" ,STATE_ID,CREATEDBY,LASTMODIFIEDBY) values " +
" (nextVal('seq_contrajournalvoucher'),:vhId,null,:depositedBankId,:ihId,null,:createdBy,:createdBy)";
final SQLQuery ioSQLQuery = getSession().createSQLQuery(ioSql);
ioSQLQuery.setLong("vhId", (Long) instrumentDetailsMap.get("payinid"))
.setLong("ihId", (Long) instrumentDetailsMap.get("instrumentheader"))
.setLong("depositedBankId", (Long) instrumentDetailsMap.get("bankaccountid"))
.setLong("createdBy", (Long) instrumentDetailsMap.get("createdby"));
ioSQLQuery.executeUpdate();
}
@Transactional
public void addToContraJournal(CVoucherHeader cVoucherHeader, InstrumentHeader instrumentHeader, Bankaccount bankaccount) {
ContraJournalVoucher contraJournalVoucher = new ContraJournalVoucher();
contraJournalVoucher.setVoucherHeaderId(cVoucherHeader);
contraJournalVoucher.setInstrumentHeaderId(instrumentHeader);
contraJournalVoucher.setToBankAccountId(bankaccount);
persistenceService.persist(contraJournalVoucher);
}
@SuppressWarnings("unchecked")
public void editInstruments(final Long voucherId) {
final List<InstrumentOtherDetails> iOtherdetails = persistenceService.findAllBy(
"from InstrumentOtherDetails io where payinslipId.id=?", voucherId);
for (final InstrumentOtherDetails instrumentOtherDetails : iOtherdetails) {
instrumentService.editInstruments(instrumentOtherDetails);
if (LOGGER.isDebugEnabled())
LOGGER.debug("Modifying " + instrumentOtherDetails);
}
}
public PersistenceService getPersistenceService() {
return persistenceService;
}
public void setPersistenceService(final PersistenceService persistenceService) {
this.persistenceService = persistenceService;
}
/*
* public PersistenceService<VoucherDetail, Long> getVdPersitSer() { return vdPersitSer; } public void
* setVdPersitSer(PersistenceService<VoucherDetail, Long> vdPersitSer) { this.vdPersitSer = vdPersitSer; }
*/
public InstrumentService getInstrumentService() {
return instrumentService;
}
public void setInstrumentService(final InstrumentService instrumentService) {
this.instrumentService = instrumentService;
}
public void setEmployeeServiceOld(final EmployeeServiceOld employeeServiceOld) {
this.employeeServiceOld = employeeServiceOld;
}
}