/*
* 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.purap.document.validation.impl;
import static org.kuali.kfs.sys.fixture.UserNameFixture.appleton;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.Map;
import org.kuali.kfs.module.purap.PurapConstants.PurchaseOrderStatuses;
import org.kuali.kfs.module.purap.PurapPropertyConstants;
import org.kuali.kfs.module.purap.businessobject.CreditMemoItem;
import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
import org.kuali.kfs.module.purap.document.CreditMemoDocumentTest;
import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
import org.kuali.kfs.module.purap.document.PaymentRequestDocumentTest;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocumentTest;
import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
import org.kuali.kfs.module.purap.document.service.PurapService;
import org.kuali.kfs.module.purap.document.validation.PurapRuleTestBase;
import org.kuali.kfs.module.purap.fixture.CreditMemoInitTabFixture;
import org.kuali.kfs.module.purap.fixture.PaymentRequestDocumentFixture;
import org.kuali.kfs.module.purap.fixture.PurApAccountingLineFixture;
import org.kuali.kfs.module.purap.fixture.PurchaseOrderAccountingLineFixture;
import org.kuali.kfs.module.purap.fixture.PurchaseOrderDocumentFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AccountingDocumentTestUtils;
import org.kuali.kfs.sys.document.validation.GenericValidation;
import org.kuali.kfs.sys.document.validation.event.AddAccountingLineEvent;
import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEventBase;
import org.kuali.kfs.sys.fixture.AccountingLineFixture;
import org.kuali.kfs.vnd.VendorUtils;
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.krad.document.Document;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.GlobalVariables;
@ConfigureContext(session = appleton)
public class CreditMemoDocumentRuleTest extends PurapRuleTestBase {
VendorCreditMemoDocument creditMemo;
private Map<String, GenericValidation> validations;
@Override
protected void setUp() throws Exception {
super.setUp();
CreditMemoDocumentTest cmDocTest = new CreditMemoDocumentTest();
creditMemo = cmDocTest.buildSimpleDocument();
validations = SpringContext.getBeansOfType(GenericValidation.class);
}
@Override
protected void tearDown() throws Exception {
validations = null;
creditMemo = null;
super.tearDown();
}
/*
* Tests of validateInitTabRequiredFields
*/
/**
* Happy path: Date is Today
*/
public void testValidateInitTabRequiredFields_WithInvoiceWithTodayWithAmount() {
creditMemo = CreditMemoInitTabFixture.WITH_INVOICE_WITH_DATE_WITH_AMOUNT.populateForRequiredness(creditMemo);
Date today = SpringContext.getBean(PurapService.class).getDateFromOffsetFromToday(0);
creditMemo.setCreditMemoDate(today);
VendorCreditMemoInitTabRequiredFieldsValidation validation = (VendorCreditMemoInitTabRequiredFieldsValidation)validations.get("VendorCreditMemo-initTabRequiredFieldsValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Happy path: Date is in past
*/
public void testValidateInitTabRequiredFields_WithInvoiceWithYesterdayWithAmount() {
creditMemo = CreditMemoInitTabFixture.WITH_INVOICE_WITH_DATE_WITH_AMOUNT.populateForRequiredness(creditMemo);
Date yesterday = SpringContext.getBean(PurapService.class).getDateFromOffsetFromToday(-1);
creditMemo.setCreditMemoDate(yesterday);
VendorCreditMemoInitTabRequiredFieldsValidation validation = (VendorCreditMemoInitTabRequiredFieldsValidation)validations.get("VendorCreditMemo-initTabRequiredFieldsValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Date should be today or in past, not in future.
*/
public void testValidateInitTabRequiredFields_WithInvoiceWithTomorrowWithAmount() {
creditMemo = CreditMemoInitTabFixture.WITH_INVOICE_WITH_DATE_WITH_AMOUNT.populateForRequiredness(creditMemo);
Date tomorrow = SpringContext.getBean(PurapService.class).getDateFromOffsetFromToday(1);
creditMemo.setCreditMemoDate(tomorrow);
VendorCreditMemoInitTabRequiredFieldsValidation validation = (VendorCreditMemoInitTabRequiredFieldsValidation)validations.get("VendorCreditMemo-initTabRequiredFieldsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Invoice should be present and is not.
*/
public void testValidateInitTabRequiredFields_NoInvoiceWithTomorrowWithAmount() {
creditMemo = CreditMemoInitTabFixture.NO_INVOICE_WITH_DATE_WITH_AMOUNT.populateForRequiredness(creditMemo);
Date tomorrow = SpringContext.getBean(PurapService.class).getDateFromOffsetFromToday(1);
creditMemo.setCreditMemoDate(tomorrow);
VendorCreditMemoInitTabRequiredFieldsValidation validation = (VendorCreditMemoInitTabRequiredFieldsValidation)validations.get("VendorCreditMemo-initTabRequiredFieldsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Date should be present and is not.
*/
/*
public void testValidateInitTabRequiredFields_WithInvoiceNoDateWithAmount() {
creditMemo = CreditMemoInitTabFixture.WITH_INVOICE_NO_DATE_WITH_AMOUNT.populateForRequiredness(creditMemo);
assertFalse(rule.validateInitTabRequiredFields(creditMemo));
}
*/
/**
* Amount should be present and is not.
*/
public void testValidateInitTabRequiredFields_WithInvoiceWithTomorrowNoAmount() {
creditMemo = CreditMemoInitTabFixture.WITH_INVOICE_WITH_DATE_NO_AMOUNT.populateForRequiredness(creditMemo);
Date tomorrow = SpringContext.getBean(PurapService.class).getDateFromOffsetFromToday(1);
creditMemo.setCreditMemoDate(tomorrow);
VendorCreditMemoInitTabRequiredFieldsValidation validation = (VendorCreditMemoInitTabRequiredFieldsValidation)validations.get("VendorCreditMemo-initTabRequiredFieldsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/*
* Utility helper methods
*/
/**
* Save a PO to get one with a valid poID in the database.
*
* @return A valid Integer PurchaseOrderIdentifier
* @throws Exception
*/
private Integer prepareAndSavePO() throws Exception {
PurchaseOrderDocumentTest poDocTest = new PurchaseOrderDocumentTest();
PurchaseOrderDocument po = poDocTest.buildSimpleDocument();
po.setApplicationDocumentStatus(PurchaseOrderStatuses.APPDOC_OPEN);
//po.prepareForSave(); Duplicated by saveDocument.
DocumentService documentService = SpringContext.getBean(DocumentService.class);
AccountingDocumentTestUtils.saveDocument(po, documentService);
PurchaseOrderDocument poWithID = (PurchaseOrderDocument)documentService.getByDocumentHeaderId(po.getDocumentNumber());
return poWithID.getPurapDocumentIdentifier();
}
/**
* Save a PREQ to get one with a valid preqID in the database.
*
* @return A valid Integer PaymentRequestIdentifier
* @throws Exception
*/
private Integer prepareAndSavePREQ() throws Exception {
PaymentRequestDocumentTest preqDocTest = new PaymentRequestDocumentTest();
PaymentRequestDocument preq = preqDocTest.createPaymentRequestDocument(
PaymentRequestDocumentFixture.PREQ_APPROVAL_REQUIRED,
preqDocTest.createPurchaseOrderDocument(PurchaseOrderDocumentFixture.PO_APPROVAL_REQUIRED,false),
true, new KualiDecimal[] {new KualiDecimal(100)});
return preq.getPurapDocumentIdentifier();
}
/*
* Tests of validateInitTabReferenceNumbers. These should pass if there is exactly one document of one of the three
* types associated with it.
*/
/**
* First happy path: CM is derived from Purchase Order.
* @throws Exception
*/
public void testValidateInitTabReferenceNumbers_WithPOIDNoPREQIDNoVendorNum() throws Exception {
// Get the poID of a PO that is validly in the database.
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poID = prepareAndSavePO();
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poID);
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Second happy path: CM is derived from Payment Request.
* @throws Exception
*/
public void testValidateInitTabReferenceNumbers_NoPOIDWithPREQIDNoVendorNum() throws Exception{
// Get the preqId of a PREQ that is validly in the database.
Integer preqID = prepareAndSavePREQ();
creditMemo.setPaymentRequestIdentifier(preqID);
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* This happy-path test won't fail if there is no such vendor as the one from the fixture.
* If there is such a vendor in the database, this tests whether a creditMemo associated with
* that vendor number alone will pass the validateInitTabReferenceNumbers validation method.
*/
public void testValidateInitTabReferenceNumbers_NoPOIDNoPREQIdWithVendorNum() {
creditMemo = CreditMemoInitTabFixture.WITH_VENDOR_NUMBER.populateForReferenceNumbers(creditMemo);
String vendorNumber = creditMemo.getVendorNumber();
// If there is such a vendor in the database, we can proceed to test this.
VendorDetail vendor = SpringContext.getBean(VendorService.class).getVendorDetail(
VendorUtils.getVendorHeaderId(vendorNumber), VendorUtils.getVendorDetailId(vendorNumber));
if(org.kuali.rice.krad.util.ObjectUtils.isNotNull(vendor)) {
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
else {
assertTrue(true);
}
}
/**
* Should fail with no reference numbers; CM not created from any documents.
*/
public void testValidateInitTabReferenceNumbers_NoPOIDNoPREQIdNoVendorNum() {
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Should fail since there are both Purchase Order and Vendor reference numbers.
* @throws Exception
*/
public void testValidateInitTabReferenceNumbers_WithPOIdNoPREQIdWithVendorNum() throws Exception {
creditMemo = CreditMemoInitTabFixture.WITH_VENDOR_NUMBER.populateForReferenceNumbers(creditMemo);
String vendorNumber = creditMemo.getVendorNumber();
// If there is such a vendor in the database, we can proceed to test this.
VendorDetail vendor = SpringContext.getBean(VendorService.class).getVendorDetail(
VendorUtils.getVendorHeaderId(vendorNumber), VendorUtils.getVendorDetailId(vendorNumber));
if(org.kuali.rice.krad.util.ObjectUtils.isNotNull(vendor)) {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poID = prepareAndSavePO();
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poID);
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
else {
assertTrue(true);
}
}
/**
* Should fail since there are both Payment Request and Vendor reference numbers.
* @throws Exception
*/
public void testValidateInitTabReferenceNumbers_NoPOIdWithPREQIdWithVendorNum() throws Exception {
creditMemo = CreditMemoInitTabFixture.WITH_VENDOR_NUMBER.populateForReferenceNumbers(creditMemo);
String vendorNumber = creditMemo.getVendorNumber();
// If there is such a vendor in the database, we can proceed to test this.
VendorDetail vendor = SpringContext.getBean(VendorService.class).getVendorDetail(
VendorUtils.getVendorHeaderId(vendorNumber), VendorUtils.getVendorDetailId(vendorNumber));
if(org.kuali.rice.krad.util.ObjectUtils.isNotNull(vendor)) {
Integer preqID = prepareAndSavePREQ();
creditMemo.setPaymentRequestIdentifier(preqID);
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
else {
assertTrue(true);
}
}
/**
* Should fail since there are both Purchase Order and Payment Request reference numbers.
* @throws Exception
*/
public void testValidateInitTabReferenceNumbers_WithPOIdWithPREQIdNoVendorNum() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poID = prepareAndSavePO();
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poID);
Integer preqID = prepareAndSavePREQ();
creditMemo.setPaymentRequestIdentifier(preqID);
VendorCreditMemoInitTabReferenceNumberValidation validation = (VendorCreditMemoInitTabReferenceNumberValidation)validations.get("VendorCreditMemo-initTabReferenceNumberValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/*
* Tests of validateItemQuantity
*/
/**
* Happy path for PO-type Credit Memo. The Item Quantity is the same as the Invoiced Quantity.
*/
public void testValidateItemQuantity_POType_EquivalentQuantity() {
creditMemo.setPurchaseOrderIdentifier(new Integer(99999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPoInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(1));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Happy path for PREQ-type Credit Memo. The Item Quantity is the same as the Invoiced Quantity.
*/
public void testValidateItemQuantity_PREQType_EquivalentQuantity() {
creditMemo.setPaymentRequestIdentifier(new Integer(9999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPreqInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(1));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* The conditions are met to require a quantity, but there is no quantity: PO-Type.
*/
public void testValidateItemQuantity_POType_NullQuantity() {
creditMemo.setPurchaseOrderIdentifier(new Integer(99999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPoInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(null);
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* The conditions are met to require a quantity, but there is no quantity: PREQ-Type.
*/
public void testValidateItemQuantity_PREQType_NullQuantity() {
creditMemo.setPaymentRequestIdentifier(new Integer(9999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPreqInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(null);
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Quantities cannot be negative: PO-Type.
*/
public void testValidateItemQuantity_POType_NegativeQuantity() {
creditMemo.setPurchaseOrderIdentifier(new Integer(99999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPoInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(-1));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Quantities cannot be negative: PREQ-Type
*/
public void testValidateItemQuantity_PREQType_NegativeQuantity() {
creditMemo.setPaymentRequestIdentifier(new Integer(9999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPreqInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(-1));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Quantity for the item should not be greater than the invoiced quantity: PO-Type
*/
public void testValidateItemQuantity_POType_GreaterQuantity() {
creditMemo.setPurchaseOrderIdentifier(new Integer(99999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPoInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(2));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/**
* Quantity for the item should not be greater than the invoiced quantity: PREQ-Type
*/
public void testValidateItemQuantity_PREQType_GreaterQuantity() {
creditMemo.setPaymentRequestIdentifier(new Integer(9999));
CreditMemoItem item = (CreditMemoItem)creditMemo.getItemByLineNumber(1);
item.setPreqInvoicedTotalQuantity(new KualiDecimal(1));
item.setItemQuantity(new KualiDecimal(2));
String errorKeyPrefix = KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(1) + "].";
VendorCreditMemoItemQuantityValidation validation = (VendorCreditMemoItemQuantityValidation)validations.get("VendorCreditMemo-itemQuantityValidation");
validation.setItemForValidation(item);
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
// Tests of validateItemUnitPrice
// Tests of validateItemExtendedPrice
/*
* Tests of checkPurchaseOrdersForInvoicedItems
*/
/**
* Save a PO with the given attributes. The last two parameters should be set together.
*
* @param itemInvoicedTotalQuantity KualiDecimal
* @param itemOutstandingEncumberedAmount KualiDecimal
* @param itemUnitPrice BigDecimal
* @return A valid Integer PurchaseOrderIdentifier
* @throws Exception
*/
private Integer prepareAndSavePOWithChanges(KualiDecimal itemInvoicedTotalQuantity,
KualiDecimal itemOutstandingEncumberedAmount,
BigDecimal itemUnitPrice) throws Exception {
PurchaseOrderDocumentTest poDocTest = new PurchaseOrderDocumentTest();
PurchaseOrderDocument po = poDocTest.buildSimpleDocument();
PurchaseOrderItem poItem = (PurchaseOrderItem)po.getItemByLineNumber(1);
poItem.setItemInvoicedTotalQuantity(itemInvoicedTotalQuantity);
poItem.setItemUnitPrice(itemUnitPrice);
poItem.setItemOutstandingEncumberedAmount(itemOutstandingEncumberedAmount);
po.prepareForSave();
DocumentService documentService = SpringContext.getBean(DocumentService.class);
AccountingDocumentTestUtils.saveDocument(po, documentService);
PurchaseOrderDocument poWithID = (PurchaseOrderDocument)documentService.getByDocumentHeaderId(po.getDocumentNumber());
return poWithID.getPurapDocumentIdentifier();
}
/**
* Happy path 1: The PO has one Invoiced Item, and itemInvoicedTotalQuantity has been set.
* @throws Exception
*/
/*
public void testCheckPurchaseOrdersForInvoicedItems_WithPositiveInvoicedQuantity() throws Exception {
Integer poId = prepareAndSavePOWithChanges(new KualiDecimal(1),null,null);
creditMemo.setPurchaseOrderIdentifier(poId);
assertTrue(rule.checkPurchaseOrderForInvoicedItems(creditMemo));
}
*/
/**
* Happy path 2: The PO has one Invoiced Item, and itemUnitPrice has been set to greater than itemOutstandingEncumberedAmount.
* @throws Exception
*/
/*
public void testCheckPurchaseOrdersForInvoicedItems_WithUnitPriceGreaterThanOutstandingEncumberedAmount() throws Exception {
Integer poId = prepareAndSavePOWithChanges(null,new KualiDecimal(0.5),new BigDecimal(1));
creditMemo.setPurchaseOrderIdentifier(poId);
assertTrue(rule.checkPurchaseOrderForInvoicedItems(creditMemo));
}
*/
public void testCheckPurchaseOrdersForInvoicedItems_NullChanges() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poId = prepareAndSavePOWithChanges(null,null,null);
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poId);
VendorCreditMemoPurchaseOrderForInvoicedItemsValidation validation = (VendorCreditMemoPurchaseOrderForInvoicedItemsValidation)validations.get("VendorCreditMemo-purchaseOrderForInvoicedItemsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
public void testCheckPurchaseOrdersForInvoicedItems_NullOutstandingEncumberedAmount() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poId = prepareAndSavePOWithChanges(null,null,new BigDecimal(1));
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poId);
VendorCreditMemoPurchaseOrderForInvoicedItemsValidation validation = (VendorCreditMemoPurchaseOrderForInvoicedItemsValidation)validations.get("VendorCreditMemo-purchaseOrderForInvoicedItemsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
public void testCheckPurchaseOrdersForInvoicedItems_NullUnitPrice() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poId = prepareAndSavePOWithChanges(null,new KualiDecimal(0.5),null);
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poId);
VendorCreditMemoPurchaseOrderForInvoicedItemsValidation validation = (VendorCreditMemoPurchaseOrderForInvoicedItemsValidation)validations.get("VendorCreditMemo-purchaseOrderForInvoicedItemsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
public void testCheckPurchaseOrdersForInvoicedItems_WithUnitPriceLessThanOutstandingEncumberedAmount() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poId = prepareAndSavePOWithChanges(null,new KualiDecimal(1),new BigDecimal(0.5));
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poId);
VendorCreditMemoPurchaseOrderForInvoicedItemsValidation validation = (VendorCreditMemoPurchaseOrderForInvoicedItemsValidation)validations.get("VendorCreditMemo-purchaseOrderForInvoicedItemsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
public void testCheckPurchaseOrdersForInvoicedItems_WithUnitPriceEqualToOutstandingEncumberedAmount() throws Exception {
GlobalVariables.getUserSession().setBackdoorUser( "parke" );
Integer poId = prepareAndSavePOWithChanges(null,new KualiDecimal(1),new BigDecimal(1));
GlobalVariables.getUserSession().clearBackdoorUser();
creditMemo.setPurchaseOrderIdentifier(poId);
VendorCreditMemoPurchaseOrderForInvoicedItemsValidation validation = (VendorCreditMemoPurchaseOrderForInvoicedItemsValidation)validations.get("VendorCreditMemo-purchaseOrderForInvoicedItemsValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/*
* Tests of validateTotalMatchesVendorAmount
*/
/*
public void testValidateTotalMatchesVendorAmount_EqualAmounts() {
creditMemo = CreditMemoInitTabFixture.HI_AMOUNT_HI_TOTAL.populateForAmounts(creditMemo);
assertTrue(rule.validateTotalMatchesVendorAmount(creditMemo));
}
*/
public void testValidateTotalMatchesVendorAmount_GrandTotalGreaterThanAmount() {
creditMemo = CreditMemoInitTabFixture.LO_AMOUNT_HI_TOTAL.populateForAmounts(creditMemo);
VendorCreditMemoTotalMatchesVendorAmountValidation validation = (VendorCreditMemoTotalMatchesVendorAmountValidation)validations.get("VendorCreditMemo-totalMatchesVendorAmountValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
public void testValidateTotalMatchesVendorAmount_AmountGreaterThanGrandTotal() {
creditMemo = CreditMemoInitTabFixture.HI_AMOUNT_LO_TOTAL.populateForAmounts(creditMemo);
VendorCreditMemoTotalMatchesVendorAmountValidation validation = (VendorCreditMemoTotalMatchesVendorAmountValidation)validations.get("VendorCreditMemo-totalMatchesVendorAmountValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/*
* Tests of validateTotalOverZero
*/
public void testValidateTotalOverZero_PositiveTotal() {
creditMemo = CreditMemoInitTabFixture.HI_AMOUNT_HI_TOTAL.populateForAmounts(creditMemo);
VendorCreditMemoTotalOverZeroValidation validation = (VendorCreditMemoTotalOverZeroValidation)validations.get("VendorCreditMemo-totalOverZeroValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", creditMemo)) );
}
/*
public void testValidateTotalOverZero_ZeroTotal() {
creditMemo = CreditMemoInitTabFixture.HI_AMOUNT_ZERO_TOTAL.populateForAmounts(creditMemo);
assertFalse(rule.validateTotalOverZero(creditMemo));
}
*/
/*
* Tests of validateObjectCode
*/
public void testValidateObjectCode_Happy() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
VendorCreditMemoDocument.class,
PurApAccountingLineFixture.BASIC_ACCOUNT_1,
AccountingLineFixture.LINE6);
VendorCreditMemoObjectCodeValidation validation = (VendorCreditMemoObjectCodeValidation)validations.get("VendorCreditMemo-objectCodeValidation-test");
assertTrue( validation.validate(new AddAccountingLineEvent("", creditMemo, accountingLine)) );
}
/*
@SuppressWarnings("deprecation")
public void testValidateObjectCode_BadObjectCode() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
CreditMemoDocument.class,
PurApAccountingLineFixture.BASIC_ACCOUNT_1,
AccountingLineFixture.LINE6);
//This new accounting line has a bad level.
ObjectCode badObjectCode = new ObjectCode(1970,"UA","99999");
badObjectCode.setFinancialObjectLevelCode("XX");
badObjectCode.setFinancialObjectTypeCode("XX");
accountingLine.setObjectCode(badObjectCode);
assertFalse(rule.validateObjectCode(creditMemo, accountingLine));
}
*/
/*
* Tests of verifyAccountingStringsBetween0And100Percent
*/
public void testVerifyAccountingStringsBetween0And100Percent_Happy() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
VendorCreditMemoDocument.class,
PurApAccountingLineFixture.BASIC_ACCOUNT_1,
AccountingLineFixture.LINE6);
VendorCreditMemoAccountPercentBetween0And100Validation validation = (VendorCreditMemoAccountPercentBetween0And100Validation)validations.get("VendorCreditMemo-accountPercentBetween0And100Validation-test");
assertTrue( validation.validate(new AddAccountingLineEvent("", (Document)creditMemo, (AccountingLine)accountingLine)) );
}
public void testVerifyAccountingStringsBetween0And100Percent_PercentTooHigh() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
VendorCreditMemoDocument.class,
PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_TOO_HIGH,
AccountingLineFixture.LINE6);
VendorCreditMemoAccountPercentBetween0And100Validation validation = (VendorCreditMemoAccountPercentBetween0And100Validation)validations.get("VendorCreditMemo-accountPercentBetween0And100Validation-test");
assertFalse( validation.validate(new AddAccountingLineEvent("", (Document)creditMemo, (AccountingLine)accountingLine)) );
}
public void testVerifyAccountingStringsBetween0And100Percent_PercentZero() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
VendorCreditMemoDocument.class,
PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_ZERO,
AccountingLineFixture.LINE6);
VendorCreditMemoAccountPercentBetween0And100Validation validation = (VendorCreditMemoAccountPercentBetween0And100Validation)validations.get("VendorCreditMemo-accountPercentBetween0And100Validation-test");
assertFalse( validation.validate(new AddAccountingLineEvent("", (Document)creditMemo, (AccountingLine)accountingLine)) );
}
public void testVerifyAccountingStringsBetween0And100Percent_PercentNegative() {
PurApAccountingLine accountingLine = PurchaseOrderAccountingLineFixture.BASIC_PO_ACCOUNT_1.createPurApAccountingLine(
VendorCreditMemoDocument.class,
PurApAccountingLineFixture.BAD_ACCOUNT_PERCENT_NEGATIVE,
AccountingLineFixture.LINE6);
VendorCreditMemoAccountPercentBetween0And100Validation validation = (VendorCreditMemoAccountPercentBetween0And100Validation)validations.get("VendorCreditMemo-accountPercentBetween0And100Validation-test");
assertFalse( validation.validate(new AddAccountingLineEvent("", (Document)creditMemo, (AccountingLine)accountingLine)) );
}
}