/*
* 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.report.service.impl;
import static org.kuali.kfs.module.tem.TemConstants.TravelReimbursementParameters.FAX_NUMBER;
import static org.kuali.kfs.module.tem.TemConstants.TravelReimbursementParameters.LODGING_TYPE_CODES;
import static org.kuali.kfs.module.tem.TemConstants.TravelReimbursementParameters.TRANSPORTATION_TYPE_CODES;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.tem.TemKeyConstants;
import org.kuali.kfs.module.tem.TemPropertyConstants;
import org.kuali.kfs.module.tem.businessobject.ActualExpense;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TravelerDetail;
import org.kuali.kfs.module.tem.document.TravelEntertainmentDocument;
import org.kuali.kfs.module.tem.document.TravelReimbursementDocument;
import org.kuali.kfs.module.tem.document.service.TravelDocumentService;
import org.kuali.kfs.module.tem.report.EntertainmentHostCertificationReport;
import org.kuali.kfs.module.tem.report.NonEmployeeCertificationReport;
import org.kuali.kfs.module.tem.report.service.TravelEntertainmentHostCertificationService;
import org.kuali.kfs.module.tem.service.TemProfileService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.report.ReportInfo;
import org.kuali.kfs.sys.service.ReportGenerationService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
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.kim.api.identity.PersonService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
/**
* Service implementation of ExpenseSummaryReportService.
*/
@Transactional
public class TravelEntertainmentHostCertificationServiceImpl implements TravelEntertainmentHostCertificationService {
public static Logger LOG = Logger.getLogger(TravelEntertainmentHostCertificationServiceImpl.class);
protected ConfigurationService configurationService;
protected ParameterService parameterService;
protected PersonService personService;
protected TravelDocumentService travelDocumentService;
protected ReportInfo entReportInfo;
protected TemProfileService temProfileService;
public ConfigurationService getConfigurationService() {
return configurationService;
}
public void setConfigurationService(final ConfigurationService ConfigurationService) {
this.configurationService = ConfigurationService;
}
public PersonService getPersonService() {
return personService;
}
public void setPersonService(final PersonService personService) {
this.personService = personService;
}
/**
* Creates a {@link ReportInfoHolder} instance that is used with the {@link TravelReportService}
*/
@Override
public EntertainmentHostCertificationReport buildReport(final TravelEntertainmentDocument document) {
EntertainmentHostCertificationReport report = new EntertainmentHostCertificationReport();
report.setTripId(document.getTravelDocumentIdentifier().toString());
report.setPurpose(ObjectUtils.isNull(document.getPurpose())?KFSConstants.EMPTY_STRING:document.getPurpose().getPurposeDescription());
report.setInstitution(getParameterService().getParameterValueAsString(KfsParameterConstants.FINANCIAL_SYSTEM_ALL.class, KfsParameterConstants.INSTITUTION_NAME));
report.setTemFaxNumber(getParameterService().getParameterValueAsString(TravelReimbursementDocument.class, FAX_NUMBER));
report.setDocumentId(document.getDocumentNumber());
report.setBeginDate(document.getTripBegin());
report.setEndDate(document.getTripEnd());
report.setEventId(document.getTravelDocumentIdentifier());
report.setEventTitle(document.getEventTitle());
report.setTotalExpense(document.getDocumentGrandTotal());
report.setCertificationDescription(getTravelDocumentService().getMessageFrom(TemKeyConstants.TEM_ENT_HOST_CERTIFICATION,report.getInstitution() ));
report.setEntertainmentHostName(document.getHostName());
if (!ObjectUtils.isNull(document.getTraveler())) {
report.setEmployeeName(document.getTraveler().getFirstName()+" "+document.getTraveler().getLastName());
}
report.setApprovingDepartment(getApprovingDepartment(document.getTraveler()));
final List<NonEmployeeCertificationReport.Detail> expenseDetails = new ArrayList<NonEmployeeCertificationReport.Detail>();
final Map<String,KualiDecimal> summaryData = new HashMap<String,KualiDecimal>();
if(document.getActualExpenses().size()>0){
for (final ActualExpense expense : document.getActualExpenses()) {
expense.refreshReferenceObject(TemPropertyConstants.EXPENSE_TYPE_OBJECT_CODE);
final String expenseDate = new SimpleDateFormat("MM/dd/yyyy").format(expense.getExpenseDate());
final NonEmployeeCertificationReport.Detail detail = new NonEmployeeCertificationReport.Detail(expense.getExpenseTypeObjectCode().getExpenseType().getName()==null?
"":expense.getExpenseTypeObjectCode().getExpenseType().getName(),new KualiDecimal(expense.getExpenseAmount().bigDecimalValue().multiply(expense.getCurrencyRate())), expenseDate);
expenseDetails.add(detail);
incrementSummary(summaryData, expense);
}
}
else {
expenseDetails.add(new NonEmployeeCertificationReport.Detail("",null,""));
}
report.setExpenseDetails(expenseDetails);
return report;
}
public String getApprovingDepartment(final TravelerDetail traveler) {
String approvingDepartment=KFSConstants.EMPTY_STRING;
if(ObjectUtils.isNotNull(traveler)&&ObjectUtils.isNotNull(traveler.getPrincipalId())){
TemProfile profile=getTemProfileService().findTemProfileByPrincipalId(traveler.getPrincipalId());
if(ObjectUtils.isNotNull(profile)&&ObjectUtils.isNotNull(profile.getHomeDepartment())) {
approvingDepartment=profile.getHomeDepartment();
}
}else if(ObjectUtils.isNotNull(traveler)){
Map<String,String> criteria=new HashMap<String, String>();
criteria.put("firstName", traveler.getFirstName());
criteria.put("lastName", traveler.getLastName());
TemProfile profile=getTemProfileService().findTemProfile(criteria);
if(ObjectUtils.isNotNull(profile)&&ObjectUtils.isNotNull(profile.getHomeDepartment())) {
approvingDepartment=profile.getHomeDepartment();
}
}
return approvingDepartment;
}
protected void incrementSummary(final Map<String, KualiDecimal> summaryData, ActualExpense expense) {
final String expenseDate = new SimpleDateFormat("MM/dd/yyyy").format(expense.getExpenseDate());
KualiDecimal summaryAmount = summaryData.get(expenseDate);
if (summaryAmount == null) {
summaryAmount = KualiDecimal.ZERO;
}
summaryAmount = summaryAmount.add(new KualiDecimal(expense.getExpenseAmount().bigDecimalValue().multiply(expense.getCurrencyRate())));
LOG.debug("Adding "+ summaryAmount+ " for "+ expenseDate+ " to summary data");
summaryData.put(expenseDate, summaryAmount);
}
protected boolean isTransportationExpense(final ActualExpense expense) {
LOG.debug("Checking if "+ expense+ " is a transportation ");
return expenseTypeCodeMatchesParameter(expense.getExpenseTypeCode(), TRANSPORTATION_TYPE_CODES);
}
protected boolean isMealsExpense(final ActualExpense expense) {
return getTravelDocumentService().isHostedMeal(expense);
}
protected boolean isLodgingExpense(final ActualExpense expense) {
LOG.debug("Checking if "+ expense+ " is a lodging ");
return expenseTypeCodeMatchesParameter(expense.getExpenseTypeCode(), LODGING_TYPE_CODES);
}
protected boolean expenseTypeCodeMatchesParameter(final String expenseTypeCode, final String parameter) {
return getParameterService().getParameterValuesAsString(TravelReimbursementDocument.class, parameter).contains(expenseTypeCode);
}
/**
* Gets the parameterService attribute.
* @return Returns the parameterService.
*/
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 travelAuthorizationService attribute.
* @return Returns the travelAuthorizationService.
*/
public TravelDocumentService getTravelDocumentService() {
return travelDocumentService;
}
/**
* Sets the travelDocumentService attribute value.
* @param travelDocumentService The travelDocumentService to set.
*/
public void setTravelDocumentService(TravelDocumentService travelDocumentService) {
this.travelDocumentService = travelDocumentService;
}
@Override
public File generateEntertainmentHostCertReport(EntertainmentHostCertificationReport report) {
String reportFileName;
String reportDirectory;
String reportTemplateClassPath;
String reportTemplateName;
String subReportTemplateClassPath;
Map<String, String> subReports;
reportFileName = entReportInfo.getReportFileName();
reportDirectory = entReportInfo.getReportsDirectory();
reportTemplateClassPath = entReportInfo.getReportTemplateClassPath();
reportTemplateName = entReportInfo.getReportTemplateName();
Map<String, Object> reportData = new HashMap<String, Object>();
reportData.put("report", report);
String template = reportTemplateClassPath + reportTemplateName;
String fullReportFileName = getReportGenerationService().buildFullFileName(new Date(), reportDirectory, reportFileName, "");
getReportGenerationService().generateReportToPdfFile(reportData,report.getExpenseDetails() ,template, fullReportFileName);
File reportFile = new File(fullReportFileName+".pdf");
return reportFile;
}
public ReportInfo getEntReportInfo() {
return entReportInfo;
}
public void setEntReportInfo(ReportInfo entReportInfo) {
this.entReportInfo = entReportInfo;
}
protected ReportGenerationService getReportGenerationService() {
return SpringContext.getBean(ReportGenerationService.class);
}
public TemProfileService getTemProfileService() {
return temProfileService;
}
public void setTemProfileService(TemProfileService temProfileService) {
this.temProfileService = temProfileService;
}
}