/* * 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.fp.document.service; import static org.kuali.kfs.sys.fixture.UserNameFixture.twatson; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.kuali.kfs.fp.businessobject.CashDrawer; import org.kuali.kfs.fp.businessobject.Deposit; import org.kuali.kfs.fp.document.CashManagementDocument; import org.kuali.kfs.fp.document.CashReceiptDocument; import org.kuali.kfs.fp.document.CashReceiptFamilyTestUtil; import org.kuali.kfs.fp.exception.CashDrawerStateException; import org.kuali.kfs.fp.exception.InvalidCashReceiptState; import org.kuali.kfs.fp.service.CashDrawerService; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSConstants.DocumentStatusCodes.CashReceipt; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.Bank; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.SpringContext; 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.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.identity.PersonService; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.exception.ValidationException; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.util.GlobalVariables; @ConfigureContext(session = twatson) public class CashManagementServiceTest extends KualiTestBase { static final String CMST_CAMPUS_CODE = "FW"; final public void testCreateCashManagementDocument_blankUnitName() throws Exception { boolean failedAsExpected = false; try { SpringContext.getBean(CashManagementService.class).createCashManagementDocument(" ", "foo", "cmst1"); } catch (IllegalArgumentException e) { failedAsExpected = true; } assertTrue(failedAsExpected); } final public void testCreateCashManagementDocument_blankDocDescription() throws Exception { boolean failedAsExpected = false; try { SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, null, "cmst2"); } catch (IllegalArgumentException e) { failedAsExpected = true; } assertTrue(failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testCreateCashManagementDocument_valid() throws Exception { String testDocumentId = null; try { deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue(preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testCreate_valid", "cmst3"); assertNotNull( "document returned from createCashManagementDocument should not have been null", createdDoc); testDocumentId = createdDoc.getDocumentNumber(); // save it separately SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // verify that the doc was saved CashManagementDocument retrievedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); assertEquals("Document is in incorrect workflow status", DocumentStatus.SAVED, retrievedDoc.getDocumentHeader().getWorkflowDocument().getStatus()); } finally { // cancel the document cleanupCancel(testDocumentId); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testCreateCashManagementDocument_cashDrawerAlreadyOpen() throws Exception { String testDocumentId = null; try { deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue(preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testCreate_cashDrawerAlreadyOpen", "cmst3"); assertNotNull( "document returned from createCashManagementDocument should not have been null", createdDoc); testDocumentId = createdDoc.getDocumentNumber(); // force the drawer open SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); boolean failedAsExpected = false; // fail creating the document since the CashDrawer is already open try { SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testCreate_validCollision 2", "cmst5"); fail("created a CMD while the CashDrawer is already open"); } catch (CashDrawerStateException e) { // good failedAsExpected = true; } assertEquals(failedAsExpected, true); // // cancel empty CMDoc // SpringContext.getBean(CashManagementService.class).cancelCashManagementDocument(createdDoc); } finally { // cancel the document cleanupCancel(testDocumentId); // delete the cashDrawer you created deleteIfExists(CMST_CAMPUS_CODE); } } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testCancelCashManagementDocument_valid_interimOnly() throws Exception { String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue( "cash drawer should have been closed", preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); testDocumentId = createdDoc.getDocumentNumber(); // save it separately SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // // create Interim Deposit // create CashReceipts changeCurrentUser(UserNameFixture.ineff); CashReceiptDocument cr1 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR1",CashReceipt.VERIFIED, new KualiDecimal("25.00")); CashReceiptDocument cr2 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR2",CashReceipt.VERIFIED, new KualiDecimal("25.00")); CashReceiptDocument cr3 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR3",CashReceipt.VERIFIED, new KualiDecimal("23.00")); List crList = new ArrayList(); crList.add(cr1); crList.add(cr2); crList.add(cr3); // add interim deposit changeCurrentUser(twatson); CashManagementDocument interimDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); SpringContext.getBean(CashManagementService.class).addDeposit(interimDoc, VALID_DEPOSIT_TICKET, lookupBank(), crList, new ArrayList(), false); // // verify addition CashManagementDocument depositedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); { // 1 deposit in document List deposits = depositedDoc.getDeposits(); assertEquals( "number of deposits incorrect", 1, deposits.size()); // deposit exists in database Map<String,Object> depositPK = new HashMap<String, Object>(2); depositPK.put(KFSPropertyConstants.DOCUMENT_NUMBER, testDocumentId); depositPK.put("financialDocumentDepositLineNumber", new Integer(0)); assertEquals( "number of deposits does not match the database", 1, SpringContext.getBean(BusinessObjectService.class).countMatching(Deposit.class, depositPK)); // deposit contains 3 CRs Deposit deposit = depositedDoc.getDeposit(0); List depositedReceiptControls = SpringContext.getBean(CashManagementService.class).retrieveCashReceipts(deposit); assertEquals( "the number of receipt control records does not match", 3, depositedReceiptControls.size()); // CRs are in appropriate state assertEquals( "cash receipt state is incorrect for CR #1",CashReceipt.INTERIM, lookupCR(cr1.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals( "cash receipt state is incorrect for CR #2",CashReceipt.INTERIM, lookupCR(cr2.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals( "cash receipt state is incorrect for CR #3",CashReceipt.INTERIM, lookupCR(cr3.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); } } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); // cancel CMDoc; now we can cleanupCancel(testDocumentId); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } } private static final String VALID_DEPOSIT_TICKET = "0 0 0 destruct 0"; final public void testAddInterimDeposit_nullDoc() throws Exception { boolean failedAsExpected = false; try { SpringContext.getBean(CashManagementService.class).addDeposit(null, VALID_DEPOSIT_TICKET, lookupBank(), null, null, false); } catch (IllegalArgumentException e) { failedAsExpected = true; } assertTrue( "addition of null document for deposit did not fail", failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testAddInterimDeposit_nullBank() throws Exception { boolean failedAsExpected = false; String docId = null; try { deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_eCRL", null); docId = createdDoc.getDocumentNumber(); SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), docId); saveDocument(createdDoc); SpringContext.getBean(CashManagementService.class).addDeposit(createdDoc, VALID_DEPOSIT_TICKET, null, new ArrayList(), new ArrayList(), false); } catch (IllegalArgumentException e) { failedAsExpected = true; } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); if (docId != null) { Document testDoc = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId); SpringContext.getBean(DocumentService.class).cancelDocument(testDoc, "CMST cleanup"); } // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } assertTrue(failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testAddInterimDeposit_nonverifiedCashReceipt() throws Exception { boolean failedAsExpected = false; String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue(preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_nonverified", null); testDocumentId = createdDoc.getDocumentNumber(); SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // retrieve the document, for future use CashManagementDocument retrievedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); // // create Interim Deposit // create CashReceipt changeCurrentUser(UserNameFixture.ineff); //CashReceiptDocument cr = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST nonverified CR",CashReceipt.INTERIM, new KualiDecimal("75.00")); CashReceiptDocument cr = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST nonverified CR", CashReceipt.FINAL, new KualiDecimal("75.00")); changeCurrentUser(twatson); List crList = new ArrayList(); crList.add(cr); // add invalid interim deposit SpringContext.getBean(CashManagementService.class).addDeposit(retrievedDoc, VALID_DEPOSIT_TICKET, lookupBank(), crList, new ArrayList(), false); } catch (InvalidCashReceiptState e) { failedAsExpected = true; } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); // cancel CMDoc cleanupCancel(testDocumentId); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } assertTrue(failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testAddInterimDeposit_unsavedCMDoc() throws Exception { boolean failedAsExpected = false; String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue( "cash drawer should have been closed", preDocCD.isClosed()); changeCurrentUser(UserNameFixture.twatson); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_nonverified", null); testDocumentId = createdDoc.getDocumentNumber(); // // create Interim Deposit // create CashReceipt changeCurrentUser(UserNameFixture.ineff); CashReceiptDocument cr = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST noncheck CR",CashReceipt.VERIFIED, new KualiDecimal("25.00")); changeCurrentUser(UserNameFixture.twatson); List crList = new ArrayList(); crList.add(cr); // add interim deposit SpringContext.getBean(CashManagementService.class).addDeposit(createdDoc, VALID_DEPOSIT_TICKET, lookupBank(), crList, new ArrayList(), false); } catch (IllegalStateException e) { failedAsExpected = true; } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } assertTrue(failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) final public void testAddInterimDeposit_valid() throws Exception { String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue( "cash drawer should have been closed", preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); testDocumentId = createdDoc.getDocumentNumber(); // save it SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // retrieve the document, for future use CashManagementDocument retrievedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); // // create Interim Deposit // create CashReceipts changeCurrentUser(UserNameFixture.ineff); CashReceiptDocument cr1 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR1",CashReceipt.VERIFIED, new KualiDecimal("10.00")); CashReceiptDocument cr2 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR2",CashReceipt.VERIFIED, new KualiDecimal("25.00")); CashReceiptDocument cr3 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR3",CashReceipt.VERIFIED, new KualiDecimal("23.00")); List<CashReceiptDocument> crList = new ArrayList<CashReceiptDocument>(); crList.add(cr1); crList.add(cr2); crList.add(cr3); // add interim deposit changeCurrentUser(UserNameFixture.twatson); SpringContext.getBean(CashManagementService.class).addDeposit(retrievedDoc, VALID_DEPOSIT_TICKET, lookupBank(), crList, Collections.emptyList(), false); // // validate results CashManagementDocument depositedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); // 1 deposit List deposits = depositedDoc.getDeposits(); assertEquals( "number of deposits is not correct", 1, deposits.size()); // deposit exists in database Map<String, Object> depositPK = new HashMap<String, Object>(); depositPK.put(KFSPropertyConstants.DOCUMENT_NUMBER, testDocumentId); depositPK.put("financialDocumentDepositLineNumber", new Integer(0)); assertEquals( "number of deposits does not match database", 1, SpringContext.getBean(BusinessObjectService.class).countMatching(Deposit.class, depositPK)); // deposit is interim, not final Deposit deposit = (Deposit) deposits.get(0); assertEquals( "deposit type code is incorrect", KFSConstants.DepositConstants.DEPOSIT_TYPE_INTERIM, deposit.getDepositTypeCode()); // deposit contains 3 CRs List depositedReceiptControls = SpringContext.getBean(CashManagementService.class).retrieveCashReceipts(deposit); assertEquals( "number of cash receipts on the deposit is incorrect", 3, depositedReceiptControls.size()); // CRs are in appropriate state assertEquals( "status code on CR #1 is incorrect",CashReceipt.INTERIM, lookupCR(cr1.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals( "status code on CR #2 is incorrect",CashReceipt.INTERIM, lookupCR(cr2.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals( "status code on CR #3 is incorrect",CashReceipt.INTERIM, lookupCR(cr3.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); // total value of the deposit is the sum of the values of the 3 CRs assertEquals( "deposit amount is incorrect", new KualiDecimal("58.00"), deposit.getDepositAmount()); } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); // cancel CMDoc cleanupCancel(testDocumentId); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } } public void testCancelDeposit_nullDeposit() throws Exception { boolean failedAsExpected = false; try { SpringContext.getBean(CashManagementService.class).cancelDeposit(null); } catch (IllegalArgumentException e) { failedAsExpected = true; } assertTrue(failedAsExpected); } @ConfigureContext(session = twatson, shouldCommitTransactions = true) public void testCancelDeposit_cancelSingleInterim() throws Exception { String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue(preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); testDocumentId = createdDoc.getDocumentNumber(); // save it SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // // add Interim Deposit // create CashReceipts changeCurrentUser(UserNameFixture.ineff); CashReceiptDocument cr1 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR1",CashReceipt.VERIFIED, new KualiDecimal("25.00")); CashReceiptDocument cr2 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR2",CashReceipt.VERIFIED, new KualiDecimal("25.00")); CashReceiptDocument cr3 = buildCashReceiptDoc(CMST_CAMPUS_CODE, "CMST CR3",CashReceipt.VERIFIED, new KualiDecimal("25.00")); List crList = new ArrayList(); crList.add(cr1); crList.add(cr2); crList.add(cr3); // add interim deposit changeCurrentUser(twatson); CashManagementDocument interimDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); SpringContext.getBean(CashManagementService.class).addDeposit(interimDoc, VALID_DEPOSIT_TICKET, lookupBank(), crList, new ArrayList(), false); // // verify addition CashManagementDocument depositedDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); { // 1 deposit in document List deposits = depositedDoc.getDeposits(); assertEquals( "number of deposits is not correct", 1, deposits.size()); // deposit exists in database Map depositPK = new HashMap(); depositPK.put(KFSPropertyConstants.DOCUMENT_NUMBER, testDocumentId); depositPK.put("financialDocumentDepositLineNumber", new Integer(0)); assertEquals( "number of deposits does not match database", 1, SpringContext.getBean(BusinessObjectService.class).countMatching(Deposit.class, depositPK)); // deposit contains 3 CRs Deposit deposit = depositedDoc.getDeposit(0); List depositedReceiptControls = SpringContext.getBean(CashManagementService.class).retrieveCashReceipts(deposit); assertEquals( "number of cash receipts on the deposit is incorrect", 3, depositedReceiptControls.size()); // CRs are in appropriate state assertEquals(CashReceipt.INTERIM, lookupCR(cr1.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals(CashReceipt.INTERIM, lookupCR(cr2.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals(CashReceipt.INTERIM, lookupCR(cr3.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); } { // // cancel deposit Deposit deposit = depositedDoc.getDeposit(0); SpringContext.getBean(CashManagementService.class).cancelDeposit(deposit); // // verify cancellation CashManagementDocument postCanceledDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(testDocumentId); // not exactly sure why, but we need to refresh here or we get an OJB OptimisticLockException later and test fails postCanceledDoc.refresh(); // 0 deposits in document List deposits = postCanceledDoc.getDeposits(); assertEquals(0, deposits.size()); // deposit doesn't exist in database Map depositPK = new HashMap(); depositPK.put(KFSPropertyConstants.DOCUMENT_NUMBER, testDocumentId); depositPK.put("financialDocumentDepositLineNumber", new Integer(0)); assertEquals(0, SpringContext.getBean(BusinessObjectService.class).countMatching(Deposit.class, depositPK)); // cash receipts have been restored to appropriate state assertEquals(CashReceipt.VERIFIED, lookupCR(cr1.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals(CashReceipt.VERIFIED, lookupCR(cr2.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); assertEquals(CashReceipt.VERIFIED, lookupCR(cr3.getDocumentNumber()).getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode()); } } finally { // clean up CRdoc denatureCashReceipts(CMST_CAMPUS_CODE); // cancel CMDoc cleanupCancel(testDocumentId); // delete the cashDrawer which was created as a side-effect above deleteIfExists(CMST_CAMPUS_CODE); } } public void testKULEDOCS_1475_nullDocument() { try { // open the Cash Drawer for a null documentId deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer forcedOpen = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); forcedOpen.setStatusCode(KFSConstants.CashDrawerConstants.STATUS_OPEN); forcedOpen.setReferenceFinancialDocumentNumber(null); SpringContext.getBean(BusinessObjectService.class).save(forcedOpen); // try create a new CM doc CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); assertNotNull(createdDoc); } finally { deleteIfExists(CMST_CAMPUS_CODE); } } public void testKULEDOCS_1475_nonexistentDocument() { try { // open the Cash Drawer for a nonexistent documentId deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer forcedLocked = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); forcedLocked.setStatusCode(KFSConstants.CashDrawerConstants.STATUS_LOCKED); forcedLocked.setReferenceFinancialDocumentNumber("0"); SpringContext.getBean(BusinessObjectService.class).save(forcedLocked); // try create a new CM doc CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); assertNotNull(createdDoc); } finally { deleteIfExists(CMST_CAMPUS_CODE); } } @ConfigureContext(session = twatson, shouldCommitTransactions = true) public void testKULEDOCS_1475_existentDocument() throws Exception { boolean failedAsExpected = false; String testDocumentId = null; try { // // create a valid, empty CashManagementDocument deleteIfExists(CMST_CAMPUS_CODE); recreateCashDrawer(CMST_CAMPUS_CODE); CashDrawer preDocCD = SpringContext.getBean(CashDrawerService.class).getByCampusCode(CMST_CAMPUS_CODE); assertTrue(preDocCD.isClosed()); CashManagementDocument createdDoc = SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); testDocumentId = createdDoc.getDocumentNumber(); // save it SpringContext.getBean(CashDrawerService.class).openCashDrawer(createdDoc.getCashDrawer(), testDocumentId); saveDocument(createdDoc); // try create a new CM doc SpringContext.getBean(CashManagementService.class).createCashManagementDocument(CMST_CAMPUS_CODE, "CMST_testAddID_valid", null); } catch (CashDrawerStateException e) { failedAsExpected = true; } finally { // cancel CMDoc cleanupCancel(testDocumentId); deleteIfExists(CMST_CAMPUS_CODE); } assertTrue(failedAsExpected); } private CashReceiptDocument lookupCR(String documentId) throws WorkflowException { CashReceiptDocument crDoc = (CashReceiptDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(documentId); return crDoc; } private void deleteIfExists(String campusCode) { Map deleteCriteria = new HashMap(); deleteCriteria.put("campusCode", campusCode); SpringContext.getBean(BusinessObjectService.class).deleteMatching(CashDrawer.class, deleteCriteria); } private void recreateCashDrawer(String campusCode) { CashDrawer cd = new CashDrawer(); cd.setCampusCode(campusCode); cd.setStatusCode(KFSConstants.CashDrawerConstants.STATUS_CLOSED); SpringContext.getBean(BusinessObjectService.class).save(cd); } private static final String[] BOTH_STATII = { CashReceipt.VERIFIED, CashReceipt.INTERIM }; private void denatureCashReceipts(String campusCode) { List verifiedReceipts = SpringContext.getBean(CashReceiptService.class).getCashReceipts(campusCode, BOTH_STATII); for (Iterator i = verifiedReceipts.iterator(); i.hasNext();) { CashReceiptDocument receipt = (CashReceiptDocument) i.next(); receipt.getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode("Z"); SpringContext.getBean(DocumentService.class).updateDocument(receipt); } } private CashReceiptDocument buildCashReceiptDoc(String campusCode, String description, String status, KualiDecimal checkAmount) throws WorkflowException { CashReceiptDocument crDoc = (CashReceiptDocument) SpringContext.getBean(DocumentService.class).getNewDocument(CashReceiptDocument.class); crDoc.getDocumentHeader().setDocumentDescription(description); crDoc.getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode(status); crDoc.setCheckEntryMode(CashReceiptDocument.CHECK_ENTRY_TOTAL); crDoc.setTotalConfirmedCheckAmount(checkAmount); crDoc.setCampusLocationCode(campusCode); crDoc.addSourceAccountingLine(CashReceiptFamilyTestUtil.buildSourceAccountingLine(crDoc.getDocumentNumber(), crDoc.getPostingYear(), crDoc.getNextSourceLineNumber())); saveDocument(crDoc); CashReceiptDocument persistedDoc = (CashReceiptDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(crDoc.getDocumentNumber()); return persistedDoc; } private void saveDocument(Document doc) throws WorkflowException { try { SpringContext.getBean(DocumentService.class).saveDocument(doc); } catch (ValidationException e) { // If the business rule evaluation fails then give us more info for debugging this test. fail(e.getMessage() + ", " + GlobalVariables.getMessageMap()); } } private Bank lookupBank() throws GeneralSecurityException { Map<String, String> keyMap = new HashMap<String, String>(); keyMap.put("bankCode", "TEST"); Bank bank = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(Bank.class, keyMap); assertNotNull("invalid bank for test", bank); return bank; } private void cleanupCancel(String documentId) throws Exception { if (documentId != null) { Document testDoc = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(documentId); if (testDoc != null && !testDoc.getDocumentHeader().getWorkflowDocument().isCanceled()) { final String initiatorNetworkId = SpringContext.getBean(PersonService.class).getPerson(testDoc.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId()).getPrincipalName(); final String previousNetworkId = GlobalVariables.getUserSession().getPerson().getPrincipalName(); if (!previousNetworkId.equals(initiatorNetworkId)) { changeCurrentUser(UserNameFixture.valueOf(initiatorNetworkId.toLowerCase())); // Only the initiator can cancel an initiated or saved document. testDoc = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(documentId); } SpringContext.getBean(DocumentService.class).cancelDocument(testDoc, "CMST cleanup cancel"); changeCurrentUser(UserNameFixture.valueOf(previousNetworkId.toLowerCase())); } } } }