001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.pdp.batch.service.impl;
017
018 import java.io.BufferedWriter;
019 import java.io.FileWriter;
020 import java.io.IOException;
021 import java.sql.Timestamp;
022 import java.text.MessageFormat;
023 import java.text.SimpleDateFormat;
024 import java.util.Date;
025 import java.util.HashMap;
026 import java.util.Iterator;
027 import java.util.List;
028 import java.util.Map;
029
030 import org.kuali.kfs.pdp.PdpConstants;
031 import org.kuali.kfs.pdp.PdpKeyConstants;
032 import org.kuali.kfs.pdp.batch.service.ExtractPaymentService;
033 import org.kuali.kfs.pdp.businessobject.CustomerProfile;
034 import org.kuali.kfs.pdp.businessobject.PaymentDetail;
035 import org.kuali.kfs.pdp.businessobject.PaymentGroup;
036 import org.kuali.kfs.pdp.businessobject.PaymentGroupHistory;
037 import org.kuali.kfs.pdp.businessobject.PaymentNoteText;
038 import org.kuali.kfs.pdp.businessobject.PaymentProcess;
039 import org.kuali.kfs.pdp.businessobject.PaymentStatus;
040 import org.kuali.kfs.pdp.dataaccess.PaymentGroupHistoryDao;
041 import org.kuali.kfs.pdp.dataaccess.ProcessDao;
042 import org.kuali.kfs.pdp.service.PaymentDetailService;
043 import org.kuali.kfs.pdp.service.PaymentGroupService;
044 import org.kuali.kfs.pdp.service.PdpEmailService;
045 import org.kuali.kfs.sys.businessobject.Bank;
046 import org.kuali.rice.kns.bo.Country;
047 import org.kuali.rice.kns.service.BusinessObjectService;
048 import org.kuali.rice.kns.service.CountryService;
049 import org.kuali.rice.kns.service.DateTimeService;
050 import org.kuali.rice.kns.service.KualiConfigurationService;
051 import org.kuali.rice.kns.service.ParameterService;
052 import org.kuali.rice.kns.util.KualiDecimal;
053 import org.kuali.rice.kns.util.ObjectUtils;
054 import org.springframework.transaction.annotation.Transactional;
055
056 @Transactional
057 public class ExtractPaymentServiceImpl implements ExtractPaymentService {
058 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ExtractPaymentServiceImpl.class);
059
060 protected String directoryName;
061
062 protected DateTimeService dateTimeService;
063 protected ParameterService parameterService;
064 protected PaymentGroupService paymentGroupService;
065 protected PaymentDetailService paymentDetailService;
066 protected PaymentGroupHistoryDao paymentGroupHistoryDao;
067 protected ProcessDao processDao;
068 protected PdpEmailService paymentFileEmailService;
069 protected BusinessObjectService businessObjectService;
070 protected KualiConfigurationService kualiConfigurationService;
071 protected CountryService countryService;
072
073 // Set this to true to run this process without updating the database. This
074 // should stay false for production.
075 public static boolean testMode = false;
076
077 protected String getOutputFile(String fileprefix, Date runDate) {
078 String filename = directoryName + "/" + fileprefix + "_";
079 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
080 filename = filename + sdf.format(runDate);
081 filename = filename + ".xml";
082
083 return filename;
084 }
085
086 /**
087 * @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractCancelledChecks()
088 */
089 public void extractCanceledChecks() {
090 LOG.debug("extractCancelledChecks() started");
091
092 Date processDate = dateTimeService.getCurrentDate();
093 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
094
095 String checkCancelledFilePrefix = this.kualiConfigurationService.getPropertyString(PdpKeyConstants.ExtractPayment.CHECK_CANCEL_FILENAME);
096 checkCancelledFilePrefix = MessageFormat.format(checkCancelledFilePrefix, new Object[] { null });
097
098 String filename = getOutputFile(checkCancelledFilePrefix, processDate);
099 LOG.debug("extractCanceledChecks() filename = " + filename);
100
101 // Open file
102 BufferedWriter os = null;
103
104 try {
105 os = new BufferedWriter(new FileWriter(filename));
106 os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
107 writeOpenTag(os, 0, "canceledChecks");
108
109 Iterator paymentIterator = paymentGroupHistoryDao.getCanceledChecks();
110 while (paymentIterator.hasNext()) {
111 PaymentGroupHistory history = (PaymentGroupHistory) paymentIterator.next();
112
113 writeOpenTag(os, 2, "check");
114
115 writeBank(os, 4, history.getPaymentGroup().getBank());
116 writePayee(os, 4, history.getPaymentGroup());
117
118 writeTag(os, 4, "netAmount", history.getPaymentGroup().getNetPaymentAmount().toString());
119 if (ObjectUtils.isNotNull(history.getOrigDisburseNbr())) {
120 writeTag(os, 4, "disbursementNumber", history.getOrigDisburseNbr().toString());
121 }
122 else {
123 writeTag(os, 4, "disbursementNumber", history.getPaymentGroup().getDisbursementNbr().toString());
124 }
125 if (ObjectUtils.isNotNull(history.getPaymentGroup().getDisbursementType())) {
126 writeTag(os, 4, "disbursementType", history.getPaymentGroup().getDisbursementType().getCode());
127 }
128 else {
129 writeTag(os, 4, "disbursementType", history.getDisbursementType().getCode());
130 }
131
132 writeCloseTag(os, 2, "check");
133
134 if (!testMode) {
135 history.setLastUpdate(new Timestamp(processDate.getTime()));
136 history.setPmtCancelExtractDate(new Timestamp(processDate.getTime()));
137 history.setPmtCancelExtractStat(Boolean.TRUE);
138 history.setChangeTime(new Timestamp(new Date().getTime()));
139
140 this.businessObjectService.save(history);
141 }
142 }
143
144 writeCloseTag(os, 0, "canceledChecks");
145 }
146 catch (IOException ie) {
147 LOG.error("extractCanceledChecks() Problem reading file: " + filename, ie);
148 throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
149 }
150 finally {
151 // Close file
152 if (os != null) {
153 try {
154 os.close();
155 }
156 catch (IOException ie) {
157 // Not much we can do now
158 }
159 }
160 }
161 }
162
163 /**
164 * @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractAchPayments()
165 */
166 public void extractAchPayments() {
167 LOG.debug("extractAchPayments() started");
168
169 Date processDate = dateTimeService.getCurrentDate();
170 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
171 PaymentStatus extractedStatus = (PaymentStatus) this.businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.EXTRACTED);
172
173 String achFilePrefix = this.kualiConfigurationService.getPropertyString(PdpKeyConstants.ExtractPayment.ACH_FILENAME);
174 achFilePrefix = MessageFormat.format(achFilePrefix, new Object[] { null });
175
176 String filename = getOutputFile(achFilePrefix, processDate);
177 LOG.debug("extractAchPayments() filename = " + filename);
178
179 // Open file
180 BufferedWriter os = null;
181
182 writeExtractAchFile(extractedStatus, filename, processDate, sdf);
183
184 }
185
186 /**
187 * @see org.kuali.kfs.pdp.batch.service.ExtractPaymentService#extractChecks()
188 */
189 public void extractChecks() {
190 LOG.debug("extractChecks() started");
191
192 Date processDate = dateTimeService.getCurrentDate();
193 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
194 PaymentStatus extractedStatus = (PaymentStatus) this.businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.EXTRACTED);
195
196 String checkFilePrefix = this.kualiConfigurationService.getPropertyString(PdpKeyConstants.ExtractPayment.CHECK_FILENAME);
197 checkFilePrefix = MessageFormat.format(checkFilePrefix, new Object[] { null });
198
199 String filename = getOutputFile(checkFilePrefix, processDate);
200 LOG.debug("extractChecks() filename: " + filename);
201
202 List<PaymentProcess> extractsToRun = this.processDao.getAllExtractsToRun();
203 for (PaymentProcess extractToRun : extractsToRun) {
204 writeExtractCheckFile(extractedStatus, extractToRun, filename, extractToRun.getId().intValue());
205 this.processDao.setExtractProcessAsComplete(extractToRun);
206 }
207 }
208
209 protected void writeExtractCheckFile(PaymentStatus extractedStatus, PaymentProcess p, String filename, Integer processId) {
210 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
211 Date processDate = dateTimeService.getCurrentDate();
212 BufferedWriter os = null;
213
214 try {
215 os = new BufferedWriter(new FileWriter(filename));
216 os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
217 writeOpenTagAttribute(os, 0, "checks", "processId", processId.toString(), "campusCode", p.getCampusCode());
218
219 List<String> bankCodes = paymentGroupService.getDistinctBankCodesForProcessAndType(processId, PdpConstants.DisbursementTypeCodes.CHECK);
220
221 for (String bankCode : bankCodes) {
222 List<Integer> disbNbrs = paymentGroupService.getDisbursementNumbersByDisbursementTypeAndBankCode(processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
223 for (Iterator<Integer> iter = disbNbrs.iterator(); iter.hasNext();) {
224 Integer disbursementNbr = iter.next();
225
226 boolean first = true;
227
228 KualiDecimal totalNetAmount = new KualiDecimal(0);
229
230 // this seems wasteful, but since the total net amount is needed on the first payment detail...it's needed
231 Iterator<PaymentDetail> i2 = paymentDetailService.getByDisbursementNumber(disbursementNbr, processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
232 while (i2.hasNext()) {
233 PaymentDetail pd = i2.next();
234 totalNetAmount = totalNetAmount.add(pd.getNetPaymentAmount());
235 }
236
237 Iterator<PaymentDetail> paymentDetails = paymentDetailService.getByDisbursementNumber(disbursementNbr, processId, PdpConstants.DisbursementTypeCodes.CHECK, bankCode);
238 while (paymentDetails.hasNext()) {
239 PaymentDetail pd = paymentDetails.next();
240 PaymentGroup pg = pd.getPaymentGroup();
241 if (!testMode) {
242 pg.setDisbursementDate(new java.sql.Date(processDate.getTime()));
243 pg.setPaymentStatus(extractedStatus);
244 this.businessObjectService.save(pg);
245 }
246
247 if (first) {
248 writeOpenTagAttribute(os, 2, "check", "disbursementNbr", pg.getDisbursementNbr().toString());
249
250 // Write check level information
251
252 writeBank(os, 4, pg.getBank());
253
254 writeTag(os, 4, "disbursementDate", sdf.format(processDate));
255 writeTag(os, 4, "netAmount", totalNetAmount.toString());
256
257 writePayee(os, 4, pg);
258 writeTag(os, 4, "campusAddressIndicator", pg.getCampusAddress().booleanValue() ? "Y" : "N");
259 writeTag(os, 4, "attachmentIndicator", pg.getPymtAttachment().booleanValue() ? "Y" : "N");
260 writeTag(os, 4, "specialHandlingIndicator", pg.getPymtSpecialHandling().booleanValue() ? "Y" : "N");
261 writeTag(os, 4, "immediatePaymentIndicator", pg.getProcessImmediate().booleanValue() ? "Y" : "N");
262 writeTag(os, 4, "customerUnivNbr", pg.getCustomerInstitutionNumber());
263 writeTag(os, 4, "paymentDate", sdf.format(pg.getPaymentDate()));
264
265 // Write customer profile information
266 CustomerProfile cp = pg.getBatch().getCustomerProfile();
267 writeCustomerProfile(os, 4, cp);
268
269 writeOpenTag(os, 4, "payments");
270
271 }
272
273 writeOpenTag(os, 6, "payment");
274
275 writeTag(os, 8, "purchaseOrderNbr", pd.getPurchaseOrderNbr());
276 writeTag(os, 8, "invoiceNbr", pd.getInvoiceNbr());
277 writeTag(os, 8, "requisitionNbr", pd.getRequisitionNbr());
278 writeTag(os, 8, "custPaymentDocNbr", pd.getCustPaymentDocNbr());
279 writeTag(os, 8, "invoiceDate", sdf.format(pd.getInvoiceDate()));
280
281 writeTag(os, 8, "origInvoiceAmount", pd.getOrigInvoiceAmount().toString());
282 writeTag(os, 8, "netPaymentAmount", pd.getNetPaymentAmount().toString());
283 writeTag(os, 8, "invTotDiscountAmount", pd.getInvTotDiscountAmount().toString());
284 writeTag(os, 8, "invTotShipAmount", pd.getInvTotShipAmount().toString());
285 writeTag(os, 8, "invTotOtherDebitAmount", pd.getInvTotOtherDebitAmount().toString());
286 writeTag(os, 8, "invTotOtherCreditAmount", pd.getInvTotOtherCreditAmount().toString());
287
288 writeOpenTag(os, 8, "notes");
289 for (Iterator ix = pd.getNotes().iterator(); ix.hasNext();) {
290 PaymentNoteText note = (PaymentNoteText) ix.next();
291 writeTag(os, 10, "note", note.getCustomerNoteText());
292 }
293 writeCloseTag(os, 8, "notes");
294
295 writeCloseTag(os, 6, "payment");
296
297 first = false;
298 }
299 writeCloseTag(os, 4, "payments");
300 writeCloseTag(os, 2, "check");
301 }
302 }
303 writeCloseTag(os, 0, "checks");
304 }
305 catch (IOException ie) {
306 LOG.error("extractChecks() Problem reading file: " + filename, ie);
307 throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
308 }
309 finally {
310 // Close file
311 if (os != null) {
312 try {
313 os.close();
314 }
315 catch (IOException ie) {
316 // Not much we can do now
317 }
318 }
319 }
320 }
321
322 protected void writeExtractAchFile(PaymentStatus extractedStatus, String filename, Date processDate, SimpleDateFormat sdf) {
323 BufferedWriter os = null;
324 try {
325 os = new BufferedWriter(new FileWriter(filename));
326 os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
327 writeOpenTag(os, 0, "achPayments");
328
329 // totals for summary
330 Map<String, Integer> unitCounts = new HashMap<String, Integer>();
331 Map<String, KualiDecimal> unitTotals = new HashMap<String, KualiDecimal>();
332
333 Iterator iter = paymentGroupService.getByDisbursementTypeStatusCode(PdpConstants.DisbursementTypeCodes.ACH, PdpConstants.PaymentStatusCodes.PENDING_ACH);
334 while (iter.hasNext()) {
335 PaymentGroup paymentGroup = (PaymentGroup) iter.next();
336 if (!testMode) {
337 paymentGroup.setDisbursementDate(new java.sql.Date(processDate.getTime()));
338 paymentGroup.setPaymentStatus(extractedStatus);
339 businessObjectService.save(paymentGroup);
340 }
341
342 writeOpenTagAttribute(os, 2, "ach", "disbursementNbr", paymentGroup.getDisbursementNbr().toString());
343 PaymentProcess paymentProcess = paymentGroup.getProcess();
344 writeTag(os, 4, "processCampus", paymentProcess.getCampusCode());
345 writeTag(os, 4, "processId", paymentProcess.getId().toString());
346
347 writeBank(os, 4, paymentGroup.getBank());
348
349 writeTag(os, 4, "disbursementDate", sdf.format(processDate));
350 writeTag(os, 4, "netAmount", paymentGroup.getNetPaymentAmount().toString());
351
352 writePayeeAch(os, 4, paymentGroup);
353 writeTag(os, 4, "customerUnivNbr", paymentGroup.getCustomerInstitutionNumber());
354 writeTag(os, 4, "paymentDate", sdf.format(paymentGroup.getPaymentDate()));
355
356 // Write customer profile information
357 CustomerProfile cp = paymentGroup.getBatch().getCustomerProfile();
358 writeCustomerProfile(os, 4, cp);
359
360 // Write all payment level information
361 writeOpenTag(os, 4, "payments");
362 List pdList = paymentGroup.getPaymentDetails();
363 for (Iterator iterator = pdList.iterator(); iterator.hasNext();) {
364 PaymentDetail paymentDetail = (PaymentDetail) iterator.next();
365 writeOpenTag(os, 6, "payment");
366
367 // Write detail info
368 writeTag(os, 6, "purchaseOrderNbr", paymentDetail.getPurchaseOrderNbr());
369 writeTag(os, 6, "invoiceNbr", paymentDetail.getInvoiceNbr());
370 writeTag(os, 6, "requisitionNbr", paymentDetail.getRequisitionNbr());
371 writeTag(os, 6, "custPaymentDocNbr", paymentDetail.getCustPaymentDocNbr());
372 writeTag(os, 6, "invoiceDate", sdf.format(paymentDetail.getInvoiceDate()));
373
374 writeTag(os, 6, "origInvoiceAmount", paymentDetail.getOrigInvoiceAmount().toString());
375 writeTag(os, 6, "netPaymentAmount", paymentDetail.getNetPaymentAmount().toString());
376 writeTag(os, 6, "invTotDiscountAmount", paymentDetail.getInvTotDiscountAmount().toString());
377 writeTag(os, 6, "invTotShipAmount", paymentDetail.getInvTotShipAmount().toString());
378 writeTag(os, 6, "invTotOtherDebitAmount", paymentDetail.getInvTotOtherDebitAmount().toString());
379 writeTag(os, 6, "invTotOtherCreditAmount", paymentDetail.getInvTotOtherCreditAmount().toString());
380
381 writeOpenTag(os, 6, "notes");
382 for (Iterator i = paymentDetail.getNotes().iterator(); i.hasNext();) {
383 PaymentNoteText note = (PaymentNoteText) i.next();
384 writeTag(os, 8, "note", escapeString(note.getCustomerNoteText()));
385 }
386 writeCloseTag(os, 6, "notes");
387
388 writeCloseTag(os, 4, "payment");
389
390 String unit = paymentGroup.getBatch().getCustomerProfile().getChartCode() + "-" + paymentGroup.getBatch().getCustomerProfile().getUnitCode() + "-" + paymentGroup.getBatch().getCustomerProfile().getSubUnitCode();
391
392 Integer count = 1;
393 if (unitCounts.containsKey(unit)) {
394 count = 1 + unitCounts.get(unit);
395 }
396 unitCounts.put(unit, count);
397
398 KualiDecimal unitTotal = paymentDetail.getNetPaymentAmount();
399 if (unitTotals.containsKey(unit)) {
400 unitTotal = paymentDetail.getNetPaymentAmount().add(unitTotals.get(unit));
401 }
402 unitTotals.put(unit, unitTotal);
403 }
404
405 writeCloseTag(os, 4, "payments");
406 writeCloseTag(os, 2, "ach");
407 }
408 writeCloseTag(os, 0, "achPayments");
409
410 // send summary email
411 paymentFileEmailService.sendAchSummaryEmail(unitCounts, unitTotals, dateTimeService.getCurrentDate());
412 }
413 catch (IOException ie) {
414 LOG.error("extractAchPayments() Problem reading file: " + filename, ie);
415 throw new IllegalArgumentException("Error writing to output file: " + ie.getMessage());
416 }
417 finally {
418 // Close file
419 if (os != null) {
420 try {
421 os.close();
422 }
423 catch (IOException ie) {
424 // Not much we can do now
425 }
426 }
427 }
428 }
429
430 protected static String SPACES = " ";
431
432 protected void writeTag(BufferedWriter os, int indent, String tag, String data) throws IOException {
433 if (data != null) {
434 os.write(SPACES.substring(0, indent));
435 os.write("<" + tag + ">" + escapeString(data) + "</" + tag + ">\n");
436 }
437 }
438
439 protected void writeOpenTag(BufferedWriter os, int indent, String tag) throws IOException {
440 os.write(SPACES.substring(0, indent));
441 os.write("<" + tag + ">\n");
442 }
443
444 protected void writeOpenTagAttribute(BufferedWriter os, int indent, String tag, String attr, String attrVal) throws IOException {
445 os.write(SPACES.substring(0, indent));
446 os.write("<" + tag + " " + attr + "=\"" + escapeString(attrVal) + "\">\n");
447 }
448
449 protected void writeOpenTagAttribute(BufferedWriter os, int indent, String tag, String attr1, String attr1Val, String attr2, String attr2Val) throws IOException {
450 os.write(SPACES.substring(0, indent));
451 os.write("<" + tag + " " + attr1 + "=\"" + escapeString(attr1Val) + "\" " + attr2 + "=\"" + escapeString(attr2Val) + "\">\n");
452 }
453
454 protected void writeCloseTag(BufferedWriter os, int indent, String tag) throws IOException {
455 os.write(SPACES.substring(0, indent));
456 os.write("</" + tag + ">\n");
457 }
458
459 protected void writeBank(BufferedWriter os, int indent, Bank b) throws IOException {
460 if (b != null) {
461 writeOpenTagAttribute(os, indent, "bank", "code", b.getBankCode());
462 writeTag(os, indent + 2, "accountNumber", b.getBankAccountNumber());
463 writeTag(os, indent + 2, "routingNumber", b.getBankRoutingNumber());
464 writeCloseTag(os, indent, "bank");
465 }
466 }
467
468 protected void writeCustomerProfile(BufferedWriter os, int indent, CustomerProfile cp) throws IOException {
469 writeOpenTag(os, indent, "customerProfile");
470 writeTag(os, indent + 2, "chartCode", cp.getChartCode());
471 writeTag(os, indent + 2, "orgCode", cp.getUnitCode());
472 writeTag(os, indent + 2, "subUnitCode", cp.getSubUnitCode());
473 writeOpenTag(os, indent + 2, "checkHeaderNoteLines");
474 writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine1());
475 writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine2());
476 writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine3());
477 writeTag(os, indent + 4, "note", cp.getCheckHeaderNoteTextLine4());
478 writeCloseTag(os, indent + 2, "checkHeaderNoteLines");
479 writeOpenTag(os, indent + 2, "additionalCheckNoteLines");
480 writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine1());
481 writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine2());
482 writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine3());
483 writeTag(os, indent + 4, "note", cp.getAdditionalCheckNoteTextLine4());
484 writeCloseTag(os, indent + 2, "additionalCheckNoteLines");
485 writeCloseTag(os, indent, "customerProfile");
486 }
487
488 protected void writePayeeAch(BufferedWriter os, int indent, PaymentGroup pg) throws IOException {
489 writePayeeInformation(os, indent, pg, true);
490 }
491
492 protected void writePayee(BufferedWriter os, int indent, PaymentGroup pg) throws IOException {
493 writePayeeInformation(os, indent, pg, false);
494 }
495
496 protected void writePayeeInformation(BufferedWriter os, int indent, PaymentGroup pg, boolean includeAch) throws IOException {
497 os.write(SPACES.substring(0, indent));
498 os.write("<payee id=\"" + pg.getPayeeId() + "\" type=\"" + pg.getPayeeIdTypeCd() + "\">\n");
499 writeTag(os, indent + 2, "payeeName", pg.getPayeeName());
500 writeTag(os, indent + 2, "line1Address", pg.getLine1Address());
501 writeTag(os, indent + 2, "line2Address", pg.getLine2Address());
502 writeTag(os, indent + 2, "line3Address", pg.getLine3Address());
503 writeTag(os, indent + 2, "line4Address", pg.getLine4Address());
504 writeTag(os, indent + 2, "city", pg.getCity());
505 writeTag(os, indent + 2, "state", pg.getState());
506 writeTag(os, indent + 2, "zipCd", pg.getZipCd());
507
508 // get country name for code
509 Country country = countryService.getByPrimaryId(pg.getCountry());
510 if (country != null) {
511 writeTag(os, indent + 2, "country", country.getPostalCountryName());
512 }
513 else {
514 writeTag(os, indent + 2, "country", pg.getCountry());
515 }
516
517 if (includeAch) {
518 writeTag(os, indent + 2, "achBankRoutingNbr", pg.getAchBankRoutingNbr());
519 writeTag(os, indent + 2, "achBankAccountNbr", pg.getAchAccountNumber().getAchBankAccountNbr());
520 writeTag(os, indent + 2, "achAccountType", pg.getAchAccountType());
521 }
522 writeCloseTag(os, indent, "payee");
523 }
524
525 protected String escapeString(String input) {
526 String output = input.replaceAll("\\&", "&");
527 output = output.replaceAll("\"", """);
528 output = output.replaceAll("\\'", "'");
529 output = output.replaceAll("\\<", "<");
530 output = output.replaceAll("\\>", ">");
531 return output;
532 }
533
534 /**
535 * Sets the directoryName attribute value.
536 *
537 * @param directoryName The directoryName to set.
538 */
539 public void setDirectoryName(String directoryName) {
540 this.directoryName = directoryName;
541 }
542
543
544 /**
545 * Sets the dateTimeService attribute value.
546 *
547 * @param dateTimeService The dateTimeService to set.
548 */
549 public void setDateTimeService(DateTimeService dateTimeService) {
550 this.dateTimeService = dateTimeService;
551 }
552
553 /**
554 * Sets the parameterService attribute value.
555 *
556 * @param parameterService The parameterService to set.
557 */
558 public void setParameterService(ParameterService parameterService) {
559 this.parameterService = parameterService;
560 }
561
562 /**
563 * Sets the paymentGroupService attribute value.
564 *
565 * @param paymentGroupService The paymentGroupService to set.
566 */
567 public void setPaymentGroupService(PaymentGroupService paymentGroupService) {
568 this.paymentGroupService = paymentGroupService;
569 }
570
571 /**
572 * Sets the paymentDetailService attribute value.
573 *
574 * @param paymentDetailService The paymentDetailService to set.
575 */
576 public void setPaymentDetailService(PaymentDetailService paymentDetailService) {
577 this.paymentDetailService = paymentDetailService;
578 }
579
580 /**
581 * Sets the paymentGroupHistoryDao attribute value.
582 *
583 * @param paymentGroupHistoryDao The paymentGroupHistoryDao to set.
584 */
585 public void setPaymentGroupHistoryDao(PaymentGroupHistoryDao paymentGroupHistoryDao) {
586 this.paymentGroupHistoryDao = paymentGroupHistoryDao;
587 }
588
589 /**
590 * Sets the processDao attribute value.
591 *
592 * @param processDao The processDao to set.
593 */
594 public void setProcessDao(ProcessDao processDao) {
595 this.processDao = processDao;
596 }
597
598 /**
599 * Sets the paymentFileEmailService attribute value.
600 *
601 * @param paymentFileEmailService The paymentFileEmailService to set.
602 */
603 public void setPaymentFileEmailService(PdpEmailService paymentFileEmailService) {
604 this.paymentFileEmailService = paymentFileEmailService;
605 }
606
607 /**
608 * Sets the business object service
609 *
610 * @param businessObjectService
611 */
612 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
613 this.businessObjectService = businessObjectService;
614 }
615
616 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
617 this.kualiConfigurationService = kualiConfigurationService;
618 }
619
620 /**
621 * Gets the countryService attribute.
622 *
623 * @return Returns the countryService.
624 */
625 protected CountryService getCountryService() {
626 return countryService;
627 }
628
629 /**
630 * Sets the countryService attribute value.
631 *
632 * @param countryService The countryService to set.
633 */
634 public void setCountryService(CountryService countryService) {
635 this.countryService = countryService;
636 }
637
638
639 }