/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.tem.document.service.impl;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.TemParameterConstants;
import org.kuali.kfs.module.tem.TemPropertyConstants;
import org.kuali.kfs.module.tem.businessobject.CreditCardAgency;
import org.kuali.kfs.module.tem.businessobject.HistoricalTravelExpense;
import org.kuali.kfs.module.tem.businessobject.ImportedExpense;
import org.kuali.kfs.module.tem.businessobject.TemSourceAccountingLine;
import org.kuali.kfs.module.tem.dataaccess.TravelDocumentDao;
import org.kuali.kfs.module.tem.document.TEMReimbursementDocument;
import org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService;
import org.kuali.kfs.pdp.PdpConstants;
import org.kuali.kfs.pdp.businessobject.PaymentAccountDetail;
import org.kuali.kfs.pdp.businessobject.PaymentDetail;
import org.kuali.kfs.pdp.businessobject.PaymentGroup;
import org.kuali.kfs.pdp.businessobject.PaymentNoteText;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSParameterKeyConstants;
import org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
import org.kuali.kfs.sys.document.service.PaymentSourceHelperService;
import org.kuali.kfs.sys.document.validation.event.AccountingDocumentSaveWithNoLedgerEntryGenerationEvent;
import org.kuali.kfs.vnd.businessobject.VendorAddress;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.kfs.vnd.document.service.VendorService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.core.api.util.type.KualiInteger;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
/**
* Service which supports creating PDP payments for Corporate Cards by extracting reimbursable documents
*/
@Transactional
public class CorporateCardExtractionServiceImpl implements PaymentSourceToExtractService<TEMReimbursementDocument> {
static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CorporateCardExtractionServiceImpl.class);
protected ParameterService parameterService;
protected DocumentService documentService;
protected TravelDocumentDao travelDocumentDao;
protected PaymentSourceHelperService paymentSourceHelperService;
protected TravelPaymentsHelperService travelPaymentsHelperService;
protected BusinessObjectService businessObjectService;
protected VendorService vendorService;
/**
*
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#retrievePaymentSourcesByCampus(boolean)
*/
@Override
public Map<String, List<TEMReimbursementDocument>> retrievePaymentSourcesByCampus(boolean immediatesOnly) {
if (LOG.isDebugEnabled()) {
LOG.debug("retrievePaymentSourcesByCampus() started");
}
final boolean disburseCorporateCardPayments = getParameterService().getParameterValueAsBoolean(TemParameterConstants.TEM_DOCUMENT.class, TemConstants.TravelParameters.CORPORATE_CARD_PAYMENT_IND);
if (!disburseCorporateCardPayments) {
return new HashMap<String, List<TEMReimbursementDocument>>(); // can't disburse payments? then don't find any documents to disburse
}
Map<String, List<TEMReimbursementDocument>> documentsByCampus = new HashMap<String, List<TEMReimbursementDocument>>();
final List<TEMReimbursementDocument> reimbursables = retrieveAllCorporateCardDocuments(immediatesOnly);
Map<String, String> initiatorCampuses = new HashMap<String, String>();
for (TEMReimbursementDocument document : reimbursables) {
if (document.isCorporateCardPayable() && shouldExtractPayment(document)) {
final String campusCode = getTravelPaymentsHelperService().findCampusForDocument(document, initiatorCampuses);
if (!StringUtils.isBlank(campusCode)) {
List<TEMReimbursementDocument> documentsForCampus = documentsByCampus.get(campusCode);
if (documentsForCampus == null) {
documentsForCampus = new ArrayList<TEMReimbursementDocument>();
documentsByCampus.put(campusCode, documentsForCampus);
}
documentsForCampus.add(document);
}
}
}
return documentsByCampus;
}
/**
* Retrieves all the TravelReimbursement, TravelRelocation, and TravelEntertainment documents paid by check at approved status in one convenient call
* @param immediatesOnly true if only those documents marked for immediate payment should be retrieved, false if all qualifying documents should be retrieved
* @return all of the documents to process in a list
*/
protected List<TEMReimbursementDocument> retrieveAllCorporateCardDocuments(boolean immediatesOnly) {
List<TEMReimbursementDocument> allReimbursables = new ArrayList<TEMReimbursementDocument>();
allReimbursables.addAll(getTravelDocumentDao().getReimbursementDocumentsNeedingCorporateCardExtraction());
allReimbursables.addAll(getTravelDocumentDao().getEntertainmentDocumentsNeedingCorporateCardExtraction());
allReimbursables.addAll(getTravelDocumentDao().getRelocationDocumentsNeedingCorporateCardExtraction());
return allReimbursables;
}
/**
* Uses the value in the KFS-TEM / Document / PRE_DISBURSEMENT_EXTRACT_ORGANIZATION parameter
* @see org.kuali.kfs.sys.document.PaymentSource#getPreDisbursementCustomerProfileUnit()
*/
@Override
public String getPreDisbursementCustomerProfileUnit() {
final String unit = getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, KFSParameterKeyConstants.PdpExtractBatchParameters.PDP_ORG_CODE);
return unit;
}
/**
* Uses the value in the KFS-TEM / Document / PRE_DISBURSEMENT_EXTRACT_SUB_UNIT
* @see org.kuali.kfs.sys.document.PaymentSource#getPreDisbursementCustomerProfileSubUnit()
*/
@Override
public String getPreDisbursementCustomerProfileSubUnit() {
final String subUnit = getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, KFSParameterKeyConstants.PdpExtractBatchParameters.PDP_SBUNT_CODE);
return subUnit;
}
/**
* Sets the corporate card payment extracted date on the document
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#markAsExtracted(org.kuali.kfs.sys.document.PaymentSource, java.sql.Date)
*/
@Override
public void markAsExtracted(TEMReimbursementDocument document, Date sqlProcessRunDate, KualiInteger paymentGroupId) {
try {
document.setCorporateCardPaymentExtractDate(sqlProcessRunDate);
associatePaymentGroupWithCreditCardData(document, paymentGroupId);
getDocumentService().saveDocument(document, AccountingDocumentSaveWithNoLedgerEntryGenerationEvent.class);
}
catch (WorkflowException we) {
LOG.error("Could not save TEMReimbursementDocument document #" + document.getDocumentNumber() + ": " + we);
throw new RuntimeException(we);
}
}
/**
* Associates the given payment group id with every historical travel expense that represents a corporate card charge on the given document
* @param document the document to update
* @param paymentGroupNumber the payment group id to update the historical expenses with
*/
protected void associatePaymentGroupWithCreditCardData(TEMReimbursementDocument document, KualiInteger paymentGroupNumber) {
for (HistoricalTravelExpense expense : document.getHistoricalTravelExpenses()){
if (expense.getCreditCardStagingData() != null){
if (StringUtils.equals(expense.getCreditCardStagingData().getCreditCardAgency().getTravelCardTypeCode(), TemConstants.TRAVEL_TYPE_CORP)){
expense.getCreditCardStagingData().setPaymentGroupId(paymentGroupNumber);
getBusinessObjectService().save(expense.getCreditCardStagingData());
}
}
}
}
/**
*
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#createPaymentGroup(org.kuali.kfs.sys.document.PaymentSource, java.sql.Date)
*/
@Override
public PaymentGroup createPaymentGroup(TEMReimbursementDocument document, Date processRunDate) {
if (LOG.isDebugEnabled()) {
LOG.debug("createPaymentGroupForReimbursable() started");
}
final boolean disburseCorporateCardPayments = getParameterService().getParameterValueAsBoolean(TemParameterConstants.TEM_DOCUMENT.class, TemConstants.TravelParameters.CORPORATE_CARD_PAYMENT_IND);
if (!disburseCorporateCardPayments) {
return null; // can't disburse payments? then don't create payment groups
}
PaymentGroup pg = new PaymentGroup();
final CreditCardAgency creditCardAgency = getCorporateCreditCardAgency(document);
if (creditCardAgency == null) {
LOG.error("Skipping corporate card payment for "+document.getDocumentNumber()+" because no credit card agency could be found.");
return null;
}
final VendorDetail vendor = getCorporateCardVendor(creditCardAgency);
if (vendor == null) {
LOG.error("Skipping corporate card payment for "+document.getDocumentNumber()+" because no vendor could be found.");
return null;
}
final VendorAddress vendorAddress = getVendorService().getVendorDefaultAddress(vendor.getVendorAddresses(), vendor.getVendorHeader().getVendorType().getAddressType().getVendorAddressTypeCode(), "");
pg.setCombineGroups(Boolean.TRUE);
pg.setCampusAddress(Boolean.FALSE);
pg.setCity(vendorAddress.getVendorCityName());
pg.setCountry(vendorAddress.getVendorCountryCode());
pg.setLine1Address(vendorAddress.getVendorLine1Address());
pg.setLine2Address(vendorAddress.getVendorLine2Address());
pg.setPayeeName(vendor.getVendorName());
pg.setState(vendorAddress.getVendorStateCode());
pg.setZipCd(vendorAddress.getVendorZipCode());
pg.setPaymentDate(getNextDate(processRunDate));
pg.setProcessImmediate(false);
pg.setPymtAttachment(false);
pg.setPymtSpecialHandling(false);
pg.setNraPayment(false);
pg.setBankCode(creditCardAgency.getBankCode());
pg.setPaymentStatusCode(PdpConstants.PaymentStatusCodes.OPEN);
if (StringUtils.equals(document.getTraveler().getTravelerTypeCode(), TemConstants.EMP_TRAVELER_TYP_CD)) {
pg.setEmployeeIndicator(true);
}
pg.setPayeeId(vendor.getVendorNumber());
pg.setPayeeIdTypeCd(PdpConstants.PayeeIdTypeCodes.VENDOR_ID);
pg.setTaxablePayment(Boolean.FALSE);
pg.setPayeeOwnerCd(vendor.getVendorHeader().getVendorOwnershipCode());
// now add the payment detail
final PaymentDetail paymentDetail = buildPaymentDetail(document, processRunDate);
pg.addPaymentDetails(paymentDetail);
paymentDetail.setPaymentGroup(pg);
return pg;
}
/**
* Finds the vendor for the corporate card used on the given document
* @param document the document to find a corporate card vendor for
* @return the found vendor or null if a vendor could not be found
*/
protected VendorDetail getCorporateCardVendor(CreditCardAgency creditCardAgency) {
if (!ObjectUtils.isNull(creditCardAgency)) {
final String vendorNumber = creditCardAgency.getVendorNumber();
if (!StringUtils.isBlank(vendorNumber)) {
return getVendorService().getByVendorNumber(vendorNumber);
}
}
return null;
}
/**
* Looks through the imported expenses on the document to find a corporate card record which has a credit card agency - returns that
* @param document a document to find a corporate card vendor for
* @return the id of the found vendor or null if nothing was found
*/
protected CreditCardAgency getCorporateCreditCardAgency(TEMReimbursementDocument document) {
for (ImportedExpense importedExpense : document.getImportedExpenses()) {
if (StringUtils.equals(importedExpense.getCardType(), TemConstants.TRAVEL_TYPE_CORP) && !ObjectUtils.isNull(importedExpense.getHistoricalTravelExpense())) {
importedExpense.getHistoricalTravelExpense().refreshReferenceObject(TemPropertyConstants.CREDIT_CARD_AGENCY);
if (!ObjectUtils.isNull(importedExpense.getHistoricalTravelExpense().getCreditCardAgency()) && !StringUtils.isBlank(importedExpense.getHistoricalTravelExpense().getCreditCardAgency().getVendorNumber())) {
return importedExpense.getHistoricalTravelExpense().getCreditCardAgency();
}
}
}
return null;
}
/**
* Finds the vendor number from the first historical travel expense associated with the given document
* @param document a document to find a corporate card vendor for
* @return the id of the found vendor or null if nothing was found
*/
protected String findCorporateCardVendorNumber(TEMReimbursementDocument document) {
final CreditCardAgency creditCardAgency = getCorporateCreditCardAgency(document);
if (!ObjectUtils.isNull(creditCardAgency)) {
return creditCardAgency.getVendorNumber();
}
return null;
}
/**
* Returns a Date object representing the day after the given processDate
* @param processDate the date to find the next day for
* @return the next day for the given date
*/
protected Date getNextDate(Date processDate) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(processDate.getTime());
cal.add(Calendar.DATE, 1);
return new java.sql.Date(cal.getTimeInMillis());
}
/**
* Builds the PaymentDetail for the given reimbursable travel & entertainment document
* @param document the reimbursable travel & entertainment document to create a payment for
* @param processRunDate the date when the extraction is occurring
* @return a PaymentDetail to add to the PaymentGroup
*/
protected PaymentDetail buildPaymentDetail(TEMReimbursementDocument document, Date processRunDate) {
if (LOG.isDebugEnabled()) {
LOG.debug("buildPaymentDetail() started");
}
PaymentDetail pd = new PaymentDetail();
if (StringUtils.isNotEmpty(document.getDocumentHeader().getOrganizationDocumentNumber())) {
pd.setOrganizationDocNbr(document.getDocumentHeader().getOrganizationDocumentNumber());
}
pd.setCustPaymentDocNbr(document.getDocumentNumber());
pd.setInvoiceDate(new java.sql.Date(processRunDate.getTime()));
pd.setOrigInvoiceAmount(getPaymentAmount(document));
pd.setInvTotDiscountAmount(KualiDecimal.ZERO);
pd.setInvTotOtherCreditAmount(KualiDecimal.ZERO);
pd.setInvTotOtherDebitAmount(KualiDecimal.ZERO);
pd.setInvTotShipAmount(KualiDecimal.ZERO);
pd.setNetPaymentAmount(getPaymentAmount(document));
pd.setPrimaryCancelledPayment(Boolean.FALSE);
pd.setFinancialDocumentTypeCode(getAchCheckDocumentType(document));
pd.setFinancialSystemOriginCode(KFSConstants.ORIGIN_CODE_KUALI);
pd.setPurchaseOrderNbr(document.getTravelDocumentIdentifier());
pd.setOrganizationDocNbr(document.getTravelDocumentIdentifier());
int line = 0;
PaymentNoteText pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
final String travelerId = (!ObjectUtils.isNull(document.getTemProfile()) ?
(!ObjectUtils.isNull(document.getTemProfile().getPrincipal()) ? document.getTemProfile().getPrincipal().getPrincipalName() : document.getTemProfile().getCustomerNumber()) :
document.getDocumentNumber()); // they got this far without a payee id? that really probably shouldn't happen
pnt.setCustomerNoteText("Info: " + travelerId + " " + document.getTemProfile().getPhoneNumber());
pd.addNote(pnt);
final String text = document.getDocumentHeader().getDocumentDescription();
if (!StringUtils.isBlank(text)) {
pnt = getPaymentSourceHelperService().buildNoteForCheckStubText(text, line);
if (LOG.isDebugEnabled()) {
LOG.debug("Creating check stub text note: " + pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
// Handle accounts, but only corporate card accounting lines
List<TemSourceAccountingLine> corporateCardLines = new ArrayList<TemSourceAccountingLine>();
for (TemSourceAccountingLine accountingLine : (List<TemSourceAccountingLine>)document.getSourceAccountingLines()) {
if (StringUtils.equals(TemConstants.TRAVEL_TYPE_CORP, accountingLine.getCardType())) {
corporateCardLines.add(accountingLine);
}
}
final List<PaymentAccountDetail> paymentAccounts = buildPaymentAccountDetails(corporateCardLines);
for (PaymentAccountDetail pad : paymentAccounts) {
pd.addAccountDetail(pad);
}
return pd;
}
/**
* Only build account details for corporate card accounting lines
* @see org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService#buildGenericPaymentAccountDetails(java.util.List)
*/
protected List<PaymentAccountDetail> buildPaymentAccountDetails(List<? extends AccountingLine> accountingLines) {
List<PaymentAccountDetail> details = new ArrayList<PaymentAccountDetail>();
for (AccountingLine al : accountingLines) {
final TemSourceAccountingLine accountingLine = (TemSourceAccountingLine)al;
if (StringUtils.equals(accountingLine.getCardType(), TemConstants.TRAVEL_TYPE_CORP)) {
PaymentAccountDetail pad = new PaymentAccountDetail();
pad.setFinChartCode(accountingLine.getChartOfAccountsCode());
pad.setAccountNbr(accountingLine.getAccountNumber());
if (!StringUtils.isBlank(accountingLine.getSubAccountNumber())) {
pad.setSubAccountNbr(accountingLine.getSubAccountNumber());
}
else {
pad.setSubAccountNbr(KFSConstants.getDashSubAccountNumber());
}
pad.setFinObjectCode(accountingLine.getFinancialObjectCode());
if (!StringUtils.isBlank(accountingLine.getFinancialSubObjectCode())) {
pad.setFinSubObjectCode(accountingLine.getFinancialSubObjectCode());
}
else {
pad.setFinSubObjectCode(KFSConstants.getDashFinancialSubObjectCode());
}
if (!StringUtils.isBlank(accountingLine.getOrganizationReferenceId())) {
pad.setOrgReferenceId(accountingLine.getOrganizationReferenceId());
}
if (!StringUtils.isBlank(accountingLine.getProjectCode())) {
pad.setProjectCode(accountingLine.getProjectCode());
}
else {
pad.setProjectCode(KFSConstants.getDashProjectCode());
}
pad.setAccountNetAmount(accountingLine.getAmount());
details.add(pad);
}
}
return details;
}
/**
* The sum of all CORP accounting lines on the document
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#getPaymentAmount(org.kuali.kfs.sys.document.PaymentSource)
*/
@Override
public KualiDecimal getPaymentAmount(TEMReimbursementDocument document) {
KualiDecimal amount = KualiDecimal.ZERO;
for(TemSourceAccountingLine line: (List<TemSourceAccountingLine>)document.getSourceAccountingLines()){
if (StringUtils.equals(line.getCardType(), TemConstants.TRAVEL_TYPE_CORP)){
amount = amount.add(line.getAmount());
}
}
return amount;
}
/**
* Sets teh corporate card payment paid date on the document to the process date
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#markAsPaid(org.kuali.kfs.sys.document.PaymentSource, java.sql.Date)
*/
@Override
public void markAsPaid(TEMReimbursementDocument paymentSource, Date processDate) {
try {
paymentSource.setCorporateCardPaymentPaidDate(processDate);
getDocumentService().saveDocument(paymentSource, AccountingDocumentSaveWithNoLedgerEntryGenerationEvent.class);
}
catch (WorkflowException we) {
LOG.error("encountered workflow exception while attempting to save Disbursement Voucher: " + paymentSource.getDocumentNumber() + " " + we);
throw new RuntimeException(we);
}
}
/**
* Sets the corporate card payment cancel date to the given cancel date and handles the entry cancellation for the payment
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#cancelPayment(org.kuali.kfs.sys.document.PaymentSource, java.sql.Date)
*/
@Override
public void cancelPayment(TEMReimbursementDocument paymentSource, Date cancelDate) {
if (paymentSource.getCorporateCardPaymentCancelDate() == null) {
try {
paymentSource.setCorporateCardPaymentCancelDate(cancelDate);
getPaymentSourceHelperService().handleEntryCancellation(paymentSource, this);
// save the document
getDocumentService().saveDocument(paymentSource, AccountingDocumentSaveWithNoLedgerEntryGenerationEvent.class);
}
catch (WorkflowException we) {
LOG.error("encountered workflow exception while attempting to save Disbursement Voucher: " + paymentSource.getDocumentNumber() + " " + we);
throw new RuntimeException(we);
}
}
}
/**
* True if the GLPE has a doc type of RCCA
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#shouldRollBackPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
*/
@Override
public boolean shouldRollBackPendingEntry(GeneralLedgerPendingEntry entry) {
return StringUtils.equals(TemConstants.TravelDocTypes.REIMBURSABLE_CORPORATE_CARD_CHECK_ACH_DOCUMENT, entry.getFinancialDocumentTypeCode());
}
/**
* Resets the corporate card payment extract date and paid date on the document to null
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#resetFromExtraction(org.kuali.kfs.sys.document.PaymentSource)
*/
@Override
public void resetFromExtraction(TEMReimbursementDocument paymentSource) {
try {
paymentSource.setCorporateCardPaymentExtractDate(null);
paymentSource.setCorporateCardPaymentPaidDate(null);
getDocumentService().saveDocument(paymentSource, AccountingDocumentSaveWithNoLedgerEntryGenerationEvent.class);
}
catch (WorkflowException we) {
LOG.error("encountered workflow exception while attempting to save Disbursement Voucher: " + paymentSource.getDocumentNumber() + " " + we);
throw new RuntimeException(we);
}
}
/**
* Returns the value of the KFS-TEM / Document / IMMEDIATE_EXTRACT_NOTIFICATION_FROM_EMAIL_ADDRESS parameter
* @see org.kuali.kfs.sys.document.PaymentSource#getImmediateExtractEMailFromAddress()
*/
@Override
public String getImmediateExtractEMailFromAddress() {
return getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, KFSParameterKeyConstants.PdpExtractBatchParameters.IMMEDIATE_EXTRACT_FROM_ADDRESS_PARM_NM);
}
/**
* Returns the value of the KFS-TEM / Document / IMMEDIATE_EXTRACT_NOTIFICATION_TO_EMAIL_ADDRESSES parameter
* @see org.kuali.kfs.sys.document.PaymentSource#getImmediateExtractEmailToAddresses()
*/
@Override
public List<String> getImmediateExtractEmailToAddresses() {
List<String> toAddresses = new ArrayList<String>();
toAddresses.addAll(getParameterService().getParameterValuesAsString(TemParameterConstants.TEM_DOCUMENT.class, KFSParameterKeyConstants.PdpExtractBatchParameters.IMMEDIATE_EXTRACT_TO_ADDRESSES_PARM_NM));
return toAddresses;
}
/**
* Returns RCCA. But not TCCA or TAVA.
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#getAchCheckDocumentType(org.kuali.kfs.sys.document.PaymentSource)
*/
@Override
public String getAchCheckDocumentType(TEMReimbursementDocument paymentSource) {
return TemConstants.TravelDocTypes.REIMBURSABLE_CORPORATE_CARD_CHECK_ACH_DOCUMENT;
}
/**
* This extraction service handles RCCA payment details
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#handlesAchCheckDocumentType(java.lang.String)
*/
@Override
public boolean handlesAchCheckDocumentType(String achCheckDocumentType) {
return StringUtils.equals(TemConstants.TravelDocTypes.REIMBURSABLE_CORPORATE_CARD_CHECK_ACH_DOCUMENT, achCheckDocumentType);
}
/**
* Determines if the payment would be 0 - if it's greater than that, it should be extracted
* @see org.kuali.kfs.sys.batch.service.PaymentSourceToExtractService#shouldExtractPayment(org.kuali.kfs.sys.document.PaymentSource)
*/
@Override
public boolean shouldExtractPayment(TEMReimbursementDocument paymentSource) {
return KualiDecimal.ZERO.isLessThan(getPaymentAmount(paymentSource));
}
public ParameterService getParameterService() {
return parameterService;
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
public DocumentService getDocumentService() {
return documentService;
}
public void setDocumentService(DocumentService documentService) {
this.documentService = documentService;
}
public TravelDocumentDao getTravelDocumentDao() {
return travelDocumentDao;
}
public void setTravelDocumentDao(TravelDocumentDao travelDocumentDao) {
this.travelDocumentDao = travelDocumentDao;
}
public PaymentSourceHelperService getPaymentSourceHelperService() {
return paymentSourceHelperService;
}
public void setPaymentSourceHelperService(PaymentSourceHelperService paymentSourceHelperService) {
this.paymentSourceHelperService = paymentSourceHelperService;
}
public TravelPaymentsHelperService getTravelPaymentsHelperService() {
return travelPaymentsHelperService;
}
public void setTravelPaymentsHelperService(TravelPaymentsHelperService travelPaymentsHelperService) {
this.travelPaymentsHelperService = travelPaymentsHelperService;
}
public BusinessObjectService getBusinessObjectService() {
return businessObjectService;
}
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public VendorService getVendorService() {
return vendorService;
}
public void setVendorService(VendorService vendorService) {
this.vendorService = vendorService;
}
}