/*
* 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.tem.batch.service;
import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
import java.util.List;
import org.junit.Test;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.TemConstants.AgencyStagingDataErrorCodes;
import org.kuali.kfs.module.tem.TemConstants.ExpenseImportTypes;
import org.kuali.kfs.module.tem.businessobject.AgencyStagingData;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TemSourceAccountingLine;
import org.kuali.kfs.module.tem.businessobject.TripAccountingInformation;
import org.kuali.kfs.module.tem.businessobject.defaultvalue.NextAgencyStagingDataIdFinder;
import org.kuali.kfs.module.tem.document.TravelAuthorizationDocument;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.service.SequenceAccessorService;
import org.kuali.rice.krad.util.ErrorMessage;
@ConfigureContext(session = khuntley)
public class ExpenseImportByTripServiceTest extends KualiTestBase {
private ExpenseImportByTripService expenseImportByTripService;
private DateTimeService dateTimeService;
private BusinessObjectService businessObjectService;
private SequenceAccessorService sas;
private ParameterService parameterService;
private DocumentService documentService;
private static final String TRIP_ID = "12345678";
@Override
protected void setUp() throws Exception {
super.setUp();
expenseImportByTripService = SpringContext.getBean(ExpenseImportByTripService.class);
dateTimeService = SpringContext.getBean(DateTimeService.class);
businessObjectService = SpringContext.getBean(BusinessObjectService.class);
sas = SpringContext.getBean(SequenceAccessorService.class);
parameterService = SpringContext.getBean(ParameterService.class);
documentService = SpringContext.getBean(DocumentService.class);
}
/**
*
* This method tests {@link ExpenseImportByTripService#validateAccountingInfo(TemProfile, AgencyStagingData)}
*/
@Test
@ConfigureContext(shouldCommitTransactions = false, session = khuntley)
public void testValidateAccountingInfo() {
AgencyStagingData agency = createAgencyStagingData();
TravelAuthorizationDocument travelAuth = createTA();
// success case
expenseImportByTripService.validateAccountingInfo(agency);
assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR));
TripAccountingInformation accountingInfo = agency.getTripAccountingInformation().get(0);
// test with an invalid account
accountingInfo.setTripAccountNumber("");
expenseImportByTripService.validateAccountingInfo(agency);
assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_INVALID_ACCOUNT));
// test with an invalid sub-account
accountingInfo.setTripAccountNumber("1031400");
accountingInfo.setTripSubAccountNumber("ZZ");
agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR);
expenseImportByTripService.validateAccountingInfo(agency);
assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_INVALID_SUBACCOUNT));
// test with an invalid project code
accountingInfo.setTripSubAccountNumber("");
accountingInfo.setProjectCode("COOL");
agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR);
expenseImportByTripService.validateAccountingInfo(agency);
assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_INVALID_PROJECT));
}
/**
*
* This method tests {@link ExpenseImportByTripService#validateTripId(AgencyStagingData)}
*/
@Test
@ConfigureContext(shouldCommitTransactions = false)
public void testValidateTripId() throws Exception {
// invalid trip id
AgencyStagingData agency = createAgencyStagingData();
expenseImportByTripService.validateTripId(agency);
assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_INVALID_TRIPID));
}
/**
*
* This method tests {@link ExpenseImportByTripService#isDuplicate(AgencyStagingData)}
*/
@Test
@ConfigureContext(shouldCommitTransactions = false)
public void testIsDuplicate() {
AgencyStagingData dbData = createAgencyStagingData();
businessObjectService.save(dbData);
// duplicate entry test
AgencyStagingData importData = createAgencyStagingData();
List<ErrorMessage> errorMessages = expenseImportByTripService.validateDuplicateData(importData);
assertTrue(!errorMessages.isEmpty());
// not a duplicate
importData.setTripId("987654321");
errorMessages = expenseImportByTripService.validateDuplicateData(importData);
assertTrue(errorMessages.isEmpty());
}
/**
*
* This method tests {@link ExpenseImportByTripService#areMandatoryFieldsPresent(AgencyStagingData)}
*/
@Test
@ConfigureContext(shouldCommitTransactions = false)
public void testAreMandatoryFieldsPresent() {
AgencyStagingData agency = createAgencyStagingData();
// all fields present
List<ErrorMessage> errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertTrue(errorMessages.isEmpty());
// missing fields, testing in reverse order of the if block to hit all possible checks
agency.setAirTicketNumber("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setTripInvoiceNumber("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setTripExpenseAmount("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.getTripAccountingInformation().get(0).setTripAccountNumber("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setTransactionPostingDate(null);
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setAlternateTripId(null);
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setTripId("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
agency.setCreditCardOrAgencyCode("");
errorMessages = expenseImportByTripService.validateMandatoryFieldsPresent(agency);
assertFalse(errorMessages.isEmpty());
}
protected TemProfile createTemProfile() {
TemProfile profile = new TemProfile();
Integer newProfileId = sas.getNextAvailableSequenceNumber(TemConstants.TEM_PROFILE_SEQ_NAME).intValue();
profile.setProfileId(newProfileId);
profile.getTemProfileAddress().setProfileId(newProfileId);
profile.setDefaultChartCode("BL");
profile.setDefaultAccount("1031400");
profile.setDefaultSubAccount("ADV");
profile.setDefaultProjectCode("KUL");
profile.setDateOfBirth(dateTimeService.getCurrentSqlDate());
profile.setGender("M");
profile.setHomeDeptOrgCode("BL");
profile.setHomeDeptChartOfAccountsCode("BL");
return profile;
}
protected AgencyStagingData createAgencyStagingData() {
AgencyStagingData agency = new AgencyStagingData();
NextAgencyStagingDataIdFinder idFinder = new NextAgencyStagingDataIdFinder();
agency.setId(Integer.valueOf(idFinder.getValue()));
agency.setImportBy(ExpenseImportTypes.IMPORT_BY_TRIP);
agency.setTravelerName("Traveler Bob");
agency.setCreditCardOrAgencyCode("1234");
agency.setTripId(TRIP_ID);
agency.setAlternateTripId("12345678");
agency.setTransactionPostingDate(dateTimeService.getCurrentSqlDate());
agency.setTripExpenseAmount(new KualiDecimal(123.45));
agency.setTripInvoiceNumber("invoice12345");
agency.setAirTicketNumber("12345678");
//agency.
TripAccountingInformation account = new TripAccountingInformation();
account.setTripChartCode("BL");
account.setTripAccountNumber("1031400");
agency.addTripAccountingInformation(account);
agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR);
return agency;
}
protected TravelAuthorizationDocument createTA() {
TravelAuthorizationDocument ta = null;
try {
ta = (TravelAuthorizationDocument)documentService.getNewDocument(TravelAuthorizationDocument.class);
ta.getDocumentHeader().setDocumentDescription("testing");
ta.setTravelDocumentIdentifier(TRIP_ID);
ta.setTripTypeCode("IN");
ta.setApplicationDocumentStatus("In Process");
TemSourceAccountingLine line = new TemSourceAccountingLine();
line.setAccountNumber("1031400");
line.setSubAccountNumber("ADV");
line.setFinancialObjectCode("6000");
line.setChartOfAccountsCode("BL");
line.setCardType(TemConstants.ADVANCE);
line.setAmount(new KualiDecimal(50));
ta.addSourceAccountingLine(line);
TemProfile temProfile = new TemProfile();
temProfile.setPrincipalName("abeal");
temProfile.setProfileId(8);
temProfile.setTravelerTypeCode("EMP");
ta.setTemProfile(temProfile);
documentService.saveDocument(ta);
} catch (Exception e) {
e.printStackTrace();
}
return ta;
}
}