/*
* 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.validation.impl;
import static org.kuali.kfs.sys.fixture.UserNameFixture.appleton;
import java.sql.Date;
import java.util.Calendar;
import java.util.Map;
import java.util.Set;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.PurapKeyConstants;
import org.kuali.kfs.module.purap.PurapPropertyConstants;
import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
import org.kuali.kfs.module.purap.document.service.PaymentRequestService;
import org.kuali.kfs.module.purap.document.validation.PurapRuleTestBase;
import org.kuali.kfs.module.purap.fixture.PaymentRequestInvoiceTabFixture;
import org.kuali.kfs.module.purap.fixture.PaymentRequestTaxTabFixture;
import org.kuali.kfs.module.purap.util.TestPaymentRequestPayDateNotPastValidation;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.validation.GenericValidation;
import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEventBase;
import org.kuali.kfs.sys.document.workflow.MockWorkflowDocument;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kew.api.WorkflowDocument;
import org.kuali.rice.kew.api.action.ReturnPoint;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.util.ErrorMessage;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.MessageMap;
import org.springframework.util.AutoPopulatingList;
@ConfigureContext(session = appleton)
public class PaymentRequestDocumentRuleTest extends PurapRuleTestBase {
private DocumentService documentService;
private Map<String, GenericValidation> validations;
PaymentRequestDocument preq;
@Override
protected void setUp() throws Exception {
super.setUp();
if (null == documentService) {
documentService = SpringContext.getBean(DocumentService.class);
}
preq = (PaymentRequestDocument) documentService.getNewDocument(PaymentRequestDocument.class);
validations = SpringContext.getBeansOfType(GenericValidation.class);
}
@Override
protected void tearDown() throws Exception {
validations = null;
preq = null;
super.tearDown();
}
/*
* Tests of processInvoiceValidation
*/
public void testProcessInvoiceValidation_With_All() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
PaymentRequestInvoiceValidation validation = (PaymentRequestInvoiceValidation)validations.get("PaymentRequest-invoiceValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessInvoiceValidation_Without_PO_ID() {
preq = PaymentRequestInvoiceTabFixture.NO_POID_WITH_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
PaymentRequestInvoiceValidation validation = (PaymentRequestInvoiceValidation)validations.get("PaymentRequest-invoiceValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessInvoiceValidation_Without_Date() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_NO_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
PaymentRequestInvoiceValidation validation = (PaymentRequestInvoiceValidation)validations.get("PaymentRequest-invoiceValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessInvoiceValidation_Without_Number() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_NO_NUMBER_WITH_AMOUNT.populate(preq);
PaymentRequestInvoiceValidation validation = (PaymentRequestInvoiceValidation)validations.get("PaymentRequest-invoiceValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessInvoiceValidation_Without_Amount() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_WITH_NUMBER_NO_AMOUNT.populate(preq);
PaymentRequestInvoiceValidation validation = (PaymentRequestInvoiceValidation)validations.get("PaymentRequest-invoiceValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
/*
* Tests of processPurchaseOrderIDValidation
*/
/*
* Tests of encumberedItemExistsForInvoicing
*/
/*
* Tests of processPaymentRequestDateValidationForContinue
*/
private Date getDateFromOffsetFromToday(int offsetDays) {
Calendar calendar = SpringContext.getBean(DateTimeService.class).getCurrentCalendar();
calendar.add(Calendar.DATE, offsetDays);
return new Date(calendar.getTimeInMillis());
}
public void testProcessPaymentRequestDateValidationForContinue_BeforeToday() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
Date yesterday = getDateFromOffsetFromToday(-1);
preq.setInvoiceDate(yesterday);
PaymentRequestDateForContinueValidation validation = (PaymentRequestDateForContinueValidation)validations.get("PaymentRequest-dateForContinueValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessPaymentRequestDateValidationForContinue_AfterToday() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
Date tomorrow = getDateFromOffsetFromToday(1);
preq.setInvoiceDate(tomorrow);
PaymentRequestDateForContinueValidation validation = (PaymentRequestDateForContinueValidation)validations.get("PaymentRequest-dateForContinueValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testProcessPaymentRequestDateValidationForContinue_Today() {
preq = PaymentRequestInvoiceTabFixture.WITH_POID_WITH_DATE_WITH_NUMBER_WITH_AMOUNT.populate(preq);
Date today = SpringContext.getBean(DateTimeService.class).getCurrentSqlDate();
preq.setInvoiceDate(today);
PaymentRequestDateForContinueValidation validation = (PaymentRequestDateForContinueValidation)validations.get("PaymentRequest-dateForContinueValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testValidatePaymentRequestDates_PastAndInitiatedDocument() throws Exception {
DocumentService documentService = SpringContext.getBean(DocumentService.class);
PaymentRequestService paymentRequestService = SpringContext.getBean(PaymentRequestService.class);
// some date in the past
Date yesterday = getDateFromOffsetFromToday(-1);
assertFalse("Something is wrong with the test. Error map was not empty before document saving called", GlobalVariables.getMessageMap().hasErrors());
// rule 1: past pay dates are NOT allowed if the document has not been successfully saved or submitted yet
PaymentRequestDocument document1 = (PaymentRequestDocument) documentService.getNewDocument(PaymentRequestDocument.class);
document1.setPaymentRequestPayDate(yesterday);
PaymentRequestPayDateNotPastValidation validation = (PaymentRequestPayDateNotPastValidation)validations.get("PaymentRequest-payDateNotPastValidation-test");
assertFalse( validation.validate(new AttributedDocumentEventBase("","", document1)) );
AutoPopulatingList<ErrorMessage> l = GlobalVariables.getMessageMap().getMessages("document.paymentRequestPayDate");
boolean correctError = false;
for ( ErrorMessage m : l ) {
if (PurapKeyConstants.ERROR_INVALID_PAY_DATE.equals(m.getErrorKey())) {
correctError = true;
break;
}
}
assertTrue("Unable to find error message key '" + PurapKeyConstants.ERROR_INVALID_PAY_DATE + "'", correctError);
GlobalVariables.getMessageMap().clearErrorMessages();
}
public void testValidatePaymentRequestDates_PastAndPersistedDocument() throws Exception {
DocumentService documentService = SpringContext.getBean(DocumentService.class);
final Date yesterday = getDateFromOffsetFromToday(-1);
// rule 2: if a past paydate was already stored on the document in the database, the document may be saved with a past pay date only if
// the pay date is the same date in the database (i.e. can NOT change from one past paydate to another)
// we need to test the second part of the rule, but the testing framework makes this difficult because we have to first
// store a previous document in the DB, so I'm creating a special rule implementation that retrieves a hard coded document
TestPaymentRequestPayDateNotPastValidation validation = (TestPaymentRequestPayDateNotPastValidation)validations.get("TestPaymentRequest-payDateNotPastValidation-test");
validation.setTestDate(yesterday);
// create a workflow document that simulates the document being enroute
WorkflowDocument workflowDocument = new MockWorkflowDocument() {
public String getCurrentRouteNodeNames() {
return null;
}
public boolean isStandardSaveAllowed() {
return false;
}
@Override
public boolean isInitiated() {
return false;
}
@Override
public boolean isSaved() {
return false;
}
@Override
public boolean isEnroute() {
return true;
}
public void superUserActionRequestApprove(Long actionRequestId, String annotation) {
}
@Override
public void superUserCancel(String annotation) {
}
@Override
public void superUserDisapprove(String annotation) {
}
public boolean userIsRoutedByUser(Person user) {
return false;
}
public Set<Person> getAllPriorApprovers() {
return null;
}
public void adHocRouteDocumentToPrincipal(String actionRequested, String routeTypeName, String annotation, String principalId, String responsibilityDesc, boolean ignorePreviousActions) {
}
public void adHocRouteDocumentToGroup(String actionRequested, String routeTypeName, String annotation, String groupId, String responsibilityDesc, boolean ignorePreviousActions) {
}
@Override
public void returnToPreviousNode(String nodeName, ReturnPoint returnPoint) {
// TODO Auto-generated method stub
}
@Override
public boolean isRecalled() {
return false;
}
@Override
public void recall(String arg0, boolean arg1) {
// TODO Auto-generated method stub
}
};
PaymentRequestDocument document2 = (PaymentRequestDocument) documentService.getNewDocument(PaymentRequestDocument.class);
document2.getDocumentHeader().setWorkflowDocument(workflowDocument);
document2.setPaymentRequestPayDate(yesterday);
assertTrue("Didn't change past pay date, so doucment should validate successfully.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertFalse("Error map should be empty: " + GlobalVariables.getMessageMap().getErrorMessages(), GlobalVariables.getMessageMap().hasErrors());
document2.setPaymentRequestPayDate(getDateFromOffsetFromToday(-2));
assertFalse("changed past pay date to another past pay date, so document should fail.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertTrue("Error map should not be empty", GlobalVariables.getMessageMap().hasErrors());
GlobalVariables.getMessageMap().clearErrorMessages();
document2.setPaymentRequestPayDate(getDateFromOffsetFromToday(3));
assertTrue("Changed past pay date to future, so doucment should validate successfully.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertFalse("Error map should be empty: " + GlobalVariables.getMessageMap().getErrorMessages(), GlobalVariables.getMessageMap().hasErrors());
}
public void testValidatePaymentRequestDates_FutureAndPersistedDocument() throws Exception {
DocumentService documentService = SpringContext.getBean(DocumentService.class);
final Date tomorrow = getDateFromOffsetFromToday(1);
// rule 3: if a future paydate was already stored on the document in the database, the document may store any future pay date, but no past pay dates
// we need to test the second part of the rule, but the testing framework makes this difficult because we have to first
// store a previous document in the DB, so I'm creating a special rule implementation that retrieves a hard coded document
TestPaymentRequestPayDateNotPastValidation validation = (TestPaymentRequestPayDateNotPastValidation)validations.get("TestPaymentRequest-payDateNotPastValidation-test");
validation.setTestDate(tomorrow);
// create a workflow document that simulates the document being enroute
WorkflowDocument workflowDocument = new MockWorkflowDocument() {
public String getCurrentRouteNodeNames() {
return null;
}
public String getRoutedByUserNetworkId() {
return null;
}
public boolean isStandardSaveAllowed() {
return false;
}
@Override
public boolean isInitiated() {
return false;
}
@Override
public boolean isSaved() {
return false;
}
@Override
public boolean isEnroute() {
return true;
}
public void superUserActionRequestApprove(Long actionRequestId, String annotation) {
}
@Override
public void superUserCancel(String annotation) {
}
@Override
public void superUserDisapprove(String annotation) {
}
public boolean userIsRoutedByUser(Person user) {
return false;
}
public Set<Person> getAllPriorApprovers() {
return null;
}
public void adHocRouteDocumentToPrincipal(String actionRequested, String routeTypeName, String annotation, String principalId, String responsibilityDesc, boolean ignorePreviousActions) {
}
public void adHocRouteDocumentToGroup(String actionRequested, String routeTypeName, String annotation, String groupId, String responsibilityDesc, boolean ignorePreviousActions) {
}
@Override
public void returnToPreviousNode(String nodeName, ReturnPoint returnPoint) {
// TODO Auto-generated method stub
}
@Override
public boolean isRecalled() {
return false;
}
@Override
public void recall(String arg0, boolean arg1) {
// TODO Auto-generated method stub
}
};
PaymentRequestDocument document2 = (PaymentRequestDocument) documentService.getNewDocument(PaymentRequestDocument.class);
document2.getDocumentHeader().setWorkflowDocument(workflowDocument);
document2.setPaymentRequestPayDate(tomorrow);
assertTrue("Didn't change future pay date, so doucment should validate successfully.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertFalse("Error map should be empty: " + GlobalVariables.getMessageMap().getErrorMessages(), GlobalVariables.getMessageMap().hasErrors());
document2.setPaymentRequestPayDate(getDateFromOffsetFromToday(-2));
assertFalse("changed future pay date to past pay date, so document should fail.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertTrue("Error map should not be empty", GlobalVariables.getMessageMap().hasErrors());
GlobalVariables.getMessageMap().clearErrorMessages();
document2.setPaymentRequestPayDate(getDateFromOffsetFromToday(3));
assertTrue("Changed future pay date to another future date, so doucment should validate successfully.", validation.validate(new AttributedDocumentEventBase("","", document2)) );
assertFalse("Error map should be empty: " + GlobalVariables.getMessageMap().getErrorMessages(), GlobalVariables.getMessageMap().hasErrors());
}
public void testValidatePaymentRequestDates_Today() {
Date today = SpringContext.getBean(DateTimeService.class).getCurrentSqlDate();
preq.setPaymentRequestPayDate(today);
PaymentRequestPayDateNotPastValidation validation = (PaymentRequestPayDateNotPastValidation)validations.get("PaymentRequest-payDateNotPastValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
public void testValidatePaymentRequestDates_Tomorrow() {
Date tomorrow = getDateFromOffsetFromToday(1);
preq.setPaymentRequestPayDate(tomorrow);
PaymentRequestPayDateNotPastValidation validation = (PaymentRequestPayDateNotPastValidation)validations.get("PaymentRequest-payDateNotPastValidation-test");
assertTrue( validation.validate(new AttributedDocumentEventBase("","", preq)) );
}
/*
* Tests of validateItem
*/
/*
* Tests of validateItemAccounts
*/
/*
* Tests of validateCancel
*/
/*
* Tests of validatePaymentRequestReview
*/
/*
* Test for tax area edit rules.
*/
public void testProcessPreCalculateTaxAreaBusinessRules() {
MessageMap errMap = GlobalVariables.getMessageMap();
String pre = PurapConstants.PAYMENT_REQUEST_TAX_TAB_ERRORS + ".";
// testing tax income class
PaymentRequestTaxAreaValidation validation = (PaymentRequestTaxAreaValidation)validations.get("PaymentRequest-taxAreaValidation-test");
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_EMPTY.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_CLASSIFICATION_CODE, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_REQUIRED));
assertTrue(errMap.getErrorCount() == 1);
PaymentRequestTaxTabFixture.INCOME_N_OTHERS_EMPTY.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_N_OTHERS_NOTEMPTY.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_COUNTRY_CODE, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_NQI_ID, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_EXEMPT_TREATY_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.getErrorCount() == 7);
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_NOTN_TAX_COUNTRY_EMPTY.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_REQUIRED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_REQUIRED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_COUNTRY_CODE, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_REQUIRED_IF));
assertTrue(errMap.getErrorCount() == 3);
// testing tax rates
// Fellowship
PaymentRequestTaxTabFixture.INCOME_F_TAX_VALID.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_F_FED_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_F_ST_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
// Independent Contractor
PaymentRequestTaxTabFixture.INCOME_I_TAX_VALID.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_I_FED_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_I_ST_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
// Royalties
PaymentRequestTaxTabFixture.INCOME_R_TAX_VALID.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_R_FED_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.INCOME_R_ST_INVALID.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.getErrorCount() == 1);
// relationship between federal/state tax rates
PaymentRequestTaxTabFixture.FED_ZERO_ST_ZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.FFD_ZERO_ST_NOTZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.getErrorCount() == 1);
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.FED_NOTZERO_ST_ZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_NOT_ZERO_IF));
assertTrue(errMap.getErrorCount() == 1);
// testing tax indicators
// choose gross up
PaymentRequestTaxTabFixture.GROSS_TAX_NOTZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.GROSS_TAX_ZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_NOT_ZERO_IF));
assertTrue(errMap.getErrorCount() == 1);
// choose foreign source
PaymentRequestTaxTabFixture.FOREIGN_TAX_ZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.FOREIGN_TAX_NOTZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_STATE_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.getErrorCount() == 2);
// choose USAID per diem
PaymentRequestTaxTabFixture.USAID_OTHER_INCOME_F_TAX_ZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.USAID_INCOME_NOTF_TAX_NOTZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_OTHER_EXEMPT_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_REQUIRED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_CLASSIFICATION_CODE, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.getErrorCount() == 3);
// choose exempt under other code
PaymentRequestTaxTabFixture.OTHER_TAX_ZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.OTHER_TAX_NOTZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.getErrorCount() == 1);
// choose special W4
PaymentRequestTaxTabFixture.SW4_INCOME_F_TAX_ZERO.populate(preq);
assertTrue(validation.validate(new AttributedDocumentEventBase("","", preq)));
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.SW4_NEG_INCOME_NOTF_TAX_NOTZERO.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_SPECIAL_W4_AMOUNT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_MUST_NOT_NEGATIVE));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_CLASSIFICATION_CODE, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_VALUE_INVALID_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FEDERAL_PERCENT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_RATE_MUST_ZERO_IF));
assertTrue(errMap.getErrorCount() == 3);
// most indicators shall be mutual exclusive
errMap.clearErrorMessages();
PaymentRequestTaxTabFixture.SW4_TREATY_GROSS_FOREIGN_USAID_OTHER.populate(preq);
assertFalse(validation.validate(new AttributedDocumentEventBase("","", preq)));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_EXEMPT_TREATY_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_GROSS_UP_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_FOREIGN_SOURCE_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_USAID_PER_DIEM_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_OTHER_EXEMPT_INDICATOR, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
assertTrue(errMap.fieldHasMessage(pre+PurapPropertyConstants.TAX_SPECIAL_W4_AMOUNT, PurapKeyConstants.ERROR_PAYMENT_REQUEST_TAX_FIELD_DISALLOWED_IF));
}
}