/* * 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.document.service.impl; import static org.kuali.kfs.module.tem.TemConstants.PARAM_NAMESPACE; import static org.kuali.kfs.module.tem.TemConstants.TravelParameters.TRAVEL_COVERSHEET_INSTRUCTIONS; import static org.kuali.kfs.module.tem.TemPropertyConstants.TRAVEL_DOCUMENT_IDENTIFIER; import static org.kuali.kfs.sys.KFSConstants.EXTERNALIZABLE_HELP_URL_KEY; import static org.kuali.kfs.sys.context.SpringContext.getBean; import java.beans.PropertyChangeListener; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.kuali.kfs.module.tem.TemConstants.TravelParameters; import org.kuali.kfs.module.tem.TemParameterConstants; import org.kuali.kfs.module.tem.TemPropertyConstants; import org.kuali.kfs.module.tem.businessobject.ActualExpense; import org.kuali.kfs.module.tem.businessobject.Attendee; import org.kuali.kfs.module.tem.businessobject.ExpenseTypeObjectCode; import org.kuali.kfs.module.tem.businessobject.TravelerDetail; import org.kuali.kfs.module.tem.document.TravelDocument; import org.kuali.kfs.module.tem.document.TravelEntertainmentDocument; import org.kuali.kfs.module.tem.document.service.TravelDocumentService; import org.kuali.kfs.module.tem.document.service.TravelEntertainmentDocumentService; import org.kuali.kfs.module.tem.pdf.Coversheet; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.kim.api.identity.PersonService; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.DictionaryValidationService; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.util.ObjectUtils; public class TravelEntertainmentDocumentServiceImpl implements TravelEntertainmentDocumentService{ private ParameterService parameterService; private BusinessObjectService businessObjectService; private DocumentService documentService; private PersonService personService; private ConfigurationService ConfigurationService; private List<PropertyChangeListener> propertyChangeListeners; private TravelDocumentService travelDocumentService; @Override public Collection<TravelEntertainmentDocument> findByTravelId(String travelDocumentIdentifier) { final Map<String, Object> criteria = new HashMap<String, Object>(); criteria.put(TRAVEL_DOCUMENT_IDENTIFIER, travelDocumentIdentifier); return getBusinessObjectService().findMatching(TravelEntertainmentDocument.class, criteria); } @Override public TravelEntertainmentDocument find(String documentNumber) throws WorkflowException { final TravelEntertainmentDocument retval = (TravelEntertainmentDocument) getDocumentService().getByDocumentHeaderId(documentNumber); addListenersTo(retval); return retval; } @Override public void addListenersTo(final TravelEntertainmentDocument entertainment) { if (entertainment != null) { entertainment.setPropertyChangeListeners(getPropertyChangeListeners()); } } public List<PropertyChangeListener> getPropertyChangeListeners() { return this.propertyChangeListeners; } @Override public Coversheet generateCoversheetFor(TravelEntertainmentDocument document) throws Exception { final String docNumber = document.getDocumentNumber(); final String initiatorId = document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId(); final String instructions = getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, TRAVEL_COVERSHEET_INSTRUCTIONS); final String mailTo = travelDocumentService.retrieveAddressFromLocationCode(document.getTravelPayment().getDocumentationLocationCode()); final String destination = document.getEventTitle(); final String directory = getConfigurationService().getPropertyValueAsString(EXTERNALIZABLE_HELP_URL_KEY); final Person initiator = getPersonService().getPerson(initiatorId); final TravelerDetail traveler = document.getTraveler(); traveler.refreshReferenceObject(TemPropertyConstants.CUSTOMER); final Coversheet cover = new Coversheet(); cover.setInstructions(instructions); cover.setMailTo(mailTo); cover.setTripId(document.getTravelDocumentIdentifier()); cover.setDate(new SimpleDateFormat("MM/dd/yyyy").format(document.getTripBegin())); cover.setInitiatorName(initiator.getFirstName() + " " + initiator.getLastName()); cover.setInitiatorPrincipalName(initiator.getPrincipalName()); cover.setInitiatorPhone(initiator.getPhoneNumber()); cover.setInitiatorEmail(initiator.getEmailAddress()); if(traveler.getCustomer()!=null) { cover.setTravelerName(traveler.getCustomer().getCustomerName()); } Person person = getPersonService().getPerson(traveler.getPrincipalId()); cover.setTravelerPrincipalName(person != null ? person.getPrincipalName() : ""); cover.setTravelerPhone(traveler.getPhoneNumber()); cover.setTravelerEmail(traveler.getEmailAddress()); cover.setDestination(destination); cover.setDocumentNumber(docNumber); final Collection<Map<String, String>> expenses = new ArrayList<Map<String, String>>(); if (document.getActualExpenses() != null) { for (final ActualExpense expense : document.getActualExpenses()) { final Map<String, String> expenseMap = new HashMap<String, String>(); expense.refreshReferenceObject(TemPropertyConstants.EXPENSE_TYPE_OBJECT_CODE); expenseMap.put("expenseType", expense.getExpenseTypeObjectCode().getExpenseType().getName()); final BigDecimal rate = expense.getCurrencyRate(); final KualiDecimal amount = expense.getExpenseAmount(); expenseMap.put("amount", new KualiDecimal(amount.bigDecimalValue().multiply(rate)).toString()); expenseMap.put("receipt", getReceiptRequired(expense.getExpenseTypeObjectCode())); expenses.add(expenseMap); } } cover.setExpenses(expenses); return cover; } protected String getReceiptRequired(String expenseType, final TravelDocument document) { final String expenseTypeCode = getParameterService().getParameterValueAsString(PARAM_NAMESPACE, TravelParameters.DOCUMENT_DTL_TYPE, expenseType); Map<String, String> primaryKeys = new HashMap<String, String>(); primaryKeys.put(KFSPropertyConstants.CODE, expenseTypeCode); primaryKeys.put(TemPropertyConstants.TRIP_TYPE, document.getTripTypeCode()); primaryKeys.put(TemPropertyConstants.TRAVELER_TYPE, document.getTraveler().getTravelerTypeCode()); primaryKeys.put(KFSPropertyConstants.DOCUMENT_TYPE, document.getDocumentTypeName()); return getReceiptRequired(businessObjectService.findByPrimaryKey(ExpenseTypeObjectCode.class, primaryKeys)); } protected String getReceiptRequired(ExpenseTypeObjectCode expenseTypeCode) { String receipt = "-"; if(ObjectUtils.isNotNull(expenseTypeCode) && ObjectUtils.isNotNull(expenseTypeCode.isReceiptRequired())) { if(expenseTypeCode.isReceiptRequired()) { receipt = "Yes"; } else { receipt = "No"; } } return receipt; } @Override public void handleNewAttendee(Attendee newAttendeeLine) { getDictionaryValidationService().validate(newAttendeeLine); } public ParameterService getParameterService() { return parameterService; } public void setParameterService(ParameterService parameterService) { this.parameterService = parameterService; } public BusinessObjectService getBusinessObjectService() { return businessObjectService; } public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } public DocumentService getDocumentService() { return documentService; } public void setDocumentService(DocumentService documentService) { this.documentService = documentService; } public void setPropertyChangeListeners(List<PropertyChangeListener> propertyChangeListeners) { this.propertyChangeListeners = propertyChangeListeners; } public PersonService getPersonService() { return personService; } public void setPersonService(PersonService personService) { this.personService = personService; } public ConfigurationService getConfigurationService() { return ConfigurationService; } public void setConfigurationService(ConfigurationService ConfigurationService) { this.ConfigurationService = ConfigurationService; } public TravelDocumentService getTravelDocumentService() { return travelDocumentService; } public void setTravelDocumentService(TravelDocumentService travelDocumentService) { this.travelDocumentService = travelDocumentService; } protected DictionaryValidationService getDictionaryValidationService() { return getBean(DictionaryValidationService.class); } }