/*
* 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;
import static org.kuali.kfs.sys.document.AccountingDocumentTestUtils.saveDocument;
import static org.kuali.kfs.sys.document.AccountingDocumentTestUtils.testGetNewDocument_byDocumentClass;
import static org.kuali.kfs.sys.fixture.AccountingLineFixture.LINE7;
import static org.kuali.kfs.sys.fixture.UserNameFixture.hschrein;
import static org.kuali.kfs.sys.fixture.UserNameFixture.mylarge;
import static org.kuali.kfs.sys.fixture.UserNameFixture.vputman;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import junit.framework.Assert;
import org.apache.log4j.Logger;
import org.kuali.kfs.fp.businessobject.DisbursementVoucherNonResidentAlienTax;
import org.kuali.kfs.fp.businessobject.DisbursementVoucherPayeeDetail;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.DocumentTestUtils;
import org.kuali.kfs.sys.KualiTestConstants;
import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
import org.kuali.kfs.sys.businessobject.TargetAccountingLine;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AccountingDocument;
import org.kuali.kfs.sys.document.AccountingDocumentTestUtils;
import org.kuali.kfs.sys.document.workflow.WorkflowTestUtils;
import org.kuali.kfs.sys.fixture.AccountingLineFixture;
import org.kuali.kfs.sys.fixture.UserNameFixture;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.kns.util.KNSGlobalVariables;
import org.kuali.rice.krad.document.Document;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.GlobalVariables;
/**
* This class is used to test DisbursementVoucherDocument.
*/
@ConfigureContext(session = hschrein)
public class DisbursementVoucherDocumentTest extends KualiTestBase {
private static Logger LOG = Logger.getLogger(DisbursementVoucherDocumentTest.class);
public static final Class<DisbursementVoucherDocument> DOCUMENT_CLASS = DisbursementVoucherDocument.class;
// The set of Route Nodes that the test document will progress through
private static final String ACCOUNT_REVIEW = "Account";
private static final String ORG_REVIEW = "AccountingOrganizationHierarchy";
private static final String TAX_REVIEW = "Tax";
private static final String CAMPUS_CODE = "Campus";
private static final String PAYMENT_METHOD = "PaymentMethod";
public final void testConvertIntoCopy_clear_additionalCodeInvalidVendor() throws Exception {
// Clear both Message lists until rice drops the latter
GlobalVariables.getMessageMap().clearErrorMessages();
KNSGlobalVariables.getMessageList().clear();
DisbursementVoucherDocument dvParameter = (DisbursementVoucherDocument) getDocumentParameterFixture();
DisbursementVoucherDocument document = (DisbursementVoucherDocument) getDocumentParameterFixture();
document.getDvPayeeDetail().setDisbVchrPayeeIdNumber("1234-0");
document.getDvPayeeDetail().setDisbursementVoucherPayeeTypeCode("V");
document.toCopy();
// the dvParameter doc number needs to be resynced
dvParameter.setDocumentNumber(document.getDocumentNumber());
dvParameter.setDisbVchrContactPhoneNumber("");
dvParameter.setDisbVchrContactEmailId("");
dvParameter.getDvPayeeDetail().setDisbVchrPayeePersonName(null);
dvParameter.getDvPayeeDetail().setDisbVchrAlienPaymentCode(false);
dvParameter.getDvPayeeDetail().setDisbVchrPaymentReasonCode(null);
dvParameter.setDvNonResidentAlienTax(new DisbursementVoucherNonResidentAlienTax());
dvParameter.setDisbVchrPayeeTaxControlCode("");
dvParameter.getDvPayeeDetail().setDisbVchrPayeeIdNumber("");
dvParameter.setDisbVchrContactPersonName(GlobalVariables.getUserSession().getPerson().getName());
// set to tomorrow
Calendar calendar = SpringContext.getBean(DateTimeService.class).getCurrentCalendar();
calendar.add(Calendar.DAY_OF_MONTH, 1);
calendar.clear(Calendar.MILLISECOND);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.HOUR);
dvParameter.setDisbursementVoucherDueDate(new Date(calendar.getTimeInMillis()));
// clear document time since just want to compare dates
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(document.getDisbursementVoucherDueDate().getTime());
calendar2.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.SECOND);
calendar2.clear(Calendar.MINUTE);
calendar2.clear(Calendar.HOUR);
document.setDisbursementVoucherDueDate(new Date(calendar2.getTimeInMillis()));
assertMatch(dvParameter, document);
}
@ConfigureContext(session = hschrein, shouldCommitTransactions = true)
// @RelatesTo(RelatesTo.JiraIssue.KULRNE4834)
public final void testWorkflowRouting() throws Exception {
// save and route the document
Document document = buildDocument();
final String docId = document.getDocumentNumber();
SpringContext.getBean(DocumentService.class).routeDocument(document, "routing test doc", null);
WorkflowTestUtils.waitForNodeChange(document.getDocumentHeader().getWorkflowDocument(), ACCOUNT_REVIEW);
// the document should now be routed to vputman as Fiscal Officer
changeCurrentUser(vputman);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(document, ACCOUNT_REVIEW));
assertTrue("Document should be enroute.", document.getDocumentHeader().getWorkflowDocument().isEnroute());
assertTrue("vputman should have an approve request.", document.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(document, "Test approving as vputman", null);
/*WorkflowTestUtils.waitForNodeChange(document.getDocumentHeader().getWorkflowDocument(), ORG_REVIEW);
// now doc should be in Org Review routing to cswinson
changeCurrentUser(UserNameFixture.cswinson);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(document, ORG_REVIEW));
assertTrue("cswinson should have an approve request.", document.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(document, "Test approving as cswinson", null);*/
WorkflowTestUtils.waitForNodeChange(document.getDocumentHeader().getWorkflowDocument(), TAX_REVIEW);
// now doc should be in Org Review routing to cswinson
changeCurrentUser(UserNameFixture.dfogle);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(document, TAX_REVIEW));
assertTrue("dfogle should have an approve request.", document.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(document, "Test approving as dfogle", null);
// this is going to skip a bunch of other routing and end up at campus code
WorkflowTestUtils.waitForNodeChange(document.getDocumentHeader().getWorkflowDocument(), CAMPUS_CODE);
// doc should be in "Campus Code" routing to mylarge
changeCurrentUser(mylarge);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(document, CAMPUS_CODE));
assertTrue("Should have an approve request.", document.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(document, "Approve", null);
/*WorkflowTestUtils.waitForNodeChange(document.getDocumentHeader().getWorkflowDocument(), PAYMENT_METHOD);
// doc should be in "Campus Code" routing to mylarge
changeCurrentUser(UserNameFixture.appleton);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("At incorrect node.", WorkflowTestUtils.isAtNode(document, PAYMENT_METHOD));
assertTrue("Should have an approve request.", document.getDocumentHeader().getWorkflowDocument().isApprovalRequested());
SpringContext.getBean(DocumentService.class).approveDocument(document, "Approve", null);*/
WorkflowTestUtils.waitForDocumentApproval(document.getDocumentNumber());
changeCurrentUser(vputman);
document = SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(docId);
assertTrue("Document should now be final.", document.getDocumentHeader().getWorkflowDocument().isFinal());
}
private int getExpectedPrePeCount() {
return 2;
}
private Document getDocumentParameterFixture() throws Exception {
DisbursementVoucherDocument document = DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), DisbursementVoucherDocument.class);
DisbursementVoucherPayeeDetail payeeDetail = new DisbursementVoucherPayeeDetail();
payeeDetail.setDisbVchrPayeeIdNumber("1013-0");
// payeeDetail.setDisbVchrAlienPaymentCode(true);
payeeDetail.setDisbursementVoucherPayeeTypeCode("V");
payeeDetail.setDisbVchrPayeeLine1Addr("100 Main St");
payeeDetail.setDisbVchrPayeeCityName("Bloomington");
payeeDetail.setDisbVchrPayeeStateCode("IN");
payeeDetail.setDisbVchrPayeeZipCode("47405");
payeeDetail.setDisbVchrPayeeCountryCode("US");
payeeDetail.setDisbVchrVendorDetailAssignedIdNumber("0");
payeeDetail.setDisbVchrPayeePersonName("Jerry Neal");
payeeDetail.setDisbVchrPaymentReasonCode("B");
payeeDetail.setDocumentNumber(document.getDocumentNumber());
// payee detail
document.setDvPayeeDetail(payeeDetail);
// payment info
document.setDisbVchrPaymentMethodCode("P");
document.setDisbursementVoucherDueDate(Date.valueOf("2010-01-24"));
document.setDisbursementVoucherDocumentationLocationCode("F");
// contact information
document.setCampusCode("BL");
document.setDisbVchrContactPhoneNumber("808-123-4567");
document.setDisbVchrContactPersonName("aynalem");
document.setDisbVchrCheckStubText("Test DV Check");
document.setDisbVchrBankCode(KualiTestConstants.TestConstants.BankCodeTestData.BANK_CODE);
KualiDecimal amount = KualiDecimal.ZERO;
for (AccountingLineFixture fixture : getSourceAccountingLineParametersFromFixtures()) {
amount = amount.add(fixture.amount);
}
for (AccountingLineFixture fixture : getTargetAccountingLineParametersFromFixtures()) {
amount = amount.add(fixture.amount);
}
document.setDisbVchrCheckTotalAmount(amount);
return document;
}
private List<AccountingLineFixture> getTargetAccountingLineParametersFromFixtures() {
return new ArrayList<AccountingLineFixture>();
}
private List<AccountingLineFixture> getSourceAccountingLineParametersFromFixtures() {
List<AccountingLineFixture> list = new ArrayList<AccountingLineFixture>();
list.add(LINE7);
return list;
}
private <T extends Document> void assertMatch(T document1, T document2) {
AccountingDocumentTestUtils.assertMatch(document1, document2);
DisbursementVoucherDocument d1 = (DisbursementVoucherDocument) document1;
DisbursementVoucherDocument d2 = (DisbursementVoucherDocument) document2;
assertPayeeDetail(d1.getDvPayeeDetail(), d2.getDvPayeeDetail());
Assert.assertEquals(d2.getDisbVchrCheckTotalAmount(), d2.getDisbVchrCheckTotalAmount());
Assert.assertEquals(d1.getDisbVchrPaymentMethodCode(), d2.getDisbVchrPaymentMethodCode());
Assert.assertEquals(d1.getDisbursementVoucherDueDate(), d2.getDisbursementVoucherDueDate());
Assert.assertEquals(d1.getDisbursementVoucherDocumentationLocationCode(), d2.getDisbursementVoucherDocumentationLocationCode());
Assert.assertEquals(d1.getDisbVchrContactEmailId(), d2.getDisbVchrContactEmailId());
Assert.assertEquals(d1.getDisbVchrContactPhoneNumber(), d2.getDisbVchrContactPhoneNumber());
Assert.assertEquals(d1.getDisbVchrPayeeTaxControlCode(), d2.getDisbVchrPayeeTaxControlCode());
Assert.assertEquals(d1.getDisbVchrContactPersonName(), d2.getDisbVchrContactPersonName());
}
private void assertPayeeDetail(DisbursementVoucherPayeeDetail d1, DisbursementVoucherPayeeDetail d2) {
Assert.assertEquals(d1.getDisbVchrPayeeIdNumber(), d2.getDisbVchrPayeeIdNumber());
Assert.assertEquals(d1.getDisbVchrPayeePersonName(), d2.getDisbVchrPayeePersonName());
Assert.assertEquals(d1.getDisbVchrPaymentReasonCode(), d2.getDisbVchrPaymentReasonCode());
}
public final void testAddAccountingLine() throws Exception {
List<SourceAccountingLine> sourceLines = generateSouceAccountingLines();
List<TargetAccountingLine> targetLines = generateTargetAccountingLines();
int expectedSourceTotal = sourceLines.size();
int expectedTargetTotal = targetLines.size();
AccountingDocumentTestUtils.testAddAccountingLine(DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), DOCUMENT_CLASS), sourceLines, targetLines, expectedSourceTotal, expectedTargetTotal);
}
public final void testGetNewDocument() throws Exception {
testGetNewDocument_byDocumentClass(DOCUMENT_CLASS, SpringContext.getBean(DocumentService.class));
}
public final void testConvertIntoCopy_copyDisallowed() throws Exception {
AccountingDocumentTestUtils.testConvertIntoCopy_copyDisallowed(buildDocument(), SpringContext.getBean(DataDictionaryService.class));
}
@ConfigureContext(session = hschrein, shouldCommitTransactions = true)
public final void testRouteDocument() throws Exception {
DisbursementVoucherDocument document = buildDocument();
AccountingDocumentTestUtils.testRouteDocument(document, SpringContext.getBean(DocumentService.class));
}
@ConfigureContext(session = hschrein, shouldCommitTransactions = true)
public final void testSaveDocument() throws Exception {
// get document parameter
AccountingDocument document = buildDocument();
document.prepareForSave();
// save
saveDocument(document, SpringContext.getBean(DocumentService.class));
// retrieve
AccountingDocument result = (AccountingDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(document.getDocumentNumber());
// verify
assertMatch(document, result);
}
@ConfigureContext(session = hschrein, shouldCommitTransactions = true)
public final void testConvertIntoCopy() throws Exception {
DisbursementVoucherDocument document = buildDocument();
String originalDocumentNumber = document.getDocumentNumber();
AccountingDocumentTestUtils.testConvertIntoCopy(document, SpringContext.getBean(DocumentService.class), getExpectedPrePeCount());
String copiedDocumentNumber = document.getDocumentNumber();
DocumentService documentService = SpringContext.getBean(DocumentService.class);
// original document is dirty and can't be deleted until copied document is saved
document.prepareForSave();
saveDocument(document, documentService);
SpringContext.getBean(BusinessObjectService.class).delete(documentService.getByDocumentHeaderId(originalDocumentNumber));
SpringContext.getBean(BusinessObjectService.class).delete(documentService.getByDocumentHeaderId(copiedDocumentNumber));
}
// test util methods
private List<SourceAccountingLine> generateSouceAccountingLines() throws Exception {
List<SourceAccountingLine> sourceLines = new ArrayList<SourceAccountingLine>();
// set accountinglines to document
for (AccountingLineFixture sourceFixture : getSourceAccountingLineParametersFromFixtures()) {
sourceLines.add(sourceFixture.createSourceAccountingLine());
}
return sourceLines;
}
private List<TargetAccountingLine> generateTargetAccountingLines() throws Exception {
List<TargetAccountingLine> targetLines = new ArrayList<TargetAccountingLine>();
for (AccountingLineFixture targetFixture : getTargetAccountingLineParametersFromFixtures()) {
targetLines.add(targetFixture.createTargetAccountingLine());
}
return targetLines;
}
private DisbursementVoucherDocument buildDocument() throws Exception {
// put accounting lines into document parameter for later
DisbursementVoucherDocument document = (DisbursementVoucherDocument) getDocumentParameterFixture();
// set accountinglines to document
for (AccountingLineFixture sourceFixture : getSourceAccountingLineParametersFromFixtures()) {
sourceFixture.addAsSourceTo(document);
}
for (AccountingLineFixture targetFixture : getTargetAccountingLineParametersFromFixtures()) {
targetFixture.addAsTargetTo(document);
}
return document;
}
}