/*
* 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.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.TemParameterConstants;
import org.kuali.kfs.module.tem.batch.TaxableRamificationNotificationStep;
import org.kuali.kfs.module.tem.batch.service.TaxableRamificationNotificationService;
import org.kuali.kfs.module.tem.businessobject.TravelAdvance;
import org.kuali.kfs.module.tem.businessobject.TravelerDetail;
import org.kuali.kfs.module.tem.document.TaxableRamificationDocument;
import org.kuali.kfs.module.tem.document.service.TaxableRamificationDocumentService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.service.KfsNotificationService;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.mail.MailMessage;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
/**
* implement the taxable ramification notification service, which also generates taxable ramification document
*/
public class TaxableRamificationNotificationServiceImpl implements TaxableRamificationNotificationService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TaxableRamificationNotificationServiceImpl.class);
private String notificationTemplate;
private BusinessObjectService businessObjectService;
private TaxableRamificationDocumentService taxableRamificationDocumentService;
private KfsNotificationService kfsNotificationService;
private ParameterService parameterService;
private DateTimeService dateTimeService;
/**
* @see org.kuali.kfs.module.tem.batch.service.TaxRamificationNotificationService#sendTaxRamificationReport()
*/
@Override
public void sendTaxableRamificationReport() {
Date taxableRamificationNotificationDate = this.getDateTimeService().getCurrentSqlDate();
List<TravelAdvance> travelAdvances = this.getTaxableRamificationDocumentService().getAllQualifiedOutstandingTravelAdvance();
for (TravelAdvance advance : travelAdvances) {
try{
TaxableRamificationDocument taxableRamificationDocument = this.createTaxableRamificationDocument(advance, taxableRamificationNotificationDate);
this.sendTaxableRamificationReport(taxableRamificationDocument);
}
catch(Exception ex){
LOG.error("Failed to send taxable ramification document for the travel advance: " + advance, ex);
}
}
LOG.info("The total outstanding travel advance being processed is " + travelAdvances.size());
}
/**
* @see org.kuali.kfs.module.tem.batch.service.TaxableRamificationNotificationService#sendTaxableRamificationReport(org.kuali.kfs.module.tem.businessobject.TravelAdvance,
* java.sql.Date)
*/
@Override
public void sendTaxableRamificationReport(TaxableRamificationDocument taxableRamificationDocument) {
if (ObjectUtils.isNotNull(taxableRamificationDocument)) {
MailMessage mailMessage = this.buildTaxRamificationReportMailMessage(taxableRamificationDocument);
this.getKfsNotificationService().sendNotificationByMail(mailMessage);
}
}
/**
* @see org.kuali.kfs.module.tem.batch.service.TaxableRamificationNotificationService#sendTaxableRamificationReport(org.kuali.kfs.module.tem.businessobject.TravelAdvance,
* java.sql.Date)
*/
@Override
@Transactional
public TaxableRamificationDocument createTaxableRamificationDocument(TravelAdvance travelAdvance, Date taxableRamificationNotificationDate) {
if (ObjectUtils.isNull(travelAdvance)) {
throw new RuntimeException("The given travel advance cannot be null.");
}
TaxableRamificationDocument taxRamificationDocument = this.getTaxableRamificationDocumentService().createAndBlanketApproveRamificationDocument(travelAdvance);
if (ObjectUtils.isNotNull(taxRamificationDocument)) {
travelAdvance.setTaxRamificationNotificationDate(taxableRamificationNotificationDate);
this.getBusinessObjectService().save(travelAdvance);
}
return taxRamificationDocument;
}
/**
* build mail message object from the given taxable ramification document
*/
protected MailMessage buildTaxRamificationReportMailMessage(TaxableRamificationDocument taxableRamificationDocument) {
MailMessage mailMessage = new MailMessage();
String senderEmailAddress = this.getNotificationSender();
mailMessage.setFromAddress(senderEmailAddress);
TravelerDetail travelerDetail = taxableRamificationDocument.getTravelerDetail();
String travelerEmailAddress = travelerDetail.getEmailAddress();
mailMessage.addToAddress(travelerEmailAddress);
String travelerName = travelerDetail.getLastName() + ", " + travelerDetail.getFirstName();
String notificationSubject = this.getNotificationSubject() + KFSConstants.SQUARE_BRACKET_LEFT + travelerName + KFSConstants.SQUARE_BRACKET_RIGHT;
mailMessage.setSubject(notificationSubject);
String notificationBody = this.buildNotificationBody(taxableRamificationDocument);
mailMessage.setMessage(notificationBody);
return mailMessage;
}
/**
* collect all the information from the given customer invoice document and build the notification body
*/
protected String buildNotificationBody(TaxableRamificationDocument taxRamificationDocument) {
Map<String, Object> taxRamificationInformationHolder = new HashMap<String, Object>();
taxRamificationInformationHolder.put(KFSPropertyConstants.DOCUMENT, taxRamificationDocument);
String campusTravelEmailAddress = this.getCampusTravelEmailAddress();
taxRamificationInformationHolder.put(TemConstants.CAMPUS_TRAVEL_EMAIL_ADDRESS, campusTravelEmailAddress);
return this.getKfsNotificationService().generateNotificationContent(this.getNotificationTemplate(), taxRamificationInformationHolder);
}
/**
* get the email notification sender from an application parameter
*/
protected String getNotificationSender() {
return this.getParameterService().getParameterValueAsString(TaxableRamificationNotificationStep.class, TemConstants.TravelParameters.FROM_EMAIL_ADDRESS_PARAM_NAME);
}
/**
* get the notification text from an application parameter
*/
protected String getNotificationText() {
return this.getParameterService().getParameterValueAsString(TaxableRamificationNotificationStep.class, TemConstants.TaxRamificationParameter.NOTIFICATION_TEXT_PARAM_NAME);
}
/**
* get the notification subject from an application parameter
*/
protected String getNotificationSubject() {
return this.getParameterService().getParameterValueAsString(TaxableRamificationNotificationStep.class, TemConstants.TaxRamificationParameter.NOTIFICATION_SUBJECT_PARAM_NAME);
}
/**
* get the Campus Travel Email Address from an application parameter
*/
protected String getCampusTravelEmailAddress() {
return this.getParameterService().getParameterValueAsString(TemParameterConstants.TEM_DOCUMENT.class, TemConstants.TravelParameters.TRAVEL_EMAIL_ADDRESS);
}
/**
* Gets the kfsNotificationService attribute.
*
* @return Returns the kfsNotificationService.
*/
public KfsNotificationService getKfsNotificationService() {
return kfsNotificationService;
}
/**
* Sets the kfsNotificationService attribute value.
*
* @param kfsNotificationService The kfsNotificationService to set.
*/
public void setKfsNotificationService(KfsNotificationService kfsNotificationService) {
this.kfsNotificationService = kfsNotificationService;
}
/**
* Gets the notificationTemplate attribute.
*
* @return Returns the notificationTemplate.
*/
public String getNotificationTemplate() {
return notificationTemplate;
}
/**
* Sets the notificationTemplate attribute value.
*
* @param notificationTemplate The notificationTemplate to set.
*/
public void setNotificationTemplate(String notificationTemplate) {
this.notificationTemplate = notificationTemplate;
}
/**
* 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 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 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 taxableRamificationDocumentService attribute.
* @return Returns the taxableRamificationDocumentService.
*/
public TaxableRamificationDocumentService getTaxableRamificationDocumentService() {
return taxableRamificationDocumentService;
}
/**
* Sets the taxableRamificationDocumentService attribute value.
* @param taxableRamificationDocumentService The taxableRamificationDocumentService to set.
*/
public void setTaxableRamificationDocumentService(TaxableRamificationDocumentService taxableRamificationDocumentService) {
this.taxableRamificationDocumentService = taxableRamificationDocumentService;
}
}