/*
* 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.pdp.batch.service.impl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Timestamp;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.kuali.kfs.pdp.PdpConstants;
import org.kuali.kfs.pdp.PdpKeyConstants;
import org.kuali.kfs.pdp.batch.service.ExtractPaymentService;
import org.kuali.kfs.pdp.businessobject.CustomerProfile;
import org.kuali.kfs.pdp.businessobject.PaymentDetail;
import org.kuali.kfs.pdp.businessobject.PaymentGroup;
import org.kuali.kfs.pdp.businessobject.PaymentGroupHistory;
import org.kuali.kfs.pdp.businessobject.PaymentNoteText;
import org.kuali.kfs.pdp.businessobject.PaymentProcess;
import org.kuali.kfs.pdp.businessobject.PaymentStatus;
import org.kuali.kfs.pdp.businessobject.ProcessSummary;
import org.kuali.kfs.pdp.dataaccess.PaymentGroupHistoryDao;
import org.kuali.kfs.pdp.dataaccess.ProcessDao;
import org.kuali.kfs.pdp.service.PaymentDetailService;
import org.kuali.kfs.pdp.service.PaymentGroupService;
import org.kuali.kfs.pdp.service.PdpEmailService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.batch.InitiateDirectoryBase;
import org.kuali.kfs.sys.businessobject.Bank;
import org.kuali.kfs.sys.report.BusinessObjectReportHelper;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DataDictionaryService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.location.api.country.Country;
import org.kuali.rice.location.api.country.CountryService;
import org.springframework.transaction.annotation.Transactional;
import org.kuali.rice.core.api.util.type.KualiInteger;
@Transactional
public class ExtractPaymentServiceImpl extends InitiateDirectoryBase implements ExtractPaymentService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ExtractPaymentServiceImpl.class);
protected String directoryName;
protected DateTimeService dateTimeService;
protected ParameterService parameterService;
protected PaymentGroupService paymentGroupService;
protected PaymentDetailService paymentDetailService;
protected PaymentGroupHistoryDao paymentGroupHistoryDao;
protected ProcessDao processDao;
protected PdpEmailService paymentFileEmailService;
protected BusinessObjectService businessObjectService;
protected ConfigurationService kualiConfigurationService;
protected CountryService countryService;
protected DataDictionaryService dataDictionaryService;
// Set this to true to run this process without updating the database. This
// should stay false for production.
public static boolean testMode = false;
/**
* Generate the output file with prefix and date subfix
*
* @param fileprefix
* @param runDate
* @return
*/
protected String getOutputFile(String fileprefix, Date runDate) {
//add a step to check for directory paths
prepareDirectories(getRequiredDirectoryNames());
String filename = directoryName + "/" + fileprefix + "_";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
filename = filename + sdf.format(runDate);
filename = filename + ".xml";
return filename;
}
/**
* @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractCancelledChecks()
*/
@Override
public void extractCanceledChecks() {
LOG.debug("extractCancelledChecks() started");
Date processDate = dateTimeService.getCurrentDate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String checkCancelledFilePrefix = this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.ExtractPayment.CHECK_CANCEL_FILENAME);
checkCancelledFilePrefix = MessageFormat.format(checkCancelledFilePrefix, new Object[] { null });
String filename = getOutputFile(checkCancelledFilePrefix, processDate);
if (LOG.isDebugEnabled()) {
LOG.debug("extractCanceledChecks() filename = " + filename);
}
// Open file
BufferedWriter os = null;
try {
os = new BufferedWriter(new FileWriter(filename));
os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
writeOpenTag(os, 0, "canceledChecks");
Iterator paymentIterator = paymentGroupHistoryDao.getCanceledChecks();
while (paymentIterator.hasNext()) {
PaymentGroupHistory history = (PaymentGroupHistory) paymentIterator.next();
writeOpenTag(os, 2, "check");
writeBank(os, 4, history.getPaymentGroup().getBank());
writePayee(os, 4, history.getPaymentGroup());
writeTag(os, 4, "netAmount", history.getPaymentGroup().getNetPaymentAmount().toString());
if (ObjectUtils.isNotNull(history.getOrigDisburseNbr())) {
writeTag(os, 4, "disbursementNumber", history.getOrigDisburseNbr().toString());
}
else {
writeTag(os, 4, "disbursementNumber", history.getPaymentGroup().getDisbursementNbr().toString());
}
if (ObjectUtils.isNotNull(history.getPaymentGroup().getDisbursementType())) {
writeTag(os, 4, "disbursementType", history.getPaymentGroup().getDisbursementType().getCode());
}
else {
writeTag(os, 4, "disbursementType", history.getDisbursementType().getCode());
}
writeCloseTag(os, 2, "check");
if (!testMode) {
history.setLastUpdate(new Timestamp(processDate.getTime()));
history.setPmtCancelExtractDate(new Timestamp(processDate.getTime()));
history.setPmtCancelExtractStat(Boolean.TRUE);
history.setChangeTime(new Timestamp(new Date().getTime()));
this.businessObjectService.save(history);
}
}
writeCloseTag(os, 0, "canceledChecks");
createDoneFile(filename);
}
catch (IOException ie) {
LOG.error("extractCanceledChecks() Problem reading file: " + filename, ie);
throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
}
finally {
// Close file
if (os != null) {
try {
os.close();
}
catch (IOException ie) {
// Not much we can do now
}
}
}
}
/**
* @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractAchPayments()
*/
@Override
public void extractAchPayments() {
LOG.debug("extractAchPayments() started");
Date processDate = dateTimeService.getCurrentDate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
PaymentStatus extractedStatus = this.businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.EXTRACTED);
String achFilePrefix = this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.ExtractPayment.ACH_FILENAME);
achFilePrefix = MessageFormat.format(achFilePrefix, new Object[] { null });
String filename = getOutputFile(achFilePrefix, processDate);
if (LOG.isDebugEnabled()) {
LOG.debug("extractAchPayments() filename = " + filename);
}
// Open file
BufferedWriter os = null;
writeExtractAchFile(extractedStatus, filename, processDate, sdf);
createDoneFile(filename);
}
/**
* @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractChecks()
*/
@Override
public void extractChecks() {
LOG.debug("extractChecks() started");
Date processDate = dateTimeService.getCurrentDate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
PaymentStatus extractedStatus = this.businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.EXTRACTED);
String checkFilePrefix = this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.ExtractPayment.CHECK_FILENAME);
checkFilePrefix = MessageFormat.format(checkFilePrefix, new Object[] { null });
String filename = getOutputFile(checkFilePrefix, processDate);
if (LOG.isDebugEnabled()) {
LOG.debug("extractChecks() filename: " + filename);
}
List<PaymentProcess> extractsToRun = this.processDao.getAllExtractsToRun();
for (PaymentProcess extractToRun : extractsToRun) {
writeExtractCheckFile(extractedStatus, extractToRun, filename, extractToRun.getId().intValue());
extractToRun.setExtractedInd(true);
businessObjectService.save(extractToRun);
}
}
protected boolean isResearchParticipantExtractFile(Integer processId) {
boolean result = false;
if (parameterService.parameterExists(PaymentDetail.class, PdpConstants.RESEARCH_PARTICIPANT_CUSTOMER_PROFILE)) {
Map fieldValues = new HashMap<String, Integer>();
fieldValues.put("processId", processId);
Collection<ProcessSummary> processSummaryList = this.businessObjectService.findMatching(ProcessSummary.class, fieldValues);
ProcessSummary processSummary = processSummaryList.iterator().next();
Collection<String> researchParticipantCustomers = parameterService.getParameterValuesAsString(PaymentDetail.class, PdpConstants.RESEARCH_PARTICIPANT_CUSTOMER_PROFILE);
for (String researchParticipantCustomer : researchParticipantCustomers) {
String[] customerArray = researchParticipantCustomer.split(KFSConstants.DASH);
CustomerProfile customer = processSummary.getCustomer();
if (customer.getChartCode().equals(customerArray[0]) && customer.getUnitCode().equals(customerArray[1]) && customer.getSubUnitCode().equals(customerArray[2])) {
return true;
}
}
}
return result;
}
protected void writeExtractCheckFile(PaymentStatus extractedStatus, PaymentProcess p, String filename, Integer processId) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date processDate = dateTimeService.getCurrentDate();
BufferedWriter os = null;
//Check whether this is for research participant upload. If the customer profile matches research participant's
//customer profile, then change the filename to append the RP-Upload prefix.
if (isResearchParticipantExtractFile(processId)) {
String checkFilePrefix = this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.ExtractPayment.CHECK_FILENAME);
checkFilePrefix = MessageFormat.format(checkFilePrefix, new Object[] { null });
checkFilePrefix = PdpConstants.RESEARCH_PARTICIPANT_FILE_PREFIX + KFSConstants.DASH + checkFilePrefix;
filename = getOutputFile(checkFilePrefix, processDate);
}
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(filename), "UTF-8");
os = new BufferedWriter(writer);
os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
writeOpenTagAttribute(os, 0, "checks", "processId", processId.toString(), "campusCode", p.getCampusCode());
List<String> bankCodes = paymentGroupService.getDistinctBankCodesForProcessAndType(processId, PdpConstants.DisbursementTypeCodes.CHECK);
for (String bankCode : bankCodes) {
List<Integer> disbNbrs = paymentGroupService.getDisbursementNumbersByDisbursementTypeAndBankCode(processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
for (Iterator<Integer> iter = disbNbrs.iterator(); iter.hasNext();) {
Integer disbursementNbr = iter.next();
boolean first = true;
KualiDecimal totalNetAmount = new KualiDecimal(0);
// this seems wasteful, but since the total net amount is needed on the first payment detail...it's needed
Iterator<PaymentDetail> i2 = paymentDetailService.getByDisbursementNumber(disbursementNbr, processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
while (i2.hasNext()) {
PaymentDetail pd = i2.next();
totalNetAmount = totalNetAmount.add(pd.getNetPaymentAmount());
}
List<KualiInteger> paymentGroupIdsSaved = new ArrayList<KualiInteger>();
Iterator<PaymentDetail> paymentDetails = paymentDetailService.getByDisbursementNumber(disbursementNbr, processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
while (paymentDetails.hasNext()) {
PaymentDetail detail = paymentDetails.next();
PaymentGroup group = detail.getPaymentGroup();
if (!testMode) {
if (!paymentGroupIdsSaved.contains(group.getId())) {
group.setDisbursementDate(new java.sql.Date(processDate.getTime()));
group.setPaymentStatus(extractedStatus);
this.businessObjectService.save(group);
paymentGroupIdsSaved.add(group.getId());
}
}
if (first) {
writeOpenTagAttribute(os, 2, "check", "disbursementNbr", group.getDisbursementNbr().toString());
// Write check level information
writeBank(os, 4, group.getBank());
writeTag(os, 4, "disbursementDate", sdf.format(processDate));
writeTag(os, 4, "netAmount", totalNetAmount.toString());
writePayee(os, 4, group);
writeTag(os, 4, "campusAddressIndicator", group.getCampusAddress().booleanValue() ? "Y" : "N");
writeTag(os, 4, "attachmentIndicator", group.getPymtAttachment().booleanValue() ? "Y" : "N");
writeTag(os, 4, "specialHandlingIndicator", group.getPymtSpecialHandling().booleanValue() ? "Y" : "N");
writeTag(os, 4, "immediatePaymentIndicator", group.getProcessImmediate().booleanValue() ? "Y" : "N");
writeTag(os, 4, "paymentDate", sdf.format(group.getPaymentDate()));
// Write customer profile information
CustomerProfile cp = group.getBatch().getCustomerProfile();
writeCustomerProfile(os, 4, cp);
writeOpenTag(os, 4, "payments");
}
writeOpenTag(os, 6, "payment");
writeTag(os, 8, "purchaseOrderNbr", detail.getPurchaseOrderNbr());
writeTag(os, 8, "invoiceNbr", detail.getInvoiceNbr());
writeTag(os, 8, "requisitionNbr", detail.getRequisitionNbr());
writeTag(os, 8, "custPaymentDocNbr", detail.getCustPaymentDocNbr());
writeTag(os, 8, "customerUnivNbr", detail.getCustomerInstitutionNumber());
writeTag(os, 8, "invoiceDate", sdf.format(detail.getInvoiceDate()));
writeTag(os, 8, "origInvoiceAmount", detail.getOrigInvoiceAmount().toString());
writeTag(os, 8, "netPaymentAmount", detail.getNetPaymentAmount().toString());
writeTag(os, 8, "invTotDiscountAmount", detail.getInvTotDiscountAmount().toString());
writeTag(os, 8, "invTotShipAmount", detail.getInvTotShipAmount().toString());
writeTag(os, 8, "invTotOtherDebitAmount", detail.getInvTotOtherDebitAmount().toString());
writeTag(os, 8, "invTotOtherCreditAmount", detail.getInvTotOtherCreditAmount().toString());
writeOpenTag(os, 8, "notes");
for (Iterator ix = detail.getNotes().iterator(); ix.hasNext();) {
PaymentNoteText note = (PaymentNoteText) ix.next();
writeTag(os, 10, "note", note.getCustomerNoteText());
}
writeCloseTag(os, 8, "notes");
writeCloseTag(os, 6, "payment");
first = false;
}
writeCloseTag(os, 4, "payments");
writeCloseTag(os, 2, "check");
}
}
writeCloseTag(os, 0, "checks");
createDoneFile(filename);
}
catch (IOException ie) {
LOG.error("extractChecks() Problem reading file: " + filename, ie);
throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
}
finally {
// Close file
if (os != null) {
try {
os.close();
}
catch (IOException ie) {
// Not much we can do now
}
}
}
}
protected void writeExtractAchFile(PaymentStatus extractedStatus, String filename, Date processDate, SimpleDateFormat sdf) {
BufferedWriter os = null;
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(filename), "UTF-8");
os = new BufferedWriter(writer);
os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
writeOpenTag(os, 0, "achPayments");
// totals for summary
Map<String, Integer> unitCounts = new HashMap<String, Integer>();
Map<String, KualiDecimal> unitTotals = new HashMap<String, KualiDecimal>();
Iterator iter = paymentGroupService.getByDisbursementTypeStatusCode(PdpConstants.DisbursementTypeCodes.ACH, PdpConstants.PaymentStatusCodes.PENDING_ACH);
while (iter.hasNext()) {
PaymentGroup paymentGroup = (PaymentGroup) iter.next();
if (!testMode) {
paymentGroup.setDisbursementDate(new java.sql.Date(processDate.getTime()));
paymentGroup.setPaymentStatus(extractedStatus);
businessObjectService.save(paymentGroup);
}
writeOpenTagAttribute(os, 2, "ach", "disbursementNbr", paymentGroup.getDisbursementNbr().toString());
PaymentProcess paymentProcess = paymentGroup.getProcess();
writeTag(os, 4, "processCampus", paymentProcess.getCampusCode());
writeTag(os, 4, "processId", paymentProcess.getId().toString());
writeBank(os, 4, paymentGroup.getBank());
writeTag(os, 4, "disbursementDate", sdf.format(processDate));
writeTag(os, 4, "netAmount", paymentGroup.getNetPaymentAmount().toString());
writePayeeAch(os, 4, paymentGroup);
writeTag(os, 4, "paymentDate", sdf.format(paymentGroup.getPaymentDate()));
// Write customer profile information
CustomerProfile cp = paymentGroup.getBatch().getCustomerProfile();
writeCustomerProfile(os, 4, cp);
// Write all payment level information
writeOpenTag(os, 4, "payments");
List pdList = paymentGroup.getPaymentDetails();
for (Iterator iterator = pdList.iterator(); iterator.hasNext();) {
PaymentDetail paymentDetail = (PaymentDetail) iterator.next();
writeOpenTag(os, 6, "payment");
// Write detail info
writeTag(os, 6, "purchaseOrderNbr", paymentDetail.getPurchaseOrderNbr());
writeTag(os, 6, "invoiceNbr", paymentDetail.getInvoiceNbr());
writeTag(os, 6, "requisitionNbr", paymentDetail.getRequisitionNbr());
writeTag(os, 6, "custPaymentDocNbr", paymentDetail.getCustPaymentDocNbr());
writeTag(os, 6, "customerUnivNbr", paymentDetail.getCustomerInstitutionNumber());
writeTag(os, 6, "invoiceDate", sdf.format(paymentDetail.getInvoiceDate()));
writeTag(os, 6, "origInvoiceAmount", paymentDetail.getOrigInvoiceAmount().toString());
writeTag(os, 6, "netPaymentAmount", paymentDetail.getNetPaymentAmount().toString());
writeTag(os, 6, "invTotDiscountAmount", paymentDetail.getInvTotDiscountAmount().toString());
writeTag(os, 6, "invTotShipAmount", paymentDetail.getInvTotShipAmount().toString());
writeTag(os, 6, "invTotOtherDebitAmount", paymentDetail.getInvTotOtherDebitAmount().toString());
writeTag(os, 6, "invTotOtherCreditAmount", paymentDetail.getInvTotOtherCreditAmount().toString());
writeOpenTag(os, 6, "notes");
for (Iterator i = paymentDetail.getNotes().iterator(); i.hasNext();) {
PaymentNoteText note = (PaymentNoteText) i.next();
writeTag(os, 8, "note", escapeString(note.getCustomerNoteText()));
}
writeCloseTag(os, 6, "notes");
writeCloseTag(os, 4, "payment");
String unit = paymentGroup.getBatch().getCustomerProfile().getChartCode() + "-" + paymentGroup.getBatch().getCustomerProfile().getUnitCode() + "-" + paymentGroup.getBatch().getCustomerProfile().getSubUnitCode();
Integer count = 1;
if (unitCounts.containsKey(unit)) {
count = 1 + unitCounts.get(unit);
}
unitCounts.put(unit, count);
KualiDecimal unitTotal = paymentDetail.getNetPaymentAmount();
if (unitTotals.containsKey(unit)) {
unitTotal = paymentDetail.getNetPaymentAmount().add(unitTotals.get(unit));
}
unitTotals.put(unit, unitTotal);
}
writeCloseTag(os, 4, "payments");
writeCloseTag(os, 2, "ach");
}
writeCloseTag(os, 0, "achPayments");
// send summary email
paymentFileEmailService.sendAchSummaryEmail(unitCounts, unitTotals, dateTimeService.getCurrentDate());
}
catch (IOException ie) {
LOG.error("extractAchPayments() Problem reading file: " + filename, ie);
throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
}
finally {
// Close file
if (os != null) {
try {
os.close();
}
catch (IOException ie) {
// Not much we can do now
}
}
}
}
protected static String SPACES = " ";
protected void writeTag(BufferedWriter os, int indent, String tag, String data) throws IOException {
if (data != null) {
os.write(SPACES.substring(0, indent));
os.write("<" + tag + ">" + escapeString(data) + "</" + tag + ">\n");
}
}
protected void writeOpenTag(BufferedWriter os, int indent, String tag) throws IOException {
os.write(SPACES.substring(0, indent));
os.write("<" + tag + ">\n");
}
protected void writeOpenTagAttribute(BufferedWriter os, int indent, String tag, String attr, String attrVal) throws IOException {
os.write(SPACES.substring(0, indent));
os.write("<" + tag + " " + attr + "=\"" + escapeString(attrVal) + "\">\n");
}
protected void writeOpenTagAttribute(BufferedWriter os, int indent, String tag, String attr1, String attr1Val, String attr2, String attr2Val) throws IOException {
os.write(SPACES.substring(0, indent));
os.write("<" + tag + " " + attr1 + "=\"" + escapeString(attr1Val) + "\" " + attr2 + "=\"" + escapeString(attr2Val) + "\">\n");
}
protected void writeCloseTag(BufferedWriter os, int indent, String tag) throws IOException {
os.write(SPACES.substring(0, indent));
os.write("</" + tag + ">\n");
}
protected void writeBank(BufferedWriter os, int indent, Bank b) throws IOException {
if (b != null) {
writeOpenTagAttribute(os, indent, "bank", "code", b.getBankCode());
writeTag(os, indent + 2, "accountNumber", b.getBankAccountNumber());
writeTag(os, indent + 2, "routingNumber", b.getBankRoutingNumber());
writeCloseTag(os, indent, "bank");
}
}
protected void writeCustomerProfile(BufferedWriter os, int indent, CustomerProfile cp) throws IOException {
writeOpenTag(os, indent, "customerProfile");
writeTag(os, indent + 2, "chartCode", cp.getChartCode());
writeTag(os, indent + 2, "orgCode", cp.getUnitCode());
writeTag(os, indent + 2, "subUnitCode", cp.getSubUnitCode());
writeOpenTag(os, indent + 2, "checkHeaderNoteLines");
writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine1());
writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine2());
writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine3());
writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine4());
writeCloseTag(os, indent + 2, "checkHeaderNoteLines");
writeOpenTag(os, indent + 2, "additionalCheckNoteLines");
writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine1());
writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine2());
writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine3());
writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine4());
writeCloseTag(os, indent + 2, "additionalCheckNoteLines");
writeCloseTag(os, indent, "customerProfile");
}
protected void writePayeeAch(BufferedWriter os, int indent, PaymentGroup pg) throws IOException {
writePayeeInformation(os, indent, pg, true);
}
protected void writePayee(BufferedWriter os, int indent, PaymentGroup pg) throws IOException {
writePayeeInformation(os, indent, pg, false);
}
protected void writePayeeInformation(BufferedWriter os, int indent, PaymentGroup pg, boolean includeAch) throws IOException {
os.write(SPACES.substring(0, indent));
os.write("<payee id=\"" + pg.getPayeeId() + "\" type=\"" + pg.getPayeeIdTypeCd() + "\">\n");
writeTag(os, indent + 2, "payeeName", pg.getPayeeName());
writeTag(os, indent + 2, "line1Address", pg.getLine1Address());
writeTag(os, indent + 2, "line2Address", pg.getLine2Address());
writeTag(os, indent + 2, "line3Address", pg.getLine3Address());
writeTag(os, indent + 2, "line4Address", pg.getLine4Address());
writeTag(os, indent + 2, "city", pg.getCity());
writeTag(os, indent + 2, "state", pg.getState());
writeTag(os, indent + 2, "zipCd", pg.getZipCd());
// get country name for code
String countryName = "";
if ( StringUtils.isNotBlank(pg.getCountry()) ) {
Country country = countryService.getCountry(pg.getCountry());
if (country != null) {
countryName = country.getName();
}
if ( StringUtils.isBlank(countryName) ) {
countryName = pg.getCountry();
}
}
writeTag(os, indent + 2, "country", countryName);
if (includeAch) {
writeTag(os, indent + 2, "achBankRoutingNbr", pg.getAchBankRoutingNbr());
writeTag(os, indent + 2, "achBankAccountNbr", pg.getAchAccountNumber().getAchBankAccountNbr());
writeTag(os, indent + 2, "achAccountType", pg.getAchAccountType());
}
writeCloseTag(os, indent, "payee");
}
/**
* Creates a '.done' file with the name of the original file.
*/
protected void createDoneFile(String filename) {
String doneFileName = StringUtils.substringBeforeLast(filename,".") + ".done";
File doneFile = new File(doneFileName);
if (!doneFile.exists()) {
boolean doneFileCreated = false;
try {
doneFileCreated = doneFile.createNewFile();
}
catch (IOException e) {
LOG.error("unable to create done file " + doneFileName, e);
throw new RuntimeException("Errors encountered while saving the file: Unable to create .done file " + doneFileName, e);
}
if (!doneFileCreated) {
LOG.error("unable to create done file " + doneFileName);
throw new RuntimeException("Errors encountered while saving the file: Unable to create .done file " + doneFileName);
}
}
}
protected String escapeString(String input) {
String output = input.replaceAll("\\&", "&");
output = output.replaceAll("\"", """);
output = output.replaceAll("\\'", "'");
output = output.replaceAll("\\<", "<");
output = output.replaceAll("\\>", ">");
return output;
}
/**
* Sets the directoryName attribute value.
*
* @param directoryName The directoryName to set.
*/
public void setDirectoryName(String directoryName) {
this.directoryName = directoryName;
}
/**
* Sets the dateTimeService attribute value.
*
* @param dateTimeService The dateTimeService to set.
*/
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
/**
* Sets the parameterService attribute value.
*
* @param parameterService The parameterService to set.
*/
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
/**
* Sets the paymentGroupService attribute value.
*
* @param paymentGroupService The paymentGroupService to set.
*/
public void setPaymentGroupService(PaymentGroupService paymentGroupService) {
this.paymentGroupService = paymentGroupService;
}
/**
* Sets the paymentDetailService attribute value.
*
* @param paymentDetailService The paymentDetailService to set.
*/
public void setPaymentDetailService(PaymentDetailService paymentDetailService) {
this.paymentDetailService = paymentDetailService;
}
/**
* Sets the paymentGroupHistoryDao attribute value.
*
* @param paymentGroupHistoryDao The paymentGroupHistoryDao to set.
*/
public void setPaymentGroupHistoryDao(PaymentGroupHistoryDao paymentGroupHistoryDao) {
this.paymentGroupHistoryDao = paymentGroupHistoryDao;
}
/**
* Sets the processDao attribute value.
*
* @param processDao The processDao to set.
*/
public void setProcessDao(ProcessDao processDao) {
this.processDao = processDao;
}
/**
* Sets the paymentFileEmailService attribute value.
*
* @param paymentFileEmailService The paymentFileEmailService to set.
*/
public void setPaymentFileEmailService(PdpEmailService paymentFileEmailService) {
this.paymentFileEmailService = paymentFileEmailService;
}
/**
* Sets the business object service
*
* @param businessObjectService
*/
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
public void setConfigurationService(ConfigurationService kualiConfigurationService) {
this.kualiConfigurationService = kualiConfigurationService;
}
/**
* Gets the countryService attribute.
*
* @return Returns the countryService.
*/
protected CountryService getCountryService() {
return countryService;
}
/**
* Sets the countryService attribute value.
*
* @param countryService The countryService to set.
*/
public void setCountryService(CountryService countryService) {
this.countryService = countryService;
}
/**
* @see org.kuali.kfs.sys.batch.service.impl.InitiateDirectoryImpl#getRequiredDirectoryNames()
*/
@Override
public List<String> getRequiredDirectoryNames() {
return new ArrayList<String>() {{add(directoryName); }};
}
public DataDictionaryService getDataDictionaryService() {
return dataDictionaryService;
}
public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
this.dataDictionaryService = dataDictionaryService;
}
/**
* @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#formatCheckNoteLines(java.lang.String)
*
* Long check stub note
*/
@Override
public List<String> formatCheckNoteLines(String checkNote) {
List<String> formattedCheckNoteLines = new ArrayList<String>();
if (StringUtils.isBlank(checkNote)) {
return formattedCheckNoteLines;
}
String[] textLines = StringUtils.split(checkNote, BusinessObjectReportHelper.LINE_BREAK);
int maxLengthOfNoteLine = dataDictionaryService.getAttributeMaxLength(PaymentNoteText.class, "customerNoteText");
for (String textLine : textLines) {
String text = WordUtils.wrap(textLine, maxLengthOfNoteLine, BusinessObjectReportHelper.LINE_BREAK, true);
String[] wrappedTextLines = StringUtils.split(text, BusinessObjectReportHelper.LINE_BREAK);
for (String wrappedText : wrappedTextLines) {
formattedCheckNoteLines.add(wrappedText);
}
}
return formattedCheckNoteLines;
}
}