/*
* 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.collection.integration.services;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.egov.collection.constants.CollectionConstants;
import org.egov.collection.entity.OnlinePayment;
import org.egov.collection.entity.ReceiptDetail;
import org.egov.collection.entity.ReceiptHeader;
import org.egov.collection.entity.ReceiptVoucher;
import org.egov.collection.integration.models.BillInfo;
import org.egov.collection.integration.models.BillInfoImpl;
import org.egov.collection.integration.models.BillReceiptInfo;
import org.egov.collection.integration.models.BillReceiptInfoImpl;
import org.egov.collection.integration.models.PaymentInfo;
import org.egov.collection.integration.models.PaymentInfoBank;
import org.egov.collection.integration.models.PaymentInfoCash;
import org.egov.collection.integration.models.PaymentInfoChequeDD;
import org.egov.collection.integration.models.PaymentInfoSearchRequest;
import org.egov.collection.integration.models.RestAggregatePaymentInfo;
import org.egov.collection.integration.models.RestReceiptInfo;
import org.egov.collection.integration.pgi.PaymentRequest;
import org.egov.collection.service.ReceiptHeaderService;
import org.egov.collection.utils.CollectionCommon;
import org.egov.collection.utils.CollectionsUtil;
import org.egov.commons.CVoucherHeader;
import org.egov.commons.Fund;
import org.egov.commons.dao.ChartOfAccountsHibernateDAO;
import org.egov.commons.dao.EgwStatusHibernateDAO;
import org.egov.commons.dao.FundHibernateDAO;
import org.egov.commons.entity.Source;
import org.egov.infra.admin.master.entity.Department;
import org.egov.infra.admin.master.entity.User;
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.infstr.models.ServiceDetails;
import org.egov.infstr.services.PersistenceService;
import org.egov.model.instrument.InstrumentHeader;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
* Collections integration service implementation - exposes APIs that can be
* used by other applications (typically billing systems) to interact with the
* collections module.
*/
@Transactional(readOnly = true)
public class CollectionIntegrationServiceImpl extends PersistenceService<ReceiptHeader, Long>
implements CollectionIntegrationService {
private static final Logger LOGGER = Logger.getLogger(CollectionIntegrationServiceImpl.class);
@Autowired
private FundHibernateDAO fundHibernateDAO;
private PersistenceService persistenceService;
private CollectionsUtil collectionsUtil;
private ReceiptHeaderService receiptHeaderService;
@Autowired
private EgwStatusHibernateDAO statusDAO;
private final List<ValidationError> errors = new ArrayList<ValidationError>(0);
private CollectionCommon collectionCommon;
@Autowired
private ChartOfAccountsHibernateDAO chartOfAccountsHibernateDAO;
@Autowired
private FundHibernateDAO fundDAO;
public CollectionIntegrationServiceImpl() {
super(ReceiptHeader.class);
}
public void setReceiptHeaderService(final ReceiptHeaderService receiptHeaderService) {
this.receiptHeaderService = receiptHeaderService;
}
public void setCollectionsUtil(final CollectionsUtil collectionsUtil) {
this.collectionsUtil = collectionsUtil;
}
/*
* (non-Javadoc)
* @seeorg.egov.infstr.collections.integration.ICollectionInterface#
* getBillReceiptInfo(java.lang.String, java.lang.String)
*/
@Override
public List<BillReceiptInfo> getBillReceiptInfo(final String serviceCode, final String refNum) {
final ArrayList<BillReceiptInfo> receipts = new ArrayList<BillReceiptInfo>(0);
// Get all receipt headers for given reference number
final List<ReceiptHeader> receiptHeaders = findAllByNamedQuery(
CollectionConstants.QUERY_RECEIPTS_BY_REFNUM_AND_SERVICECODE, refNum, serviceCode);
if (receiptHeaders == null || receiptHeaders.isEmpty())
return null;
for (final ReceiptHeader receiptHeader : receiptHeaders)
receipts.add(new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO, persistenceService, null));
return receipts;
}
/*
* (non-Javadoc)
* @seeorg.egov.infstr.collections.integration.ICollectionInterface#
* getBillReceiptInfo(java.lang.String, java.util.Set)
*/
@Override
public Map<String, List<BillReceiptInfo>> getBillReceiptInfo(final String serviceCode, final Set<String> refNums) {
final HashMap<String, List<BillReceiptInfo>> receipts = new HashMap<String, List<BillReceiptInfo>>(0);
for (final String refNum : refNums)
receipts.put(refNum, getBillReceiptInfo(serviceCode, refNum));
return receipts;
}
/*
* (non-Javadoc)
* @seeorg.egov.infstr.collections.integration.ICollectionInterface#
* getInstrumentReceiptInfo(java.lang.String, java.lang.String)
*/
@Override
public List<BillReceiptInfo> getInstrumentReceiptInfo(final String serviceCode, final String instrumentNum) {
final ArrayList<BillReceiptInfo> receipts = new ArrayList<BillReceiptInfo>(0);
final List<ReceiptHeader> receiptHeaders = findAllByNamedQuery(
CollectionConstants.QUERY_RECEIPTS_BY_INSTRUMENTNO_AND_SERVICECODE, instrumentNum, serviceCode);
if (receiptHeaders == null || receiptHeaders.isEmpty())
return null;
for (final ReceiptHeader receiptHeader : receiptHeaders)
receipts.add(new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO, persistenceService, null));
return receipts;
}
/*
* (non-Javadoc)
* @seeorg.egov.infstr.collections.integration.ICollectionInterface#
* getInstrumentReceiptInfo(java.lang.String, java.util.Set)
*/
@Override
public Map<String, List<BillReceiptInfo>> getInstrumentReceiptInfo(final String serviceCode,
final Set<String> instrumentNums) {
final HashMap<String, List<BillReceiptInfo>> receipts = new HashMap<String, List<BillReceiptInfo>>(0);
for (final String instrumentNum : instrumentNums)
receipts.put(instrumentNum, getInstrumentReceiptInfo(serviceCode, instrumentNum));
return receipts;
}
/*
* (non-Javadoc)
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* getReceiptInfo (java.lang.String, java.lang.String)
*/
@Override
public BillReceiptInfo getReceiptInfo(final String serviceCode, final String receiptNum) {
final ReceiptHeader receiptHeader = findByNamedQuery(
CollectionConstants.QUERY_RECEIPT_BY_RECEIPTNUM_AND_SERVICECODE, serviceCode, receiptNum, receiptNum);
if (receiptHeader == null)
return null;
else {
// Create bill receipt info
final BillReceiptInfoImpl receiptInfo = new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO,
persistenceService, null);
return receiptInfo;
}
}
@Override
public RestReceiptInfo getDetailsByTransactionId(final PaymentInfoSearchRequest paymentInfoSearchRequest) {
LOGGER.info(paymentInfoSearchRequest.getSource());
final ReceiptHeader header = find("from ReceiptHeader r where r.manualreceiptnumber=? and r.source=? ",
paymentInfoSearchRequest.getTransactionId(), paymentInfoSearchRequest.getSource());
if (header == null)
throw new RuntimeException("No data found");
return new RestReceiptInfo(header);
}
/*
* (non-Javadoc)
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* getReceiptInfo (java.lang.String, java.util.Set)
*/
@Override
public Map<String, BillReceiptInfo> getReceiptInfo(final String serviceCode, final Set<String> receiptNums) {
final HashMap<String, BillReceiptInfo> receipts = new HashMap<String, BillReceiptInfo>(0);
for (final String receiptNum : receiptNums)
receipts.put(receiptNum, getReceiptInfo(serviceCode, receiptNum));
return receipts;
}
/*
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* createReceipt (BillInfo bill, List<PaymentInfo> paymentInfoList)
*/
@Override
public BillReceiptInfo createReceipt(final BillInfo bill, final List<PaymentInfo> paymentInfoList) {
LOGGER.info("Logs for CreateReceipt : Receipt Creation Started....");
final Fund fund = fundHibernateDAO.fundByCode(bill.getFundCode());
if (fund == null)
throw new ApplicationRuntimeException("Fund not present for the fund code [" + bill.getFundCode() + "].");
final Department dept = (Department) persistenceService
.findByNamedQuery(CollectionConstants.QUERY_DEPARTMENT_BY_CODE, bill.getDepartmentCode());
if (dept == null)
throw new ApplicationRuntimeException(
"Department not present for the department code [" + bill.getDepartmentCode() + "].");
final ReceiptHeader receiptHeader = collectionCommon.initialiseReceiptModelWithBillInfo(bill, fund, dept);
receiptHeader.setCreatedDate(new Date());
receiptHeader.setReceiptdate(new Date());
receiptHeader.setReceipttype(CollectionConstants.RECEIPT_TYPE_BILL);
receiptHeader.setIsModifiable(Boolean.TRUE);
receiptHeader.setIsReconciled(Boolean.FALSE);
receiptHeader.setCollectiontype(CollectionConstants.COLLECTION_TYPE_FIELDCOLLECTION);
receiptHeader.setSource(bill.getSource() != null ? bill.getSource() : "");
receiptHeader.setStatus(collectionsUtil.getStatusForModuleAndCode(CollectionConstants.MODULE_NAME_RECEIPTHEADER,
CollectionConstants.RECEIPT_STATUS_CODE_APPROVED));
receiptHeader.setPaidBy(bill.getPaidBy());
if (ApplicationThreadLocals.getUserId() != null) {
final User user = collectionsUtil.getUserById(ApplicationThreadLocals.getUserId());
receiptHeader.setCreatedBy(user);
receiptHeader.setLastModifiedBy(user);
receiptHeader.setLastModifiedDate(new Date());
// TODO: Uncomment following lines once LocationId is added to
// ThreadLocals
/*
* if (ApplicationThreadLocals.getLocationId() != null) { final
* Location location =
* collectionsUtil.getLocationById(ApplicationThreadLocals
* .getLocationId()); if (location != null)
* receiptHeader.setLocation(location); }
*/
}
BigDecimal chequeDDInstrumenttotal = BigDecimal.ZERO;
BigDecimal otherInstrumenttotal = BigDecimal.ZERO;
// populate instrument details
final List<InstrumentHeader> instrumentHeaderList = new ArrayList<InstrumentHeader>(0);
for (final PaymentInfo paytInfo : paymentInfoList) {
final String instrType = paytInfo.getInstrumentType().toString();
if (CollectionConstants.INSTRUMENTTYPE_CASH.equals(instrType)) {
final PaymentInfoCash paytInfoCash = (PaymentInfoCash) paytInfo;
instrumentHeaderList.add(collectionCommon.validateAndConstructCashInstrument(paytInfoCash));
otherInstrumenttotal = paytInfo.getInstrumentAmount();
}
/*
* if(CollectionConstants.INSTRUMENTTYPE_CARD.equals(instrType)){
* PaymentInfoCard paytInfoCard = (PaymentInfoCard)paytInfo;
* instrumentHeaderList.add(
* collectionCommon.validateAndConstructCardInstrument(
* paytInfoCard,receiptHeader)); otherInstrumenttotal =
* paytInfoCard.getInstrumentAmount(); }
*/
if (CollectionConstants.INSTRUMENTTYPE_BANK.equals(instrType)) {
final PaymentInfoBank paytInfoBank = (PaymentInfoBank) paytInfo;
instrumentHeaderList.add(collectionCommon.validateAndConstructBankInstrument(paytInfoBank));
otherInstrumenttotal = paytInfoBank.getInstrumentAmount();
}
if (CollectionConstants.INSTRUMENTTYPE_CHEQUE.equals(instrType)
|| CollectionConstants.INSTRUMENTTYPE_DD.equals(instrType)) {
final PaymentInfoChequeDD paytInfoChequeDD = (PaymentInfoChequeDD) paytInfo;
instrumentHeaderList.add(collectionCommon.validateAndConstructChequeDDInstrument(paytInfoChequeDD));
chequeDDInstrumenttotal = chequeDDInstrumenttotal.add(paytInfoChequeDD.getInstrumentAmount());
}
/*
* if(CollectionConstants.INSTRUMENTTYPE_ATM.equals(instrType)){
* PaymentInfoATM paytInfoATM = (PaymentInfoATM)paytInfo;
* instrumentHeaderList.add(
* collectionCommon.validateAndConstructATMInstrument(
* paytInfoATM)); otherInstrumenttotal =
* paytInfoATM.getInstrumentAmount(); }
*/
}
BigDecimal debitAmount = BigDecimal.ZERO;
for (final ReceiptDetail receiptDetail : receiptHeader.getReceiptDetails()) {
debitAmount = debitAmount.add(receiptDetail.getCramount());
debitAmount = debitAmount.subtract(receiptDetail.getDramount());
}
receiptHeader.addReceiptDetail(collectionCommon.addDebitAccountHeadDetails(debitAmount, receiptHeader,
chequeDDInstrumenttotal, otherInstrumenttotal, paymentInfoList.get(0).getInstrumentType().toString()));
receiptHeaderService.persistFieldReceipt(receiptHeader, instrumentHeaderList);
LOGGER.info("Logs for CreateReceipt : Receipt Creation Finished....");
return new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO, persistenceService, null);
}
/*
* (non-Javadoc)
* @seeorg.egov.infstr.collections.integration.ICollectionInterface#
* getPendingReceiptsInfo(java.lang.String, java.lang.String)
*/
@Override
public List<BillReceiptInfo> getOnlinePendingReceipts(final String serviceCode, final String consumerCode) {
final ArrayList<BillReceiptInfo> receipts = new ArrayList<BillReceiptInfo>(0);
final List<ReceiptHeader> receiptHeaders = findAllByNamedQuery(
CollectionConstants.QUERY_ONLINE_PENDING_RECEIPTS_BY_CONSUMERCODE_AND_SERVICECODE, serviceCode,
consumerCode, CollectionConstants.ONLINEPAYMENT_STATUS_CODE_PENDING);
if (receiptHeaders == null || receiptHeaders.isEmpty())
return null;
else {
for (final ReceiptHeader receiptHeader : receiptHeaders)
receipts.add(
new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO, persistenceService, null));
return receipts;
}
}
/*
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* createMiscellaneousReceipt (BillInfo bill, List<PaymentInfo>
* paymentInfoList)
*/
@Override
public BillReceiptInfo createMiscellaneousReceipt(final BillInfo bill, final List<PaymentInfo> paymentInfoList) {
LOGGER.info("Logs For Miscellaneous Receipt : Receipt Creation Started....");
final Fund fund = fundHibernateDAO.fundByCode(bill.getFundCode());
if (fund == null)
throw new ApplicationRuntimeException("Fund not present for the fund code [" + bill.getFundCode() + "].");
final Department dept = (Department) persistenceService
.findByNamedQuery(CollectionConstants.QUERY_DEPARTMENT_BY_CODE, bill.getDepartmentCode());
if (dept == null)
throw new ApplicationRuntimeException(
"Department not present for the department code [" + bill.getDepartmentCode() + "].");
final ReceiptHeader receiptHeader = collectionCommon.initialiseReceiptModelWithBillInfo(bill, fund, dept);
receiptHeader.setCreatedDate(new Date());
receiptHeader.setReceipttype(CollectionConstants.RECEIPT_TYPE_ADHOC);
receiptHeader.setIsModifiable(Boolean.TRUE);
receiptHeader.setIsReconciled(Boolean.TRUE);
receiptHeader.setCollectiontype(CollectionConstants.COLLECTION_TYPE_COUNTER);
receiptHeader.setStatus(collectionsUtil.getStatusForModuleAndCode(CollectionConstants.MODULE_NAME_RECEIPTHEADER,
CollectionConstants.RECEIPT_STATUS_CODE_APPROVED));
receiptHeader.setPaidBy(bill.getPaidBy());
if (ApplicationThreadLocals.getUserId() != null)
receiptHeader.setCreatedBy(collectionsUtil.getUserById(ApplicationThreadLocals.getUserId()));
// TODO: Uncomment following lines once LocationId is added to
// ThreadLocals
/*
* if (ApplicationThreadLocals.getLocationId() != null) { final Location
* location =
* collectionsUtil.getLocationById(ApplicationThreadLocals.getLocationId
* ()); if (location != null) receiptHeader.setLocation(location); }
*/
final BigDecimal chequeDDInstrumenttotal = BigDecimal.ZERO;
final BigDecimal otherInstrumenttotal = BigDecimal.ZERO;
/*
* // populate instrument details List<InstrumentHeader>
* instrumentHeaderList = new ArrayList<InstrumentHeader>(); for
* (PaymentInfo paytInfo : paymentInfoList) { String instrType =
* paytInfo.getInstrumentType().toString(); if
* (CollectionConstants.INSTRUMENTTYPE_CASH.equals(instrType)) {
* PaymentInfoCash paytInfoCash = (PaymentInfoCash) paytInfo;
* instrumentHeaderList
* .add(collectionCommon.validateAndConstructCashInstrument
* (paytInfoCash)); otherInstrumenttotal =
* paytInfo.getInstrumentAmount(); } if
* (CollectionConstants.INSTRUMENTTYPE_BANK.equals(instrType)) {
* PaymentInfoBank paytInfoBank = (PaymentInfoBank) paytInfo;
* instrumentHeaderList
* .add(collectionCommon.validateAndConstructBankInstrument
* (paytInfoBank)); otherInstrumenttotal =
* paytInfoBank.getInstrumentAmount(); } if
* (CollectionConstants.INSTRUMENTTYPE_CHEQUE.equals(instrType) ||
* CollectionConstants.INSTRUMENTTYPE_DD.equals(instrType)) {
* PaymentInfoChequeDD paytInfoChequeDD = (PaymentInfoChequeDD)
* paytInfo; instrumentHeaderList.add(collectionCommon.
* validateAndConstructChequeDDInstrument(paytInfoChequeDD));
* chequeDDInstrumenttotal =
* chequeDDInstrumenttotal.add(paytInfoChequeDD.getInstrumentAmount());
* } } instrumentHeaderList =
* receiptHeaderService.createInstrument(instrumentHeaderList);
* LOGGER.info(" Instrument List created ");
* receiptHeader.setReceiptInstrument(new
* HashSet(instrumentHeaderList));
*/
BigDecimal debitAmount = BigDecimal.ZERO;
for (final ReceiptDetail receiptDetail : receiptHeader.getReceiptDetails()) {
debitAmount = debitAmount.add(receiptDetail.getCramount());
debitAmount = debitAmount.subtract(receiptDetail.getDramount());
}
receiptHeader.addReceiptDetail(collectionCommon.addDebitAccountHeadDetails(debitAmount, receiptHeader,
chequeDDInstrumenttotal, otherInstrumenttotal, paymentInfoList.get(0).getInstrumentType().toString()));
receiptHeaderService.persist(receiptHeader);
receiptHeaderService.getSession().flush();
LOGGER.info("Miscellaneous Receipt Created with receipt number: " + receiptHeader.getReceiptnumber());
try {
receiptHeaderService.createVoucherForReceipt(receiptHeader);
LOGGER.debug("Updated financial systems and created voucher.");
} catch (final ApplicationRuntimeException ex) {
errors.add(new ValidationError(
"Miscellaneous Receipt creation transaction rolled back as update to financial system failed.",
"Miscellaneous Receipt creation transaction rolled back as update to financial system failed."));
LOGGER.error("Update to financial systems failed");
}
// Create Vouchers
final List<CVoucherHeader> voucherHeaderList = new ArrayList<CVoucherHeader>();
LOGGER.info("Receipt Voucher created with vouchernumber: " + receiptHeader.getVoucherNum());
for (final ReceiptVoucher receiptVoucher : receiptHeader.getReceiptVoucher())
voucherHeaderList.add(receiptVoucher.getVoucherheader());
/*
* if (voucherHeaderList != null && !instrumentHeaderList.isEmpty()) {
* receiptHeaderService.updateInstrument(voucherHeaderList,
* instrumentHeaderList); }
*/
LOGGER.info("Logs For Miscellaneous Receipt : Receipt Creation Finished....");
return new BillReceiptInfoImpl(receiptHeader, chartOfAccountsHibernateDAO, persistenceService, null);
}
/*
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* getAggregateReceiptTotal (Date fromDate, Date toDate)
*/
@Override
public List<RestAggregatePaymentInfo> getAggregateReceiptTotal(final PaymentInfoSearchRequest aggrReq) {
final List<RestAggregatePaymentInfo> listAggregatePaymentInfo = new ArrayList<RestAggregatePaymentInfo>(0);
// final SimpleDateFormat formatter = new
// SimpleDateFormat("dd-MMM-yyyy");
final StringBuilder queryBuilder = new StringBuilder(
"select sum(recordcount) as records,ulb, sum(total) as total,service from public.receipt_aggr_view "
+ " where receipt_date>=:fromDate and receipt_date<=:toDate and service=:serviceCode "
+ " and source=:source and ulb=:ulbCode group by ulb,service ");
final Query query = getSession().createSQLQuery(queryBuilder.toString());
query.setDate("fromDate", aggrReq.getFromdate());
query.setDate("toDate", aggrReq.getTodate());
query.setString("serviceCode", aggrReq.getServicecode());
query.setString("source", aggrReq.getSource());
query.setString("ulbCode", aggrReq.getUlbCode());
LOGGER.debug(aggrReq.getSource());
final List<Object[]> queryResults = query.list();
for (final Object[] objectArray : queryResults) {
final RestAggregatePaymentInfo aggregatePaymentInfo = new RestAggregatePaymentInfo();
aggregatePaymentInfo.setTxncount(Integer.parseInt(objectArray[0].toString()));
aggregatePaymentInfo.setUlbcode(objectArray[1].toString());
aggregatePaymentInfo.setTxnamount(new BigDecimal(objectArray[2].toString()));
aggregatePaymentInfo.setServiceCode(objectArray[3].toString());
listAggregatePaymentInfo.add(aggregatePaymentInfo);
}
if (listAggregatePaymentInfo.size() == 0)
listAggregatePaymentInfo.add(new RestAggregatePaymentInfo());
return listAggregatePaymentInfo;
}
/*
* @see
* org.egov.infstr.collections.integration.CollectionIntegrationService#
* getReceiptDetailsByDateAndService(final Date fromDate, final Date toDate,
* final String serviceCode)
*/
@Override
public List<RestReceiptInfo> getReceiptDetailsByDateAndService(final PaymentInfoSearchRequest aggrReq) {
final ArrayList<RestReceiptInfo> receipts = new ArrayList<RestReceiptInfo>(0);
final List<ReceiptHeader> receiptHeaders = findAllByNamedQuery(
CollectionConstants.QUERY_RECEIPTS_BY_DATE_AND_SERVICECODE, aggrReq.getFromdate(), aggrReq.getTodate(),
aggrReq.getServicecode(), aggrReq.getSource());
if (receiptHeaders == null || receiptHeaders.isEmpty()) {
receipts.add(new RestReceiptInfo());
return receipts;
} else {
for (final ReceiptHeader receiptHeader : receiptHeaders)
receipts.add(new RestReceiptInfo(receiptHeader));
return receipts;
}
}
@Override
public String cancelReceipt(final PaymentInfoSearchRequest cancelReq) {
String statusMessage = null;
String instrumentType = "";
boolean isInstrumentDeposited = false;
final ReceiptHeader receiptHeaderToBeCancelled = (ReceiptHeader) persistenceService
.findByNamedQuery(CollectionConstants.QUERY_RECEIPTS_BY_RECEIPTNUM, cancelReq.getReceiptNo());
if (receiptHeaderToBeCancelled == null)
throw new RuntimeException("Invalid receiptNumber:" + cancelReq.getReceiptNo());
else if (!cancelReq.getTransactionId().equals(receiptHeaderToBeCancelled.getManualreceiptnumber()))
throw new RuntimeException("transactionId doesnot match with receiptNo " + cancelReq.getReceiptNo());
else if (CollectionConstants.RECEIPT_STATUS_CODE_CANCELLED
.equalsIgnoreCase(receiptHeaderToBeCancelled.getStatus().getCode()))
throw new RuntimeException("Receipt is already Cancelled " + cancelReq.getReceiptNo());
LOGGER.info("Receipt Header to be Cancelled : " + receiptHeaderToBeCancelled.getReceiptnumber());
for (final InstrumentHeader instrumentHeader : receiptHeaderToBeCancelled.getReceiptInstrument())
if (instrumentHeader.getInstrumentType().getType().equals(CollectionConstants.INSTRUMENTTYPE_CASH)) {
if (instrumentHeader.getStatusId().getDescription()
.equals(CollectionConstants.INSTRUMENT_RECONCILED_STATUS)) {
isInstrumentDeposited = true;
break;
}
} else if (instrumentHeader.getStatusId().getDescription()
.equals(CollectionConstants.INSTRUMENT_DEPOSITED_STATUS)) {
isInstrumentDeposited = true;
break;
}
if (isInstrumentDeposited)
statusMessage = CollectionConstants.RECEIPT_DEPOSITED_CANCELLED;
else {
// if instrument has not been deposited, cancel the old instrument,
// reverse the
// voucher and persist
receiptHeaderToBeCancelled.setStatus(statusDAO.getStatusByModuleAndCode(
CollectionConstants.MODULE_NAME_RECEIPTHEADER, CollectionConstants.RECEIPT_STATUS_CODE_CANCELLED));
receiptHeaderToBeCancelled.setIsReconciled(false);
receiptHeaderToBeCancelled.setReasonForCancellation(CollectionConstants.RECEIPT_CANCELLED_REASON);
for (final InstrumentHeader instrumentHeader : receiptHeaderToBeCancelled.getReceiptInstrument()) {
instrumentHeader.setStatusId(
statusDAO.getStatusByModuleAndCode(CollectionConstants.MODULE_NAME_INSTRUMENTHEADER,
CollectionConstants.INSTRUMENTHEADER_STATUS_CANCELLED));
instrumentType = instrumentHeader.getInstrumentType().getType();
}
for (final ReceiptVoucher receiptVoucher : receiptHeaderToBeCancelled.getReceiptVoucher())
receiptHeaderService.createReversalVoucher(receiptVoucher, instrumentType);
receiptHeaderService.persist(receiptHeaderToBeCancelled);
// End work-flow for the cancelled receipt
if (receiptHeaderToBeCancelled.getState() != null
&& !receiptHeaderToBeCancelled.getState().getValue().equals(CollectionConstants.WF_STATE_END))
receiptHeaderService.endReceiptWorkFlowOnCancellation(receiptHeaderToBeCancelled);
LOGGER.info("Receipt Cancelled with Receipt Number(saveOnCancel): "
+ receiptHeaderToBeCancelled.getReceiptnumber() + "; Consumer Code: "
+ receiptHeaderToBeCancelled.getConsumerCode());
statusMessage = CollectionConstants.RECEIPT_CANCELLED_SUCCESS;
}
return statusMessage;
}
@Override
public List<ReceiptDetail> getReceiptDetailListByReceiptNumber(final String receiptNumber) {
final List<ReceiptDetail> receiptDetList = persistenceService
.findAllByNamedQuery(CollectionConstants.QUERY_RECEIPTDETAIL_BY_RECEIPTNUMBER, receiptNumber);
return receiptDetList;
}
@Override
@Transactional
public PaymentRequest processMobilePayments(final BillInfoImpl billInfo) throws ValidationException {
ReceiptHeader receiptHeader = new ReceiptHeader();
BigDecimal totalAmountToBeCollected = BigDecimal.ZERO;
final Fund fund = fundDAO.fundByCode(billInfo.getFundCode());
if (fund == null)
throw new ValidationException(Arrays.asList(new ValidationError("billreceipt.improperbilldata.missingfund",
"billreceipt.improperbilldata.missingfund")));
final Department dept = (Department) persistenceService
.findByNamedQuery(CollectionConstants.QUERY_DEPARTMENT_BY_CODE, billInfo.getDepartmentCode());
if (dept == null)
throw new ValidationException(
Arrays.asList(new ValidationError("billreceipt.improperbilldata.missingdepartment",
"billreceipt.improperbilldata.missingdepartment")));
receiptHeader = collectionCommon.initialiseReceiptModelWithBillInfo(billInfo, fund, dept);
totalAmountToBeCollected = totalAmountToBeCollected.add(receiptHeader.getTotalAmountToBeCollected());
for (final ReceiptDetail rDetails : receiptHeader.getReceiptDetails())
rDetails.getCramountToBePaid().setScale(CollectionConstants.AMOUNT_PRECISION_DEFAULT, BigDecimal.ROUND_UP);
if (totalAmountToBeCollected.compareTo(BigDecimal.ZERO) == -1) {
LOGGER.info("Amount to be collected is less than zero, hence cannot proceed.");
throw new ValidationException(Arrays.asList(new ValidationError("billreceipt.totalamountlessthanzero.error",
"billreceipt.totalamountlessthanzero.error")));
} else
receiptHeader.setTotalAmount(totalAmountToBeCollected.setScale(CollectionConstants.AMOUNT_PRECISION_DEFAULT,
BigDecimal.ROUND_UP));
final ServiceDetails paymentService = (ServiceDetails) persistenceService
.findByNamedQuery(CollectionConstants.QUERY_SERVICE_BY_CODE, CollectionConstants.SERVICECODE_AXIS);
if (receiptHeader.getStatus() == null) {
receiptHeader.setReceiptdate(new Date());
// receiptHeader.setReferencenumber(billInfo.getTransactionReferenceNumber());
receiptHeader.setReceipttype(CollectionConstants.RECEIPT_TYPE_BILL);
receiptHeader.setIsModifiable(Boolean.FALSE);
// recon flag should be set as false when the receipt is
// actually
// created on successful online transaction
receiptHeader.setIsReconciled(Boolean.TRUE);
receiptHeader.setCollectiontype(CollectionConstants.COLLECTION_TYPE_ONLINECOLLECTION);
receiptHeader.setStatus(
collectionsUtil.getReceiptStatusForCode(CollectionConstants.RECEIPT_STATUS_CODE_PENDING));
receiptHeader.setSource(Source.MOBILE.toString());
BigDecimal debitAmount = BigDecimal.ZERO;
// TODO: Clarification
// calculate sum of creditamounts as a debit value to
// create a
// debit account head and add to receipt details
for (final ReceiptDetail receiptDetail : receiptHeader.getReceiptDetails()) {
receiptDetail.setCramount(receiptDetail.getCramount());
debitAmount = debitAmount.add(receiptDetail.getCramount());
debitAmount = debitAmount.subtract(receiptDetail.getDramount());
}
// end of outer for loop
receiptHeader.addReceiptDetail(collectionCommon.addDebitAccountHeadDetails(debitAmount, receiptHeader,
BigDecimal.ZERO, receiptHeader.getTotalAmount(), CollectionConstants.INSTRUMENTTYPE_ONLINE));
// Add Online Payment Details
final OnlinePayment onlinePayment = new OnlinePayment();
onlinePayment
.setStatus(collectionsUtil.getStatusForModuleAndCode(CollectionConstants.MODULE_NAME_ONLINEPAYMENT,
CollectionConstants.ONLINEPAYMENT_STATUS_CODE_PENDING));
onlinePayment.setReceiptHeader(receiptHeader);
onlinePayment.setService(paymentService);
receiptHeader.setOnlinePayment(onlinePayment);
}
receiptHeaderService.persistReceiptObject(receiptHeader);
return collectionCommon.createPaymentRequest(paymentService, receiptHeader);
}// end of method
public void setCollectionCommon(final CollectionCommon collectionCommon) {
this.collectionCommon = collectionCommon;
}
public void setPersistenceService(final PersistenceService persistenceService) {
this.persistenceService = persistenceService;
}
}