/* * 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/>. */ /* * Created on Mar 9, 2005 * */ package org.kuali.kfs.module.purap.businessobject; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; import org.kuali.kfs.module.purap.service.ElectronicInvoiceMappingService; import org.kuali.kfs.module.purap.util.ElectronicInvoiceUtils; import org.kuali.kfs.module.purap.util.cxml.CxmlHeader; public class ElectronicInvoice { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ElectronicInvoice.class); private static BigDecimal zero = new BigDecimal(0.00); public static String INVOICE_AMOUNT_TYPE_CODE_ITEM = "ITEM"; public static String INVOICE_AMOUNT_TYPE_CODE_TAX = "TAX"; public static String INVOICE_AMOUNT_TYPE_CODE_SPECIAL_HANDLING = "SPHD"; public static String INVOICE_AMOUNT_TYPE_CODE_SHIPPING = "SHIP"; public static String INVOICE_AMOUNT_TYPE_CODE_DISCOUNT = "DISC"; public static String INVOICE_AMOUNT_TYPE_CODE_DEPOSIT = "DPST"; public static String INVOICE_AMOUNT_TYPE_CODE_DUE = "DUE"; public static String INVOICE_AMOUNT_TYPE_CODE_EXMT = "EXMT"; public static boolean FILE_REJECTED = true; public static boolean FILE_NOT_REJECTED = false; public static boolean FILE_DOES_CONTAIN_REJECTS = true; public static boolean FILE_DOES_NOT_CONTAIN_REJECTS = false; private CxmlHeader cxmlHeader; private String customerNumber; private String fileName; private String dunsNumber; private Integer vendorHeaderID = null; private Integer vendorDetailID = null; private String vendorName = null; private boolean fileRejected = FILE_NOT_REJECTED; private boolean containsRejects = FILE_DOES_NOT_CONTAIN_REJECTS; private List fileRejectReasons = new ArrayList(); private ElectronicInvoiceDetailRequestHeader invoiceDetailRequestHeader; private List invoiceDetailOrders = new ArrayList(); private ElectronicInvoiceDetailRequestSummary invoiceDetailRequestSummary; /** * Newly Added */ private String version = "1.2.019"; private String timestamp; private String payloadID; private String locale; private String deploymentMode = "production"; /** * */ public ElectronicInvoice() { super(); } private boolean containsLineLevelAmounts() { return invoiceDetailRequestHeader.isShippingInLine() || invoiceDetailRequestHeader.isSpecialHandlingInLine() || invoiceDetailRequestHeader.isTaxInLine() || invoiceDetailRequestHeader.isDiscountInLine(); } public void addFileRejectReasonToList(ElectronicInvoiceRejectReason reason) { this.fileRejectReasons.add(reason); } /* * ADDRESS METHODS */ public ElectronicInvoicePostalAddress getCxmlPostalAddress(ElectronicInvoiceOrder eio, String roleID, String addressName) { if (this.invoiceDetailRequestHeader.isShippingInLine()) { return eio.getCxmlPostalAddressByRoleID(roleID, addressName); } else { return this.invoiceDetailRequestHeader.getCxmlPostalAddressByRoleID(roleID, addressName); } } public ElectronicInvoiceContact getCxmlContact(ElectronicInvoiceOrder eio, String roleID) { if (this.invoiceDetailRequestHeader.isShippingInLine()) { return eio.getCxmlContactByRoleID(roleID); } else { return this.invoiceDetailRequestHeader.getCxmlContactByRoleID(roleID); } } public String getShippingDateDisplayText(ElectronicInvoiceOrder eio) { Date date = null; String dateString = ""; if (this.invoiceDetailRequestHeader.isShippingInLine()) { date = eio.getInvoiceShippingDate(); dateString = eio.getInvoiceShippingDateString(); } else { date = this.invoiceDetailRequestHeader.getShippingDate(); dateString = this.invoiceDetailRequestHeader.getShippingDateString(); } if (date != null) { return ElectronicInvoiceUtils.getDateDisplayText(date); } else { return dateString; } } public String getMasterAgreementIDInfoDateDisplayText(ElectronicInvoiceOrder eio) { Date date = eio.getMasterAgreementIDInfoDate(); if (date != null) { return ElectronicInvoiceUtils.getDateDisplayText(date); } else { return eio.getMasterAgreementIDInfoDateString(); } } public String getMasterAgreementReferenceDateDisplayText(ElectronicInvoiceOrder eio) { Date date = eio.getMasterAgreementReferenceDate(); if (date != null) { return ElectronicInvoiceUtils.getDateDisplayText(date); } else { return eio.getMasterAgreementReferenceDateString(); } } public String getOrderIDInfoDateDisplayText(ElectronicInvoiceOrder eio) { Date date = eio.getOrderIDInfoDate(); if (date != null) { return ElectronicInvoiceUtils.getDateDisplayText(date); } else { return eio.getOrderIDInfoDateString(); } } public String getInvoiceDateDisplayText() { Date date = this.invoiceDetailRequestHeader.getInvoiceDate(); if (date != null) { return ElectronicInvoiceUtils.getDateDisplayText(date); } else { return this.invoiceDetailRequestHeader.getInvoiceDateString(); } } /* * DESCRIPTION METHODS */ public String getInvoiceShippingDescription(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isShippingInLine()) { return eio.getInvoiceShippingDescription(); } else { return invoiceDetailRequestSummary.getShippingDescription(); } } public String getInvoiceTaxDescription(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isTaxInLine()) { return eio.getInvoiceTaxDescription(); } else { return invoiceDetailRequestSummary.getTaxDescription(); } } public String getInvoiceSpecialHandlingDescription(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isSpecialHandlingInLine()) { return eio.getInvoiceSpecialHandlingDescription(); }else{ return invoiceDetailRequestSummary.getSpecialHandlingAmountDescription(); } } /* * AMOUNT METHODS */ public BigDecimal getFileTotalAmountForInLineItems(String invoiceLineItemType) { BigDecimal total = zero; for (Iterator orderIter = this.invoiceDetailOrders.iterator(); orderIter.hasNext();) { ElectronicInvoiceOrder eio = (ElectronicInvoiceOrder) orderIter.next(); if (INVOICE_AMOUNT_TYPE_CODE_TAX.equalsIgnoreCase(invoiceLineItemType)) { total = total.add(eio.getInvoiceTaxAmount()); } else if (INVOICE_AMOUNT_TYPE_CODE_SPECIAL_HANDLING.equalsIgnoreCase(invoiceLineItemType)) { total = total.add(eio.getInvoiceSpecialHandlingAmount()); } else if (INVOICE_AMOUNT_TYPE_CODE_SHIPPING.equalsIgnoreCase(invoiceLineItemType)) { total = total.add(eio.getInvoiceShippingAmount()); } else if (INVOICE_AMOUNT_TYPE_CODE_DISCOUNT.equalsIgnoreCase(invoiceLineItemType)) { total = total.add(eio.getInvoiceDiscountAmount()); } } return total; } public BigDecimal getInvoiceSubTotalAmount(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { return eio.getInvoiceSubTotalAmount(); } else { return invoiceDetailRequestSummary.getInvoiceSubTotalAmount(); } } public BigDecimal getInvoiceTaxAmount(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isTaxInLine()) { return eio.getInvoiceTaxAmount(); } else { return invoiceDetailRequestSummary.getInvoiceTaxAmount(); } } public BigDecimal getInvoiceSpecialHandlingAmount(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isSpecialHandlingInLine()) { return eio.getInvoiceSpecialHandlingAmount(); } else { return invoiceDetailRequestSummary.getInvoiceSpecialHandlingAmount(); } } public BigDecimal getInvoiceShippingAmount(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isShippingInLine()) { return eio.getInvoiceShippingAmount(); } else { return invoiceDetailRequestSummary.getInvoiceShippingAmount(); } } public BigDecimal getInvoiceGrossAmount(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { return eio.getInvoiceGrossAmount(); } else { return invoiceDetailRequestSummary.getInvoiceGrossAmount(); } } public BigDecimal getInvoiceDiscountAmount(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isDiscountInLine()) { return eio.getInvoiceDiscountAmount(); } else { return invoiceDetailRequestSummary.getInvoiceDiscountAmount(); } } public BigDecimal getInvoiceNetAmount(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { return eio.getInvoiceNetAmount(); } else { return invoiceDetailRequestSummary.getInvoiceNetAmount(); } } public BigDecimal getInvoiceDepositAmount() { return invoiceDetailRequestSummary.getInvoiceDepositAmount(); } public BigDecimal getInvoiceDueAmount() { return invoiceDetailRequestSummary.getInvoiceDueAmount(); } /* * CURRENCY METHODS */ public String getCodeOfLineItemThatContainsInvalidCurrency(String invoiceLineItemType) { for (Iterator orderIter = this.invoiceDetailOrders.iterator(); orderIter.hasNext();) { ElectronicInvoiceOrder eio = (ElectronicInvoiceOrder) orderIter.next(); for (Iterator itemIter = eio.getInvoiceItems().iterator(); itemIter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) itemIter.next(); if (INVOICE_AMOUNT_TYPE_CODE_TAX.equalsIgnoreCase(invoiceLineItemType)) { if (!(this.isCodeValidCurrency(eii.getTaxAmountCurrency()))) { return eii.getTaxAmountCurrency(); } } else if (INVOICE_AMOUNT_TYPE_CODE_SPECIAL_HANDLING.equalsIgnoreCase(invoiceLineItemType)) { if (!(this.isCodeValidCurrency(eii.getInvoiceLineSpecialHandlingAmountCurrency()))) { return eii.getInvoiceLineSpecialHandlingAmountCurrency(); } } else if (INVOICE_AMOUNT_TYPE_CODE_SHIPPING.equalsIgnoreCase(invoiceLineItemType)) { if (!(this.isCodeValidCurrency(eii.getInvoiceLineShippingAmountCurrency()))) { return eii.getInvoiceLineShippingAmountCurrency(); } } else if (INVOICE_AMOUNT_TYPE_CODE_DISCOUNT.equalsIgnoreCase(invoiceLineItemType)) { if (!(this.isCodeValidCurrency(eii.getInvoiceLineDiscountAmountCurrency()))) { return eii.getInvoiceLineDiscountAmountCurrency(); } } } } return null; } /** * This method contains the mapping check for valid Currency Code(s) */ public String checkCodeForValidCurrency(String code) { if (!(this.isCodeValidCurrency(code))) { return code; } else { return null; } } /** * This method contains the mapping check for valid Currency Code(s) */ public boolean isCodeValidCurrency(String code) { if (code != null) { for (int i = 0; i < ElectronicInvoiceMappingService.CXML_VALID_CURRENCY_CODES.length; i++) { String validCode = ElectronicInvoiceMappingService.CXML_VALID_CURRENCY_CODES[i]; if (code.equalsIgnoreCase(validCode)) { return true; } } } return false; } public String getInvoiceSubTotalCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getSubTotalAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getSubTotalAmountCurrency()); } } public String getInvoiceTaxCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isTaxInLine()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getTaxAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getTaxAmountCurrency()); } } public String getInvoiceSpecialHandlingCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isSpecialHandlingInLine()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getInvoiceLineSpecialHandlingAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getSpecialHandlingAmountCurrency()); } } public String getInvoiceShippingCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isShippingInLine()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getInvoiceLineShippingAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getShippingAmountCurrency()); } } public String getInvoiceGrossCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getInvoiceLineGrossAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getGrossAmountCurrency()); } } public String getInvoiceDiscountCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.invoiceDetailRequestHeader.isDiscountInLine()) { for (Iterator iter = eio.getInvoiceItems().iterator(); iter.hasNext();) { ElectronicInvoiceItem eii = (ElectronicInvoiceItem) iter.next(); String currentCode = this.checkCodeForValidCurrency(eii.getInvoiceLineDiscountAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getDiscountAmountCurrency()); } } public String getInvoiceNetCurrencyIfNotValid(ElectronicInvoiceOrder eio) { if (this.containsLineLevelAmounts()) { for (ElectronicInvoiceItem eii : eio.getInvoiceItems()) { String currentCode = this.checkCodeForValidCurrency(eii.getInvoiceLineNetAmountCurrency()); if (currentCode != null) { return currentCode; } } return null; } else { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getNetAmountCurrency()); } } public String getInvoiceDepositCurrencyIfNotValid() { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getDepositAmountCurrency()); } public String getInvoiceDueCurrencyIfNotValid() { return this.checkCodeForValidCurrency(invoiceDetailRequestSummary.getDueAmountCurrency()); } /* * GETTERS AND SETTERS */ /** * @return Returns the containsRejects. */ public boolean isContainsRejects() { return containsRejects; } /** * @param containsRejects The containsRejects to set. */ public void setContainsRejects(boolean containsRejects) { this.containsRejects = containsRejects; } /** * @return Returns the customerNumber. */ public String getCustomerNumber() { return customerNumber; } /** * @param customerNumber The customerNumber to set. */ public void setCustomerNumber(String customerNumber) { this.customerNumber = customerNumber; } /** * @return Returns the cxmlHeader. */ public CxmlHeader getCxmlHeader() { return cxmlHeader; } /** * @param cxmlHeader The cxmlHeader to set. */ public void setCxmlHeader(CxmlHeader cxmlHeader) { this.cxmlHeader = cxmlHeader; } /** * @return Returns the dunsNumber. */ public String getDunsNumber() { return dunsNumber; } /** * @param dunsNumber The dunsNumber to set. */ public void setDunsNumber(String dunsNumber) { this.dunsNumber = dunsNumber; } /** * @return Returns the fileName. */ public String getFileName() { return fileName; } /** * @param fileName The fileName to set. */ public void setFileName(String fileName) { this.fileName = fileName; } /** * @return Returns the fileRejected. */ public boolean isFileRejected() { return fileRejected; } /** * @param fileRejected The fileRejected to set. */ public void setFileRejected(boolean fileRejected) { this.fileRejected = fileRejected; } /** * @return Returns the fileRejectReasons. */ public List<ElectronicInvoiceRejectReason> getFileRejectReasons() { return fileRejectReasons; } /** * @param fileRejectReasons The fileRejectReasons to set. */ public void setFileRejectReasons(List<ElectronicInvoiceRejectReason> fileRejectReasons) { this.fileRejectReasons = fileRejectReasons; } /** * @return Returns the invoiceDetailOrders. */ public List<ElectronicInvoiceOrder> getInvoiceDetailOrders() { return invoiceDetailOrders; } /** * @param invoiceDetailOrders The invoiceDetailOrders to set. */ public void setInvoiceDetailOrders(List<ElectronicInvoiceOrder> invoiceDetailOrders) { this.invoiceDetailOrders = invoiceDetailOrders; } /** * @return Returns the invoiceDetailRequestHeader. */ public ElectronicInvoiceDetailRequestHeader getInvoiceDetailRequestHeader() { return invoiceDetailRequestHeader; } /** * @param invoiceDetailRequestHeader The invoiceDetailRequestHeader to set. */ public void setInvoiceDetailRequestHeader(ElectronicInvoiceDetailRequestHeader invoiceDetailRequestHeader) { this.invoiceDetailRequestHeader = invoiceDetailRequestHeader; } /** * @return Returns the invoiceDetailRequestSummary. */ public ElectronicInvoiceDetailRequestSummary getInvoiceDetailRequestSummary() { return invoiceDetailRequestSummary; } /** * @param invoiceDetailRequestSummary The invoiceDetailRequestSummary to set. */ public void setInvoiceDetailRequestSummary(ElectronicInvoiceDetailRequestSummary invoiceDetailRequestSummary) { this.invoiceDetailRequestSummary = invoiceDetailRequestSummary; } /** * @return Returns the vendorDetailID. */ public Integer getVendorDetailID() { return vendorDetailID; } /** * @param vendorDetailID The vendorDetailID to set. */ public void setVendorDetailID(Integer vendorDetailID) { this.vendorDetailID = vendorDetailID; } /** * @return Returns the vendorHeaderID. */ public Integer getVendorHeaderID() { return vendorHeaderID; } /** * @param vendorHeaderID The vendorHeaderID to set. */ public void setVendorHeaderID(Integer vendorHeaderID) { this.vendorHeaderID = vendorHeaderID; } /** * @return the vendorName */ public String getVendorName() { return vendorName; } /** * @param vendorName the vendorName to set */ public void setVendorName(String vendorName) { this.vendorName = vendorName; } public String getPayloadID() { return payloadID; } public void setPayloadID(String payloadID) { this.payloadID = payloadID; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getLocale() { return locale; } public void setLocale(String locale) { this.locale = locale; } public void addInvoiceDetailOrder(ElectronicInvoiceOrder electronicInvoiceOrder) { invoiceDetailOrders.add(electronicInvoiceOrder); } public ElectronicInvoiceOrder[] getInvoiceDetailOrdersAsArray() { if (invoiceDetailOrders.size() > 0) { ElectronicInvoiceOrder[] tempOrders = new ElectronicInvoiceOrder[invoiceDetailOrders.size()]; invoiceDetailOrders.toArray(tempOrders); return tempOrders; } return null; } public String getDeploymentMode() { return deploymentMode; } public void setDeploymentMode(String deploymentMode) { this.deploymentMode = deploymentMode; } public String toString() { ToStringBuilder toString = new ToStringBuilder(this); toString.append("version", getVersion()); toString.append("timestamp", getTimestamp()); toString.append("payloadID", getPayloadID()); toString.append("locale", getLocale()); toString.append("customerNumber", getCustomerNumber()); toString.append("fileName", getFileName()); toString.append("deploymentMode", getDeploymentMode()); toString.append("dunsNumber", getDunsNumber()); toString.append("vendorHeaderID", getVendorHeaderID()); toString.append("vendorDetailID", getVendorDetailID()); toString.append("vendorName", getVendorName()); toString.append("cxmlHeader", getCxmlHeader()); toString.append("invoiceDetailRequestHeader", getInvoiceDetailRequestHeader()); toString.append("invoiceDetailOrders", getInvoiceDetailOrders()); toString.append("invoiceDetailRequestSummary", getInvoiceDetailRequestSummary()); return toString.toString(); } }