/*
* 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.sys.KFSConstants.ReportGeneration.PDF_FILE_EXTENSION;
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.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.Organization;
import org.kuali.kfs.coa.service.OrganizationService;
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.TravelDocument;
import org.kuali.kfs.module.tem.document.TravelEntertainmentDocument;
import org.kuali.kfs.module.tem.document.TravelReimbursementDocument;
import org.kuali.kfs.module.tem.document.TravelRelocationDocument;
import org.kuali.kfs.module.tem.document.service.TravelDocumentService;
import org.kuali.kfs.module.tem.report.NonEmployeeCertificationReport;
import org.kuali.kfs.module.tem.report.service.NonEmployeeCertificationReportService;
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.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.krad.util.ObjectUtils;
public class NonEmployeeCertificationReportServiceImpl implements NonEmployeeCertificationReportService{
public static Logger LOG = Logger.getLogger(NonEmployeeCertificationReportServiceImpl.class);
protected ParameterService parameterService;
protected ReportInfo reportInfo;
protected PersonService personService;
protected OrganizationService organizationService;
protected TravelDocumentService travelDocumentService;
protected TemProfileService temProfileService;
@Override
public NonEmployeeCertificationReport buildReport(TravelDocument travelDocument) {
NonEmployeeCertificationReport report = new NonEmployeeCertificationReport();
report.setTripId(travelDocument.getTravelDocumentIdentifier().toString());
report.setPurpose(travelDocument.getReportPurpose() == null ? "" : travelDocument.getReportPurpose());
report.setInstitution(getParameterService().getParameterValueAsString(KfsParameterConstants.FINANCIAL_SYSTEM_ALL.class, KfsParameterConstants.INSTITUTION_NAME));
report.setCertificationDescription(getTravelDocumentService().getMessageFrom(TemKeyConstants.TEM_NON_EMPLOYEE_CERTIFICATION,report.getInstitution() ));
report.setDocumentId(travelDocument.getTravelDocumentIdentifier().toString());
if (!ObjectUtils.isNull(travelDocument.getTraveler())) {
report.setTraveler(travelDocument.getTraveler().getFirstName() + " " + travelDocument.getTraveler().getLastName());
}
report.setBeginDate(travelDocument.getTripBegin());
report.setEndDate(travelDocument.getTripEnd());
report.setEventId(travelDocument.getTravelDocumentIdentifier().toString());
report.setEventName(travelDocument.getDocumentTitle());
report.setTotalExpense(travelDocument.getDocumentGrandTotal());
if (travelDocument instanceof TravelReimbursementDocument) {
report.setDestination(travelDocument.getPrimaryDestination().getPrimaryDestinationName());
report.setEventType("TravelReimbursement");
}else if (travelDocument instanceof TravelRelocationDocument) {
report.setDestination(getDestination((TravelRelocationDocument) travelDocument));
report.setEventType("TravelRelocation");
}else if (travelDocument instanceof TravelEntertainmentDocument) {
report.setEventType(((TravelEntertainmentDocument)travelDocument).getPurpose().getPurposeName());
report.setEventName(((TravelEntertainmentDocument)travelDocument).getEventTitle());
}
//Lookup the Organization Name of the initiator's primary department for the Approving Department
final String initiatorId = travelDocument.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
final Person initiator = getPersonService().getPerson(initiatorId);
Organization organization = getOrganizationService().getByPrimaryId(StringUtils.substringBefore(initiator.getPrimaryDepartmentCode(), "-"), StringUtils.substringAfter(initiator.getPrimaryDepartmentCode(), "-"));
if(ObjectUtils.isNotNull(organization)) {
report.setApprovingDepartment(organization.getOrganizationName());
} else {
report.setApprovingDepartment("N/A");
}
final List<NonEmployeeCertificationReport.Detail> other = new ArrayList<NonEmployeeCertificationReport.Detail>();
final Map<String,KualiDecimal> summaryData = new HashMap<String,KualiDecimal>();
if (travelDocument.getActualExpenses() != null) {
for (final ActualExpense expense : travelDocument.getActualExpenses()) {
expense.refreshReferenceObject(TemPropertyConstants.EXPENSE_TYPE_OBJECT_CODE);
final String expenseDate = new SimpleDateFormat("MM/dd").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);
other.add(detail);
incrementSummary(summaryData, expense);
}
}
if(other.size()==0) {
other.add(new NonEmployeeCertificationReport.Detail("",null,""));
}
report.setExpenseDetails(other);
return report;
}
public String getDestination(TravelRelocationDocument relocation){
StringBuffer destination = new StringBuffer();
if(relocation.getToAddress1() != null){
destination.append(relocation.getToAddress1() + " ");
}
if(relocation.getToAddress2() != null){
destination.append(relocation.getToAddress2() + " ");
}
if(relocation.getToCity() != null){
destination.append(relocation.getToCity() + " ");
}
if(relocation.getToStateCode() != null){
destination.append(relocation.getToStateCode() + " ");
}
if(relocation.getToCountryCode() != null){
destination.append(relocation.getToCountryCode());
}
return destination.toString();
}
protected void incrementSummary(final Map<String, KualiDecimal> summaryData, ActualExpense expense) {
final String expenseDate = new SimpleDateFormat("MM/dd").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);
}
@Override
public File generateReport(NonEmployeeCertificationReport report) {
String reportFileName;
String reportDirectory;
String reportTemplateClassPath;
String reportTemplateName;
String subReportTemplateClassPath;
Map<String, String> subReports;
reportFileName = getReportInfo().getReportFileName();
reportDirectory = getReportInfo().getReportsDirectory();
reportTemplateClassPath = getReportInfo().getReportTemplateClassPath();
reportTemplateName = getReportInfo().getReportTemplateName();
Map<String, Object> reportData = new HashMap<String, Object>();
reportData.put("report", report);
reportData.put("temFaxNumber", getParameterService().getParameterValueAsString(TravelReimbursementDocument.class, FAX_NUMBER));
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_FILE_EXTENSION);
return reportFile;
}
protected ReportGenerationService getReportGenerationService() {
return SpringContext.getBean(ReportGenerationService.class);
}
public ReportInfo getReportInfo(){
return this.reportInfo;
}
public void setReportInfo(ReportInfo reportInfo){
this.reportInfo = reportInfo;
}
/**
* 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;
}
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;
}
/**
* Gets the personService attribute.
* @return Returns the personService.
*/
public PersonService getPersonService() {
return personService;
}
/**
* Sets the personService attribute value.
* @param personService The personService to set.
*/
public void setPersonService(PersonService personService) {
this.personService = personService;
}
/**
* Gets the organizationService attribute.
* @return Returns the organizationService.
*/
public OrganizationService getOrganizationService() {
return organizationService;
}
/**
* Sets the organizationService attribute value.
* @param organizationService The organizationService to set.
*/
public void setOrganizationService(OrganizationService organizationService) {
this.organizationService = organizationService;
}
/**
* Gets the travelDocumentService attribute.
* @return Returns the travelDocumentService.
*/
public TravelDocumentService getTravelDocumentService() {
return travelDocumentService;
}
/**
* Sets the travelDocumentService attribute value.
* @param travelDocumentService The travelDocumentService to set.
*/
public void setTravelDocumentService(TravelDocumentService travelDocumentService) {
this.travelDocumentService = travelDocumentService;
}
public TemProfileService getTemProfileService() {
return temProfileService;
}
public void setTemProfileService(TemProfileService temProfileService) {
this.temProfileService = temProfileService;
}
}