/* * 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 java.util.List; import org.kuali.kfs.fp.businessobject.DisbursementVoucherNonResidentAlienTax; import org.kuali.kfs.fp.businessobject.DisbursementVoucherPayeeDetail; import org.kuali.kfs.fp.document.DisbursementVoucherDocument; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.SourceAccountingLine; 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.krad.service.DocumentService; import org.kuali.rice.krad.util.GlobalVariables; /** * This class tests the DisbursementVoucherTax service. */ @ConfigureContext(session=UserNameFixture.khuntley) public class DisbursementVoucherTaxServiceTest extends KualiTestBase { private DisbursementVoucherDocument dvDocument; @Override protected void setUp() throws Exception { super.setUp(); dvDocument = (DisbursementVoucherDocument) SpringContext.getBean(DocumentService.class).getNewDocument(DisbursementVoucherDocument.class); dvDocument.setDvPayeeDetail(new DisbursementVoucherPayeeDetail()); dvDocument.setDvNonResidentAlienTax(new DisbursementVoucherNonResidentAlienTax()); dvDocument.getDvPayeeDetail().setDisbVchrAlienPaymentCode(true); AccountingLine line = new SourceAccountingLine(); line.setChartOfAccountsCode("UA"); line.setAccountNumber("1912610"); line.setFinancialObjectCode("5000"); line.setAmount(new KualiDecimal(100)); line.setSequenceNumber(new Integer(1)); dvDocument.getSourceAccountingLines().add(line); dvDocument.setNextSourceLineNumber(new Integer(2)); } /** * Test validation of nra information before generation of lines * * @throws Exception */ public void testValidateNRA() throws Exception { // check tax is not created for attributes that it should not be generated for dvDocument.setDisbVchrCheckTotalAmount(new KualiDecimal(100)); dvDocument.getDvNonResidentAlienTax().setFederalIncomeTaxPercent(KualiDecimal.ZERO); dvDocument.getDvNonResidentAlienTax().setStateIncomeTaxPercent(KualiDecimal.ZERO); // should not be generated for non-reportable dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("N"); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); List newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.isEmpty()); assertTrue(GlobalVariables.getMessageMap().getNumberOfPropertiesWithErrors() == 1); GlobalVariables.getMessageMap().clearErrorMessages(); // should not be generated for foreign source dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(true); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.isEmpty()); assertTrue(GlobalVariables.getMessageMap().getNumberOfPropertiesWithErrors() == 1); GlobalVariables.getMessageMap().clearErrorMessages(); // should not be generated for treaty exempt dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); dvDocument.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(true); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.isEmpty()); assertTrue(GlobalVariables.getMessageMap().getNumberOfPropertiesWithErrors() == 1); GlobalVariables.getMessageMap().clearErrorMessages(); // should not be generated for doc reference is given dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); dvDocument.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(false); dvDocument.getDvNonResidentAlienTax().setReferenceFinancialDocumentNumber("foo"); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.isEmpty()); assertTrue(GlobalVariables.getMessageMap().getNumberOfPropertiesWithErrors() == 1); GlobalVariables.getMessageMap().clearErrorMessages(); // should not be generated if check amount is 0 dvDocument.setDisbVchrCheckTotalAmount(KualiDecimal.ZERO); dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); dvDocument.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(false); dvDocument.getDvNonResidentAlienTax().setReferenceFinancialDocumentNumber(""); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.isEmpty()); assertTrue(GlobalVariables.getMessageMap().getNumberOfPropertiesWithErrors() == 1); GlobalVariables.getMessageMap().clearErrorMessages(); } /** * Test generation and clearing of nra tax lines. */ public void testGenerateNRATaxLines() { KualiDecimal orginalCheckAmount = new KualiDecimal(100); dvDocument.setDisbVchrCheckTotalAmount(new KualiDecimal(100)); dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); dvDocument.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(false); dvDocument.getDvNonResidentAlienTax().setReferenceFinancialDocumentNumber(""); dvDocument.getDvNonResidentAlienTax().setFederalIncomeTaxPercent(new KualiDecimal(14)); dvDocument.getDvNonResidentAlienTax().setStateIncomeTaxPercent(new KualiDecimal(3.4)); dvDocument.getDvNonResidentAlienTax().setPostalCountryCode("USA"); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); List newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.size() == 2); assertTrue(newTaxNumbers.get(0).equals(new Integer(2))); assertTrue(newTaxNumbers.get(1).equals(new Integer(3))); assertTrue(dvDocument.getNextSourceLineNumber().equals(new Integer(4))); assertTrue(dvDocument.getSourceAccountingLines().size() == 3); // test clearning SpringContext.getBean(DisbursementVoucherTaxService.class).clearNRATaxLines(dvDocument); assertEquals(1, dvDocument.getSourceAccountingLines().size()); assertEquals("Check total credited correctly", new KualiDecimal(100), dvDocument.getDisbVchrCheckTotalAmount()); assertEquals("Source total does not match check total", new KualiDecimal(100), dvDocument.getSourceTotal()); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertTrue(newTaxNumbers.size() == 2); assertTrue(newTaxNumbers.get(0).equals(new Integer(4))); assertTrue(newTaxNumbers.get(1).equals(new Integer(5))); assertTrue(dvDocument.getNextSourceLineNumber().equals(new Integer(6))); assertEquals(3, dvDocument.getSourceAccountingLines().size()); // validate debit of check total amount and accounting lines assertEquals("Check total not debited correctly", new KualiDecimal(82.6), dvDocument.getDisbVchrCheckTotalAmount()); assertEquals("Source total does not match check total", new KualiDecimal(82.6), dvDocument.getSourceTotal()); SpringContext.getBean(DisbursementVoucherTaxService.class).clearNRATaxLines(dvDocument); } /** * Tests correct calculation of gross up amounts */ public void testGrossUp() { dvDocument.getDvNonResidentAlienTax().setIncomeClassCode("F"); dvDocument.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); dvDocument.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(false); dvDocument.getDvNonResidentAlienTax().setReferenceFinancialDocumentNumber(null); dvDocument.getDvNonResidentAlienTax().setPostalCountryCode("USA"); dvDocument.getDvNonResidentAlienTax().setIncomeTaxGrossUpCode(true); runGrossUpTest(new KualiDecimal(100), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(50.55), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(10), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(12.82), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(12.83), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(12.84), new KualiDecimal(14), new KualiDecimal(3.4)); runGrossUpTest(new KualiDecimal(8456234.23), new KualiDecimal(14), new KualiDecimal(3.4)); } private void runGrossUpTest(KualiDecimal checkAmount, KualiDecimal federalTax, KualiDecimal stateTax) { dvDocument.setDisbVchrCheckTotalAmount(checkAmount); dvDocument.getSourceAccountingLine(0).setAmount(checkAmount); dvDocument.getDvNonResidentAlienTax().setFederalIncomeTaxPercent(federalTax); dvDocument.getDvNonResidentAlienTax().setStateIncomeTaxPercent(stateTax); SpringContext.getBean(DisbursementVoucherTaxService.class).processNonResidentAlienTax(dvDocument); List newTaxNumbers = SpringContext.getBean(DisbursementVoucherTaxService.class).getNRATaxLineNumbers(dvDocument.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); assertEquals( "Number of new tax lines is incorrect.", 3, newTaxNumbers.size() ); assertEquals("Check total does not match original amount", checkAmount, dvDocument.getDisbVchrCheckTotalAmount()); assertEquals("Source total does not match original amount", checkAmount, dvDocument.getSourceTotal()); SpringContext.getBean(DisbursementVoucherTaxService.class).clearNRATaxLines(dvDocument); } }