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.module.purap.service.impl;
017
018 import java.math.BigDecimal;
019 import java.sql.Date;
020 import java.text.ParseException;
021 import java.util.ArrayList;
022 import java.util.HashMap;
023 import java.util.List;
024 import java.util.Map;
025
026 import org.apache.commons.lang.ArrayUtils;
027 import org.apache.commons.lang.StringUtils;
028 import org.apache.commons.lang.builder.ToStringBuilder;
029 import org.apache.log4j.Logger;
030 import org.kuali.kfs.module.purap.PurapConstants;
031 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoice;
032 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceItem;
033 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceItemMapping;
034 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceOrder;
035 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoicePostalAddress;
036 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceRejectItem;
037 import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceRejectReason;
038 import org.kuali.kfs.module.purap.businessobject.ItemType;
039 import org.kuali.kfs.module.purap.businessobject.PurApItem;
040 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
041 import org.kuali.kfs.module.purap.document.ElectronicInvoiceRejectDocument;
042 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
043 import org.kuali.kfs.module.purap.util.ElectronicInvoiceUtils;
044 import org.kuali.kfs.sys.context.SpringContext;
045 import org.kuali.rice.kns.service.DateTimeService;
046 import org.kuali.rice.kns.util.GlobalVariables;
047
048 /**
049 * This is a holder class which can be passed to the matching service to validate einvoice or reject doc data
050 * against the po document.
051 *
052 */
053
054 public class ElectronicInvoiceOrderHolder {
055
056 private final static Logger LOG = Logger.getLogger(ElectronicInvoiceOrderHolder.class);
057
058 private ElectronicInvoiceRejectDocument rejectDocument;
059 private ElectronicInvoiceOrder invoiceOrder;
060 private ElectronicInvoice eInvoice;
061 private PurchaseOrderDocument poDocument;
062 private Map<String,ElectronicInvoiceItemMapping> itemTypeMappings;
063 private Map<String,ItemType> kualiItemTypes;
064
065 private Map<String, FieldErrorHelper> errorFieldDetails = new HashMap<String, FieldErrorHelper>();
066
067 private List<ElectronicInvoiceItemHolder> items = new ArrayList<ElectronicInvoiceItemHolder>();
068
069 private boolean isRejected = false;
070 private boolean isRejectDocumentHolder;
071 private boolean validateHeader;
072
073 private String[] summaryRejectCodes = new String[]{PurapConstants.ElectronicInvoice.TAX_SUMMARY_AMT_MISMATCH,
074 PurapConstants.ElectronicInvoice.SHIPPING_SUMMARY_AMT_MISMATCH,
075 PurapConstants.ElectronicInvoice.SPL_HANDLING_SUMMARY_AMT_MISMATCH,
076 PurapConstants.ElectronicInvoice.DISCOUNT_SUMMARY_AMT_MISMATCH};
077
078 public ElectronicInvoiceOrderHolder(ElectronicInvoiceRejectDocument rejectDocument,
079 Map itemTypeMappings,
080 Map itemTypes){
081
082 /**
083 * This class has been designed based on good citizen pattern.
084 */
085 if (rejectDocument == null){
086 throw new NullPointerException("ElectronicInvoiceRejectDocument should not be null");
087 }
088
089 this.rejectDocument = rejectDocument;
090 this.itemTypeMappings = itemTypeMappings;
091 this.poDocument = rejectDocument.getCurrentPurchaseOrderDocument();
092 this.kualiItemTypes = itemTypes;
093
094 isRejectDocumentHolder = true;
095 validateHeader = true;
096
097 for (int i = 0; i < rejectDocument.getInvoiceRejectItems().size(); i++) {
098
099 ElectronicInvoiceRejectItem invoiceRejectItem = rejectDocument.getInvoiceRejectItems().get(i);
100
101 PurApItem poItem = null;
102 if (poDocument != null){
103 try{
104 poItem = poDocument.getItemByLineNumber(invoiceRejectItem.getInvoiceReferenceItemLineNumber());
105 }catch(NullPointerException e){
106 /**
107 * Not needed to handle this invalid item here, this will be handled in the matching process
108 */
109 }
110 }
111
112 items.add(new ElectronicInvoiceItemHolder(invoiceRejectItem,itemTypeMappings,poItem == null ? null : (PurchaseOrderItem)poItem,this));
113 }
114
115 /**
116 * It's needed to retain any reject reasons which are related to summary amount matching
117 * which should not escape from the matching process
118 */
119 retainSummaryRejects(rejectDocument);
120
121 }
122
123 protected void retainSummaryRejects(ElectronicInvoiceRejectDocument rejectDocument){
124
125 if (LOG.isInfoEnabled()){
126 LOG.info("Searching for summary rejects");
127 }
128
129 List<ElectronicInvoiceRejectReason> retainList = new ArrayList<ElectronicInvoiceRejectReason>();
130 List<ElectronicInvoiceRejectReason> rejectReasons = rejectDocument.getInvoiceRejectReasons();
131
132 for (int i = 0; i < rejectReasons.size(); i++) {
133 if (ArrayUtils.contains(summaryRejectCodes,rejectReasons.get(i).getInvoiceRejectReasonTypeCode())){
134 retainList.add(rejectReasons.get(i));
135 if (LOG.isInfoEnabled()){
136 LOG.info("Retaining Reject [Code=" + rejectReasons.get(i).getInvoiceRejectReasonTypeCode() + ",Desc=" + rejectReasons.get(i).getInvoiceRejectReasonDescription());
137 }
138 }
139 }
140
141 if (LOG.isInfoEnabled()){
142 if (retainList.size() == 0){
143 LOG.info("No summary rejects found");
144 }
145 }
146
147 /**
148 * FIXME: Use rejectDocument.getInvoiceRejectReasons().remove(index) instead of creating a new list
149 */
150 rejectDocument.getInvoiceRejectReasons().clear();
151
152 for (int i = 0; i < retainList.size(); i++) {
153 rejectDocument.addRejectReason(retainList.get(i));
154 }
155 }
156
157
158 public ElectronicInvoiceOrderHolder(ElectronicInvoice eInvoice,
159 ElectronicInvoiceOrder invoiceOrder,
160 PurchaseOrderDocument poDocument,
161 Map itemTypeMappings,
162 Map itemTypes,
163 boolean validateHeader){
164
165 if (eInvoice == null){
166 throw new NullPointerException("ElectronicInvoice should not be null");
167 }
168
169 if (invoiceOrder == null){
170 throw new NullPointerException("ElectronicInvoiceOrder should not be null");
171 }
172
173 this.eInvoice = eInvoice;
174 this.invoiceOrder = invoiceOrder;
175 this.itemTypeMappings = itemTypeMappings;
176 this.validateHeader = validateHeader;
177 this.kualiItemTypes = itemTypes;
178
179 this.poDocument = poDocument;
180
181 isRejectDocumentHolder = false;
182
183 for (int i = 0; i < invoiceOrder.getInvoiceItems().size(); i++) {
184
185 ElectronicInvoiceItem orderItem = invoiceOrder.getInvoiceItems().get(i);
186
187 PurApItem poItem = null;
188 if (poDocument != null){
189 try{
190 poItem = poDocument.getItemByLineNumber(orderItem.getReferenceLineNumberInteger());
191 }catch(NullPointerException e){
192 /**
193 * Not needed to handle this invalid item here, this will be handled in the matching process
194 */
195 }
196 }
197
198 items.add(new ElectronicInvoiceItemHolder(orderItem,itemTypeMappings,poItem == null ? null : (PurchaseOrderItem)poItem,this));
199 }
200
201 }
202
203 public String getFileName() {
204 if (isRejectDocumentHolder()){
205 return rejectDocument.getInvoiceFileName();
206 }else{
207 return eInvoice.getFileName();
208 }
209 }
210
211 public String getDunsNumber() {
212 if (isRejectDocumentHolder()){
213 return rejectDocument.getVendorDunsNumber();
214 }else{
215 return eInvoice.getDunsNumber();
216 }
217 }
218
219 public String getCustomerNumber() {
220 if (isRejectDocumentHolder()){
221 return rejectDocument.getInvoiceCustomerNumber();
222 }else{
223 return eInvoice.getCustomerNumber();
224 }
225 }
226
227 public Integer getVendorHeaderId(){
228 if (isRejectDocumentHolder()){
229 return rejectDocument.getVendorHeaderGeneratedIdentifier();
230 }else{
231 return eInvoice.getVendorHeaderID();
232 }
233 }
234
235 public Integer getVendorDetailId(){
236 if (isRejectDocumentHolder()){
237 return rejectDocument.getVendorDetailAssignedIdentifier();
238 }else{
239 return eInvoice.getVendorDetailID();
240 }
241 }
242
243 public String getVendorName(){
244 if (isRejectDocumentHolder()){
245 if (rejectDocument.getVendorDetail() != null){
246 return rejectDocument.getVendorDetail().getVendorName();
247 }else{
248 return StringUtils.EMPTY;
249 }
250 }else{
251 return eInvoice.getVendorName();
252 }
253 }
254
255 public String getInvoiceNumber(){
256 if (isRejectDocumentHolder()){
257 return rejectDocument.getInvoiceFileNumber();
258 }else{
259 return eInvoice.getInvoiceDetailRequestHeader().getInvoiceId();
260 }
261 }
262
263 public Date getInvoiceDate(){
264 if (isRejectDocumentHolder()){
265 return ElectronicInvoiceUtils.getDate(rejectDocument.getInvoiceFileDate());
266 }else{
267 return eInvoice.getInvoiceDetailRequestHeader().getInvoiceDate();
268 }
269 }
270
271 public String getInvoiceDateString(){
272 if (isRejectDocumentHolder()){
273 return rejectDocument.getInvoiceFileDate();
274 }else{
275 return eInvoice.getInvoiceDetailRequestHeader().getInvoiceDateString();
276 }
277 }
278
279
280 public boolean isInformationOnly(){
281 if (isRejectDocumentHolder()){
282 return rejectDocument.isInvoiceFileInformationOnlyIndicator();
283 }else{
284 return eInvoice.getInvoiceDetailRequestHeader().isInformationOnly();
285 }
286 }
287
288 public String getInvoicePurchaseOrderID(){
289 if (isRejectDocumentHolder()){
290 return rejectDocument.getInvoicePurchaseOrderNumber();
291 }else{
292 return invoiceOrder.getOrderReferenceOrderID();
293 }
294 }
295
296 public boolean isTaxInLine(){
297 if (isRejectDocumentHolder()){
298 return rejectDocument.isInvoiceFileTaxInLineIndicator();
299 }else{
300 return eInvoice.getInvoiceDetailRequestHeader().isTaxInLine();
301 }
302 }
303
304 public BigDecimal getTaxAmount(){
305 if (isRejectDocumentHolder()){
306 return rejectDocument.getInvoiceItemTaxAmount();
307 }else{
308 return eInvoice.getInvoiceTaxAmount(invoiceOrder);
309 }
310 }
311
312 public String getTaxDescription(){
313 if (isRejectDocumentHolder()){
314 return rejectDocument.getInvoiceItemTaxDescription();
315 }else{
316 return eInvoice.getInvoiceTaxDescription(invoiceOrder);
317 }
318 }
319 public boolean isSpecialHandlingInLine(){
320 if (isRejectDocumentHolder()){
321 return rejectDocument.isInvoiceFileSpecialHandlingInLineIndicator();
322 }else{
323 return eInvoice.getInvoiceDetailRequestHeader().isSpecialHandlingInLine();
324 }
325 }
326
327 public BigDecimal getInvoiceSpecialHandlingAmount(){
328 if (isRejectDocumentHolder()){
329 return rejectDocument.getInvoiceItemSpecialHandlingAmount();
330 }else{
331 return eInvoice.getInvoiceSpecialHandlingAmount(invoiceOrder);
332 }
333 }
334
335 public String getInvoiceSpecialHandlingDescription(){
336 if (isRejectDocumentHolder()){
337 return rejectDocument.getInvoiceItemSpecialHandlingDescription();
338 }else{
339 return eInvoice.getInvoiceSpecialHandlingDescription(invoiceOrder);
340 }
341 }
342
343 public boolean isShippingInLine(){
344 if (isRejectDocumentHolder()){
345 return rejectDocument.isInvoiceFileShippingInLineIndicator();
346 }else{
347 return eInvoice.getInvoiceDetailRequestHeader().isShippingInLine();
348 }
349 }
350
351 public BigDecimal getInvoiceShippingAmount(){
352 if (isRejectDocumentHolder()){
353 return rejectDocument.getInvoiceItemShippingAmount();
354 }else{
355 return eInvoice.getInvoiceShippingAmount(invoiceOrder);
356 }
357 }
358
359 public String getInvoiceShippingDescription(){
360 if (isRejectDocumentHolder()){
361 return rejectDocument.getInvoiceItemShippingDescription();
362 }else{
363 return eInvoice.getInvoiceShippingDescription(invoiceOrder);
364 }
365 }
366
367 public boolean isDiscountInLine(){
368 if (isRejectDocumentHolder()){
369 return rejectDocument.isInvoiceFileDiscountInLineIndicator();
370 }else{
371 return eInvoice.getInvoiceDetailRequestHeader().isDiscountInLine();
372 }
373 }
374
375 public BigDecimal getInvoiceDiscountAmount(){
376 if (isRejectDocumentHolder()){
377 return rejectDocument.getInvoiceItemDiscountAmount();
378 }else{
379 return eInvoice.getInvoiceDiscountAmount(invoiceOrder);
380 }
381 }
382
383 public BigDecimal getInvoiceDepositAmount() {
384 if (isRejectDocumentHolder()){
385 throw new UnsupportedOperationException("Deposit amount not available for the reject document");
386 }else{
387 return eInvoice.getInvoiceDepositAmount();
388 }
389 }
390
391 public BigDecimal getInvoiceDueAmount() {
392 if (isRejectDocumentHolder()){
393 throw new UnsupportedOperationException("Deposit amount not available for the reject document");
394 }else{
395 return eInvoice.getInvoiceDueAmount();
396 }
397 }
398
399 public PurchaseOrderDocument getPurchaseOrderDocument(){
400 return poDocument;
401 }
402
403 public ElectronicInvoiceItemHolder[] getItems() {
404 if (items != null){
405 ElectronicInvoiceItemHolder[] returnItems = new ElectronicInvoiceItemHolder[items.size()];
406 items.toArray(returnItems);
407 return returnItems;
408 }
409 return null;
410 }
411
412 public ElectronicInvoiceItemHolder getItemByLineNumber(int lineNumber){
413
414 if (items != null){
415 for (int i = 0; i < items.size(); i++) {
416 ElectronicInvoiceItemHolder itemHolder = items.get(i);
417 if (itemHolder.getInvoiceItemLineNumber().intValue() == lineNumber){
418 return itemHolder;
419 }
420 }
421 }
422 return null;
423 }
424
425 public void addInvoiceHeaderRejectReason(ElectronicInvoiceRejectReason rejectReason){
426 addInvoiceHeaderRejectReason(rejectReason,null,null);
427 }
428
429 public void addInvoiceHeaderRejectReason(ElectronicInvoiceRejectReason rejectReason,
430 String fieldName,
431 String applnResourceKey){
432
433 if (LOG.isInfoEnabled()){
434 LOG.info("Adding reject reason - " + rejectReason.getInvoiceRejectReasonDescription());
435 }
436
437 if (isRejectDocumentHolder()){
438 rejectDocument.addRejectReason(rejectReason);
439 if (fieldName != null && applnResourceKey != null){
440 /**
441 * FIXME : Create a helper method to get the fieldname and key name in the resource bundle
442 * for a specific reject reason type code instead of getting it from the
443 * calling method. Matching service should not do these things. It should
444 * not know whether it's doing the matching process for a reject doc or for einvoice. It should
445 * be independent of the incoming data
446 *
447 */
448 GlobalVariables.getMessageMap().putError(fieldName, applnResourceKey);
449 }
450 }else{
451 eInvoice.addFileRejectReasonToList(rejectReason);
452 eInvoice.setFileRejected(true);
453 }
454 }
455
456 public void addInvoiceOrderRejectReason(ElectronicInvoiceRejectReason rejectReason,
457 String fieldName){
458 addInvoiceOrderRejectReason(rejectReason,fieldName,null);
459 }
460
461 public void addInvoiceOrderRejectReason(ElectronicInvoiceRejectReason rejectReason,
462 String fieldName,
463 String applnResourceKey){
464
465 if (LOG.isInfoEnabled()){
466 LOG.info("Adding reject reason - " + rejectReason.getInvoiceRejectReasonDescription());
467 }
468
469 if (isRejectDocumentHolder()){
470 rejectDocument.addRejectReason(rejectReason);
471 if (fieldName != null && applnResourceKey != null){
472 /**
473 * FIXME : Create a helper method to get the fieldname and key name in the resource bundle
474 * for a specific reject reason type code instead of getting it from the
475 * calling method. Matching service should not do these things. It should
476 * not know whether it's doing the matching process for a reject doc or for einvoice. It should
477 * be independent of the incoming data
478 *
479 * Also, needs to analyze the way of handling errors in specific line item
480 */
481 GlobalVariables.getMessageMap().putError(fieldName, applnResourceKey);
482 }
483 }else{
484 invoiceOrder.addRejectReasonToList(rejectReason);
485 eInvoice.setFileRejected(true);
486 }
487 }
488
489 public void addInvoiceOrderRejectReason(ElectronicInvoiceRejectReason rejectReason) {
490 addInvoiceOrderRejectReason(rejectReason,null,null);
491 }
492
493 public boolean isValidateHeaderInformation(){
494 return validateHeader;
495 }
496
497 public boolean isRejectDocumentHolder(){
498 return isRejectDocumentHolder;
499 }
500
501 public ElectronicInvoiceItemMapping getInvoiceItemMapping(String invoiceItemTypeCode){
502 if (itemTypeMappings == null){
503 return null;
504 }else{
505 return itemTypeMappings.get(invoiceItemTypeCode);
506 }
507 }
508
509 /*public boolean isItemTypeAvailableInKuali(String invoiceItemTypeCode) {
510 if (itemTypeMappings == null) {
511 return false;
512 }
513 else {
514 return itemTypeMappings.containsKey(invoiceItemTypeCode);
515 }
516 }*/
517
518 public boolean isItemTypeAvailableInItemMapping(String invoiceItemTypeCode) {
519 if (itemTypeMappings == null) {
520 return false;
521 }
522 else {
523 return itemTypeMappings.containsKey(invoiceItemTypeCode);
524 }
525 }
526
527
528 public boolean isInvoiceRejected() {
529 if (isRejectDocumentHolder()) {
530 return rejectDocument.getInvoiceRejectReasons() != null && rejectDocument.getInvoiceRejectReasons().size() > 0;
531 }
532 else {
533 return eInvoice.isFileRejected();
534 }
535 }
536
537
538 public String getKualiItemTypeCodeFromMappings(String invoiceItemTypeCode) {
539
540 ElectronicInvoiceItemMapping itemMapping = getInvoiceItemMapping(invoiceItemTypeCode);
541
542 if (itemMapping != null) {
543 return itemMapping.getItemTypeCode();
544 } else {
545 return null;
546 }
547 }
548
549 /* public String getKualiItemTypeCode(String invoiceItemTypeCode) {
550
551 ItemType itemType = kualiItemTypes.get(invoiceItemTypeCode);
552
553 if (itemType != null) {
554 return itemType.getItemTypeCode();
555 }
556 else {
557 return null;
558 }
559 }*/
560
561 /* public boolean isKualiItemTypeExistsInVendorItemTypeMappings(String kualiItemType){
562 ElectronicInvoiceItemMapping[] mappings = getInvoiceItemTypeMappings();
563 if (mappings != null){
564 for (int i = 0; i < mappings.length; i++) {
565 if (StringUtils.equals(kualiItemType,mappings[i].getItemTypeCode())){
566 return true;
567 }
568 }
569 }
570
571 return false;
572 }*/
573
574 public ElectronicInvoiceItemMapping[] getInvoiceItemTypeMappings(){
575 if (itemTypeMappings != null){
576 ElectronicInvoiceItemMapping[] itemMappings = new ElectronicInvoiceItemMapping[itemTypeMappings.size()];
577 itemTypeMappings.values().toArray(itemMappings);
578 return itemMappings;
579 }else{
580 return null;
581 }
582 }
583
584 public boolean isInvoiceNumberAcceptIndicatorEnabled(){
585 if (isRejectDocumentHolder()) {
586 return rejectDocument.isInvoiceNumberAcceptIndicator();
587 }else {
588 return false;
589 }
590 }
591
592 public ElectronicInvoice getElectronicInvoice(){
593 if (isRejectDocumentHolder()){
594 throw new UnsupportedOperationException("ElectronicInvoice object not available for ElectronicInvoiceRejectDocument");
595 }else{
596 return eInvoice;
597 }
598 }
599
600 public BigDecimal getInvoiceNetAmount(){
601 if (isRejectDocumentHolder()){
602 return rejectDocument.getInvoiceItemNetAmount();
603 }else{
604 return eInvoice.getInvoiceNetAmount(invoiceOrder);
605 }
606 }
607
608 public Date getInvoiceProcessedDate(){
609 DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class);
610 if (isRejectDocumentHolder()){
611 try {
612 return dateTimeService.convertToSqlDate(rejectDocument.getInvoiceProcessTimestamp());
613 }
614 catch (ParseException e) {
615 throw new RuntimeException("ParseException thrown when trying to convert a Timestamp to SqlDate.", e);
616 }
617 }else{
618 return dateTimeService.getCurrentSqlDate();
619 }
620 }
621
622 public String getInvoiceShipToAddressAsString() {
623
624 StringBuffer noteBuffer = new StringBuffer();
625 noteBuffer.append("Shipping Address from Electronic Invoice:\n\n");
626
627 if (!isRejectDocumentHolder()) {
628
629 ElectronicInvoicePostalAddress shipToAddress = eInvoice.getCxmlPostalAddress(invoiceOrder, PurapConstants.ElectronicInvoice.CXML_ADDRESS_SHIP_TO_ROLE_ID, PurapConstants.ElectronicInvoice.CXML_ADDRESS_SHIP_TO_NAME);
630 if (shipToAddress != null) {
631
632 if (StringUtils.isNotEmpty(shipToAddress.getName())) {
633 noteBuffer.append(shipToAddress.getName() + "\n");
634 }
635
636 noteBuffer.append(shipToAddress.getLine1() + "\n");
637
638 if (StringUtils.isNotEmpty(shipToAddress.getLine2())) {
639 noteBuffer.append(shipToAddress.getLine2() + "\n");
640 }
641
642 if (StringUtils.isNotEmpty(shipToAddress.getLine3())) {
643 noteBuffer.append(shipToAddress.getLine3() + "\n");
644 }
645
646 noteBuffer.append(shipToAddress.getCityName() + ", " + shipToAddress.getStateCode() + " " + shipToAddress.getPostalCode() + "\n");
647 noteBuffer.append(shipToAddress.getCountryName());
648 }
649
650 } else {
651
652 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceShipToAddressName())) {
653 noteBuffer.append(rejectDocument.getInvoiceShipToAddressName() + "\n");
654 }
655
656 noteBuffer.append(rejectDocument.getInvoiceShipToAddressLine1() + "\n");
657
658 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceShipToAddressLine2())) {
659 noteBuffer.append(rejectDocument.getInvoiceShipToAddressLine2() + "\n");
660 }
661
662 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceShipToAddressLine3())) {
663 noteBuffer.append(rejectDocument.getInvoiceShipToAddressLine3() + "\n");
664 }
665
666 noteBuffer.append(rejectDocument.getInvoiceShipToAddressCityName() + ", " + rejectDocument.getInvoiceShipToAddressStateCode() + " " + rejectDocument.getInvoiceShipToAddressPostalCode() + "\n");
667 noteBuffer.append(rejectDocument.getInvoiceShipToAddressCountryName());
668
669 }
670 return noteBuffer.toString();
671 }
672
673 public String getInvoiceBillToAddressAsString(){
674
675 StringBuffer noteBuffer = new StringBuffer();
676 noteBuffer.append("Billing Address from Electronic Invoice:\n\n");
677
678 if (!isRejectDocumentHolder()){
679
680 ElectronicInvoicePostalAddress billToAddress = eInvoice.getCxmlPostalAddress(invoiceOrder,
681 PurapConstants.ElectronicInvoice.CXML_ADDRESS_BILL_TO_ROLE_ID,
682 PurapConstants.ElectronicInvoice.CXML_ADDRESS_BILL_TO_NAME);
683
684 if (billToAddress != null) {
685
686 if (StringUtils.isNotEmpty(billToAddress.getName())) {
687 noteBuffer.append(billToAddress.getName() + "\n");
688 }
689
690 noteBuffer.append(billToAddress.getLine1() + "\n");
691
692 if (StringUtils.isNotEmpty(billToAddress.getLine2())) {
693 noteBuffer.append(billToAddress.getLine2() + "\n");
694 }
695
696 if (StringUtils.isNotEmpty(billToAddress.getLine3())) {
697 noteBuffer.append(billToAddress.getLine3() + "\n");
698 }
699
700 noteBuffer.append(billToAddress.getCityName() + ", " + billToAddress.getStateCode() + " " + billToAddress.getPostalCode() + "\n");
701 noteBuffer.append(billToAddress.getCountryName());
702 }
703 }else{
704
705 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceBillToAddressName())) {
706 noteBuffer.append(rejectDocument.getInvoiceBillToAddressName() + "\n");
707 }
708
709 noteBuffer.append(rejectDocument.getInvoiceBillToAddressLine1() + "\n");
710
711 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceBillToAddressLine2())){
712 noteBuffer.append(rejectDocument.getInvoiceBillToAddressLine2() + "\n");
713 }
714
715 if (StringUtils.isNotEmpty(rejectDocument.getInvoiceBillToAddressLine3())){
716 noteBuffer.append(rejectDocument.getInvoiceBillToAddressLine3() + "\n");
717 }
718
719 noteBuffer.append(rejectDocument.getInvoiceBillToAddressCityName() + ", " + rejectDocument.getInvoiceBillToAddressStateCode() + " " + rejectDocument.getInvoiceBillToAddressPostalCode() + "\n");
720 noteBuffer.append(rejectDocument.getInvoiceBillToAddressCountryName());
721 }
722
723 return noteBuffer.toString();
724 }
725
726 public Integer getAccountsPayablePurchasingDocumentLinkIdentifier(){
727 if (isRejectDocumentHolder()){
728 return rejectDocument.getAccountsPayablePurchasingDocumentLinkIdentifier();
729 }else{
730 if (poDocument != null){
731 return poDocument.getAccountsPayablePurchasingDocumentLinkIdentifier();
732 }else{
733 return null;
734 }
735 }
736 }
737
738 protected class FieldErrorHelper {
739
740 private String fieldName;
741 private String applicationResourceKeyName;
742 private String rejectReasonTypeCode;
743
744 FieldErrorHelper(String fieldName,
745 String applicationResourceKeyName,
746 String rejectReasonTypeCode){
747
748 if (StringUtils.isEmpty(fieldName) ||
749 StringUtils.isEmpty(applicationResourceKeyName) ||
750 StringUtils.isEmpty(rejectReasonTypeCode)){
751 throw new NullPointerException("Invalid field Values [fieldName=" + fieldName + ",applicationResourceKeyName=" + applicationResourceKeyName + ",rejectReasonTypeCode=" + rejectReasonTypeCode + "]");
752 }
753
754 this.fieldName = fieldName;
755 this.applicationResourceKeyName = applicationResourceKeyName;
756 this.rejectReasonTypeCode = rejectReasonTypeCode;
757 }
758
759 public String getApplicationResourceKeyName() {
760 return applicationResourceKeyName;
761 }
762 public void setApplicationResourceKeyName(String applicationResourceKeyName) {
763 this.applicationResourceKeyName = applicationResourceKeyName;
764 }
765 public String getFieldName() {
766 return fieldName;
767 }
768 public void setFieldName(String fieldName) {
769 this.fieldName = fieldName;
770 }
771 public String getRejectReasonTypeCode() {
772 return rejectReasonTypeCode;
773 }
774 public void setRejectReasonTypeCode(String rejectReasonTypeCode) {
775 this.rejectReasonTypeCode = rejectReasonTypeCode;
776 }
777
778 public String toString(){
779 ToStringBuilder toString = new ToStringBuilder(this);
780 toString.append("fieldName",fieldName);
781 toString.append("applicationResourceKeyName",applicationResourceKeyName);
782 toString.append("rejectReasonTypeCode",rejectReasonTypeCode);
783 return toString.toString();
784 }
785
786 }
787
788
789 }