/*
* 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;
import junit.framework.Assert;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
import org.kuali.kfs.module.purap.businessobject.PurchasingItem;
import org.kuali.kfs.module.purap.fixture.PurchaseOrderDocumentFixture;
import org.kuali.kfs.module.purap.fixture.PurchaseOrderItemAccountsFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.DocumentTestUtils;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AccountingDocumentTestUtils;
import org.kuali.kfs.sys.document.workflow.WorkflowTestUtils;
import org.kuali.kfs.sys.fixture.UserNameFixture;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.WorkflowDocument;
import org.kuali.rice.kew.api.document.DocumentStatus;
import org.kuali.rice.kns.service.TransactionalDocumentDictionaryService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.workflow.service.WorkflowDocumentService;
import java.util.ArrayList;
import java.util.List;
import static org.kuali.kfs.module.purap.fixture.PurchaseOrderItemAccountsFixture.WITH_DESC_WITH_UOM_WITH_PRICE_WITH_ACCOUNT;
import static org.kuali.kfs.sys.document.AccountingDocumentTestUtils.testGetNewDocument_byDocumentClass;
import static org.kuali.kfs.sys.fixture.UserNameFixture.*;
/**
* Used to create and test populated Purchase Order Documents of various kinds.
*/
@ConfigureContext(session = UserNameFixture.parke)
public class PurchaseOrderDocumentTest extends KualiTestBase {
public static final Class<PurchaseOrderDocument> DOCUMENT_CLASS = PurchaseOrderDocument.class;
private List<PurchaseOrderItemAccountsFixture> getItemParametersFromFixtures() {
List<PurchaseOrderItemAccountsFixture> list = new ArrayList<PurchaseOrderItemAccountsFixture>();
list.add(WITH_DESC_WITH_UOM_WITH_PRICE_WITH_ACCOUNT);
return list;
}
private int getExpectedPrePeCount() {
return 0;
}
public final void testAddItem() throws Exception {
List<PurchasingItem> items = new ArrayList<PurchasingItem>();
for (PurchaseOrderItem item : generateItems()) {
items.add(item);
}
int expectedItemTotal = items.size();
PurchasingDocumentTestUtils.testAddItem(DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), DOCUMENT_CLASS), items, expectedItemTotal);
}
public final void testGetNewDocument() throws Exception {
testGetNewDocument_byDocumentClass(DOCUMENT_CLASS, SpringContext.getBean(DocumentService.class));
}
public final void testConvertIntoErrorCorrection_documentAlreadyCorrected() throws Exception {
AccountingDocumentTestUtils.testConvertIntoErrorCorrection_documentAlreadyCorrected(buildSimpleDocument(), SpringContext.getBean(TransactionalDocumentDictionaryService.class));
}
@ConfigureContext(session = UserNameFixture.parke, shouldCommitTransactions=true)
public final void testConvertIntoErrorCorrection() throws Exception {
AccountingDocumentTestUtils.testConvertIntoErrorCorrection(buildSimpleDocument(), getExpectedPrePeCount(), SpringContext.getBean(DocumentService.class), SpringContext.getBean(TransactionalDocumentDictionaryService.class));
}
@ConfigureContext(session = parke, shouldCommitTransactions=true)
public final void testRouteDocument() throws Exception {
PurchaseOrderDocument poDocument = buildSimpleDocument();
DocumentService documentService = SpringContext.getBean(DocumentService.class);
poDocument.prepareForSave();
assertFalse("Document should not have been in ENROUTE status.",DocumentStatus.ENROUTE.equals(poDocument.getDocumentHeader().getWorkflowDocument().getStatus()));
AccountingDocumentTestUtils.routeDocument(poDocument, "test annotation", null, documentService);
WorkflowTestUtils.waitForDocumentApproval(poDocument.getDocumentNumber());
WorkflowDocument workflowDocument = SpringContext.getBean(WorkflowDocumentService.class).loadWorkflowDocument(poDocument.getDocumentNumber(), UserNameFixture.kfs.getPerson() );
assertTrue("Document should now be final.", workflowDocument.isFinal());
}
@ConfigureContext(session = parke, shouldCommitTransactions=true)
public final void testSaveDocument() throws Exception {
PurchaseOrderDocument poDocument = buildSimpleDocument();
DocumentService documentService = SpringContext.getBean(DocumentService.class);
poDocument.prepareForSave();
AccountingDocumentTestUtils.saveDocument(poDocument, documentService);
PurchaseOrderDocument result = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(poDocument.getDocumentNumber());
assertMatch(poDocument, result);
}
public final void testHandleNegativeEntryAmount() {
PurchaseOrderDocument doc = new PurchaseOrderDocument();
GeneralLedgerPendingEntry entry = new GeneralLedgerPendingEntry();
entry.setTransactionLedgerEntryAmount(new KualiDecimal(-1));
doc.handleNegativeEntryAmount(entry);
assertEquals(new KualiDecimal(1), entry.getTransactionLedgerEntryAmount());
assertEquals(KFSConstants.GL_CREDIT_CODE, entry.getTransactionDebitCreditCode());
}
public final void testHandleNegativeEntryAmountNonNegative() {
PurchaseOrderDocument doc = new PurchaseOrderDocument();
GeneralLedgerPendingEntry entry = new GeneralLedgerPendingEntry();
entry.setTransactionLedgerEntryAmount(new KualiDecimal(1));
doc.handleNegativeEntryAmount(entry);
assertEquals(new KualiDecimal(1), entry.getTransactionLedgerEntryAmount());
assertEquals(KFSConstants.GL_DEBIT_CODE, entry.getTransactionDebitCreditCode());
}
// test util methods
/**
* Matches two Purchase Order Documents by comparing their most important persistant fields;
* Fails the assertion if any of these fields don't match.
*/
public static void assertMatch(PurchaseOrderDocument doc1, PurchaseOrderDocument doc2) {
// match header
Assert.assertEquals(doc1.getDocumentNumber(), doc2.getDocumentNumber());
Assert.assertEquals(doc1.getDocumentHeader().getWorkflowDocument().getDocumentTypeName(), doc2.getDocumentHeader().getWorkflowDocument().getDocumentTypeName());
// match posting year
if (StringUtils.isNotBlank(doc1.getPostingPeriodCode()) && StringUtils.isNotBlank(doc2.getPostingPeriodCode())) {
Assert.assertEquals(doc1.getPostingPeriodCode(), doc2.getPostingPeriodCode());
}
Assert.assertEquals(doc1.getPostingYear(), doc2.getPostingYear());
// match important fields in PO
Assert.assertEquals(doc1.getVendorHeaderGeneratedIdentifier(), doc2.getVendorHeaderGeneratedIdentifier());
Assert.assertEquals(doc1.getVendorDetailAssignedIdentifier(), doc2.getVendorDetailAssignedIdentifier());
Assert.assertEquals(doc1.getVendorName(), doc2.getVendorName());
Assert.assertEquals(doc1.getVendorNumber(), doc2.getVendorNumber());
Assert.assertEquals(doc1.getApplicationDocumentStatus(), doc2.getApplicationDocumentStatus());
Assert.assertEquals(doc1.getChartOfAccountsCode(), doc2.getChartOfAccountsCode());
Assert.assertEquals(doc1.getOrganizationCode(), doc2.getOrganizationCode());
Assert.assertEquals(doc1.getDeliveryCampusCode(), doc2.getDeliveryCampusCode());
Assert.assertEquals(doc1.getDeliveryRequiredDate(), doc2.getDeliveryRequiredDate());
Assert.assertEquals(doc1.getRequestorPersonName(), doc2.getRequestorPersonName());
Assert.assertEquals(doc1.getContractManagerCode(), doc2.getContractManagerCode());
Assert.assertEquals(doc1.getVendorContractName(), doc2.getVendorContractName());
Assert.assertEquals(doc1.getPurchaseOrderAutomaticIndicator(), doc2.getPurchaseOrderAutomaticIndicator());
Assert.assertEquals(doc1.getPurchaseOrderTransmissionMethodCode(), doc2.getPurchaseOrderTransmissionMethodCode());
Assert.assertEquals(doc1.getRequisitionIdentifier(), doc2.getRequisitionIdentifier());
Assert.assertEquals(doc1.getPurchaseOrderPreviousIdentifier(), doc2.getPurchaseOrderPreviousIdentifier());
Assert.assertEquals(doc1.isPurchaseOrderCurrentIndicator(), doc2.isPurchaseOrderCurrentIndicator());
Assert.assertEquals(doc1.getPurchaseOrderCreateTimestamp(), doc2.getPurchaseOrderCreateTimestamp());
Assert.assertEquals(doc1.getPurchaseOrderLastTransmitTimestamp(), doc2.getPurchaseOrderLastTransmitTimestamp());
}
private List<PurchaseOrderItem> generateItems() throws Exception {
List<PurchaseOrderItem> items = new ArrayList<PurchaseOrderItem>();
// set items to document
for (PurchaseOrderItemAccountsFixture itemFixture : getItemParametersFromFixtures()) {
items.add(itemFixture.populateItem());
}
return items;
}
public PurchaseOrderDocument buildSimpleDocument() throws Exception {
return PurchaseOrderDocumentFixture.PO_ONLY_REQUIRED_FIELDS.createPurchaseOrderDocument();
}
private UserNameFixture getInitialUserName() {
return rjweiss;
}
protected UserNameFixture getTestUserName() {
return rorenfro;
}
}