/*
* 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.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 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.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
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.TravelerDetail;
import org.kuali.kfs.module.tem.document.TravelRelocationDocument;
import org.kuali.kfs.module.tem.document.service.TravelDocumentService;
import org.kuali.kfs.module.tem.document.service.TravelRelocationService;
import org.kuali.kfs.module.tem.pdf.Coversheet;
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.DocumentService;
public class TravelRelocationServiceImpl implements TravelRelocationService{
protected static Logger LOG = Logger.getLogger(TravelRelocationServiceImpl.class);
private BusinessObjectService businessObjectService;
private DocumentService documentService;
private ConfigurationService ConfigurationService;
private PersonService personService;
private TravelDocumentService travelDocumentService;
private ParameterService parameterService;
private List<PropertyChangeListener> propertyChangeListeners;
/**
* @see org.kuali.kfs.module.tem.document.service.TravelRelocationService#findByIdentifier(java.lang.String)
*/
@Override
public Collection<TravelRelocationDocument> findByIdentifier(final String travelDocumentIdentifier) {
final Map<String, Object> criteria = new HashMap<String, Object>();
criteria.put(TRAVEL_DOCUMENT_IDENTIFIER, travelDocumentIdentifier);
return getBusinessObjectService().findMatching(TravelRelocationDocument.class, criteria);
}
/**
* @see org.kuali.kfs.module.tem.document.service.TravelRelocationService#find(java.lang.String)
*/
@Override
public TravelRelocationDocument find(final String documentNumber) throws WorkflowException {
final TravelRelocationDocument retval = (TravelRelocationDocument) getDocumentService().getByDocumentHeaderId(documentNumber);
addListenersTo(retval);
return retval;
}
/**
* @see org.kuali.kfs.module.tem.document.service.TravelRelocationService#addListenersTo(org.kuali.kfs.module.tem.document.TravelRelocationDocument)
*/
@Override
public void addListenersTo(final TravelRelocationDocument relocation) {
if (relocation != null) {
relocation.setPropertyChangeListeners(getPropertyChangeListeners());
}
}
/**
* @see org.kuali.kfs.module.tem.service.TravelRelocationService#generateCoversheetFor(java.lang.String, java.lang.String,
* org.kuali.kfs.module.tem.document.TravelRelocationDocument, java.io.OutputStream)
*/
@Override
public Coversheet generateCoversheetFor(final TravelRelocationDocument 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.getToCity();
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());
cover.setTravelerName(traveler.getCustomer().getCustomerName());
Person person = getPersonService().getPerson(traveler.getPrincipalId());
cover.setTravelerPrincipalName(StringUtils.defaultString(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", "");
expenses.add(expenseMap);
}
}
cover.setExpenses(expenses);
return cover;
}
public void setBusinessObjectService(final BusinessObjectService businessObjectService){
this.businessObjectService = businessObjectService;
}
protected BusinessObjectService getBusinessObjectService(){
return this.businessObjectService;
}
public void setDocumentService(final DocumentService documentService){
this.documentService = documentService;
}
protected DocumentService getDocumentService(){
return this.documentService;
}
public void setConfigurationService(final ConfigurationService ConfigurationService){
this.ConfigurationService = ConfigurationService;
}
protected ConfigurationService getConfigurationService(){
return this.ConfigurationService;
}
public void setPersonService(final PersonService personService) {
this.personService = personService;
}
protected PersonService getPersonService() {
return personService;
}
public void setTravelDocumentService(final TravelDocumentService travelDocumentService){
this.travelDocumentService = travelDocumentService;
}
protected TravelDocumentService getTravelDocumentService(){
return this.travelDocumentService;
}
public void setParameterService(final ParameterService parameterService){
this.parameterService = parameterService;
}
protected ParameterService getParameterService(){
return this.parameterService;
}
/**
* Sets the propertyChangeListener attribute value.
*
* @param propertyChangeListener The propertyChangeListener to set.
*/
public void setPropertyChangeListeners(final List<PropertyChangeListener> propertyChangeListeners) {
this.propertyChangeListeners = propertyChangeListeners;
}
/**
* Gets the propertyChangeListeners attribute.
*
* @return Returns the propertyChangeListenerDetailId.
*/
public List<PropertyChangeListener> getPropertyChangeListeners() {
return this.propertyChangeListeners;
}
}