/*
* 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 static org.kuali.kfs.sys.document.AccountingDocumentTestUtils.testGetNewDocument_byDocumentClass;
import static org.kuali.kfs.sys.fixture.UserNameFixture.jgerhart;
import static org.kuali.kfs.sys.fixture.UserNameFixture.jkitchen;
import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
import static org.kuali.kfs.sys.fixture.UserNameFixture.rjweiss;
import static org.kuali.kfs.sys.fixture.UserNameFixture.rorenfro;
import static org.kuali.kfs.sys.fixture.UserNameFixture.sterner;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
import org.kuali.kfs.module.purap.businessobject.PurchasingItem;
import org.kuali.kfs.module.purap.businessobject.RequisitionAccount;
import org.kuali.kfs.module.purap.businessobject.RequisitionItem;
import org.kuali.kfs.module.purap.fixture.RequisitionDocumentFixture;
import org.kuali.kfs.module.purap.fixture.RequisitionDocumentWithCommodityCodeFixture;
import org.kuali.kfs.module.purap.fixture.RequisitionItemFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.DocumentTestUtils;
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.kns.service.DataDictionaryService;
import org.kuali.rice.kns.service.TransactionalDocumentDictionaryService;
import org.kuali.rice.krad.rules.rule.event.RouteDocumentEvent;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.service.KualiRuleService;
import org.kuali.rice.krad.util.GlobalVariables;
/**
* Used to create and test populated Requisition Documents of various kinds.
*/
@ConfigureContext(session = khuntley)
public class RequisitionDocumentTest extends KualiTestBase {
public static final Class<RequisitionDocument> DOCUMENT_CLASS = RequisitionDocument.class;
private static final String ACCOUNT_REVIEW = "Account";
private static final String ORGANIZATION = "Organization";
private static final String COMMODITY_CODE_REVIEW = "Commodity";
private RequisitionDocument requisitionDocument = null;
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
requisitionDocument = null;
super.tearDown();
}
private List<RequisitionItemFixture> getItemParametersFromFixtures() {
List<RequisitionItemFixture> list = new ArrayList<RequisitionItemFixture>();
list.add(RequisitionItemFixture.REQ_ITEM_NO_APO);
return list;
}
private int getExpectedPrePeCount() {
return 0;
}
public final void testAddItem() throws Exception {
List<PurchasingItem> items = new ArrayList<PurchasingItem>();
items.add(RequisitionItemFixture.REQ_ITEM_NO_APO.createRequisitionItem());
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 testConvertIntoCopy_copyDisallowed() throws Exception {
RequisitionDocument doc = buildSimpleDocument();
doc.getRequisitionSource().setAllowCopyDays(0);
AccountingDocumentTestUtils.testConvertIntoCopy_copyDisallowed(doc, SpringContext.getBean(DataDictionaryService.class));
}
public final void testConvertIntoErrorCorrection_documentAlreadyCorrected() throws Exception {
AccountingDocumentTestUtils.testConvertIntoErrorCorrection_documentAlreadyCorrected(buildSimpleDocument(), SpringContext.getBean(TransactionalDocumentDictionaryService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testConvertIntoErrorCorrection() throws Exception {
requisitionDocument = buildSimpleDocument();
AccountingDocumentTestUtils.testConvertIntoErrorCorrection(requisitionDocument, getExpectedPrePeCount(), SpringContext.getBean(DocumentService.class), SpringContext.getBean(TransactionalDocumentDictionaryService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testRouteDocument() throws Exception {
requisitionDocument = buildSimpleDocument();
AccountingDocumentTestUtils.testRouteDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testSaveDocument() throws Exception {
requisitionDocument = buildSimpleDocument();
AccountingDocumentTestUtils.testSaveDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testSaveDocumentWithItemDeletion() throws Exception {
requisitionDocument = buildSimpleDocument();
AccountingDocumentTestUtils.testSaveDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
List<RequisitionItem> items = requisitionDocument.getItems();
RequisitionItem item = items.get(0);
List<PurApAccountingLine> accounts = item.getSourceAccountingLines();
RequisitionAccount account = (RequisitionAccount)item.getSourceAccountingLine(0);
requisitionDocument.deleteItem(0);
AccountingDocumentTestUtils.testSaveDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testRouteSavedDocumentWithAccountDeletion() throws Exception {
requisitionDocument = buildComplexDocument();
List<RequisitionItem> items = requisitionDocument.getItems();
RequisitionItem item = items.get(0);
List<PurApAccountingLine> accounts = item.getSourceAccountingLines();
AccountingDocumentTestUtils.testSaveDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(requisitionDocument.getDocumentNumber());
RequisitionAccount account = (RequisitionAccount)item.getSourceAccountingLine(0);
account.setAccountLinePercent(new BigDecimal(100.00));
accounts.remove(0);
account = (RequisitionAccount)item.getSourceAccountingLine(0);
account.setAccountLinePercent(new BigDecimal(100.00));
// for the sequential method, we need to set the amount in addition to the percent
account.setAmount(item.calculateExtendedPrice().multiply(new KualiDecimal(account.getAccountLinePercent())).divide(new KualiDecimal(100)));
AccountingDocumentTestUtils.testRouteDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testConvertIntoCopy() throws Exception {
requisitionDocument = buildSimpleDocument();
AccountingDocumentTestUtils.testConvertIntoCopy(requisitionDocument, SpringContext.getBean(DocumentService.class), getExpectedPrePeCount());
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testRouteDocumentToFinal() throws Exception {
requisitionDocument = RequisitionDocumentFixture.REQ_NO_APO_VALID.createRequisitionDocument();
final String docId = requisitionDocument.getDocumentNumber();
AccountingDocumentTestUtils.routeDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
WorkflowTestUtils.waitForNodeChange(requisitionDocument.getDocumentHeader().getWorkflowDocument(), ACCOUNT_REVIEW);
// the document should now be routed to the Fiscal Officer
changeCurrentUser(sterner);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(requisitionDocument, ACCOUNT_REVIEW));
assertTrue("Document should be enroute.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isEnroute());
assertTrue("sterner should have an approve request.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(requisitionDocument, "Test approving as sterner", null);
changeCurrentUser(jgerhart);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
SpringContext.getBean(DocumentService.class).acknowledgeDocument(requisitionDocument, "Acknowledging as jgerhart", null);
WorkflowTestUtils.waitForDocumentApproval(requisitionDocument.getDocumentNumber());
changeCurrentUser(khuntley);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("Document should now be final.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isFinal());
}
@ConfigureContext(session = rorenfro, shouldCommitTransactions = true)
public final void testCreateAPOAlternateRequisition() throws Exception {
RequisitionDocument altAPORequisition = RequisitionDocumentFixture.REQ_ALTERNATE_APO.createRequisitionDocument();
AccountingDocumentTestUtils.testSaveDocument(altAPORequisition, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = khuntley, shouldCommitTransactions = true)
public final void testRouteDocumentToFinalWithBasicActiveCommodityCode() throws Exception {
requisitionDocument = RequisitionDocumentWithCommodityCodeFixture.REQ_VALID_ACTIVE_COMMODITY_CODE.createRequisitionDocument();
final String docId = requisitionDocument.getDocumentNumber();
AccountingDocumentTestUtils.routeDocument(requisitionDocument, SpringContext.getBean(DocumentService.class));
WorkflowTestUtils.waitForNodeChange(requisitionDocument.getDocumentHeader().getWorkflowDocument(), ACCOUNT_REVIEW);
// the document should now be routed to rorenfro as Fiscal Officer
changeCurrentUser(sterner);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(requisitionDocument, ACCOUNT_REVIEW));
assertTrue("Document should be enroute.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isEnroute());
assertTrue("sterner should have an approve request.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(requisitionDocument, "Test approving as sterner", null);
// the document should now be routed to Awaiting Commodity Code approval which is to the PA_PUR_COMM_CODE workgroup,
// we'll use jkitchen as the user.
changeCurrentUser(jkitchen);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
WorkflowDocument workflowDocument = requisitionDocument.getDocumentHeader().getWorkflowDocument();
//assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(requisitionDocument, COMMODITY_CODE_REVIEW));
//assertTrue("Document should be enroute.", workflowDocument.isEnroute());
//assertTrue("jkitchen should have an approve request.", workflowDocument.isApprovalRequested());
//SpringContext.getBean(DocumentService.class).approveDocument(requisitionDocument, "Test approving as jkitchen", null);
changeCurrentUser(jgerhart);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
SpringContext.getBean(DocumentService.class).acknowledgeDocument(requisitionDocument, "Acknowledging as jgerhart", null);
WorkflowTestUtils.waitForDocumentApproval(requisitionDocument.getDocumentNumber());
changeCurrentUser(khuntley);
requisitionDocument = (RequisitionDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("Document should now be final.", requisitionDocument.getDocumentHeader().getWorkflowDocument().isFinal());
}
private RequisitionDocument buildSimpleDocument() throws Exception {
return RequisitionDocumentFixture.REQ_ONLY_REQUIRED_FIELDS.createRequisitionDocument();
}
private RequisitionDocument buildComplexDocument() throws Exception {
RequisitionDocument complexRequisitionDocument = RequisitionDocumentFixture.REQ_ONLY_REQUIRED_FIELDS_MULTIPLE_ACCOUNTS.createRequisitionDocument();
return complexRequisitionDocument;
}
public void testRouteBrokenDocument_ItemQuantityBased_NoQuantity() {
requisitionDocument = RequisitionDocumentFixture.REQ_INVALID_ITEM_QUANTITY_BASED_NO_QUANTITY.createRequisitionDocument();
SpringContext.getBean(KualiRuleService.class).applyRules(new RouteDocumentEvent(requisitionDocument));
assertTrue(GlobalVariables.getMessageMap().hasErrors());
}
private UserNameFixture getInitialUserName() {
return rjweiss;
}
protected UserNameFixture getTestUserName() {
return rorenfro;
}
// create document fixture
}