/*
* 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 java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TravelPayment;
import org.kuali.kfs.module.tem.businessobject.TravelerDetail;
import org.kuali.kfs.module.tem.document.TravelDocument;
import org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService;
import org.kuali.kfs.module.tem.service.TravelerService;
import org.kuali.kfs.pdp.PdpConstants;
import org.kuali.kfs.pdp.businessobject.PaymentAccountDetail;
import org.kuali.kfs.pdp.businessobject.PaymentDetail;
import org.kuali.kfs.pdp.businessobject.PaymentGroup;
import org.kuali.kfs.pdp.businessobject.PaymentNoteText;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.document.service.PaymentSourceHelperService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.core.api.util.type.KualiInteger;
import org.kuali.rice.kew.api.WorkflowDocument;
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.bo.DocumentHeader;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.workflow.service.WorkflowDocumentService;
/**
* Base implementation of the TravelPaymentsHelperService
*/
public class TravelPaymentsHelperServiceImpl implements TravelPaymentsHelperService {
org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TravelPaymentsHelperServiceImpl.class);
protected PersonService personService;
protected WorkflowDocumentService workflowDocumentService;
protected PaymentSourceHelperService paymentSourceHelperService;
protected TravelerService travelerService;
/**
* Retrieves the campus code associated with the initiator of a passed in authorization document
* @param document the authorization document to find a campus for
* @param initiatorCampuses the cache of document initiator principal keys to campus codes
* @return the campus code associated with the initiator of the given document
*/
@Override
public String findCampusForDocument(TravelDocument document, Map<String, String> initiatorCampuses) {
try {
final WorkflowDocument workflowDocument = getWorkflowDocumentService().loadWorkflowDocument(document.getDocumentNumber(), GlobalVariables.getUserSession().getPerson());
return findCampusForInitiator(workflowDocument.getInitiatorPrincipalId(), initiatorCampuses);
}
catch (WorkflowException we) {
throw new RuntimeException("Could not load document: "+document.getDocumentNumber(), we);
}
}
/**
* Retrieves and caches the campus code for the given initiator's principal id
* @param initiatorPrincipalId the principal id of the initiator of a document
* @param initiatorCampuses the cache of initiator principal keys to campus codes
* @return the campus code associated with the given principal id
*/
protected String findCampusForInitiator(String initiatorPrincipalId, Map<String, String> initiatorCampuses) {
if (!StringUtils.isBlank(initiatorCampuses.get(initiatorPrincipalId))) {
return initiatorCampuses.get(initiatorPrincipalId);
}
final Person initiatorPerson = getPersonService().getPerson(initiatorPrincipalId);
final String campusCode = initiatorPerson.getCampusCode();
if (!StringUtils.isBlank(campusCode)) {
initiatorCampuses.put(initiatorPrincipalId, campusCode);
}
return campusCode;
}
/**
* Returns the initiator for the initiator of this document
* @see org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService#getInitiator(org.kuali.kfs.module.tem.document.TravelDocument)
*/
@Override
public Person getInitiator(TravelDocument document) {
try {
final WorkflowDocument workflowDocument = getWorkflowDocumentService().loadWorkflowDocument(document.getDocumentNumber(), GlobalVariables.getUserSession().getPerson());
return getPersonService().getPerson(workflowDocument.getInitiatorPrincipalId());
}
catch (WorkflowException we) {
throw new RuntimeException("Could not load document: "+document.getDocumentNumber(), we);
}
}
/**
* @see org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService#buildGenericPaymentGroup(org.kuali.kfs.module.tem.businessobject.TravelerDetail, org.kuali.kfs.module.tem.businessobject.TemProfile, org.kuali.kfs.module.tem.businessobject.TravelPayment, java.lang.String)
*/
@Override
public PaymentGroup buildGenericPaymentGroup(TravelerDetail traveler, TemProfile travelerProfile, TravelPayment payment, String bankCode) {
PaymentGroup pg = new PaymentGroup();
pg.setCombineGroups(Boolean.TRUE);
pg.setCampusAddress(Boolean.FALSE);
pg.setCity(traveler.getCityName());
pg.setCountry(traveler.getCountryCode());
pg.setLine1Address(traveler.getStreetAddressLine1());
pg.setLine2Address(traveler.getStreetAddressLine2());
pg.setPayeeName(traveler.getFirstName() + " " + traveler.getLastName());
pg.setState(traveler.getStateCode());
pg.setZipCd(traveler.getZipCode());
pg.setPaymentDate(payment.getDueDate());
pg.setProcessImmediate(payment.isImmediatePaymentIndicator());
pg.setPymtAttachment(payment.isAttachmentCode());
pg.setPymtSpecialHandling(payment.isSpecialHandlingCode());
pg.setNraPayment(payment.isAlienPaymentCode());
pg.setBankCode(bankCode);
pg.setPaymentStatusCode(PdpConstants.PaymentStatusCodes.OPEN);
pg.setTaxablePayment(Boolean.FALSE);
if (getTravelerService().isEmployee(traveler)){
pg.setPayeeId(travelerProfile.getEmployeeId());
pg.setPayeeIdTypeCd(PdpConstants.PayeeIdTypeCodes.EMPLOYEE);
pg.setEmployeeIndicator(Boolean.TRUE);
pg.setTaxablePayment(Boolean.FALSE);
}else{
pg.setPayeeId(traveler.getCustomerNumber());
pg.setPayeeIdTypeCd(PdpConstants.PayeeIdTypeCodes.CUSTOMER);
}
return pg;
}
/**
*
* @see org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService#buildGenericPaymentDetail(org.kuali.rice.krad.bo.DocumentHeader, java.sql.Date, org.kuali.kfs.module.tem.businessobject.TravelPayment, org.kuali.rice.kim.api.identity.Person, java.lang.String)
*/
@Override
public PaymentDetail buildGenericPaymentDetail(DocumentHeader documentHeader, Date processDate, TravelPayment travelPayment, Person initiator, String achCheckDocumentType) {
PaymentDetail pd = new PaymentDetail();
if (StringUtils.isNotEmpty(documentHeader.getOrganizationDocumentNumber())) {
pd.setOrganizationDocNbr(documentHeader.getOrganizationDocumentNumber());
}
pd.setCustPaymentDocNbr(documentHeader.getDocumentNumber());
pd.setInvoiceDate(new java.sql.Date(processDate.getTime()));
pd.setOrigInvoiceAmount(travelPayment.getCheckTotalAmount());
pd.setInvTotDiscountAmount(KualiDecimal.ZERO);
pd.setInvTotOtherCreditAmount(KualiDecimal.ZERO);
pd.setInvTotOtherDebitAmount(KualiDecimal.ZERO);
pd.setInvTotShipAmount(KualiDecimal.ZERO);
pd.setNetPaymentAmount(travelPayment.getCheckTotalAmount());
pd.setPrimaryCancelledPayment(Boolean.FALSE);
pd.setFinancialDocumentTypeCode(achCheckDocumentType);
pd.setFinancialSystemOriginCode(KFSConstants.ORIGIN_CODE_KUALI);
int line = 0;
PaymentNoteText pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText("Info: " + initiator.getPrincipalName() + " " + initiator.getPhoneNumber());
pd.addNote(pnt);
if (StringUtils.isNotEmpty(travelPayment.getSpecialHandlingPersonName())) {
pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText("Send Check To: " + travelPayment.getSpecialHandlingPersonName());
if (LOG.isDebugEnabled()) {
LOG.debug("Creating special handling person name note: "+pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
if (StringUtils.isNotEmpty(travelPayment.getSpecialHandlingLine1Addr())) {
pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText(travelPayment.getSpecialHandlingLine1Addr());
if (LOG.isDebugEnabled()) {
LOG.debug("Creating special handling address 1 note: "+pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
if (StringUtils.isNotEmpty(travelPayment.getSpecialHandlingLine2Addr())) {
pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText(travelPayment.getSpecialHandlingLine2Addr());
if (LOG.isDebugEnabled()) {
LOG.debug("Creating special handling address 2 note: "+pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
if (StringUtils.isNotEmpty(travelPayment.getSpecialHandlingCityName())) {
pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText(travelPayment.getSpecialHandlingCityName() + ", " + travelPayment.getSpecialHandlingStateCode() + " " + travelPayment.getSpecialHandlingZipCode());
if (LOG.isDebugEnabled()) {
LOG.debug("Creating special handling city note: "+pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
if (travelPayment.isAttachmentCode()) {
pnt = new PaymentNoteText();
pnt.setCustomerNoteLineNbr(new KualiInteger(line++));
pnt.setCustomerNoteText("Attachment Included");
if (LOG.isDebugEnabled()) {
LOG.debug("create attachment note: "+pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
final String text = travelPayment.getCheckStubText();
if (!StringUtils.isBlank(text)) {
pnt = getPaymentSourceHelperService().buildNoteForCheckStubText(text, line);
if (LOG.isDebugEnabled()) {
LOG.debug("Creating check stub text note: " + pnt.getCustomerNoteText());
}
pd.addNote(pnt);
}
return pd;
}
/**
*
* @see org.kuali.kfs.module.tem.document.service.TravelPaymentsHelperService#buildGenericPaymentAccountDetails(java.util.List)
*/
@Override
public List<PaymentAccountDetail> buildGenericPaymentAccountDetails(List<? extends AccountingLine> accountingLines) {
List<PaymentAccountDetail> details = new ArrayList<PaymentAccountDetail>();
for (AccountingLine accountingLine : accountingLines) {
PaymentAccountDetail pad = new PaymentAccountDetail();
pad.setFinChartCode(accountingLine.getChartOfAccountsCode());
pad.setAccountNbr(accountingLine.getAccountNumber());
if (!StringUtils.isBlank(accountingLine.getSubAccountNumber())) {
pad.setSubAccountNbr(accountingLine.getSubAccountNumber());
}
else {
pad.setSubAccountNbr(KFSConstants.getDashSubAccountNumber());
}
pad.setFinObjectCode(accountingLine.getFinancialObjectCode());
if (!StringUtils.isBlank(accountingLine.getFinancialSubObjectCode())) {
pad.setFinSubObjectCode(accountingLine.getFinancialSubObjectCode());
}
else {
pad.setFinSubObjectCode(KFSConstants.getDashFinancialSubObjectCode());
}
if (!StringUtils.isBlank(accountingLine.getOrganizationReferenceId())) {
pad.setOrgReferenceId(accountingLine.getOrganizationReferenceId());
}
if (!StringUtils.isBlank(accountingLine.getProjectCode())) {
pad.setProjectCode(accountingLine.getProjectCode());
}
else {
pad.setProjectCode(KFSConstants.getDashProjectCode());
}
pad.setAccountNetAmount(accountingLine.getAmount());
details.add(pad);
}
return details;
}
/**
* @return an implementation of the PersonService
*/
public PersonService getPersonService() {
return personService;
}
/**
* Sets the implementation of the PersonService for this service to use
* @param parameterService an implementation of PersonService
*/
public void setPersonService(PersonService personService) {
this.personService = personService;
}
/**
* @return an implementation of the WorkflowDocumentService
*/
public WorkflowDocumentService getWorkflowDocumentService() {
return workflowDocumentService;
}
/**
* Sets the implementation of the WorkflowDocumentService for this service to use
* @param parameterService an implementation of WorkflowDocumentService
*/
public void setWorkflowDocumentService(WorkflowDocumentService workflowDocumentService) {
this.workflowDocumentService = workflowDocumentService;
}
/**
* @return an implementation of the PaymentSourceHelperService
*/
public PaymentSourceHelperService getPaymentSourceHelperService() {
return paymentSourceHelperService;
}
/**
* Sets the implementation of the PaymentSourceHelperService for this service to use
* @param paymentSourceHelperService an implementation of PaymentSourceHelperService
*/
public void setPaymentSourceHelperService(PaymentSourceHelperService paymentSourceHelperService) {
this.paymentSourceHelperService = paymentSourceHelperService;
}
public TravelerService getTravelerService() {
return travelerService;
}
public void setTravelerService(TravelerService travelerService) {
this.travelerService = travelerService;
}
}