/* * 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.apache.commons.lang.StringUtils; import org.junit.Test; import org.kuali.kfs.module.tem.TemConstants; import org.kuali.kfs.module.tem.TemConstants.AgencyMatchProcessParameter; import org.kuali.kfs.module.tem.TemConstants.AgencyStagingDataErrorCodes; import org.kuali.kfs.module.tem.TemConstants.ExpenseImportTypes; import org.kuali.kfs.module.tem.TemParameterConstants; import org.kuali.kfs.module.tem.businessobject.AgencyStagingData; import org.kuali.kfs.module.tem.businessobject.TemProfile; import org.kuali.kfs.module.tem.businessobject.TripAccountingInformation; import org.kuali.kfs.module.tem.businessobject.defaultvalue.NextAgencyStagingDataIdFinder; 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.api.parameter.Parameter; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.SequenceAccessorService; import org.kuali.rice.krad.util.ErrorMessage; @ConfigureContext(session = khuntley) public class ExpenseImportByTravelerServiceTest extends KualiTestBase { private ExpenseImportByTravelerService expenseImportByTravelerService; private DateTimeService dateTimeService; private BusinessObjectService businessObjectService; private SequenceAccessorService sas; private ParameterService parameterService; private final static String EMPLOYEE_ID = "123456789"; private final static String CUSTOMER_NUM = "ABC1234"; @Override protected void setUp() throws Exception { super.setUp(); expenseImportByTravelerService = SpringContext.getBean(ExpenseImportByTravelerService.class); dateTimeService = SpringContext.getBean(DateTimeService.class); businessObjectService = SpringContext.getBean(BusinessObjectService.class); sas = SpringContext.getBean(SequenceAccessorService.class); parameterService = SpringContext.getBean(ParameterService.class); } /** * * This method tests {@link ExpenseImportByTravelerService#validateAccountingInfo(TemProfile, AgencyStagingData)} */ @Test @ConfigureContext(shouldCommitTransactions = false) public void testValidateAccountingInfo() { AgencyStagingData agency = createAgencyStagingData(); TemProfile profile = createTemProfile(); // parameter is defaulted to 6000, but there are no valid combos that // will work with 6000. Set it to 5000 for testing purposes. Parameter param = parameterService.getParameter(TemParameterConstants.TEM_ALL.class, AgencyMatchProcessParameter.TRAVEL_CREDIT_CARD_AIRFARE_OBJECT_CODE); Parameter.Builder builder = Parameter.Builder.create(param); builder.setValue("5000"); parameterService.updateParameter(builder.build()); // success case expenseImportByTravelerService.validateAccountingInfo(agency); assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR)); assertTrue(agency.getTripAccountingInformation().size()==1); TripAccountingInformation accountingInfo = agency.getTripAccountingInformation().get(0); assertTrue(StringUtils.equals(accountingInfo.getTripAccountNumber(), profile.getDefaultAccount())); assertTrue(StringUtils.equals(accountingInfo.getTripSubAccountNumber(), profile.getDefaultSubAccount())); assertTrue(StringUtils.equals(accountingInfo.getProjectCode(), profile.getDefaultProjectCode())); } /** * * This method tests {@link ExpenseImportByTravelerService#validateTraveler(AgencyStagingData)} */ @Test @ConfigureContext(shouldCommitTransactions = false) public void testValidateTraveler() { TemProfile employee = createTemProfile(); employee.setTravelerTypeCode(TemConstants.EMP_TRAVELER_TYP_CD); employee.setEmployeeId(EMPLOYEE_ID); businessObjectService.save(employee); TemProfile customer = createTemProfile(); customer.setTravelerTypeCode(TemConstants.NONEMP_TRAVELER_TYP_CD); customer.setCustomerNumber(CUSTOMER_NUM); businessObjectService.save(customer); AgencyStagingData agency = createAgencyStagingData(); agency.setTravelerId("987654321"); List<ErrorMessage> errors = expenseImportByTravelerService.validateTraveler(agency); assertTrue(!errors.isEmpty()); assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_INVALID_TRAVELER)); agency.setTravelerId(EMPLOYEE_ID); agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR); TemProfile empProfile = expenseImportByTravelerService.getTraveler(agency); assertTrue(empProfile.getEmployeeId().equals(agency.getTravelerId())); assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR)); agency = createAgencyStagingData(); agency.setTravelerId(CUSTOMER_NUM); agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR); TemProfile custProfile = expenseImportByTravelerService.getTraveler(agency); assertTrue(custProfile.getCustomerNumber().equals(agency.getTravelerId())); assertTrue(agency.getErrorCode().equals(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR)); } /** * * This method tests {@link ExpenseImportByTravelerService#isDuplicate(AgencyStagingData)} */ @Test @ConfigureContext(shouldCommitTransactions = false) public void testIsDuplicate() { AgencyStagingData dbData = createAgencyStagingData(); businessObjectService.save(dbData); // duplicate entry test AgencyStagingData importData = createAgencyStagingData(); List<ErrorMessage> errors = expenseImportByTravelerService.validateDuplicateData(importData); assertTrue(!errors.isEmpty()); // not a duplicate importData.setTravelerId(CUSTOMER_NUM); errors = expenseImportByTravelerService.validateDuplicateData(importData); assertTrue(errors.isEmpty()); } /** * * This method tests {@link ExpenseImportByTravelerService#areMandatoryFieldsPresent(AgencyStagingData)} */ @Test @ConfigureContext(shouldCommitTransactions = false) public void testAreMandatoryFieldsPresent() { AgencyStagingData agency = createAgencyStagingData(); List<ErrorMessage> errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); // all fields present assertTrue(errors.isEmpty()); // missing fields, testing in reverse order of the if block to hit all possible checks agency.setTripInvoiceNumber(null); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setTripExpenseAmount(""); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setTransactionPostingDate(null); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setAgency(null); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setAirTicketNumber(""); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setTravelerId(null); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.isEmpty()); agency.setCreditCardOrAgencyCode(null); errors = expenseImportByTravelerService.validateMandatoryFieldsPresent(agency); assertFalse(errors.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(); // mandatory fields agency.setId(Integer.valueOf(idFinder.getValue())); agency.setImportBy(ExpenseImportTypes.IMPORT_BY_TRAVELLER); agency.setCreditCardOrAgencyCode("1234"); agency.setTravelerName("Traveler Bob"); agency.setTravelerId(EMPLOYEE_ID); agency.setAirTicketNumber("12345678"); agency.setLodgingItineraryNumber("12345"); agency.setRentalCarItineraryNumber("54321"); agency.setAgency("agency name"); agency.setTransactionPostingDate(dateTimeService.getCurrentSqlDate()); agency.setTripExpenseAmount(new KualiDecimal(123.45)); agency.setTripInvoiceNumber("invoice12345"); TripAccountingInformation account = new TripAccountingInformation(); account.setTripChartCode("BL"); account.setTripAccountNumber("1031400"); account.setTripSubAccountNumber("ADV"); account.setProjectCode("KUL"); agency.addTripAccountingInformation(account); agency.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR); return agency; } }