/* * 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.impl; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.kuali.kfs.coa.service.AccountService; import org.kuali.kfs.coa.service.ObjectCodeService; import org.kuali.kfs.coa.service.ProjectCodeService; import org.kuali.kfs.coa.service.SubAccountService; import org.kuali.kfs.coa.service.SubObjectCodeService; import org.kuali.kfs.module.tem.TemConstants.AgencyStagingDataErrorCodes; import org.kuali.kfs.module.tem.TemConstants.AgencyStagingDataValidation; import org.kuali.kfs.module.tem.TemConstants.TravelParameters; import org.kuali.kfs.module.tem.TemKeyConstants; import org.kuali.kfs.module.tem.TemPropertyConstants; import org.kuali.kfs.module.tem.batch.AgencyDataImportStep; import org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService; import org.kuali.kfs.module.tem.batch.service.ImportedExpensePendingEntryService; import org.kuali.kfs.module.tem.businessobject.AgencyStagingData; import org.kuali.kfs.module.tem.businessobject.HistoricalTravelExpense; import org.kuali.kfs.module.tem.businessobject.TemProfile; import org.kuali.kfs.module.tem.businessobject.TripAccountingInformation; import org.kuali.kfs.module.tem.service.TemProfileService; import org.kuali.kfs.module.tem.service.TravelExpenseService; import org.kuali.kfs.sys.service.GeneralLedgerPendingEntryService; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ErrorMessage; import org.kuali.rice.krad.util.ObjectUtils; public class ExpenseImportByTravelerServiceImpl extends ExpenseImportServiceBase implements ExpenseImportByTravelerService { public static Logger LOG = Logger.getLogger(ExpenseImportByTravelerServiceImpl.class); private TemProfileService temProfileService; private AccountService accountService; private SubAccountService subAccountService; private ProjectCodeService projectCodeService; private ParameterService parameterService; private ObjectCodeService objectCodeService; private SubObjectCodeService subObjectCodeService; private BusinessObjectService businessObjectService; private ImportedExpensePendingEntryService importedExpensePendingEntryService; private DateTimeService dateTimeService; private TravelExpenseService travelExpenseService; private GeneralLedgerPendingEntryService generalLedgerPendingEntryService; private UniversityDateService universityDateService; /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#areMandatoryFieldsPresent(org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public List<ErrorMessage> validateMandatoryFieldsPresent(final AgencyStagingData agencyData) { boolean requiredFieldsValid = true; List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>(); if (StringUtils.isEmpty(agencyData.getTravelerId())) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_NO_MANDATORY_FIELDS, TemPropertyConstants.TravelAgencyAuditReportFields.TRAVELER_DATA); errorMessages.add(error); } if (isAmountEmpty(agencyData.getTripExpenseAmount())) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_NO_MANDATORY_FIELDS, TemPropertyConstants.TravelAgencyAuditReportFields.TRIP_EXPENSE_AMOUNT); errorMessages.add(error); } if (StringUtils.isEmpty(agencyData.getTripInvoiceNumber())) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_NO_MANDATORY_FIELDS, TemPropertyConstants.TravelAgencyAuditReportFields.TRIP_INVOICE_NUMBER); errorMessages.add(error); } if (ObjectUtils.isNull(agencyData.getTransactionPostingDate())) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_NO_MANDATORY_FIELDS, TemPropertyConstants.TravelAgencyAuditReportFields.TRANSACTION_POSTING_DATE); errorMessages.add(error); } if (StringUtils.isEmpty(agencyData.getCreditCardOrAgencyCode())) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_NO_MANDATORY_FIELDS, TemPropertyConstants.TravelAgencyAuditReportFields.CREDIT_CARD_OR_AGENCY_CODE); errorMessages.add(error); } if (isTripDataMissing(agencyData)) { ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_AIR_LODGING_RENTAL_MISSING); errorMessages.add(error); } if (!errorMessages.isEmpty()) { LOG.error("Missing one or more required fields."); } return errorMessages; } /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#validateAgencyData(org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public List<ErrorMessage> validateAgencyData(final AgencyStagingData agencyData) { LOG.info("Validating agency data."); List<ErrorMessage> errorMessages = validateMandatoryFieldsPresent(agencyData); if (!errorMessages.isEmpty()) { agencyData.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_REQUIRED_FIELDS); return errorMessages; } // Perform a duplicate check first. errorMessages = validateDuplicateData(agencyData); if (!errorMessages.isEmpty()) { agencyData.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_DUPLICATE_DATA); return errorMessages; } // At this point the agencyData record is considered good. Any validation errors will be // added to the errorCode in agencyData. agencyData.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_NO_ERROR); errorMessages = validateTraveler(agencyData); errorMessages.addAll(validateAccountingInfo(agencyData)); errorMessages.addAll(validateCreditCardAgency(agencyData)); LOG.info("Finished validating agency data."); agencyData.setProcessingTimestamp(dateTimeService.getCurrentTimestamp()); if (ObjectUtils.isNull(agencyData.getCreationTimestamp())) { agencyData.setCreationTimestamp(dateTimeService.getCurrentTimestamp()); } return errorMessages; } /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#validateTraveler(org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public List<ErrorMessage> validateTraveler(final AgencyStagingData agencyData) { List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>(); TemProfile profile = getTraveler(agencyData); if (ObjectUtils.isNotNull(profile)) { agencyData.setTemProfileId(profile.getProfileId()); } else { LOG.error("Invalid Traveler in Agency Data record. travelerId: "+ agencyData.getTravelerId()); errorMessages.add(new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_INVALID_TRAVELER, agencyData.getTravelerId())); setErrorCode(agencyData, AgencyStagingDataErrorCodes.AGENCY_INVALID_TRAVELER); } return errorMessages; } /** * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#getTraveler(org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public TemProfile getTraveler(final AgencyStagingData agencyData) { // First try and get a profile by employee id TemProfile profile = temProfileService.findTemProfileByEmployeeId(agencyData.getTravelerId()); if (ObjectUtils.isNotNull(profile)) { LOG.info("Traveler is an Employee: " + agencyData.getTravelerId()); agencyData.setTemProfileId(profile.getProfileId()); return profile; } // Couldn't find a profile matching the employee id, see if its a customer number profile = temProfileService.findTemProfileByCustomerNumber(agencyData.getTravelerId()); if (ObjectUtils.isNotNull(profile)) { LOG.info("Traveler is a Customer: " + agencyData.getTravelerId()); agencyData.setTemProfileId(profile.getProfileId()); return profile; } LOG.error("Invalid Traveler in Agency Data record. travelerId: "+ agencyData.getTravelerId()); return null; } /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#validateAccountingInfo(org.kuali.kfs.module.tem.businessobject.TemProfile, org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public List<ErrorMessage> validateAccountingInfo(final AgencyStagingData agencyData) { List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>(); final List<TripAccountingInformation> accountingInfos = agencyData.getTripAccountingInformation(); // Get ACCOUNTING_LINE_VALIDATION parameter to determine which fields to validate Collection<String> validationParameters = getParameterService().getParameterValuesAsString(AgencyDataImportStep.class, TravelParameters.ACCOUNTING_LINE_VALIDATION); //don't need to validate any accounting information if (ObjectUtils.isNull(validationParameters)) { return errorMessages; } for (final TripAccountingInformation account : accountingInfos) { errorMessages.addAll(validateAccountingInfoLine(agencyData, account, validationParameters).values()); } return errorMessages; } /** * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#validatAccountingInfoLine(org.kuali.kfs.module.tem.businessobject.TripAccountingInformation) */ @Override public Map<String,ErrorMessage> validateAccountingInfoLine(TripAccountingInformation accountingLine) { return validateAccountingInfoLine(null, accountingLine, null); } protected Map<String,ErrorMessage> validateAccountingInfoLine(AgencyStagingData agencyData, TripAccountingInformation accountingLine, Collection<String> validationParameters) { Map<String,ErrorMessage> errorMap = new HashMap<String,ErrorMessage>(); if (ObjectUtils.isNull(validationParameters)) { // Get ACCOUNTING_LINE_VALIDATION parameter to determine which fields to validate validationParameters = getParameterService().getParameterValuesAsString(AgencyDataImportStep.class, TravelParameters.ACCOUNTING_LINE_VALIDATION); //don't need to validate any accounting information if (ObjectUtils.isNull(validationParameters)) { return errorMap; } } boolean setAgencyDataErrorCode = false; Integer profileId = null; String travelerId = ""; if (ObjectUtils.isNotNull(agencyData)) { setAgencyDataErrorCode = true; travelerId = agencyData.getTravelerId(); profileId = agencyData.getTemProfileId(); } if (validationParameters.contains(AgencyStagingDataValidation.VALIDATE_ACCOUNT)) { if (!isAccountNumberValid(accountingLine.getTripChartCode(), accountingLine.getTripAccountNumber())) { if (setAgencyDataErrorCode) { LOG.error("Invalid Account in Tem Profile or Agency Data record. travelerId: " + travelerId +" temProfileId: " + profileId +" chart code: " + accountingLine.getTripChartCode() + " account: " + accountingLine.getTripAccountNumber()); setErrorCode(agencyData, AgencyStagingDataErrorCodes.AGENCY_INVALID_ACCOUNT); } errorMap.put(TemPropertyConstants.TravelAgencyAuditReportFields.TRIP_ACCOUNT_NUMBER, new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_INVALID_ACCOUNT_NUM, accountingLine.getTripChartCode(), accountingLine.getTripAccountNumber())); } } if (validationParameters.contains(AgencyStagingDataValidation.VALIDATE_SUBACCOUNT)) { // sub account is optional if (StringUtils.isNotEmpty(accountingLine.getTripSubAccountNumber()) && !isSubAccountNumberValid(accountingLine.getTripChartCode(),accountingLine.getTripAccountNumber(), accountingLine.getTripSubAccountNumber())) { if (setAgencyDataErrorCode) { LOG.error("Invalid SubAccount in Tem Profile or Agency Data record. travelerId: "+ travelerId +" temProfileId: "+ profileId +" chart code: "+ accountingLine.getTripChartCode()+ " account: "+ accountingLine.getTripAccountNumber()+ " subaccount: "+ accountingLine.getTripSubAccountNumber()); setErrorCode(agencyData, AgencyStagingDataErrorCodes.AGENCY_INVALID_SUBACCOUNT); } errorMap.put(TemPropertyConstants.TravelAgencyAuditReportFields.TRIP_SUBACCOUNT_NUMBER, new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_INVALID_SUBACCOUNT, accountingLine.getTripSubAccountNumber())); } } // project code is optional if (StringUtils.isNotEmpty(accountingLine.getProjectCode()) && !isProjectCodeValid(accountingLine.getProjectCode())) { if (setAgencyDataErrorCode) { LOG.error("Invalid Project in Tem Profile or Agency Data record. travelerId: "+ travelerId +" temProfileId: "+ profileId +" project code: "+ accountingLine.getProjectCode()); setErrorCode(agencyData, AgencyStagingDataErrorCodes.AGENCY_INVALID_PROJECT); } errorMap.put(TemPropertyConstants.TravelAgencyAuditReportFields.TRIP_PROJECT_CODE, new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_INVALID_PROJECT_CODE, accountingLine.getProjectCode())); } return errorMap; } /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#validateDuplicateData(org.kuali.kfs.module.tem.businessobject.AgencyStagingData) */ @Override public List<ErrorMessage> validateDuplicateData(final AgencyStagingData agencyData) { //make sure all the mandatory fields are present before checking for duplicates List<ErrorMessage> errorMessages = validateMandatoryFieldsPresent(agencyData); if (!errorMessages.isEmpty()) { return errorMessages; } List<AgencyStagingData> agencyDataList = checkDuplicateData(agencyData); if (ObjectUtils.isNotNull(agencyDataList) || agencyDataList.size() != 0) { boolean isDuplicate = false; String errorMessage = "Found a duplicate entry for Agency Staging Data: Duplicate Ids "; for(AgencyStagingData duplicate : agencyDataList) { Integer duplicateId = duplicate.getId(); if (ObjectUtils.isNotNull(agencyData.getId()) && (duplicateId.intValue() != agencyData.getId().intValue())) { errorMessage += duplicate.getId() +" "; isDuplicate = true; } } if (isDuplicate) { LOG.error(errorMessage); ErrorMessage error = new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_TRAVELER_DUPLICATE_RECORD, agencyData.getTravelerId(), agencyData.getItineraryDataString(), agencyData.getCreditCardOrAgencyCode(), agencyData.getTransactionPostingDate().toString(), agencyData.getTripExpenseAmount().toString(), agencyData.getTripInvoiceNumber()); errorMessages.add(error); } } return errorMessages; } protected List<AgencyStagingData> checkDuplicateData(AgencyStagingData agencyStagingData) { // Verify that this isn't a duplicate entry based on the following: // Traveler ID, Ticket Number (or Lodging or Rental Car Itinerary Number), Agency Name, Transaction Date, Transaction Amount, Invoice Number final Map<String, Object> fieldValues = new HashMap<String, Object>(); if (StringUtils.isNotEmpty(agencyStagingData.getTravelerId())) { fieldValues.put(TemPropertyConstants.TRAVELER_ID, agencyStagingData.getTravelerId()); } if (StringUtils.isNotEmpty(agencyStagingData.getAirTicketNumber())) { fieldValues.put(TemPropertyConstants.AIR_TICKET_NUMBER, agencyStagingData.getAirTicketNumber()); } if (StringUtils.isNotEmpty(agencyStagingData.getLodgingItineraryNumber())) { fieldValues.put(TemPropertyConstants.LODGING_ITINERARY_NUMBER, agencyStagingData.getLodgingItineraryNumber()); } if (StringUtils.isNotEmpty(agencyStagingData.getRentalCarItineraryNumber())) { fieldValues.put(TemPropertyConstants.RENTAL_CAR_ITINERARY_NUMBER, agencyStagingData.getRentalCarItineraryNumber()); } if (StringUtils.isNotEmpty(agencyStagingData.getCreditCardOrAgencyCode())) { fieldValues.put(TemPropertyConstants.CREDIT_CARD_AGENCY_CODE, agencyStagingData.getCreditCardOrAgencyCode()); } if (ObjectUtils.isNotNull(agencyStagingData.getTransactionPostingDate())) { fieldValues.put(TemPropertyConstants.TRANSACTION_POSTING_DATE, agencyStagingData.getTransactionPostingDate()); } if (ObjectUtils.isNotNull(agencyStagingData.getTripExpenseAmount())) { fieldValues.put(TemPropertyConstants.TRIP_EXPENSE_AMOUNT, agencyStagingData.getTripExpenseAmount()); } if (StringUtils.isNotEmpty(agencyStagingData.getTripInvoiceNumber())) { fieldValues.put(TemPropertyConstants.TRIP_INVOICE_NUMBER, agencyStagingData.getTripInvoiceNumber()); } List<AgencyStagingData> agencyDataList = (List<AgencyStagingData>) businessObjectService.findMatching(AgencyStagingData.class, fieldValues); return agencyDataList; } @Override public List<ErrorMessage> validateCreditCardAgency(AgencyStagingData agencyData) { List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>(); if (!isCreditCardAgencyValid(agencyData)) { //setErrorCode is already done in isCreditCardAgencyValid() errorMessages.add(new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_CREDIT_CARD_DATA_INVALID_CCA, agencyData.getCreditCardOrAgencyCode())); } return errorMessages; } /** * * @see org.kuali.kfs.module.tem.batch.service.ExpenseImportByTravelerService#distributeExpense(org.kuali.kfs.module.tem.businessobject.AgencyStagingData+ org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper) */ @Override public List<ErrorMessage> distributeExpense(final AgencyStagingData agencyData) { LOG.info("Distributing expense for agency data: "+ agencyData.getId()); List<ErrorMessage> errors = new ArrayList<ErrorMessage>(); if (agencyData.isActive()) { if (AgencyStagingDataErrorCodes.AGENCY_NO_ERROR.equals(agencyData.getErrorCode())) { final HistoricalTravelExpense expense = travelExpenseService.createHistoricalTravelExpense(agencyData); businessObjectService.save(expense); agencyData.setMoveToHistoryIndicator(true); agencyData.setErrorCode(AgencyStagingDataErrorCodes.AGENCY_MOVED_TO_HISTORICAL); // nota bene: agency staging data object can NOT be saved here b/c the AgencyStagingDataMaint doc calls this method and will save it itself once processing completes. // batch steps which call this method need to save the business object after calling this method } else { LOG.info("Agency Data: "+ agencyData.getId() +"; expected errorCode="+ AgencyStagingDataErrorCodes.AGENCY_NO_ERROR +", received errorCode="+ agencyData.getErrorCode() +". Will not attempt to distribute expense."); errors.add(new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_DISTRIBUTE_INVALID_ERROR_CODE, AgencyStagingDataErrorCodes.AGENCY_NO_ERROR, agencyData.getErrorCode())); } } else { LOG.info("Agency Data: "+ agencyData.getId() +", is not active. Will not distribute."); errors.add(new ErrorMessage(TemKeyConstants.MESSAGE_AGENCY_DATA_DISTRIBUTE_ACTIVE)); } LOG.info("Finished distributing expense for agency data: "+ agencyData.getId() +". Agency data "+ (errors.isEmpty() ? "was":"was not") +" distributed."); return errors; } /** * Gets the temProfileService attribute. * @return Returns the temProfileService. */ public TemProfileService getTemProfileService() { return temProfileService; } /** * Sets the temProfileService attribute value. * @param temProfileService The temProfileService to set. */ public void setTemProfileService(TemProfileService temProfileService) { this.temProfileService = temProfileService; } /** * Gets the accountService attribute. * @return Returns the accountService. */ @Override public AccountService getAccountService() { return accountService; } /** * Sets the accountService attribute value. * @param accountService The accountService to set. */ public void setAccountService(AccountService accountService) { this.accountService = accountService; } /** * Gets the subAccountService attribute. * @return Returns the subAccountService. */ @Override public SubAccountService getSubAccountService() { return subAccountService; } /** * Sets the subAccountService attribute value. * @param subAccountService The subAccountService to set. */ public void setSubAccountService(SubAccountService subAccountService) { this.subAccountService = subAccountService; } /** * Gets the projectCodeService attribute. * @return Returns the projectCodeService. */ @Override public ProjectCodeService getProjectCodeService() { return projectCodeService; } /** * Sets the projectCodeService attribute value. * @param projectCodeService The projectCodeService to set. */ public void setProjectCodeService(ProjectCodeService projectCodeService) { this.projectCodeService = projectCodeService; } /** * Gets the parameterService attribute. * @return Returns the parameterService. */ @Override public ParameterService getParameterService() { return parameterService; } /** * Sets the parameterService attribute value. * @param parameterService The parameterService to set. */ public void setParameterService(ParameterService parameterService) { this.parameterService = parameterService; } /** * Gets the objectCodeService attribute. * @return Returns the objectCodeService. */ @Override public ObjectCodeService getObjectCodeService() { return objectCodeService; } /** * Sets the objectCodeService attribute value. * @param objectCodeService The objectCodeService to set. */ public void setObjectCodeService(ObjectCodeService objectCodeService) { this.objectCodeService = objectCodeService; } /** * Gets the subObjectCodeService attribute. * @return Returns the subObjectCodeService. */ @Override public SubObjectCodeService getSubObjectCodeService() { return subObjectCodeService; } /** * Sets the subObjectCodeService attribute value. * @param subObjectCodeService The subObjectCodeService to set. */ public void setSubObjectCodeService(SubObjectCodeService subObjectCodeService) { this.subObjectCodeService = subObjectCodeService; } /** * Gets the businessObjectService attribute. * @return Returns the businessObjectService. */ public BusinessObjectService getBusinessObjectService() { return businessObjectService; } /** * Sets the businessObjectService attribute value. * @param businessObjectService The businessObjectService to set. */ public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * Gets the dateTimeService attribute. * @return Returns the dateTimeService. */ public DateTimeService getDateTimeService() { return dateTimeService; } /** * Sets the dateTimeService attribute value. * @param dateTimeService The dateTimeService to set. */ public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } /** * Gets the travelExpenseService attribute. * @return Returns the travelExpenseService. */ public TravelExpenseService getTravelExpenseService() { return travelExpenseService; } /** * Sets the travelExpenseService attribute value. * @param travelExpenseService The travelExpenseService to set. */ public void setTravelExpenseService(TravelExpenseService travelExpenseService) { this.travelExpenseService = travelExpenseService; } /** * Gets the generalLedgerPendingEntryService attribute. * @return Returns the generalLedgerPendingEntryService. */ public GeneralLedgerPendingEntryService getGeneralLedgerPendingEntryService() { return generalLedgerPendingEntryService; } /** * Sets the generalLedgerPendingEntryService attribute value. * @param generalLedgerPendingEntryService The generalLedgerPendingEntryService to set. */ public void setGeneralLedgerPendingEntryService(GeneralLedgerPendingEntryService generalLedgerPendingEntryService) { this.generalLedgerPendingEntryService = generalLedgerPendingEntryService; } /** * Gets the universityDateService attribute. * @return Returns the universityDateService. */ public UniversityDateService getUniversityDateService() { return universityDateService; } /** * Sets the universityDateService attribute value. * @param universityDateService The universityDateService to set. */ public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } public void setImportedExpensePendingEntryService(ImportedExpensePendingEntryService importedExpensePendingEntryService) { this.importedExpensePendingEntryService = importedExpensePendingEntryService; } }