/*
* 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.ar.service.impl;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomer;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerAddress;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerCreditMemo;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoiceDetail;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoiceRecurrenceDetails;
import org.kuali.kfs.integration.ar.AccountsReceivableCustomerType;
import org.kuali.kfs.integration.ar.AccountsReceivableDocumentHeader;
import org.kuali.kfs.integration.ar.AccountsReceivableModuleService;
import org.kuali.kfs.integration.ar.AccountsReceivableOrganizationOptions;
import org.kuali.kfs.integration.ar.AccountsReceivableSystemInformation;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAgency;
import org.kuali.kfs.module.ar.ArPropertyConstants.CustomerTypeFields;
import org.kuali.kfs.module.ar.businessobject.Customer;
import org.kuali.kfs.module.ar.businessobject.CustomerAddress;
import org.kuali.kfs.module.ar.businessobject.CustomerCreditMemoDetail;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceRecurrenceDetails;
import org.kuali.kfs.module.ar.businessobject.CustomerType;
import org.kuali.kfs.module.ar.businessobject.OrganizationOptions;
import org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
import org.kuali.kfs.module.ar.document.service.AccountsReceivableDocumentHeaderService;
import org.kuali.kfs.module.ar.document.service.AccountsReceivablePendingEntryService;
import org.kuali.kfs.module.ar.document.service.CustomerAddressService;
import org.kuali.kfs.module.ar.document.service.CustomerCreditMemoDetailService;
import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDetailService;
import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService;
import org.kuali.kfs.module.ar.document.service.CustomerService;
import org.kuali.kfs.module.ar.document.service.SystemInformationService;
import org.kuali.kfs.module.ar.service.CustomerDocumentService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy;
import org.kuali.kfs.sys.service.FinancialSystemUserService;
import org.kuali.kfs.sys.service.NonTransactional;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.lookup.Lookupable;
import org.kuali.rice.krad.UserSession;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.document.Document;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.service.KualiModuleService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* The KFS AR module implementation of the AccountsReceivableModuleService
*/
public class AccountsReceivableModuleServiceImpl implements AccountsReceivableModuleService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountsReceivableModuleServiceImpl.class);
protected AccountsReceivableDocumentHeaderService accountsReceivableDocumentHeaderService;
protected AccountsReceivablePendingEntryService accountsReceivablePendingEntryService;
protected BusinessObjectService businessObjectService;
protected CustomerCreditMemoDetailService customerCreditMemoDetailService;
protected CustomerDocumentService customerDocumentService;
protected CustomerInvoiceDetailService customerInvoiceDetailService;
protected CustomerInvoiceDocumentService customerInvoiceDocumentService;
protected Lookupable customerLookupable;
protected CustomerService customerService;
protected CustomerAddressService customerAddressService;
protected DocumentService documentService;
protected ElectronicPaymentClaimingDocumentGenerationStrategy electronicPaymentClaimingDocumentGenerationStrategy;
protected FinancialSystemUserService financialSystemUserService;
protected KualiModuleService kualiModuleService;
protected ParameterService parameterService;
protected SystemInformationService systemInformationService;
public CustomerAddressService getCustomerAddressService() {
return customerAddressService;
}
public void setCustomerAddressService(CustomerAddressService customerAddressService) {
this.customerAddressService = customerAddressService;
}
public CustomerCreditMemoDetailService getCustomerCreditMemoDetailService() {
return customerCreditMemoDetailService;
}
public void setCustomerCreditMemoDetailService(CustomerCreditMemoDetailService customerCreditMemoDetailService) {
this.customerCreditMemoDetailService = customerCreditMemoDetailService;
}
public SystemInformationService getSystemInformationService() {
return systemInformationService;
}
public void setSystemInformationService(SystemInformationService systemInformationService) {
this.systemInformationService = systemInformationService;
}
/**
* Gets the customerInvoiceDetailService attribute.
*
* @return Returns the customerInvoiceDetailService.
*/
public CustomerInvoiceDetailService getCustomerInvoiceDetailService() {
return customerInvoiceDetailService;
}
/**
* Sets the customerInvoiceDetailService attribute value.
*
* @param customerInvoiceDetailService The customerInvoiceDetailService to set.
*/
public void setCustomerInvoiceDetailService(CustomerInvoiceDetailService customerInvoiceDetailService) {
this.customerInvoiceDetailService = customerInvoiceDetailService;
}
public CustomerService getCustomerService() {
return customerService;
}
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
public void setCustomerInvoiceDocumentService(CustomerInvoiceDocumentService customerInvoiceDocumentService) {
this.customerInvoiceDocumentService = customerInvoiceDocumentService;
}
/**
* Sets the accountsReceivableDocumentHeaderService attribute value.
*
* @param accountsReceivableDocumentHeaderService The accountsReceivableDocumentHeaderService to set.
*/
public void setAccountsReceivableDocumentHeaderService(AccountsReceivableDocumentHeaderService accountsReceivableDocumentHeaderService) {
this.accountsReceivableDocumentHeaderService = accountsReceivableDocumentHeaderService;
}
public ParameterService getParameterService() {
return parameterService;
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
public CustomerDocumentService getCustomerDocumentService() {
return customerDocumentService;
}
public void setCustomerDocumentService(CustomerDocumentService customerDocumentService) {
this.customerDocumentService = customerDocumentService;
}
public void setCustomerLookupable(Lookupable customerLookupable) {
this.customerLookupable = customerLookupable;
}
public KualiModuleService getKualiModuleService() {
return kualiModuleService;
}
public BusinessObjectService getBusinessObjectService() {
return businessObjectService;
}
public DocumentService getDocumentService() {
return documentService;
}
/**
* Sets the documentService attribute value.
*
* @param documentService The documentService to set.
*/
public void setDocumentService(DocumentService documentService) {
this.documentService = documentService;
}
/**
* @see org.kuali.kfs.integration.service.AccountsReceivableModuleService#getAccountsReceivablePaymentClaimingStrategy()
*/
@Override
public ElectronicPaymentClaimingDocumentGenerationStrategy getAccountsReceivablePaymentClaimingStrategy() {
return electronicPaymentClaimingDocumentGenerationStrategy;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#searchForCustomers(java.util.Map)
*/
@Override
public Collection<AccountsReceivableCustomer> searchForCustomers(Map<String, String> fieldValues) {
customerLookupable.setBusinessObjectClass(Customer.class);
List<? extends BusinessObject> results = customerLookupable.getSearchResults(fieldValues);
Collection<AccountsReceivableCustomer> customers = new ArrayList<AccountsReceivableCustomer>();
for (BusinessObject result : results) {
customers.add((AccountsReceivableCustomer) result);
}
return customers;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#findCustomer(java.lang.String)
*/
@Override
public AccountsReceivableCustomer findCustomer(String customerNumber) {
Map<String, Object> primaryKey = new HashMap<String, Object>();
primaryKey.put(KFSPropertyConstants.CUSTOMER_NUMBER, customerNumber);
Customer customer = getKualiModuleService().getResponsibleModuleService(Customer.class).getExternalizableBusinessObject(Customer.class, primaryKey);
return customer;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#searchForCustomerAddresses(java.util.Map)
*/
@Override
public Collection<AccountsReceivableCustomerAddress> searchForCustomerAddresses(Map<String, String> fieldValues) {
Collection<AccountsReceivableCustomerAddress> arCustomerAddresses = new ArrayList<AccountsReceivableCustomerAddress>();
Collection<CustomerAddress> customerAddresses = getBusinessObjectService().findMatching(CustomerAddress.class, fieldValues);
for (CustomerAddress customerAddress : customerAddresses){
arCustomerAddresses.add(customerAddress);
}
return arCustomerAddresses;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#findCustomerAddress(java.lang.String)
*/
@Override
public AccountsReceivableCustomerAddress findCustomerAddress(String customerNumber, String customerAddressIdentifer) {
Map<String, String> addressKey = new HashMap<String, String>();
addressKey.put(KFSPropertyConstants.CUSTOMER_NUMBER, customerNumber);
addressKey.put(KFSPropertyConstants.CUSTOMER_ADDRESS_IDENTIFIER, customerAddressIdentifer);
return getBusinessObjectService().findByPrimaryKey(CustomerAddress.class, addressKey);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getOpenCustomerInvoice(java.lang.String)
*/
@Override
public AccountsReceivableCustomerInvoice getOpenCustomerInvoice(String customerInvoiceDocumentNumber) {
return getBusinessObjectService().findBySinglePrimaryKey(CustomerInvoiceDocument.class, customerInvoiceDocumentNumber);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getCustomerInvoiceOpenAmount(java.util.List, java.lang.Integer, java.sql.Date)
*/
@Override
public Map<String, KualiDecimal> getCustomerInvoiceOpenAmount(List<String> customerTypeCodes, Integer customerInvoiceAge, Date invoiceDueDateFrom) {
Map<String, KualiDecimal> customerInvoiceOpenAmountMap = new HashMap<String, KualiDecimal>();
Collection<? extends AccountsReceivableCustomerInvoice> customerInvoiceDocuments = this.getOpenCustomerInvoices(customerTypeCodes, customerInvoiceAge, invoiceDueDateFrom);
if (ObjectUtils.isNull(customerInvoiceDocuments)) {
return customerInvoiceOpenAmountMap;
}
for (AccountsReceivableCustomerInvoice invoiceDocument : customerInvoiceDocuments) {
KualiDecimal openAmount = invoiceDocument.getOpenAmount();
if (ObjectUtils.isNotNull(openAmount) && openAmount.isPositive()) {
customerInvoiceOpenAmountMap.put(invoiceDocument.getDocumentNumber(), openAmount);
}
}
return customerInvoiceOpenAmountMap;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getOpenCustomerInvoices(java.util.List, java.lang.Integer, java.sql.Date)
*/
@Override
public Collection<? extends AccountsReceivableCustomerInvoice> getOpenCustomerInvoices(List<String> customerTypeCodes, Integer customerInvoiceAge, Date invoiceDueDateFrom) {
return customerInvoiceDocumentService.getAllAgingInvoiceDocumentsByCustomerTypes(customerTypeCodes, customerInvoiceAge, invoiceDueDateFrom);
}
/**
*
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#cancelInvoicesForTrip(java.lang.String)
*/
@Override
public void cancelInvoicesForTrip(String tripId, AccountsReceivableOrganizationOptions organizationOptions) {
for (CustomerInvoiceDocument invoice : getInvoicesForTrip(tripId)) {
final CustomerCreditMemoDocument creditMemo = createCreditMemoForTripInvoice(invoice, tripId, organizationOptions);
blanketApproveCreditMemoForTripInvoice(creditMemo, tripId);
}
}
/**
* Finds all the customer invoice documents associated with the given trip id
* @param tripId the trip id to find customer invoice documetns for
* @return a Collection of invoice documents
*/
protected Collection<CustomerInvoiceDocument> getInvoicesForTrip(String tripId) {
Map<String, String> query = new HashMap<String, String>();
query.put(KFSPropertyConstants.DOCUMENT_HEADER+"."+KFSPropertyConstants.ORGANIZATION_DOCUMENT_NUMBER, tripId);
return getBusinessObjectService().findMatching(CustomerInvoiceDocument.class, query);
}
/**
* Creates a credit memo to reverse the effects of a customer invoice that paid off an advance
* @param invoice the invoice to reverse
* @param tripId the trip id of the trip to reverse
* @param organizationOptions the organization options from the travel module
* @return a CustomerCreditMemo document which will reverse the effect the given invoice
*/
protected CustomerCreditMemoDocument createCreditMemoForTripInvoice(CustomerInvoiceDocument invoice, String tripId, AccountsReceivableOrganizationOptions organizationOptions) {
CustomerCreditMemoDocument creditMemo;
try {
creditMemo = (CustomerCreditMemoDocument)getDocumentService().getNewDocument(CustomerCreditMemoDocument.class);
}
catch (WorkflowException we) {
throw new RuntimeException("Could not create Customer Credit Memo for trip invoice, trip: "+tripId+"; invoice document #"+invoice.getDocumentNumber(), we);
}
AccountsReceivableDocumentHeader arDocHeader = accountsReceivableDocumentHeaderService.getNewAccountsReceivableDocumentHeader(organizationOptions.getProcessingChartOfAccountCode(), organizationOptions.getProcessingOrganizationCode());
arDocHeader.setDocumentNumber(creditMemo.getDocumentNumber());
arDocHeader.setCustomerNumber(invoice.getAccountsReceivableDocumentHeader().getCustomerNumber());
creditMemo.setAccountsReceivableDocumentHeader(arDocHeader);
creditMemo.getFinancialSystemDocumentHeader().setDocumentDescription(invoice.getDocumentHeader().getDocumentDescription());
creditMemo.getFinancialSystemDocumentHeader().setOrganizationDocumentNumber(tripId);
populateCustomerCreditMemoDocumentDetails(creditMemo, invoice.getDocumentNumber(), invoice.getTotalDollarAmount());
return creditMemo;
}
/**
* Blanket approves the given credit memo as the KFS system user
* @param creditMemo the credit memo to blanket approve
* @param tripId the trip id of the credit memo
*/
protected void blanketApproveCreditMemoForTripInvoice(final CustomerCreditMemoDocument creditMemo, final String tripId) {
final String blanketApproveAnnotation= String.format("Blanket Approved CRM Doc # %s by Trip ID # %s", creditMemo.getDocumentNumber(), tripId);
try {
GlobalVariables.doInNewGlobalVariables(new UserSession(KFSConstants.SYSTEM_USER), new Callable<Object>() {
/**
* Blanket approves the credit memo
* @see java.util.concurrent.Callable#call()
*/
@Override
public Object call() {
try {
blanketApproveCustomerCreditMemoDocument(creditMemo, blanketApproveAnnotation);
return null;
} catch (WorkflowException we) {
throw new RuntimeException("Could not blanket approve credit memo (doc #"+creditMemo.getDocumentNumber()+")to reverse invoice for trip: "+tripId, we);
}
}});
} catch (Exception e) {
throw new RuntimeException("Could not blanket approve credit memo (doc #"+creditMemo.getDocumentNumber()+")to reverse invoice for trip: "+tripId, e);
}
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createCustomer()
*/
@Override
public AccountsReceivableCustomer createCustomer() {
return new Customer();
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createCustomerAddress()
*/
@Override
public AccountsReceivableCustomerAddress createCustomerAddress() {
return new CustomerAddress();
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getNextCustomerNumber(org.kuali.kfs.integration.ar.AccountsReceivableCustomer)
*/
@Override
public String getNextCustomerNumber(AccountsReceivableCustomer customer) {
return customerService.getNextCustomerNumber((Customer) customer);
}
@Override
public String createAndSaveCustomer(String description, ContractsAndGrantsBillingAgency agency) throws WorkflowException {
return customerDocumentService.createAndSaveCustomer(description, agency);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#saveCustomer(org.kuali.kfs.integration.ar.AccountsReceivableCustomer)
*/
@Override
public void saveCustomer(AccountsReceivableCustomer customer) {
getBusinessObjectService().save((Customer) customer);
}
/*
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#findByCustomerTypeDescription(java.lang.String)
*/
@Override
public List<AccountsReceivableCustomerType> findByCustomerTypeDescription(String customerTypeDescription) {
Map<String, String> fieldMap = new HashMap<String, String>();
fieldMap.put(CustomerTypeFields.CUSTOMER_TYPE_DESC, customerTypeDescription);
List<AccountsReceivableCustomerType> arCustomerTypes = new ArrayList<AccountsReceivableCustomerType>();
Collection<CustomerType> customerTypes = getBusinessObjectService().findMatching(CustomerType.class, fieldMap);
for (CustomerType customerType : customerTypes){
arCustomerTypes.add(customerType);
}
return arCustomerTypes;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getOrgOptionsIfExists(java.lang.String, java.lang.String)
*/
@Override
public AccountsReceivableOrganizationOptions getOrgOptionsIfExists(String chartOfAccountsCode, String organizationCode) {
Map<String, String> criteria = new HashMap<String, String>();
criteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
criteria.put(KFSPropertyConstants.ORGANIZATION_CODE, organizationCode);
return getBusinessObjectService().findByPrimaryKey(OrganizationOptions.class, criteria);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#saveCustomerInvoiceDocument(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice)
*/
@Override
public void saveCustomerInvoiceDocument(AccountsReceivableCustomerInvoice customerInvoiceDocument) throws WorkflowException {
getDocumentService().saveDocument((CustomerInvoiceDocument) customerInvoiceDocument);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#blanketApproveCustomerInvoiceDocument(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice)
*/
@Override
public Document blanketApproveCustomerInvoiceDocument(AccountsReceivableCustomerInvoice customerInvoiceDocument) throws WorkflowException {
return getDocumentService().blanketApproveDocument((CustomerInvoiceDocument) customerInvoiceDocument, null, null);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createCustomerInvoiceRecurrenceDetails()
*/
@Override
public AccountsReceivableCustomerInvoiceRecurrenceDetails createCustomerInvoiceRecurrenceDetails() {
return new CustomerInvoiceRecurrenceDetails();
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createAccountsReceivableDocumentHeader()
*/
@Override
public AccountsReceivableDocumentHeader createAccountsReceivableDocumentHeader() {
return new org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader();
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getSystemInformationByProcessingChartOrgAndFiscalYear(java.lang.String, java.lang.String, java.lang.Integer)
*/
@Override
public AccountsReceivableSystemInformation getSystemInformationByProcessingChartOrgAndFiscalYear(String chartOfAccountsCode, String organizationCode, Integer currentFiscalYear) {
return systemInformationService.getByProcessingChartOrgAndFiscalYear(chartOfAccountsCode, organizationCode, currentFiscalYear);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getCustomerInvoiceDetailFromCustomerInvoiceItemCode(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public AccountsReceivableCustomerInvoiceDetail getCustomerInvoiceDetailFromCustomerInvoiceItemCode(String invoiceItemCode, String processingChartCode, String processingOrgCode) {
return customerInvoiceDetailService.getCustomerInvoiceDetailFromCustomerInvoiceItemCode(invoiceItemCode, processingChartCode, processingOrgCode);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getAccountsReceivableObjectCodeBasedOnReceivableParameter(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoiceDetail)
*/
@Override
public String getAccountsReceivableObjectCodeBasedOnReceivableParameter(AccountsReceivableCustomerInvoiceDetail customerInvoiceDetail) {
return getAccountsReceivablePendingEntryService().getAccountsReceivableObjectCode((CustomerInvoiceDetail) customerInvoiceDetail);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#recalculateCustomerInvoiceDetail(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice, org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoiceDetail)
*/
@Override
public void recalculateCustomerInvoiceDetail(AccountsReceivableCustomerInvoice customerInvoiceDocument, AccountsReceivableCustomerInvoiceDetail detail) {
customerInvoiceDetailService.recalculateCustomerInvoiceDetail((CustomerInvoiceDocument) customerInvoiceDocument, (CustomerInvoiceDetail) detail);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#prepareCustomerInvoiceDetailForAdd(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoiceDetail, org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice)
*/
@Override
public void prepareCustomerInvoiceDetailForAdd(AccountsReceivableCustomerInvoiceDetail detail, AccountsReceivableCustomerInvoice customerInvoiceDocument) {
customerInvoiceDetailService.prepareCustomerInvoiceDetailForAdd((CustomerInvoiceDetail) detail, (CustomerInvoiceDocument) customerInvoiceDocument);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getOpenAmountForCustomerInvoiceDocument(org.kuali.kfs.integration.ar.AccountsReceivableCustomerInvoice)
*/
@Override
public KualiDecimal getOpenAmountForCustomerInvoiceDocument(AccountsReceivableCustomerInvoice invoice) {
return customerInvoiceDocumentService.getOpenAmountForCustomerInvoiceDocument((CustomerInvoiceDocument) invoice);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getOpenInvoiceDocumentsByCustomerNumberForTrip(java.lang.String, java.lang.String)
*/
@Override
public Collection<AccountsReceivableCustomerInvoice> getOpenInvoiceDocumentsByCustomerNumberForTrip(String customerNumber, String travelDocId) {
Collection<AccountsReceivableCustomerInvoice> invoices = new ArrayList<AccountsReceivableCustomerInvoice>();
Collection<CustomerInvoiceDocument> result = customerInvoiceDocumentService.getOpenInvoiceDocumentsByCustomerNumber(customerNumber);
// if the trip id is not blank, perform a comparison with the Org Doc Num, otherwise add the entire collection into the result
if (StringUtils.isNotBlank(travelDocId)){
for (CustomerInvoiceDocument invoice : result){
if (invoice.getDocumentHeader().getOrganizationDocumentNumber().equals(travelDocId)){
invoices.add(invoice);
}
}
}else{
invoices.addAll(result);
}
return invoices;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#getNewAccountsReceivableDocumentHeader(java.lang.String, java.lang.String)
*/
@Override
public AccountsReceivableDocumentHeader getNewAccountsReceivableDocumentHeader(String processingChart, String processingOrg) {
return accountsReceivableDocumentHeaderService.getNewAccountsReceivableDocumentHeader(processingChart, processingOrg);
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createCustomerInvoiceDocument()
*/
@Override
public AccountsReceivableCustomerInvoice createCustomerInvoiceDocument() {
try {
return (CustomerInvoiceDocument) getDocumentService().getNewDocument(CustomerInvoiceDocument.class);
}
catch (WorkflowException ex) {
LOG.error("problem during AccountsReceivableModuleServiceImpl.createCustomerInvoiceDocument()", ex);
throw new RuntimeException("Could not create customer invoice document", ex);
}
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#createCustomerCreditMemoDocument()
*/
@Override
public AccountsReceivableCustomerCreditMemo createCustomerCreditMemoDocument() {
CustomerCreditMemoDocument crmDocument = new CustomerCreditMemoDocument();
try {
crmDocument = (CustomerCreditMemoDocument)getDocumentService().getNewDocument(CustomerCreditMemoDocument.class);
}
catch (WorkflowException ex) {
LOG.error("problem during AccountsReceivableModuleServiceImpl.createCustomerCreditMemoDocument()", ex);
throw new RuntimeException("Could not create new customer credit memo document", ex);
}
return crmDocument;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#populateCustomerCreditMemoDocumentDetails(org.kuali.kfs.integration.ar.AccountsReceivableCustomerCreditMemo, java.lang.String, org.kuali.rice.kns.util.KualiDecimal)
*/
@Override
public AccountsReceivableCustomerCreditMemo populateCustomerCreditMemoDocumentDetails(AccountsReceivableCustomerCreditMemo arCrmDocument, String invoiceNumber, KualiDecimal creditAmount) {
CustomerCreditMemoDocument crmDocument = (CustomerCreditMemoDocument)arCrmDocument;
//set invoice number
crmDocument.setFinancialDocumentReferenceInvoiceNumber(invoiceNumber);
//force to refresh invoice;
crmDocument.getInvoice();
crmDocument.populateCustomerCreditMemoDetails();
//update the amount on the credit memo detail, there should only be one item for Travel item so we will update that amount
CustomerCreditMemoDetail detail = crmDocument.getCreditMemoDetails().get(0);
detail.setCreditMemoItemTotalAmount(creditAmount);
customerCreditMemoDetailService.recalculateCustomerCreditMemoDetail(detail, crmDocument);
return crmDocument;
}
/**
* @see org.kuali.kfs.integration.ar.AccountsReceivableModuleService#blanketApproveCustomerCreditMemoDocument(org.kuali.kfs.integration.ar.AccountsReceivableCustomerCreditMemo, java.lang.String)
*/
@Override
public Document blanketApproveCustomerCreditMemoDocument(AccountsReceivableCustomerCreditMemo creditMemoDocument, String annotation) throws WorkflowException {
return getDocumentService().blanketApproveDocument((CustomerCreditMemoDocument)creditMemoDocument, annotation, null);
}
/**
* Sets the kualiModuleService attribute value.
*
* @param kualiModuleService The kualiModuleService to set.
*/
@NonTransactional
public void setKualiModuleService(KualiModuleService kualiModuleService) {
this.kualiModuleService = kualiModuleService;
}
/**
* Sets the businessObjectService attribute value.
*
* @param businessObjectService The businessObjectService to set.
*/
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public FinancialSystemUserService getFinancialSystemUserService() {
return financialSystemUserService;
}
public void setFinancialSystemUserService(FinancialSystemUserService financialSystemUserService) {
this.financialSystemUserService = financialSystemUserService;
}
public ElectronicPaymentClaimingDocumentGenerationStrategy getElectronicPaymentClaimingDocumentGenerationStrategy() {
return electronicPaymentClaimingDocumentGenerationStrategy;
}
public void setElectronicPaymentClaimingDocumentGenerationStrategy(ElectronicPaymentClaimingDocumentGenerationStrategy electronicPaymentClaimingDocumentGenerationStrategy) {
this.electronicPaymentClaimingDocumentGenerationStrategy = electronicPaymentClaimingDocumentGenerationStrategy;
}
public AccountsReceivablePendingEntryService getAccountsReceivablePendingEntryService() {
return accountsReceivablePendingEntryService;
}
public void setAccountsReceivablePendingEntryService(AccountsReceivablePendingEntryService accountsReceivablePendingEntryService) {
this.accountsReceivablePendingEntryService = accountsReceivablePendingEntryService;
}
}