/* * 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.fixture.UserNameFixture.appleton; import static org.kuali.kfs.sys.fixture.UserNameFixture.ferland; import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley; import static org.kuali.kfs.sys.fixture.UserNameFixture.parke; import org.kuali.kfs.module.purap.PurapConstants.PurchaseOrderDocTypes; import org.kuali.kfs.module.purap.PurapConstants.PurchaseOrderStatuses; import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; import org.kuali.kfs.module.purap.fixture.PaymentRequestDocumentFixture; import org.kuali.kfs.sys.ConfigureContext; 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.document.DocumentStatus; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.service.impl.DocumentServiceImpl; /** * Used to create and test populated Purchase Order Documents of various kinds. */ @ConfigureContext(session = khuntley) public class PurapFullProcessDocumentTest extends KualiTestBase { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DocumentServiceImpl.class); private static final String SUB_ACCOUNT_REVIEW = "SubAccount"; private static final String ACCOUNT_REVIEW = "Account"; private static final String ORG_REVIEW = "AccountingOrganizationHierarchy"; protected static DocumentService documentService = null; @Override protected void setUp() throws Exception { documentService = SpringContext.getBean(DocumentService.class); } /** * TODO: Remove once other tests are fixed */ public void testNothing() { } /* * Requisition * PO * Amend PO * PREQ * CM * Close PO */ @ConfigureContext(session = parke, shouldCommitTransactions = true) public final void PATCHFIX_testFullProcess() throws Exception { // 1. use the ACM document to create the REQ and PO ContractManagerAssignmentDocumentTest acmDocTest = new ContractManagerAssignmentDocumentTest(); String reqNumber = acmDocTest.testRouteDocument2(); RequisitionDocument reqDoc = (RequisitionDocument) documentService.getByDocumentHeaderId(reqNumber); String poNumber = reqDoc.getRelatedViews().getRelatedPurchaseOrderViews().get(0).getDocumentNumber(); PurchaseOrderDocument poDoc = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(poNumber); poDoc.setReceivingDocumentRequiredIndicator(false); // approve the PO poDoc.setPurchaseOrderVendorChoiceCode("LPRC"); // submit then approve the PO documentService.routeDocument(poDoc, "Test routing as parke", null); poDoc = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(poNumber); // 3 use the PO number to create a Payment Request and have it go final PaymentRequestDocument preqDoc = routePREQDocumentToFinal(poDoc); // 4. use the PO number to create a Credit Memo and have it go final changeCurrentUser(appleton); CreditMemoDocumentTest cmDocTest = new CreditMemoDocumentTest(); VendorCreditMemoDocument cmDoc = cmDocTest.routeDocument(preqDoc); // 2. based on the PO document number, create the Amend PO doc and let it go final (with philips?) changeCurrentUser(parke); PurchaseOrderAmendmentDocument amendDoc = (PurchaseOrderAmendmentDocument) SpringContext.getBean(PurchaseOrderService.class).createAndSavePotentialChangeDocument(poNumber, PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT, PurchaseOrderStatuses.APPDOC_AMENDMENT); documentService.routeDocument(amendDoc, "Test routing as parke", null); WorkflowTestUtils.waitForDocumentApproval(amendDoc.getDocumentNumber()); // 5. use the PO number to create a Close PO and have it go final changeCurrentUser(parke); PurchaseOrderCloseDocument closeDoc = (PurchaseOrderCloseDocument) SpringContext.getBean(PurchaseOrderService.class).createAndSavePotentialChangeDocument(poNumber, PurchaseOrderDocTypes.PURCHASE_ORDER_CLOSE_DOCUMENT, PurchaseOrderStatuses.APPDOC_PENDING_CLOSE); documentService.routeDocument(closeDoc, "Test routing as parke", null); WorkflowTestUtils.waitForDocumentApproval(closeDoc.getDocumentNumber()); LOG.info("Requisition document: " + reqDoc.getDocumentNumber()); LOG.info("PO document: " + poDoc.getDocumentNumber()); LOG.info("PREQ document: " + preqDoc.getDocumentNumber()); LOG.info("CM document: " + cmDoc.getDocumentNumber()); LOG.info("Amend PO document: " + amendDoc.getDocumentNumber()); LOG.info("Close PO document: " + closeDoc.getDocumentNumber()); } @ConfigureContext(session = appleton, shouldCommitTransactions=true) public final PaymentRequestDocument routePREQDocumentToFinal(PurchaseOrderDocument POdoc) throws Exception { // purchaseOrderDocument = createPurchaseOrderDocument(PurchaseOrderDocumentFixture.PO_APPROVAL_REQUIRED, true); PaymentRequestDocumentTest preqDocTest = new PaymentRequestDocumentTest(); PaymentRequestDocument paymentRequestDocument = preqDocTest.createPaymentRequestDocument(PaymentRequestDocumentFixture.PREQ_APPROVAL_REQUIRED, POdoc, true, new KualiDecimal[] {new KualiDecimal(100)}); final String docId = paymentRequestDocument.getDocumentNumber(); AccountingDocumentTestUtils.routeDocument(paymentRequestDocument, documentService); /*WorkflowTestUtils.waitForNodeChange(paymentRequestDocument.getDocumentHeader().getWorkflowDocument(), SUB_ACCOUNT_REVIEW); // the document should now be routed to vputman as Fiscal Officer changeCurrentUser(stroud); paymentRequestDocument = (PaymentRequestDocument) documentService.getByDocumentHeaderId(docId); assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(paymentRequestDocument, SUB_ACCOUNT_REVIEW)); assertTrue("Document should be enroute.", paymentRequestDocument.getDocumentHeader().getWorkflowDocument().isEnroute()); assertTrue("stroud should have an approve request.", paymentRequestDocument.getDocumentHeader().getWorkflowDocument().isApprovalRequested()); documentService.approveDocument(paymentRequestDocument, "Test approving as stroud", null); */ WorkflowTestUtils.waitForNodeChange(paymentRequestDocument.getDocumentHeader().getWorkflowDocument(), ACCOUNT_REVIEW); changeCurrentUser(ferland); paymentRequestDocument = (PaymentRequestDocument) documentService.getByDocumentHeaderId(docId); assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(paymentRequestDocument, ACCOUNT_REVIEW)); assertTrue("Document should be enroute.", paymentRequestDocument.getDocumentHeader().getWorkflowDocument().isEnroute()); assertTrue("ferland should have an approve request.", paymentRequestDocument.getDocumentHeader().getWorkflowDocument().isApprovalRequested()); documentService.approveDocument(paymentRequestDocument, "Test approving as ferland", null); WorkflowTestUtils.waitForDocumentApproval(paymentRequestDocument.getDocumentNumber()); paymentRequestDocument = (PaymentRequestDocument) documentService.getByDocumentHeaderId(docId); assertTrue("Document should now be final.", paymentRequestDocument.getDocumentHeader().getWorkflowDocument().isFinal()); return paymentRequestDocument; } private UserNameFixture getInitialUserName() { return khuntley; } protected UserNameFixture getTestUserName() { return khuntley; } }