/*
* 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.core;
import java.util.List;
import junit.framework.Assert;
import org.kuali.kfs.fp.businessobject.SalesTax;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.module.ar.businessobject.InvoicePaidApplied;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDetailService;
import org.kuali.kfs.module.ar.fixture.CustomerInvoiceDetailFixture;
import org.kuali.kfs.module.ar.fixture.CustomerInvoiceDocumentFixture;
import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AmountTotaling;
import org.kuali.kfs.sys.document.workflow.WorkflowTestUtils;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.document.DocumentStatus;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.ObjectUtils;
public class ArCoreTestUtils extends Assert {
private static DocumentService documentService;
private static CustomerInvoiceDetailService invoiceDetailService;
static {
documentService = SpringContext.getBean(DocumentService.class);
invoiceDetailService = SpringContext.getBean(CustomerInvoiceDetailService.class);
}
protected static void confirmCustomerInvoiceValid(CustomerInvoiceDocument invoice, KualiDecimal expectedOpenAmount, KualiDecimal expectedTotalAmount,
int numDiscounts, boolean isReversal, boolean isOpen, List<InvoiceDetailExpecteds> expecteds) {
invoice.updateDiscountAndParentLineReferences();
assertTrue("Document should be Final", invoice.getDocumentHeader().getWorkflowDocument().isFinal());
assertEquals("OpenAmount wrong.", expectedOpenAmount, invoice.getOpenAmount());
assertEquals("TotalAmount wrong.", expectedTotalAmount, invoice.getTotalDollarAmount());
assertEquals("Discounts wrong size.", numDiscounts, invoice.getDiscounts().size());
assertEquals("IsReversal wrong.", isReversal, invoice.isInvoiceReversal());
assertEquals("IsOpen wrong.", isOpen, invoice.isOpenInvoiceIndicator());
int x = 0;
for (CustomerInvoiceDetail detail : invoice.getCustomerInvoiceDetailsWithoutDiscounts()) {
assertEquals("Amount wrong.", expecteds.get(x).getAmount(), detail.getAmount());
assertEquals("AmountDiscounted wrong.", expecteds.get(x).getAmountDiscounted(), detail.getAmountDiscounted());
assertEquals("AmountOpen wrong.", expecteds.get(x).getAmountOpen(), detail.getAmountOpen());
assertEquals("WriteoffAmount wrong.", expecteds.get(x).getAmountOpen(), detail.getWriteoffAmount());
assertEquals("Details tested here should never be discount lines.", false, detail.isDiscountLine());
assertEquals("Details tested here should never be discount lines.", expecteds.get(x).isDiscounted(), detail.isDiscountLineParent());
assertEquals("Should be non-null when discounted lines.", expecteds.get(x).isDiscounted(), (detail.getDiscountCustomerInvoiceDetail() != null));
assertNull("Should always be null since we only have non-discount lines.", detail.getParentDiscountCustomerInvoiceDetail());
assertEquals("", expecteds.get(x).isDiscounted(), (detail.getInvoiceItemDiscountLineNumber() != null));
List<InvoicePaidApplied> paidApplieds = detail.getMatchingInvoicePaidAppliedsMatchingAnyDocumentFromDatabase();
List<KualiDecimal> expectedApplieds = expecteds.get(x).getPaidAppliedAmounts();
assertEquals("PaidApplieds should be the right size.", expectedApplieds.size(), paidApplieds.size());
int y = 0;
for (KualiDecimal expectedAmount : expectedApplieds) {
assertEquals("", expectedAmount, paidApplieds.get(y).getInvoiceItemAppliedAmount());
y += 1;
}
x += 1;
}
}
protected static CustomerInvoiceDocument createFinalizedInvoiceOneLine() throws Exception {
CustomerInvoiceDocument document = newInvoiceDocumentOneLine();
documentService.routeDocument(document, "Unit test routing document.", null);
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
String docNumber = document.getDocumentNumber();
document = (CustomerInvoiceDocument) documentService.getByDocumentHeaderId(docNumber);
return document;
}
protected static CustomerInvoiceDocument createFinalizedInvoiceTwoLines() throws Exception {
CustomerInvoiceDocument document = newInvoiceDocumentTwoLines();
documentService.routeDocument(document, "Unit test routing document.", null);
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
String docNumber = document.getDocumentNumber();
document = (CustomerInvoiceDocument) documentService.getByDocumentHeaderId(docNumber);
return document;
}
protected static CustomerInvoiceDocument createFinalizedInvoiceOneLineDiscounted() throws Exception {
CustomerInvoiceDocument document = newInvoiceDocumentOneLineDiscounted();
documentService.routeDocument(document, "Unit test routing document.", null);
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
String docNumber = document.getDocumentNumber();
document = (CustomerInvoiceDocument) documentService.getByDocumentHeaderId(docNumber);
return document;
}
protected static CustomerInvoiceDocument createFinalizedInvoiceTwoLinesOneIsDiscounted() throws Exception {
CustomerInvoiceDocument document = newInvoiceDocumentTwoLinesOneIsDiscounted();
documentService.routeDocument(document, "Unit test routing document.", null);
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
String docNumber = document.getDocumentNumber();
document = (CustomerInvoiceDocument) documentService.getByDocumentHeaderId(docNumber);
return document;
}
protected static CustomerInvoiceDocument createFinalizedInvoiceTwoLinesDiscounted() throws Exception {
CustomerInvoiceDocument document = newInvoiceDocumentTwoLinesDiscounted();
documentService.routeDocument(document, "Unit test routing document.", null);
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
String docNumber = document.getDocumentNumber();
document = (CustomerInvoiceDocument) documentService.getByDocumentHeaderId(docNumber);
return document;
}
protected static CustomerInvoiceDocument newInvoiceDocumentOneLine() throws WorkflowException {
CustomerInvoiceDetailFixture[] details = { CustomerInvoiceDetailFixture.ONE_THOUSAND_DOLLAR_INVOICE_DETAIL };
return CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER.createCustomerInvoiceDocument(details);
}
protected static CustomerInvoiceDocument newInvoiceDocumentTwoLines() throws WorkflowException {
CustomerInvoiceDetailFixture[] details = { CustomerInvoiceDetailFixture.ONE_THOUSAND_DOLLAR_INVOICE_DETAIL,
CustomerInvoiceDetailFixture.FIVE_HUNDRED_DOLLAR_INVOICE_DETAIL };
return CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER.createCustomerInvoiceDocument(details);
}
protected static CustomerInvoiceDocument newInvoiceDocumentOneLineDiscounted() throws WorkflowException {
CustomerInvoiceDetailFixture[] details = { CustomerInvoiceDetailFixture.ONE_THOUSAND_DOLLAR_INVOICE_DETAIL };
CustomerInvoiceDocument invoice = CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER.createCustomerInvoiceDocument(details);
invoice = addDiscountLine(invoice, 0, new KualiDecimal("-250.00"));
invoice.updateDiscountAndParentLineReferences();
return invoice;
}
protected static CustomerInvoiceDocument newInvoiceDocumentTwoLinesOneIsDiscounted() throws WorkflowException {
CustomerInvoiceDetailFixture[] details = { CustomerInvoiceDetailFixture.ONE_THOUSAND_DOLLAR_INVOICE_DETAIL,
CustomerInvoiceDetailFixture.FIVE_HUNDRED_DOLLAR_INVOICE_DETAIL };
CustomerInvoiceDocument invoice = CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER.createCustomerInvoiceDocument(details);
invoice = addDiscountLine(invoice, 0, new KualiDecimal("-250.00"));
invoice.updateDiscountAndParentLineReferences();
return invoice;
}
protected static CustomerInvoiceDocument newInvoiceDocumentTwoLinesDiscounted() throws WorkflowException {
CustomerInvoiceDetailFixture[] details = { CustomerInvoiceDetailFixture.ONE_THOUSAND_DOLLAR_INVOICE_DETAIL,
CustomerInvoiceDetailFixture.FIVE_HUNDRED_DOLLAR_INVOICE_DETAIL };
CustomerInvoiceDocument invoice = CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER.createCustomerInvoiceDocument(details);
invoice = addDiscountLine(invoice, 0, new KualiDecimal("-250.00"));
invoice = addDiscountLine(invoice, 1, new KualiDecimal("-250.00"));
invoice.updateDiscountAndParentLineReferences();
return invoice;
}
private static CustomerInvoiceDocument addDiscountLine(CustomerInvoiceDocument invoice, int seqNumberBeingDiscounted, KualiDecimal amount) {
CustomerInvoiceDetail lineBeingDiscounted = (CustomerInvoiceDetail) invoice.getSourceAccountingLine(seqNumberBeingDiscounted);
CustomerInvoiceDetail discountingLine = invoiceDetailService.getDiscountCustomerInvoiceDetailForCurrentYear(lineBeingDiscounted, invoice);
discountingLine.setAmount(amount);
discountingLine.setInvoiceItemUnitPrice(amount.bigDecimalValue());
discountingLine.refreshNonUpdateableReferences();
// add it to the document
invoice.addSourceAccountingLine(discountingLine);
// add PK fields to sales tax if needed
if (discountingLine.isSalesTaxRequired()) {
SalesTax salesTax = discountingLine.getSalesTax();
if (ObjectUtils.isNotNull(salesTax)) {
salesTax.setDocumentNumber(discountingLine.getDocumentNumber());
salesTax.setFinancialDocumentLineTypeCode(discountingLine.getFinancialDocumentLineTypeCode());
salesTax.setFinancialDocumentLineNumber(discountingLine.getSequenceNumber());
}
}
// Update the doc total
if (invoice instanceof AmountTotaling) {
((FinancialSystemDocumentHeader) invoice.getDocumentHeader()).setFinancialDocumentTotalAmount(((AmountTotaling) invoice).getTotalDollarAmount());
}
// also set parent customer invoice detail line to have discount line seq number
lineBeingDiscounted.setInvoiceItemDiscountLineNumber(discountingLine.getSequenceNumber());
return invoice;
}
protected static KualiDecimal fifteenHundred() { return new KualiDecimal("1500.00"); }
protected static KualiDecimal twelveFifty() { return new KualiDecimal("1250.00"); }
protected static KualiDecimal oneThousand() { return new KualiDecimal("1000.00"); }
protected static KualiDecimal sevenFifty() { return new KualiDecimal("750.00"); }
protected static KualiDecimal fiveHundred() { return new KualiDecimal("500.00"); }
protected static KualiDecimal twoFifty() { return new KualiDecimal("250.00"); }
}