/*
* 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.fixture;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader;
import org.kuali.kfs.module.ar.businessobject.CustomerAddress;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
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.CustomerInvoiceDocumentService;
import org.kuali.kfs.sys.DocumentTestUtils;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kew.api.WorkflowDocument;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.krad.bo.DocumentHeader;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.ObjectUtils;
public enum CustomerInvoiceDocumentFixture {
BASE_CIDOC_NO_CUSTOMER(null, // customerNumber
"UA", // processingChartOfAccountsCode
"VPIT", // processingOrganizationCode
null,
null, //billByChartOfAccountsCode
null //billedByOrganizationCode
),
BASE_CIDOC_WITH_CUSTOMER("ABB2", // customerNumber
"UA", // processingChartOfAccountsCode
"VPIT", // processingOrganizationCode
null, null, null),
BASE_CIDOC_WITH_CUSTOMER_WITH_BILLING_INFO("ABB2", // customerNumber
"UA", // processingChartOfAccountsCode
"VPIT", // processingOrganizationCode
null,
"UA", //billByChartOfAccountsCode
"VPIT" //billedByOrganizationCode
),
REVERSAL_CIDOC("ABB2", // customerNumber
"UA", // processingChartOfAccountsCode
"VPIT", // processingOrganizationCode
"123456", null, null);
public String customerNumber;
public String processingChartOfAccountsCode;
public String processingOrganizationCode;
public String financialDocumentInErrorNumber;
public String billByChartOfAccountsCode;
public String billedByOrganizationCode;
private CustomerInvoiceDocumentFixture( String customerNumber, String processingChartOfAccountsCode, String processingOrganizationCode, String financialDocumentInErrorNumber, String billByChartOfAccountsCode, String billedByOrganizationCode ){
this.customerNumber = customerNumber;
this.processingOrganizationCode = processingOrganizationCode;
this.processingChartOfAccountsCode = processingChartOfAccountsCode;
this.financialDocumentInErrorNumber = financialDocumentInErrorNumber;
this.billByChartOfAccountsCode = billByChartOfAccountsCode;
this.billedByOrganizationCode = billedByOrganizationCode;
}
/**
* This method creates a customer invoice document based on the passed in customer fixture and customer invoice detail fixture array
*
* @param customerFixture
* @param customerInvoiceDetailFixtures
* @return
*/
public CustomerInvoiceDocument createCustomerInvoiceDocument(CustomerFixture customerFixture, CustomerInvoiceDetailFixture[] customerInvoiceDetailFixtures) throws WorkflowException {
CustomerInvoiceDocument customerInvoiceDocument = createCustomerInvoiceDocument( customerInvoiceDetailFixtures );
customerInvoiceDocument.getAccountsReceivableDocumentHeader().setCustomerNumber(customerFixture.customerNumber);
return customerInvoiceDocument;
}
/**
* This method creates a customer invoice document based on the passed in customer fixture and customer invoice detail fixture array
*
* @param customerInvoiceDetailFixtures
* @return
*/
public CustomerInvoiceDocument createCustomerInvoiceDocument(CustomerInvoiceDetailFixture[] customerInvoiceDetailFixtures) throws WorkflowException {
CustomerInvoiceDocument customerInvoiceDocument = null;
try {
customerInvoiceDocument = DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), CustomerInvoiceDocument.class);
}
catch (WorkflowException e) {
throw new RuntimeException("Document creation failed.");
}
// Just verify the workflow pieces
DocumentHeader documentHeader = customerInvoiceDocument.getDocumentHeader();
WorkflowDocument workflowDocument = documentHeader.getWorkflowDocument();
//probably should change this to use values set in fixture
SpringContext.getBean(CustomerInvoiceDocumentService.class).setupDefaultValuesForNewCustomerInvoiceDocument(customerInvoiceDocument);
customerInvoiceDocument.getFinancialSystemDocumentHeader().setFinancialDocumentInErrorNumber(financialDocumentInErrorNumber);
if( StringUtils.isNotEmpty(billByChartOfAccountsCode)){
customerInvoiceDocument.setBillByChartOfAccountCode(billByChartOfAccountsCode);
}
if( StringUtils.isNotEmpty(billedByOrganizationCode)){
customerInvoiceDocument.setBilledByOrganizationCode(billedByOrganizationCode);
}
// this is a little hacky, as some of these dont even have a customer attached,
// but these are required fields now
//customerInvoiceDocument.setCustomerBillToAddressIdentifier(1);
//customerInvoiceDocument.setCustomerShipToAddressIdentifier(1);
//set AR doc Header
AccountsReceivableDocumentHeader arDocHeader = null;
if(ObjectUtils.isNull(customerInvoiceDocument.getAccountsReceivableDocumentHeader())) {
arDocHeader = new AccountsReceivableDocumentHeader();
customerInvoiceDocument.setAccountsReceivableDocumentHeader(arDocHeader);
} else {
arDocHeader = customerInvoiceDocument.getAccountsReceivableDocumentHeader();
}
arDocHeader.setCustomerNumber(customerNumber);
arDocHeader.setProcessingChartOfAccountCode( processingChartOfAccountsCode );
arDocHeader.setProcessingOrganizationCode( processingOrganizationCode );
arDocHeader.setDocumentNumber(customerInvoiceDocument.getDocumentNumber());
//customerInvoiceDocument.setAccountsReceivableDocumentHeader(arDocHeader);
// refresh to set the Customer on the arDocHeader so setaddressoninvoice doesn't throw an NPE
arDocHeader.refresh();
CustomerAddressService customerAddressService = SpringContext.getBean(CustomerAddressService.class);
CustomerAddress customerShipToAddress = customerAddressService.getPrimaryAddress(customerNumber);
CustomerAddress customerBillToAddress = customerShipToAddress;
if (ObjectUtils.isNotNull(customerShipToAddress)) {
customerInvoiceDocument.setCustomerShipToAddress(customerShipToAddress);
customerInvoiceDocument.setCustomerShipToAddressOnInvoice(customerShipToAddress);
customerInvoiceDocument.setCustomerShipToAddressIdentifier(customerShipToAddress.getCustomerAddressIdentifier());
customerInvoiceDocument.setCustomerBillToAddress(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(customerBillToAddress.getCustomerAddressIdentifier());
}
AccountsReceivablePendingEntryService accountsReceivablePendingEntryService = SpringContext.getBean(AccountsReceivablePendingEntryService.class);
//associated customer invoice detail fixtures with invoice document
if ( customerInvoiceDetailFixtures != null ){
for (CustomerInvoiceDetailFixture customerInvoiceDetailFixture : customerInvoiceDetailFixtures) {
CustomerInvoiceDetail detail = customerInvoiceDetailFixture.addTo(customerInvoiceDocument);
// FIXME Set the accountsReceivableObjectCode
String accountsReceivableObjectCode = accountsReceivablePendingEntryService.getAccountsReceivableObjectCode(detail);
detail.setAccountsReceivableObjectCode(accountsReceivableObjectCode);
}
}
//customerInvoiceDocument.refreshReferenceObject("paymentFinancialObject");
//customerInvoiceDocument.getPaymentFinancialObject().refresh();
SpringContext.getBean(DocumentService.class).saveDocument(customerInvoiceDocument);
customerInvoiceDocument = (CustomerInvoiceDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(customerInvoiceDocument.getDocumentNumber());
return customerInvoiceDocument;
}
}