/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.purap.util; import static org.kuali.kfs.sys.fixture.UserNameFixture.parke; import java.io.BufferedInputStream; import java.io.File; import java.sql.Date; import org.apache.commons.io.IOUtils; import org.kuali.kfs.module.purap.batch.ElectronicInvoiceInputFileType; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoice; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceContact; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceDetailRequestHeader; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceDetailRequestSummary; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceItem; import org.kuali.kfs.module.purap.businessobject.ElectronicInvoiceOrder; import org.kuali.kfs.module.purap.fixture.ElectronicInvoiceParserFixture; import org.kuali.kfs.module.purap.service.ElectronicInvoiceMappingService; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.batch.service.BatchInputFileService; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.SpringContext; @ConfigureContext(session = parke, shouldCommitTransactions=false) public class ElectronicInvoiceParserTest extends KualiTestBase { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ElectronicInvoiceParserTest.class); private ElectronicInvoice eInvoice; private final String eInvoiceXMLFile = ".." + File.separator + "fixture" + File.separator + "electronicInvoiceFixture.xml"; /** * TODO: Remove once other tests are fixed */ public void testNothing() { } /** * TODO: Fix this test. It should not have a hard-coded URL for finding the schema. */ public void PATCHFIX_testEInvoiceXMLParsing() throws Exception{ loadInvoiceXML(); assertNotNull(eInvoice); validateCXMLAttributes(); validateHeaderElement(); validateInvoiceDetailRequestElement(); } private void validateInvoiceDetailRequestElement(){ validateInvoiceDetailRequestHeader(); validateInvoiceDetailOrder(); validateInvoiceDetailSummary(); } private void loadInvoiceXML() throws Exception { ElectronicInvoiceInputFileType eInvoiceInputFileType = SpringContext.getBean(ElectronicInvoiceInputFileType.class); BatchInputFileService batchInputFileService = SpringContext.getBean(BatchInputFileService.class); BufferedInputStream fileStream = new BufferedInputStream(getClass().getResourceAsStream(eInvoiceXMLFile)); byte[] fileByteContent = IOUtils.toByteArray(fileStream); //If we use the schemaLocation with DEV url and not running Tomcat locally, this test is going to fail, because //it won't be able to find the electronicInvoice.xsd unless Tomcat is running locally. //Therefore, for unit test purpose, let's set the schemaLocation to CNV url. String schemaLocation = eInvoiceInputFileType.getSchemaLocation(); int beginIndex = schemaLocation.indexOf("static"); String newSchemaLocation = "https://test.kuali.org/kfs-reg/" + schemaLocation.substring(beginIndex); eInvoiceInputFileType.setSchemaLocation(newSchemaLocation); eInvoice = (ElectronicInvoice) batchInputFileService.parse(eInvoiceInputFileType, fileByteContent); } private void validateCXMLAttributes(){ assertEquals(ElectronicInvoiceParserFixture.payloadID, eInvoice.getPayloadID()); assertEquals(ElectronicInvoiceParserFixture.timestamp, eInvoice.getTimestamp()); assertEquals(ElectronicInvoiceParserFixture.version, eInvoice.getVersion()); assertEquals(ElectronicInvoiceParserFixture.locale, eInvoice.getLocale()); assertEquals(ElectronicInvoiceParserFixture.deploymentMode, eInvoice.getDeploymentMode()); } private void validateHeaderElement(){ assertEquals(ElectronicInvoiceParserFixture.fromDomain,eInvoice.getCxmlHeader().getFromDomain()); assertEquals(ElectronicInvoiceParserFixture.fromIdentity,eInvoice.getCxmlHeader().getFromIdentity()); assertEquals(ElectronicInvoiceParserFixture.toDomain,eInvoice.getCxmlHeader().getToDomain()); assertEquals(ElectronicInvoiceParserFixture.toIdentity,eInvoice.getCxmlHeader().getToIdentity()); assertEquals(ElectronicInvoiceParserFixture.senderDomain,eInvoice.getCxmlHeader().getSenderDomain()); assertEquals(ElectronicInvoiceParserFixture.senderIdentity,eInvoice.getCxmlHeader().getSenderIdentity()); assertEquals(ElectronicInvoiceParserFixture.senderSharedSecret,eInvoice.getCxmlHeader().getSenderSharedSecret()); assertEquals(ElectronicInvoiceParserFixture.senderUserAgent,eInvoice.getCxmlHeader().getSenderUserAgent()); } private void validateInvoiceDetailRequestHeader(){ String invoiceDate = eInvoice.getInvoiceDetailRequestHeader().getInvoiceDateString(); Date date = ElectronicInvoiceUtils.getDate(invoiceDate); assertEquals(ElectronicInvoiceParserFixture.invoiceDate,invoiceDate); assertEquals(date.toString(),eInvoice.getInvoiceDetailRequestHeader().getInvoiceDate().toString()); assertEquals(ElectronicInvoiceParserFixture.invoiceID,eInvoice.getInvoiceDetailRequestHeader().getInvoiceId()); assertEquals(ElectronicInvoiceParserFixture.operation,eInvoice.getInvoiceDetailRequestHeader().getOperation()); assertEquals(ElectronicInvoiceParserFixture.purpose,eInvoice.getInvoiceDetailRequestHeader().getPurpose()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isInformationOnly()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isHeaderInvoiceIndicator()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isTaxInLine()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isSpecialHandlingInLine()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isShippingInLine()); assertTrue(eInvoice.getInvoiceDetailRequestHeader().isDiscountInLine()); validateInvoicePartners(); validateShippingDetail(); validatePaymentTermElement(); } private void validateInvoicePartners(){ validateBillToContact(); validateRemitToContact(); } private void validateBillToContact(){ ElectronicInvoiceDetailRequestHeader requestHeader = eInvoice.getInvoiceDetailRequestHeader(); ElectronicInvoiceContact contact = requestHeader.getCxmlContactByRoleID(ElectronicInvoiceMappingService.CXML_ADDRESS_BILL_TO_ROLE_ID); assertNotNull(contact); assertEquals(ElectronicInvoiceParserFixture.BillToContact.addressId,contact.getAddressID()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.role,contact.getRole()); assertEquals(1,contact.getPostalAddresses().size()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.street1,contact.getPostalAddresses().get(0).getLine1()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.street2,contact.getPostalAddresses().get(0).getLine2()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.street3,contact.getPostalAddresses().get(0).getLine3()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.city,contact.getPostalAddresses().get(0).getCityName()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.state,contact.getPostalAddresses().get(0).getStateCode()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.country,contact.getPostalAddresses().get(0).getCountryName()); assertEquals(ElectronicInvoiceParserFixture.BillToContact.countryCode,contact.getPostalAddresses().get(0).getCountryCode()); } private void validateRemitToContact(){ ElectronicInvoiceDetailRequestHeader requestHeader = eInvoice.getInvoiceDetailRequestHeader(); ElectronicInvoiceContact contact = requestHeader.getCxmlContactByRoleID(ElectronicInvoiceMappingService.CXML_ADDRESS_REMIT_TO_ROLE_ID); assertNotNull(contact); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.addressId,contact.getAddressID()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.role,contact.getRole()); assertEquals(1,contact.getPostalAddresses().size()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.street1,contact.getPostalAddresses().get(0).getLine1()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.street2,contact.getPostalAddresses().get(0).getLine2()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.street3,contact.getPostalAddresses().get(0).getLine3()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.city,contact.getPostalAddresses().get(0).getCityName()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.state,contact.getPostalAddresses().get(0).getStateCode()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.country,contact.getPostalAddresses().get(0).getCountryName()); assertEquals(ElectronicInvoiceParserFixture.RemitToContact.countryCode,contact.getPostalAddresses().get(0).getCountryCode()); } private void validateShippingDetail(){ ElectronicInvoiceDetailRequestHeader requestHeader = eInvoice.getInvoiceDetailRequestHeader(); assertEquals(ElectronicInvoiceParserFixture.shippingDate,requestHeader.getShippingDateString()); ElectronicInvoiceContact contact = requestHeader.getCxmlContactByRoleID(ElectronicInvoiceMappingService.CXML_ADDRESS_SHIP_TO_ROLE_ID); assertNotNull(contact); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.addressId,contact.getAddressID()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.role,contact.getRole()); assertEquals(1,contact.getPostalAddresses().size()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.street1,contact.getPostalAddresses().get(0).getLine1()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.street2,contact.getPostalAddresses().get(0).getLine2()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.street3,contact.getPostalAddresses().get(0).getLine3()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.city,contact.getPostalAddresses().get(0).getCityName()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.state,contact.getPostalAddresses().get(0).getStateCode()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.country,contact.getPostalAddresses().get(0).getCountryName()); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.countryCode,contact.getPostalAddresses().get(0).getCountryCode()); String emailName1 = contact.getEmailAddresses().get(ElectronicInvoiceParserFixture.ShipToContact.emailName1); String emailName2 = contact.getEmailAddresses().get(ElectronicInvoiceParserFixture.ShipToContact.emailName2); assertNotNull(emailName1); assertNotNull(emailName2); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.emailValue1,emailName1); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.emailValue2,emailName2); String phoneNumber = contact.getPhoneNumbers().get(ElectronicInvoiceParserFixture.ShipToContact.phoneName); assertNotNull(phoneNumber); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.phoneNumber,phoneNumber); String faxNumber = contact.getPhoneNumbers().get(ElectronicInvoiceParserFixture.ShipToContact.faxName); assertNotNull(faxNumber); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.faxNumber,faxNumber); String url = contact.getWebAddresses().get(0); assertNotNull(url); assertEquals(ElectronicInvoiceParserFixture.ShipToContact.url,url); } private void validatePaymentTermElement(){ assertEquals(ElectronicInvoiceParserFixture.payInNumberOfDays,eInvoice.getInvoiceDetailRequestHeader().getPayInNumberOfDays()); assertEquals(ElectronicInvoiceParserFixture.percentageRate,eInvoice.getInvoiceDetailRequestHeader().getPercentageRate()); } private void validateInvoiceDetailOrder(){ assertEquals(1,eInvoice.getInvoiceDetailOrders().size()); ElectronicInvoiceOrder order = eInvoice.getInvoiceDetailOrders().get(0); assertEquals(ElectronicInvoiceParserFixture.orderDate,order.getOrderReferenceOrderDateString()); assertEquals(ElectronicInvoiceParserFixture.orderID,order.getOrderReferenceOrderID()); assertEquals(ElectronicInvoiceParserFixture.documentRefPayloadID,order.getOrderReferenceDocumentRefPayloadID()); /** * Validate item */ assertEquals(1,order.getInvoiceItems().size()); ElectronicInvoiceItem item = order.getInvoiceItems().get(0); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.invoiceLineNumber, item.getInvoiceLineNumber()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.quantity, item.getQuantity()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.uom, item.getUnitOfMeasure()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.unitPrice, item.getUnitPrice()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.itemReferenceLineNumber, item.getReferenceLineNumber()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.SupplierPartID, item.getReferenceItemIDSupplierPartID()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.itemDescription, item.getReferenceDescription()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.lineSubTotalAmt, item.getInvoiceLineSubTotalAmountBigDecimal().doubleValue()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.lineTaxAmt, item.getInvoiceLineTaxAmountBigDecimal().doubleValue()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.lineTaxDesc, item.getTaxDescription()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.lineShippingAmt, item.getInvoiceLineShippingAmountBigDecimal().doubleValue()); assertEquals(ElectronicInvoiceParserFixture.InvoiceItem.lineSpecialHandlingAmt, item.getInvoiceLineSpecialHandlingAmountBigDecimal().doubleValue()); } private void validateInvoiceDetailSummary(){ ElectronicInvoiceDetailRequestSummary summary = eInvoice.getInvoiceDetailRequestSummary(); assertNotNull(summary); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.subTotalAmt, summary.getSubTotalAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.taxAmount, summary.getTaxAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.taxDescription, summary.getTaxDescription()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.splHandlingAmt, summary.getSpecialHandlingAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.shippingAmt, summary.getShippingAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.discountAmt, summary.getDiscountAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.grossAmt, summary.getGrossAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.netAmt, summary.getNetAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.depositAmt, summary.getDepositAmount()); assertEquals(ElectronicInvoiceParserFixture.SummaryDetail.dueAmt, summary.getDueAmount()); } }