From 80a9a74c5c313b926835f5caa867c20abc143647 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Sat, 22 Jun 2019 19:30:56 +0200 Subject: [PATCH 01/48] Remove byte order marks, which cause tests to fail with Java 1.8 --- src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java | 2 +- .../ZUGFeRD/MustangReaderWriterCustomXMLTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 9b24ef11..35ce8717 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -369,7 +369,7 @@ public class ZUGFeRDImporter { static String convertStreamToString(java.io.InputStream is) { // source https://stackoverflow.com/questions/309424/how-do-i-read-convert-an-inputstream-into-a-string-in-java referring to // https://community.oracle.com/blogs/pat/2004/10/23/stupid-scanner-tricks - Scanner s = new Scanner(is).useDelimiter("\\A"); + Scanner s = new Scanner(is, "UTF-8").useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java index 07b03609..b52d8d97 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java @@ -62,7 +62,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { final byte[] UTF8ByteOrderMark = new byte[]{(byte) 0xef, (byte) 0xbb, (byte) 0xbf}; /* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. */ - String ownZUGFeRDXML = new String(UTF8ByteOrderMark) + "\n" + + String ownZUGFeRDXML = "\n" + "\n" + " \n" + " false\n" + From e8e7c4b623caa1316746bbaa3770d7cc1cfcdf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Tue, 25 Jun 2019 20:10:10 +0200 Subject: [PATCH 02/48] test nom in export so that it is also tested in import --- .../ZUGFeRD/MustangReaderWriterCustomXMLTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java index b52d8d97..42277aba 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java @@ -61,8 +61,10 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { .load(SOURCE_PDF); final byte[] UTF8ByteOrderMark = new byte[]{(byte) 0xef, (byte) 0xbb, (byte) 0xbf}; - /* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. */ - String ownZUGFeRDXML = "\n" + + /* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. + * test the export with bom (which is valid) because this will also test the import (which also needs to work and needs to be tested) + * */ + String ownZUGFeRDXML = new String(UTF8ByteOrderMark) + "\n" + "\n" + " \n" + " false\n" + From 86027e9462825fcfae54f90e7595d400b94b67f0 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 1 Jul 2019 18:55:39 +0200 Subject: [PATCH 03/48] Remove hardcoded prefix "Ursprungsbeleg: " from reference info --- .../ZUGFeRD/ZUGFeRDTransactionModelConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 11b8b45c..cf01b3c1 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -167,7 +167,7 @@ class ZUGFeRDTransactionModelConverter { if (trans.getReferenceNumber() != null && !"".equals(trans.getReferenceNumber())) { NoteType referenceInfo = xmlFactory.createNoteType(); TextType referenceInfoContent = xmlFactory.createTextType(); - referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber()); + referenceInfoContent.setValue(trans.getReferenceNumber()); referenceInfo.getContent().add(referenceInfoContent); document.getIncludedNote().add(referenceInfo); } From 00af1dcf0807e7fc4200e0c43f727e781ef69ff0 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Wed, 3 Jul 2019 14:03:23 +0200 Subject: [PATCH 04/48] deprecate misleading documentCode in favour of categoryCode --- .../org/mustangproject/ZUGFeRD/VATAmount.java | 32 +++++++++++++++---- .../ZUGFeRDTransactionModelConverter.java | 12 ++++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java index 408ea69f..817595f6 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java @@ -31,16 +31,16 @@ import java.math.BigDecimal; */ public class VATAmount { - public VATAmount(BigDecimal basis, BigDecimal calculated, String documentCode) { + public VATAmount(BigDecimal basis, BigDecimal calculated, String categoryCode) { super(); this.basis = basis; this.calculated = calculated; - this.documentCode = documentCode; + this.categoryCode = categoryCode; } BigDecimal basis, calculated; - String documentCode; + String categoryCode; public BigDecimal getBasis() { return basis; @@ -58,20 +58,38 @@ public class VATAmount { this.calculated = calculated; } + /** + * + * @deprecated Use {@link #getCategoryCode() instead} + */ + @Deprecated public String getDocumentCode() { - return documentCode; + return categoryCode; } + /** + * + * @deprecated Use {@link #setCategoryCode(String)} instead + */ + @Deprecated public void setDocumentCode(String documentCode) { - this.documentCode = documentCode; + this.categoryCode = documentCode; + } + + public String getCategoryCode() { + return categoryCode; + } + + public void setCategoryCode(String categoryCode) { + this.categoryCode = categoryCode; } public VATAmount add(VATAmount v) { - return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.documentCode); + return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.categoryCode); } public VATAmount subtract(VATAmount v) { - return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.documentCode); + return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.categoryCode); } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index cf01b3c1..206b5a2e 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -422,7 +422,7 @@ class ZUGFeRDTransactionModelConverter { TaxCategoryCodeType taxCategoryCode = xmlFactory.createTaxCategoryCodeType(); VATAmount vatAmount = VATPercentAmountMap.get(currentTaxPercent); - taxCategoryCode.setValue(vatAmount.getDocumentCode()); + taxCategoryCode.setValue(vatAmount.getCategoryCode()); tradeTax.setCategoryCode(taxCategoryCode); VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); @@ -924,7 +924,7 @@ class ZUGFeRDTransactionModelConverter { for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { BigDecimal percent = currentItem.getProduct().getVATPercent(); LineCalc lc = new LineCalc(currentItem); - VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), trans.getDocumentCode()); + VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), lc.getCategoryCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -958,7 +958,7 @@ class ZUGFeRDTransactionModelConverter { VATAmount itemVATAmount = new VATAmount( logisticsServiceCharge.getTotalAmount(), logisticsServiceCharge.getTotalAmount() - .multiply(percent).divide(new BigDecimal(100)), trans.getDocumentCode()); + .multiply(percent).divide(new BigDecimal(100)), logisticsServiceCharge.getCategoryCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -973,7 +973,7 @@ class ZUGFeRDTransactionModelConverter { BigDecimal percent = charge.getTaxPercent(); VATAmount itemVATAmount = new VATAmount( charge.getTotalAmount(), charge.getTotalAmount() - .multiply(percent).divide(new BigDecimal(100)), trans.getDocumentCode()); + .multiply(percent).divide(new BigDecimal(100)), charge.getCategoryCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -998,6 +998,7 @@ class ZUGFeRDTransactionModelConverter { private BigDecimal itemTotalNetAmount; private BigDecimal itemTotalVATAmount; private BigDecimal itemNetAmount; + private String categoryCode; public LineCalc(IZUGFeRDExportableItem currentItem) { @@ -1040,6 +1041,7 @@ class ZUGFeRDTransactionModelConverter { .add(totalCharge) .divide(currentItem.getQuantity(), 4, BigDecimal.ROUND_HALF_UP); + categoryCode = currentItem.getCategoryCode(); } @@ -1057,6 +1059,8 @@ class ZUGFeRDTransactionModelConverter { return itemNetAmount; } + public String getCategoryCode() { return categoryCode; } + } private class Totals { From 5ace39936534e311dc279e3ec279e55a2ac1b126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 13:42:24 +0200 Subject: [PATCH 05/48] no message --- History.md | 3 + pom.xml | 4 +- .../ZUGFeRD/ZUGFeRDImporter.java | 14 +- .../ZUGFeRD/ZUGFeRDVisualizer.java | 134 + .../org/mustangproject/toecount/Toecount.java | 51 +- .../stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt | 3008 +++++++++++++++++ src/main/resources/stylesheets/cii-xr.xsl | 2202 ++++++++++++ .../resources/stylesheets/xrechnung-html.xsl | 1188 +++++++ ...ccountingBeispielRE-20190610_507blanko.pdf | Bin 0 -> 87968 bytes 9 files changed, 6596 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java create mode 100644 src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt create mode 100644 src/main/resources/stylesheets/cii-xr.xsl create mode 100644 src/main/resources/stylesheets/xrechnung-html.xsl create mode 100644 src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf diff --git a/History.md b/History.md index 615a200c..f24355a2 100644 --- a/History.md +++ b/History.md @@ -5,6 +5,9 @@ Support BuyerReference (r+w), as well as SpecifiedLegalOrganization (w) and DefinedTradeContact (w) use dom4j to format output xml document corrected some exception logging glitches +upgrade PDFBox to 2.0.15+ +extraction to use proper filename instead of alias #98 +NullPointerException in ZUGFeRDImporter.extractLowLevel #96 1.7.1 diff --git a/pom.xml b/pom.xml index e8b226d1..67a0bb2a 100644 --- a/pom.xml +++ b/pom.xml @@ -69,12 +69,12 @@ org.apache.pdfbox preflight - 2.0.12 + [2.0.15,) org.apache.pdfbox pdfbox - 2.0.12 + [2.0.15,) org.dom4j diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 35ce8717..c9004873 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -46,6 +46,9 @@ import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -67,14 +70,13 @@ public class ZUGFeRDImporter { private String xmpString = null; // XMP metadata public ZUGFeRDImporter(String pdfFilename) { - try { - BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFilename)); + + try (InputStream bis = Files.newInputStream(Paths.get(pdfFilename), StandardOpenOption.READ)) { extractLowLevel(bis); - bis.close(); } catch (IOException e) { Logger.getLogger(ZUGFeRDImporter.class.getName()).log(Level.SEVERE, null, e); throw new ZUGFeRDExportException(e); - } + } } public ZUGFeRDImporter(InputStream pdfStream) { @@ -125,7 +127,9 @@ public class ZUGFeRDImporter { private void extractFiles(Map names) throws IOException { - for (String filename : names.keySet()) { + for (String alias : names.keySet()) { + String filename=names.get(alias).getFilename(); + /** * currently (in the release candidate of version 1) only one attached file with * the name ZUGFeRD-invoice.xml is allowed diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java new file mode 100644 index 00000000..03b820b3 --- /dev/null +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java @@ -0,0 +1,134 @@ +/** ********************************************************************** + * + * Copyright 2018 Jochen Staerk + * + * Use is subject to license terms. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *********************************************************************** */ +package org.mustangproject.ZUGFeRD; + +import javax.xml.transform.*; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ZUGFeRDVisualizer { + + static final ClassLoader CLASS_LOADER = ZUGFeRDVisualizer.class.getClassLoader(); + private static final String RESOURCE_PATH = ""; //$NON-NLS-1$ + private static final Logger LOG = Logger.getLogger(ZUGFeRDVisualizer.class.getName()); + // private static File createTempFileResult(final Transformer transformer, final StreamSource toTransform, +// final String suffix) throws TransformerException, IOException { +// File result = File.createTempFile("ZUV_", suffix); //$NON-NLS-1$ +// result.deleteOnExit(); +// +// try (FileOutputStream fos = new FileOutputStream(result)) { +// transformer.transform(toTransform, new StreamResult(fos)); +// } +// return result; +// } + private TransformerFactory mFactory = null; + private Templates mXsltXRTemplate = null; + private Templates mXsltHTMLTemplate = null; + + public ZUGFeRDVisualizer() { + mFactory = new net.sf.saxon.TransformerFactoryImpl(); + //fact = TransformerFactory.newInstance(); + mFactory.setURIResolver(new ClasspathResourceURIResolver()); + try { + mXsltXRTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/cii-xr.xsl"))); + mXsltHTMLTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/xrechnung-html.xsl"))); + } catch (TransformerConfigurationException ex) { + LOG.log(Level.SEVERE, null, ex); + } + } + + public String visualize(String xmlFilename) throws FileNotFoundException, TransformerException, UnsupportedEncodingException { + /** + * * + * http://www.unece.org/fileadmin/DAM/cefact/xml/XML-Naming-And-Design-Rules-V2_1.pdf + * http://www.ferd-net.de/upload/Dokumente/FACTUR-X_ZUGFeRD_2p0_Teil1_Profil_EN16931_1p03.pdf + * http://countwordsfree.com/xmlviewer + */ + ByteArrayOutputStream iaos = new ByteArrayOutputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + applySchematronXsl(new FileInputStream(xmlFilename), iaos); + // take the copy of the stream and re-write it to an InputStream + PipedInputStream in = new PipedInputStream(); + PipedOutputStream out; + try { + out = new PipedOutputStream(in); + new Thread(new Runnable() { + public void run () { + try { + // write the original OutputStream to the PipedOutputStream + // note that in order for the below method to work, you need + // to ensure that the data has finished writing to the + // ByteArrayOutputStream + iaos.writeTo(out); + } + catch (IOException e) { + // logging and exception handling should go here + } + finally { + // close the PipedOutputStream here because we're done writing data + // once this thread has completed its run + if (out != null) { + // close the PipedOutputStream cleanly + try { + out.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + }).start(); + applySchematronXsl2(in, baos); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + return baos.toString("UTF-8"); + } + + public void applySchematronXsl(final InputStream xmlFile, + final OutputStream HTMLOutstream) throws TransformerException { + Transformer transformer = mXsltXRTemplate.newTransformer(); + + transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); + } + + public void applySchematronXsl2(final InputStream xmlFile, + final OutputStream HTMLOutstream) throws TransformerException { + Transformer transformer = mXsltHTMLTemplate.newTransformer(); + + transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); + } + + private static class ClasspathResourceURIResolver implements URIResolver { + ClasspathResourceURIResolver() { + // Do nothing, just prevents synthetic access warning. + } + + @Override + public Source resolve(String href, String base) throws TransformerException { + return new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + href)); + } + } +} diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index d45a26ce..06843a4c 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -30,8 +30,10 @@ import org.mustangproject.ZUGFeRD.*; import javax.xml.transform.TransformerException; import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -235,6 +237,8 @@ public class Toecount { // Option: Help Option helpOption = parser.addBooleanOption('h', "help"); + // Option: Action + Option actionOption = parser.addStringOption('a', "action"); // Generic options available for multiple command // --source: input file @@ -304,6 +308,7 @@ public class Toecount { String sourceXMLName = parser.getOptionValue(sourceXmlOption); String outName = parser.getOptionValue(outOption); String format = parser.getOptionValue(formatOption); + String action = parser.getOptionValue(actionOption); String zugferdVersion = parser.getOptionValue(zugferdVersionOption); String zugferdProfile = parser.getOptionValue(zugferdProfileOption); @@ -319,6 +324,8 @@ public class Toecount { performConvert(sourceName, outName); } else if (upgradeRequested) { performUpgrade(sourceName, outName); + } else if (action.equals("convertToHTML")) { + performVisualization(sourceName, outName); } else { // no argument or argument unknown printUsage(); @@ -332,6 +339,48 @@ public class Toecount { } + private static void performVisualization(String sourceName, String outName) { + // Get params from user if not already defined + if (sourceName == null) { + sourceName = getFilenameFromUser("ZUGFeRD XML source", "zugferd-invoice.xml", "xml", true, false); + } else { + System.out.println("ZUGFeRD XML source set to " + sourceName); + } + if (outName == null) { + outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "factur-x.html", "html", false, true); + } else { + System.out.println("ZUGFeRD 1.0 XML source set to " + outName); + } + + // Verify params + try { + ensureFileExists(sourceName); + ensureFileNotExists(outName); + + //stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt + } catch (IOException e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } + + ZUGFeRDVisualizer zvi = new ZUGFeRDVisualizer(); + String xml = null; + try { + xml = zvi.visualize(sourceName); + Files.write(Paths.get(outName), xml.getBytes()); + } catch (FileNotFoundException e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } catch (UnsupportedEncodingException e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } catch (TransformerException e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } catch (IOException e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } + System.out.println("Written to " + outName); + + + } + private static void performUpgrade(String xmlName, String outName) throws IOException, TransformerException { // Get params from user if not already defined @@ -341,7 +390,7 @@ public class Toecount { System.out.println("ZUGFeRD 1.0 XML source set to " + xmlName); } if (outName == null) { - outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "factur-x.xml", "xml", false, true); + outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "zugferd-invoice.xml", "xml", false, true); } else { System.out.println("ZUGFeRD 1.0 XML source set to " + outName); } diff --git a/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt b/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt new file mode 100644 index 00000000..97f444fe --- /dev/null +++ b/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt @@ -0,0 +1,3008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + <meta http-equiv="X-UA-Compatible" content="IE=9"/> + <xsl:comment>[if IE]><STYLE type="text/css">.altova-rotate-left-textbox{filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3)} .altova-rotate-right-textbox{filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1)} </STYLE><![endif]</xsl:comment> + <xsl:comment>[if !IE]><!</xsl:comment> + <style type="text/css">.altova-rotate-left-textbox{-webkit-transform: rotate(-90deg) translate(-100%, 0%); -webkit-transform-origin: 0% 0%;-moz-transform: rotate(-90deg) translate(-100%, 0%); -moz-transform-origin: 0% 0%;-ms-transform: rotate(-90deg) translate(-100%, 0%); -ms-transform-origin: 0% 0%;}.altova-rotate-right-textbox{-webkit-transform: rotate(90deg) translate(0%, -100%); -webkit-transform-origin: 0% 0%;-moz-transform: rotate(90deg) translate(0%, -100%); -moz-transform-origin: 0% 0%;-ms-transform: rotate(90deg) translate(0%, -100%); -ms-transform-origin: 0% 0%;}</style> + <xsl:comment><![endif]</xsl:comment> + <style type="text/css">@page { margin-left:0.60in; margin-right:0.60in; margin-top:0.79in; margin-bottom:0.79in } @media print { br.altova-page-break { page-break-before: always; } }</style> + </head> + <body style="font-family:Courier; font-size:small; "> + <xsl:for-each select="$XML"> + <xsl:for-each select="rsm:CrossIndustryDocument"> + <span> + <xsl:text>Stylesheet Lesbarmachung der XML-Daten von ZUGFeRD-Rechnungen</xsl:text> + </span> + <br/> + <span> + <xsl:text>ZUGFeRD-Version   : 1.0 vom 25.06.2014 </xsl:text> + </span> + <br/> + <span> + <xsl:text>Stylesheet-Version: 1.0 vom 25.06.2014</xsl:text> + </span> + <br/> + <span> + <xsl:text>Codelisten-Version: 1.0 vom 25.06.2014</xsl:text> + </span> + <br/> + <span> + <xsl:text>(c) AWV e.V. 2014</xsl:text> + </span> + <xsl:variable name="altova:table"> + <table style="border-collapse:collapse; " border="1" width="100%"> + <xsl:variable name="altova:CurrContextGrid_0" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr> + <td> + <br/> + <h2> + <xsl:for-each select="rsm:HeaderExchangedDocument"> + <xsl:for-each select="ram:Name"> + <span style="font-weight:bold; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <span style="empty-cells:hide; font-weight:bold; "> + <xsl:text>(</xsl:text> + </span> + <xsl:for-each select="ram:TypeCode"> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; font-weight:bold; "> + <xsl:text>) Nr. </xsl:text> + </span> + <xsl:for-each select="ram:ID"> + <span style="font-weight:bold; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <span style="empty-cells:hide; font-weight:bold; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </h2> + <xsl:for-each select="rsm:SpecifiedExchangedDocumentContext"> + <br/> + <xsl:for-each select="ram:TestIndicator"> + <xsl:for-each select="udt:Indicator"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Testkennzeichen      : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:BusinessProcessSpecifiedDocumentContextParameter"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Geschäftsprozess     : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedExchangedDocumentContext"> + <xsl:for-each select="ram:GuidelineSpecifiedDocumentContextParameter"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Anwendungsempfehlung : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:HeaderExchangedDocument"> + <xsl:for-each select="ram:CopyIndicator"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Kopie                : </xsl:text> + </span> + <xsl:for-each select="udt:Indicator"> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:HeaderExchangedDocument"> + <xsl:for-each select="ram:LanguageID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Sprache              : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:InvoiceCurrencyCode"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Währung              : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <br/> + </td> + </tr> + <tr> + <td> + <xsl:for-each select="rsm:HeaderExchangedDocument"> + <xsl:for-each select="ram:EffectiveSpecifiedPeriod"> + <xsl:for-each select="ram:CompleteDateTime"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Vertragliches Fälligkeitsdatum: </xsl:text> + </span> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:ActualDeliverySupplyChainEvent"> + <xsl:for-each select="ram:OccurrenceDateTime"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Liefer- und Leistungsdatum    : </xsl:text> + </span> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:BillingSpecifiedPeriod"> + <xsl:for-each select="ram:StartDateTime"> + <br/> + <span> + <xsl:text>Abrechnungszeitraum           : </xsl:text> + </span> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + <span> + <xsl:text> bis </xsl:text> + </span> + <xsl:for-each select="ram:EndDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <br/> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:BuyerReference"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Referenz des Käufers          : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:PaymentReference"> + <br/> + <span style="empty-cells:hide; font-weight:bold; "> + <xsl:text>Zahlungsreferenz              : </xsl:text> + </span> + <span style="font-weight:bold; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:ReceivableSpecifiedTradeAccountingAccount"> + <xsl:for-each select="ram:ID"> + <br/> + <span> + <xsl:text>Buchungsreferenz              : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:ApplicableTradeDeliveryTerms"> + <xsl:for-each select="ram:DeliveryTypeCode"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Lieferbedingung (codiert)     : </xsl:text> + </span> + <xsl:call-template name="DeliveryTypeCode"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:RelatedSupplyChainConsignment"> + <xsl:for-each select="ram:SpecifiedLogisticsTransportMovement"> + <xsl:for-each select="ram:ModeCode"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Versandart (codiert)          : </xsl:text> + </span> + <xsl:call-template name="ram:VersandMode"/> + </xsl:for-each> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Versand-ID                    : </xsl:text> + </span> + <xsl:apply-templates/> + <xsl:for-each select="@schemeID"> + <span style="empty-cells:hide; "> + <xsl:text>, Art: </xsl:text> + </span> + <xsl:call-template name="ram:Versand_Identifer"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <br/> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:BuyerOrderReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Bestellung                    : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_1"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_1" select="string($altova:seqContentStrings_1)"/> + <xsl:value-of select="$altova:sContent_1"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:DespatchAdviceReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Lieferavis                    : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_2"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_2" select="string($altova:seqContentStrings_2)"/> + <xsl:value-of select="$altova:sContent_2"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:DeliveryNoteReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Lieferschein                  : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_3"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_3" select="string($altova:seqContentStrings_3)"/> + <xsl:value-of select="$altova:sContent_3"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:ContractReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Vertrag                       : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_4"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_4" select="string($altova:seqContentStrings_4)"/> + <xsl:value-of select="$altova:sContent_4"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:CustomerOrderReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Kundenbestellung              : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_5"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_5" select="string($altova:seqContentStrings_5)"/> + <xsl:value-of select="$altova:sContent_5"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:AdditionalReferencedDocument"> + <xsl:for-each select="ram:ID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Weitere Referenz              : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <span style="empty-cells:hide; "> + <xsl:text> vom </xsl:text> + </span> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:variable name="altova:seqContentStrings_6"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_6" select="string($altova:seqContentStrings_6)"/> + <xsl:value-of select="$altova:sContent_6"/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:TypeCode"> + <span style="empty-cells:hide; "> + <xsl:text>, Art der Referenz: </xsl:text> + </span> + <xsl:call-template name="ram:Referenz"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <br/> + <span style="empty-cells:hide; "> + <xsl:text> </xsl:text> + </span> + </td> + </tr> + <tr> + <td> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:SellerTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Verkäufer:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:BuyerTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Käufer:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeAgreement"> + <xsl:for-each select="ram:ProductEndUserTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Endverbraucher:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:ShipToTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Abweichender Warenempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:UltimateShipToTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Abweichender Endempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeDelivery"> + <xsl:for-each select="ram:ShipFromTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Abweichender Versender:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:InvoiceeTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Abweichender Rechnungsempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:PayeeTradeParty"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Abweichender Zahlungsempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + </tr> + <tr> + <td> + <xsl:for-each select="rsm:HeaderExchangedDocument"> + <br/> + <xsl:for-each select="ram:IncludedNote"> + <xsl:for-each select="ram:SubjectCode"> + <span style="color:gray; empty-cells:hide; "> + <xsl:text>Qualifizierung der Textart: </xsl:text> + </span> + <span style="font-weight:bold; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:ContentCode"> + <span style="color:gray; empty-cells:hide; "> + <xsl:text>, Qualifizierung des Textes: </xsl:text> + </span> + <span style="font-weight:bold; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:Content"> + <br/> + <span style="font-weight:bold; white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + <br/> + <br/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-bottom-style:none; "> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_7" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="text-align:center; vertical-align:middle; "> + <td style="border-bottom-style:solid; border-collapse:collapse; border-left-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:center; width:30px; "> + <span style="font-weight:bold; "> + <xsl:text>Pos</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:left; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Art-Nr-Kunde</xsl:text> + </span> + <br/> + <span style="font-weight:bold; "> + <xsl:text>Art-Nr-Lief.</xsl:text> + </span> + <br/> + <span style="font-weight:bold; "> + <xsl:text>Art-Nr</xsl:text> + </span> + <br/> + <span style="font-weight:bold; "> + <xsl:text>(Art)</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; "> + <span style="font-weight:bold; "> + <xsl:text>Beschreibung</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>E-Preis</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:120px; "> + <span style="font-weight:bold; "> + <xsl:text>Menge</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Steuer</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Entgelt</xsl:text> + </span> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:IncludedSupplyChainTradeLineItem"> + <xsl:if test="fn:not( fn:empty(ram:SpecifiedTradeProduct))"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_8" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="vertical-align:top; "> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:center; width:30px; "> + <xsl:for-each select="ram:AssociatedDocumentLineDocument"> + <xsl:if test="fn:empty(ram:IncludedNote)"> + <xsl:for-each select="ram:LineID"> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:if> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:for-each select="ram:BuyerAssignedID"> + <xsl:apply-templates/> + </xsl:for-each> + <br/> + <xsl:for-each select="ram:SellerAssignedID"> + <xsl:apply-templates/> + </xsl:for-each> + <br/> + <xsl:for-each select="ram:GlobalID"> + <xsl:apply-templates/> + <br/> + <xsl:for-each select="@schemeID"> + <xsl:call-template name="ram:Global_Identifier"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; "> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:for-each select="ram:Name"> + <span style="white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + <br/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeAgreement"> + <xsl:if test="fn:exists(ram:GrossPriceProductTradePrice)"> + <xsl:for-each select="ram:GrossPriceProductTradePrice"> + <xsl:for-each select="ram:BasisQuantity"> + <span> + <xsl:text>Preisbasismenge: </xsl:text> + </span> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + <xsl:if test="fn:not(fn:exists(ram:GrossPriceProductTradePrice))"> + <xsl:for-each select="ram:NetPriceProductTradePrice"> + <xsl:for-each select="ram:BasisQuantity"> + <br/> + <span> + <xsl:text>Preisbasismenge: </xsl:text> + </span> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + </xsl:for-each> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeAgreement"> + <xsl:if test="fn:exists(ram:GrossPriceProductTradePrice)"> + <xsl:for-each select="ram:GrossPriceProductTradePrice"> + <xsl:for-each select="ram:ChargeAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_9"> + <xsl:value-of select="format-number(number(string(.)), '##0,0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_9" select="string($altova:seqContentStrings_9)"/> + <xsl:value-of select="$altova:sContent_9"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + <xsl:if test="not(fn:exists(ram:GrossPriceProductTradePrice))"> + <xsl:for-each select="ram:NetPriceProductTradePrice"> + <xsl:for-each select="ram:ChargeAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_10"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_10" select="string($altova:seqContentStrings_10)"/> + <xsl:value-of select="$altova:sContent_10"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + </xsl:for-each> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:120px; "> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeDelivery"> + <xsl:for-each select="ram:BilledQuantity"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + <xsl:for-each select="ram:ChargeFreeQuantity"> + <br/> + <span> + <xsl:text>kostenfrei:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeSettlement"> + <xsl:for-each select="ram:ApplicableTradeTax"> + <xsl:call-template name="ram:TradeTax"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:solid; border-collapse:collapse; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradeSettlementMonetarySummation"> + <xsl:for-each select="ram:LineTotalAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_11"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_11" select="string($altova:seqContentStrings_11)"/> + <xsl:value-of select="$altova:sContent_11"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:for-each select="ram:AssociatedDocumentLineDocument"> + <xsl:if test="fn:not( fn:empty(ram:IncludedNote))"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; border-top-style:none; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_12" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="empty-cells:hide; vertical-align:top; "> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:center; width:30px; "> + <xsl:for-each select="ram:LineID"> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "/> + <td style="border-bottom-style:none; border-collapse:collapse; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; "> + <xsl:for-each select="ram:IncludedNote"> + <xsl:for-each select="ram:Content"> + <span style="white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:SubjectCode"> + <br/> + <span style="color:gray; empty-cells:hide; "> + <xsl:text>Qualifizierung der Textart: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ContentCode"> + <span style="color:gray; empty-cells:hide; "> + <xsl:text>, Qualifizierung des Textes: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <br/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "/> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeAgreement"> + <xsl:for-each select="ram:GrossPriceProductTradePrice"> + <xsl:if test="fn:not( fn:empty(ram:AppliedTradeAllowanceCharge))"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_13" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="empty-cells:hide; vertical-align:top; "> + <td style="border-bottom-style:none; border-left-style:none; border-top-style:none; width:30px; "/> + <td style="border-bottom-style:none; border-top-style:none; width:110px; "/> + <td style="border-bottom-style:none; border-right-style:none; border-top-style:none; "> + <xsl:variable name="altova:table"> + <table style="border:0px; border-style:none; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_14" select="."/> + <xsl:variable name="altova:ColumnData"/> + <thead> + <tr> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:left; width:70px; "> + <span style="font-style:italic; "> + <xsl:text>Art</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:left; "> + <span style="font-style:italic; "> + <xsl:text>Grund</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:right; width:70px; "> + <span style="font-style:italic; "> + <xsl:text>%</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:right; width:110px; "> + <span style="font-style:italic; "> + <xsl:text>Basisbetrag</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:right; width:120px; "> + <span style="font-style:italic; "> + <xsl:text>Basismenge</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; font-weight:normal; text-align:right; width:110px; "> + <span style="font-style:italic; "> + <xsl:text>Betrag</xsl:text> + </span> + </th> + <th style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; width:112px; "/> + </tr> + </thead> + <tbody> + <xsl:for-each select="ram:AppliedTradeAllowanceCharge"> + <xsl:sort select="ram:SequenceNumeric" data-type="text" order="ascending"/> + <tr> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; vertical-align:top; width:70px; "> + <xsl:for-each select="ram:ChargeIndicator"> + <xsl:for-each select="udt:Indicator"> + <span> + <xsl:value-of select="if (. eq fn:true())then 'Zuschlag' else 'Abschlag'"/> + </span> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SequenceNumeric"> + <span> + <xsl:text> Nr. </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; vertical-align:top; "> + <xsl:for-each select="ram:Reason"> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ReasonCode"> + <span> + <xsl:text> </xsl:text> + </span> + <xsl:call-template name="AllowanceChargeReasonCode"/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; vertical-align:top; width:70px; "> + <xsl:for-each select="ram:CalculationPercent"> + <span> + <xsl:variable name="altova:seqContentStrings_15"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_15" select="string($altova:seqContentStrings_15)"/> + <xsl:value-of select="$altova:sContent_15"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; vertical-align:top; width:110px; "> + <xsl:for-each select="ram:BasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_16"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_16" select="string($altova:seqContentStrings_16)"/> + <xsl:value-of select="$altova:sContent_16"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; vertical-align:top; width:120px; "> + <xsl:for-each select="ram:BasisQuantity"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; vertical-align:top; width:110px; "> + <xsl:for-each select="ram:ActualAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_17"> + <xsl:value-of select="format-number(number(if(../ram:ChargeIndicator/udt:Indicator = fn:false()) then -1*. else .), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_17" select="string($altova:seqContentStrings_17)"/> + <xsl:value-of select="$altova:sContent_17"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:108px; "/> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:if test="fn:exists(../../ram:SpecifiedSupplyChainTradeSettlement/ram:SpecifiedTradeSettlementMonetarySummation/ram:TotalAllowanceChargeAmount)"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_18" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="empty-cells:hide; vertical-align:top; "> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; width:30px; "/> + <td style="border-bottom-style:none; border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "/> + <td style="border-bottom-style:none; border-collapse:collapse; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; "> + <br/> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "> + <span> + <xsl:text>Summe:</xsl:text> + </span> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:double; empty-cells:hide; text-align:right; width:110px; "> + <xsl:for-each select="$XML"> + <xsl:for-each select="rsm:CrossIndustryDocument"> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:IncludedSupplyChainTradeLineItem"> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradeSettlementMonetarySummation"> + <xsl:for-each select="ram:TotalAllowanceChargeAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_19"> + <xsl:value-of select="format-number(number(-1*.), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_19" select="string($altova:seqContentStrings_19)"/> + <xsl:value-of select="$altova:sContent_19"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; text-align:right; width:110px; "/> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </xsl:for-each> + </xsl:for-each> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-spacing:0px; border-top-style:none; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_20" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="empty-cells:hide; vertical-align:top; "> + <td style="border-collapse:collapse; border-left-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; width:30px; "/> + <td style="border-collapse:collapse; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "/> + <td style="border-collapse:collapse; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; "> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:for-each select="ram:Description"> + <br/> + <span style="white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeDelivery"> + <xsl:for-each select="ram:ActualDeliverySupplyChainEvent"> + <xsl:for-each select="ram:OccurrenceDateTime"> + <br/> + <span> + <xsl:text>* Leistungsdatum: </xsl:text> + </span> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeSettlement"> + <xsl:for-each select="ram:BillingSpecifiedPeriod"> + <br/> + <span> + <xsl:text>* Berechnungszeitraum: </xsl:text> + </span> + <xsl:for-each select="ram:StartDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:EndDateTime"> + <span> + <xsl:text> bis </xsl:text> + </span> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:for-each select="ram:OriginTradeCountry"> + <xsl:for-each select="ram:ID"> + <br/> + <span> + <xsl:text>* Herkunftsland: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeDelivery"> + <xsl:for-each select="ram:PackageQuantity"> + <br/> + <span> + <xsl:text>* Anzahl Packstücke: </xsl:text> + </span> + <span> + <xsl:variable name="altova:seqContentStrings_21"> + <xsl:value-of select="format-number(number(string(.)), '##0', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_21" select="string($altova:seqContentStrings_21)"/> + <xsl:value-of select="$altova:sContent_21"/> + </span> + </xsl:for-each> + <xsl:call-template name="PackageQuantity"/> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeAgreement"> + <xsl:for-each select="ram:BuyerOrderReferencedDocument"> + <br/> + <span> + <xsl:text>* Bestellung</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + <xsl:for-each select="ram:ContractReferencedDocument"> + <br/> + <span> + <xsl:text>* Vertrag</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + <xsl:for-each select="ram:AdditionalReferencedDocument"> + <br/> + <span> + <xsl:text>* Dokument (</xsl:text> + </span> + <xsl:for-each select="ram:ReferenceTypeCode"> + <xsl:call-template name="ram:Referenz"/> + </xsl:for-each> + <span> + <xsl:text>)</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + <xsl:for-each select="ram:CustomerOrderReferencedDocument"> + <br/> + <span> + <xsl:text>* Kundenbestellung</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeDelivery"> + <xsl:for-each select="ram:DespatchAdviceReferencedDocument"> + <br/> + <span> + <xsl:text>* Lieferavis</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + <xsl:for-each select="ram:ReceivingAdviceReferencedDocument"> + <br/> + <span> + <xsl:text>* Wareneingang </xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + <xsl:for-each select="ram:DeliveryNoteReferencedDocument"> + <br/> + <span> + <xsl:text>* Lieferschein</xsl:text> + </span> + <xsl:call-template name="ram:Positionsreferenz"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradeAccountingAccount"> + <xsl:for-each select="ram:ID"> + <br/> + <span> + <xsl:text>* Buchungsreferenz: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:for-each select="ram:DesignatedProductClassification"> + <br/> + <span> + <xsl:text>* Klassifikation: </xsl:text> + </span> + <xsl:for-each select="ram:ClassCode"> + <span> + <xsl:text>[</xsl:text> + </span> + <xsl:apply-templates/> + <span> + <xsl:text>] </xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:ClassName"> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ClassCode"> + <xsl:call-template name="Klassifikationsart"/> + <xsl:for-each select="@listVersionID"> + <span> + <xsl:text>, Version: </xsl:text> + </span> + <span> + <xsl:value-of select="string(.)"/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedSupplyChainTradeDelivery"> + <xsl:for-each select="ram:ShipToTradeParty"> + <br/> + <span style="text-decoration:underline; "> + <xsl:text>Abweichender Warenempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + <xsl:for-each select="ram:UltimateShipToTradeParty"> + <br/> + <span style="text-decoration:underline; "> + <xsl:text>Abweichender Endempfänger:</xsl:text> + </span> + <br/> + <xsl:call-template name="ram:Party"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:if test="fn:exists(ram:ApplicableProductCharacteristic)"> + <br/> + <br/> + <span style="text-decoration:underline; "> + <xsl:text>Weitere Eigenschaften:</xsl:text> + </span> + <br/> + </xsl:if> + <xsl:for-each select="ram:ApplicableProductCharacteristic"> + <xsl:for-each select="ram:Description"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + <span> + <xsl:text>: </xsl:text> + </span> + <xsl:for-each select="ram:TypeCode"> + <xsl:apply-templates/> + </xsl:for-each> + <span> + <xsl:text> = </xsl:text> + </span> + <xsl:for-each select="ram:Value"> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ValueMeasure"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:if test="fn:exists(ram:SpecifiedTradeProduct/ram:IncludedReferencedProduct)"> + <br/> + <br/> + <span style="text-decoration:underline; "> + <xsl:text>Basisartikel:</xsl:text> + </span> + <br/> + </xsl:if> + <xsl:for-each select="ram:SpecifiedTradeProduct"> + <xsl:if test="fn:exists(ram:IncludedReferencedProduct)"> + <xsl:variable name="altova:table"> + <table style="border:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_22" select="."/> + <xsl:variable name="altova:ColumnData"/> + <thead> + <tr> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; text-align:left; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Art-Nr-Kunde</xsl:text> + </span> + <br/> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Art-Nr-Lief.</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; width:110px; "> + <span> + <xsl:text>Art-Nr. (Art)</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; "> + <span> + <xsl:text>Beschreibung</xsl:text> + </span> + </th> + <th style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; text-align:right; width:120px; "> + <span> + <xsl:text>Menge</xsl:text> + </span> + </th> + </tr> + </thead> + <tbody> + <xsl:for-each select="ram:IncludedReferencedProduct"> + <tr> + <td style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; text-align:left; vertical-align:top; width:110px; "> + <xsl:for-each select="ram:BuyerAssignedID"> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; vertical-align:top; width:110px; "> + <xsl:for-each select="ram:SellerAssignedID"> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; vertical-align:top; width:110px; "> + <xsl:for-each select="ram:GlobalID"> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:GlobalID"> + <xsl:for-each select="@schemeID"> + <xsl:call-template name="ram:Global_Identifier"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; vertical-align:top; "> + <xsl:for-each select="ram:Name"> + <xsl:apply-templates/> + </xsl:for-each> + <br/> + <xsl:for-each select="ram:Description"> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; text-align:right; vertical-align:top; width:120px; "> + <xsl:for-each select="ram:UnitQuantity"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </xsl:for-each> + </td> + <td style="border-collapse:collapse; border-left-style:none; border-right-style:none; border-spacing:0px; border-top-style:none; empty-cells:hide; width:110px; "/> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:for-each> + </xsl:for-each> + <br/> + </td> + </tr> + <tr> + <td style="border-bottom-style:none; border-top-style:none; "> + <xsl:if test="fn:exists(rsm:SpecifiedSupplyChainTradeTransaction/ram:ApplicableSupplyChainTradeSettlement/ram:SpecifiedTradePaymentTerms)"> + <br/> + <span style="empty-cells:hide; font-weight:bold; text-decoration:underline; "> + <xsl:text>Zahlungsbedingungen:</xsl:text> + </span> + <br/> + <br/> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-right-style:none; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_23" select="."/> + <xsl:variable name="altova:ColumnData"/> + <thead> + <tr> + <th style="border-left-style:none; "> + <span> + <xsl:text>Beschreibung</xsl:text> + </span> + </th> + <th style="width:110px; "> + <span> + <xsl:text>Fälligkeit</xsl:text> + </span> + </th> + <th style="border-right-style:none; width:110px; "> + <span> + <xsl:text>Teilzahlung</xsl:text> + </span> + </th> + </tr> + </thead> + <tbody> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradePaymentTerms"> + <tr> + <td style="border-bottom-style:none; border-left-style:none; "> + <xsl:for-each select="ram:Description"> + <span style="white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; text-align:center; width:110px; "> + <xsl:for-each select="ram:DueDateDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-right-style:none; text-align:right; width:110px; "> + <xsl:for-each select="ram:PartialPaymentAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_24"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_24" select="string($altova:seqContentStrings_24)"/> + <xsl:value-of select="$altova:sContent_24"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td colspan="3" style="border-left-style:none; border-right-style:none; border-top-style:none; min-height:0px; "> + <xsl:if test="fn:exists(ram:ApplicableTradePaymentPenaltyTerms) or fn:exists(ram:ApplicableTradePaymentDiscountTerms)"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-left-style:none; border-top-style:none; margin:0px; padding:0px; " border="1" width="100%"> + <xsl:variable name="altova:CurrContextGrid_25" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr style="border-bottom-style:none; border-top-style:none; "> + <td style="border-bottom-style:none; border-left-style:none; border-top-style:none; min-height:0px; "/> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Bezug</xsl:text> + </span> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Innerhalb</xsl:text> + </span> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Basisbetrag</xsl:text> + </span> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>%</xsl:text> + </span> + </td> + <td style="border-bottom-style:none; border-right-style:none; min-height:0px; text-align:center; width:108px; "> + <span style="font-weight:bold; "> + <xsl:text>Betrag</xsl:text> + </span> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:if test="fn:exists(ram:ApplicableTradePaymentPenaltyTerms)"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-bottom-style:none; border-collapse:collapse; margin:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_26" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <xsl:for-each select="ram:ApplicableTradePaymentPenaltyTerms"> + <tr> + <td style="border-bottom-style:none; border-left-style:none; min-height:0px; text-align:right; "> + <span> + <xsl:text>Zuschlag  </xsl:text> + </span> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <xsl:for-each select="ram:BasisDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisPeriodMeasure"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_27"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_27" select="string($altova:seqContentStrings_27)"/> + <xsl:value-of select="$altova:sContent_27"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:CalculationPercent"> + <span> + <xsl:variable name="altova:seqContentStrings_28"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_28" select="string($altova:seqContentStrings_28)"/> + <xsl:value-of select="$altova:sContent_28"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-right-style:none; min-height:0px; text-align:right; width:108px; "> + <xsl:for-each select="ram:ActualPenaltyAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_29"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_29" select="string($altova:seqContentStrings_29)"/> + <xsl:value-of select="$altova:sContent_29"/> + </span> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:if test="fn:exists(ram:ApplicableTradePaymentDiscountTerms)"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; margin:0px; padding:0px; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_30" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <xsl:for-each select="ram:ApplicableTradePaymentDiscountTerms"> + <tr> + <td style="border-bottom-style:none; border-left-style:none; min-height:0px; text-align:right; "> + <span> + <xsl:text>Skonto  </xsl:text> + </span> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:center; width:110px; "> + <xsl:for-each select="ram:BasisDateTime"> + <xsl:for-each select="udt:DateTimeString"> + <xsl:call-template name="ram:Datum"/> + </xsl:for-each> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisPeriodMeasure"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_31"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_31" select="string($altova:seqContentStrings_31)"/> + <xsl:value-of select="$altova:sContent_31"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; min-height:0px; text-align:right; width:110px; "> + <xsl:for-each select="ram:CalculationPercent"> + <span> + <xsl:variable name="altova:seqContentStrings_32"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_32" select="string($altova:seqContentStrings_32)"/> + <xsl:value-of select="$altova:sContent_32"/> + </span> + </xsl:for-each> + </td> + <td style="border-bottom-style:none; border-right-style:none; min-height:0px; text-align:right; width:108px; "> + <xsl:for-each select="ram:ActualDiscountAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_33"> + <xsl:value-of select="format-number(number(-1 * .), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_33" select="string($altova:seqContentStrings_33)"/> + <xsl:value-of select="$altova:sContent_33"/> + </span> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </td> + </tr> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:if test="fn:exists(rsm:SpecifiedSupplyChainTradeTransaction/ram:ApplicableSupplyChainTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans)"> + <br/> + <span style="font-weight:bold; text-decoration:underline; "> + <xsl:text>Zahlungsart:</xsl:text> + </span> + <br/> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradeSettlementPaymentMeans"> + <xsl:for-each select="ram:Information"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:TypeCode"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Zahlungstyp (codiert): </xsl:text> + </span> + <xsl:call-template name="ram:PaymentType"/> + </xsl:for-each> + <xsl:for-each select="ram:ID"> + <xsl:for-each select="@schemeAgencyID"> + <br/> + <span> + <xsl:text>Gläubiger-ID         : </xsl:text> + </span> + <span> + <xsl:value-of select="string(.)"/> + </span> + </xsl:for-each> + <br/> + <span> + <xsl:text>Mandatsreferenz      : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:PayerPartyDebtorFinancialAccount"> + <xsl:for-each select="ram:IBANID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Käufer-IBAN          : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ProprietaryID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Käufer-Kontonummer   : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:PayerSpecifiedDebtorFinancialInstitution"> + <xsl:for-each select="ram:BICID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Käufer-BIC           : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:GermanBankleitzahlID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Käufer-Bankleitzahl  : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:Name"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Käufer-Kreditinstitut: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <br/> + <xsl:for-each select="ram:PayeePartyCreditorFinancialAccount"> + <xsl:for-each select="ram:AccountName"> + <br/> + <span> + <xsl:text>Verkäufer-Kontoname  : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:IBANID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Verkäufer-IBAN       : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ProprietaryID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Verkäufer-Kontonummer: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:PayeeSpecifiedCreditorFinancialInstitution"> + <xsl:for-each select="ram:BICID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Verkäufer-BIC        : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:GermanBankleitzahlID"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Verkäufer-BLZ        : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:Name"> + <br/> + <span style="empty-cells:hide; "> + <xsl:text>Verkäufer-Kreditinst.: </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + </td> + </tr> + <tr> + <td style="border-bottom-style:none; border-right-style:none; border-top-style:none; "> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <br/> + <xsl:if test="fn:exists(ram:SpecifiedTradeAllowanceCharge) or fn:exists(ram:SpecifiedLogisticsServiceCharge)"> + <span style="font-weight:bold; text-decoration:underline; "> + <xsl:text>Zu- und Abschläge:</xsl:text> + </span> + <br/> + <br/> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; empty-cells:hide; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_34" select="."/> + <xsl:variable name="altova:ColumnData"/> + <thead> + <tr> + <th colspan="2" style="border-left-style:none; "> + <span> + <xsl:text>Art</xsl:text> + </span> + </th> + <th> + <span> + <xsl:text>%</xsl:text> + </span> + </th> + <th> + <span> + <xsl:text>Basisbetrag</xsl:text> + </span> + </th> + <th style="width:110px; "> + <span> + <xsl:text>Basismenge</xsl:text> + </span> + </th> + <th style="width:110px; "> + <span> + <xsl:text>Steuer</xsl:text> + </span> + </th> + <th style="border-right-style:none; width:110px; "> + <span> + <xsl:text>Betrag</xsl:text> + </span> + </th> + </tr> + </thead> + <tbody> + <xsl:for-each select="ram:SpecifiedTradeAllowanceCharge"> + <xsl:sort select="ram:SequenceNumeric" data-type="text" order="ascending"/> + <tr> + <td style="border-left-style:none; "> + <xsl:for-each select="ram:ChargeIndicator"> + <xsl:for-each select="udt:Indicator"> + <span> + <xsl:value-of select="if (. eq fn:true())then 'Zuschlag' else 'Abschlag'"/> + </span> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SequenceNumeric"> + <span> + <xsl:text> Nr. </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td> + <xsl:for-each select="ram:Reason"> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:ReasonCode"> + <span> + <xsl:text> </xsl:text> + </span> + <xsl:call-template name="AllowanceChargeReasonCode"/> + </xsl:for-each> + </td> + <td style="text-align:right; "> + <xsl:for-each select="ram:CalculationPercent"> + <span> + <xsl:variable name="altova:seqContentStrings_35"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_35" select="string($altova:seqContentStrings_35)"/> + <xsl:value-of select="$altova:sContent_35"/> + </span> + </xsl:for-each> + </td> + <td style="text-align:right; "> + <xsl:for-each select="ram:BasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_36"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_36" select="string($altova:seqContentStrings_36)"/> + <xsl:value-of select="$altova:sContent_36"/> + </span> + </xsl:for-each> + </td> + <td style="text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisQuantity"> + <xsl:call-template name="ram:Menge"/> + </xsl:for-each> + </td> + <td style="text-align:right; width:110px; "> + <xsl:for-each select="ram:CategoryTradeTax"> + <xsl:call-template name="ram:TradeTax"/> + </xsl:for-each> + </td> + <td style="border-right-style:none; text-align:right; width:110px; "> + <xsl:for-each select="ram:ActualAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_37"> + <xsl:value-of select="format-number(number(if (../ram:ChargeIndicator/udt:Indicator eq fn:true()) then . else -1 * .), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_37" select="string($altova:seqContentStrings_37)"/> + <xsl:value-of select="$altova:sContent_37"/> + </span> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + <xsl:if test="fn:exists(ram:SpecifiedLogisticsServiceCharge)"> + <xsl:if test="fn:not(fn:exists(ram:SpecifiedTradeAllowanceCharge))"> + <xsl:variable name="altova:table"> + <table style="border:0px; border-top-style:none; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_38" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <xsl:for-each select="ram:SpecifiedLogisticsServiceCharge"> + <tr> + <td style="border-left-style:none; border-top-style:solid; text-align:center; "> + <span style="font-weight:bold; "> + <xsl:text>Art</xsl:text> + </span> + </td> + <td style="border-top-style:solid; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Steuer</xsl:text> + </span> + </td> + <td style="border-right-style:none; border-top-style:solid; text-align:center; width:110px; "> + <span style="font-weight:bold; "> + <xsl:text>Betrag</xsl:text> + </span> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + <xsl:variable name="altova:table"> + <table style="border:0px; border-top-style:none; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_39" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <xsl:for-each select="ram:SpecifiedLogisticsServiceCharge"> + <tr> + <td style="border-left-style:none; border-top-style:none; "> + <xsl:for-each select="ram:Description"> + <span style="white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + </td> + <td style="border-top-style:none; text-align:right; width:110px; "> + <xsl:for-each select="ram:AppliedTradeTax"> + <xsl:call-template name="ram:TradeTax"/> + </xsl:for-each> + </td> + <td style="border-right-style:none; border-top-style:none; text-align:right; width:110px; "> + <xsl:for-each select="ram:AppliedAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_40"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_40" select="string($altova:seqContentStrings_40)"/> + <xsl:value-of select="$altova:sContent_40"/> + </span> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </xsl:if> + <br/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"/> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-bottom-style:none; border-top-style:none; "> + <xsl:if test="fn:exists(rsm:SpecifiedSupplyChainTradeTransaction/ram:ApplicableSupplyChainTradeSettlement/ram:ApplicableTradeTax)"> + <br/> + <span style="font-weight:bold; text-decoration:underline; "> + <xsl:text>Steuern:</xsl:text> + </span> + <br/> + <br/> + <xsl:variable name="altova:table"> + <table style="border:0px; border-collapse:collapse; border-right-style:none; width:100%; " border="1"> + <xsl:variable name="altova:CurrContextGrid_41" select="."/> + <xsl:variable name="altova:ColumnData"/> + <thead> + <tr> + <th style="border-left-style:none; "> + <span> + <xsl:text>Art (Kategorie)</xsl:text> + </span> + </th> + <th> + <span> + <xsl:text>Warenwert</xsl:text> + </span> + </th> + <th> + <span> + <xsl:text>Zu-/Abschlag</xsl:text> + </span> + </th> + <th style="width:110px; "> + <span> + <xsl:text>Nettobetrag</xsl:text> + </span> + </th> + <th style="width:110px; "> + <span> + <xsl:text>USt. %</xsl:text> + </span> + </th> + <th style="border-right-style:none; width:110px; "> + <span> + <xsl:text>USt.-Betrag</xsl:text> + </span> + </th> + </tr> + </thead> + <tbody> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:ApplicableTradeTax"> + <tr> + <td style="border-left-style:none; "> + <xsl:for-each select="ram:TypeCode"> + <xsl:apply-templates/> + </xsl:for-each> + <span> + <xsl:text> </xsl:text> + </span> + <xsl:for-each select="ram:CategoryCode"> + <span> + <xsl:text>(</xsl:text> + </span> + <xsl:apply-templates/> + <span> + <xsl:text>)</xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:ExemptionReason"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + </td> + <td style="text-align:right; "> + <xsl:for-each select="ram:LineTotalBasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_42"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_42" select="string($altova:seqContentStrings_42)"/> + <xsl:value-of select="$altova:sContent_42"/> + </span> + </xsl:for-each> + </td> + <td style="text-align:right; "> + <xsl:for-each select="ram:AllowanceChargeBasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_43"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_43" select="string($altova:seqContentStrings_43)"/> + <xsl:value-of select="$altova:sContent_43"/> + </span> + </xsl:for-each> + </td> + <td style="text-align:right; width:110px; "> + <xsl:for-each select="ram:BasisAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_44"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_44" select="string($altova:seqContentStrings_44)"/> + <xsl:value-of select="$altova:sContent_44"/> + </span> + </xsl:for-each> + </td> + <td style="text-align:right; width:110px; "> + <xsl:for-each select="ram:ApplicablePercent"> + <span> + <xsl:variable name="altova:seqContentStrings_45"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_45" select="string($altova:seqContentStrings_45)"/> + <xsl:value-of select="$altova:sContent_45"/> + </span> + </xsl:for-each> + </td> + <td style="border-right-style:none; text-align:right; width:110px; "> + <xsl:for-each select="ram:CalculatedAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_46"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_46" select="string($altova:seqContentStrings_46)"/> + <xsl:value-of select="$altova:sContent_46"/> + </span> + </xsl:for-each> + </td> + </tr> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:if> + </td> + </tr> + <tr> + <td style="border-bottom-style:none; text-align:left; "> + <br/> + <span style="font-weight:bold; text-decoration:underline; "> + <xsl:text>Belegsummen:</xsl:text> + </span> + <br/> + <xsl:for-each select="rsm:SpecifiedSupplyChainTradeTransaction"> + <xsl:for-each select="ram:ApplicableSupplyChainTradeSettlement"> + <xsl:for-each select="ram:SpecifiedTradeSettlementMonetarySummation"> + <xsl:variable name="altova:table"> + <table style="border:0px; " border="1" width="100%"> + <xsl:variable name="altova:CurrContextGrid_47" select="."/> + <xsl:variable name="altova:ColumnData"/> + <tbody> + <tr> + <td style="border-style:none; "/> + <td style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:left; width:220px; "> + <span style="font-weight:bold; "> + <xsl:text>Positionssumme</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:LineTotalAmount"> + <span style="font-weight:bold; "> + <xsl:variable name="altova:seqContentStrings_48"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_48" select="string($altova:seqContentStrings_48)"/> + <xsl:value-of select="$altova:sContent_48"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border:0px; border-top-style:double; padding:1px; text-align:left; width:220px; "> + <span> + <xsl:text>Gesamtbetrag der Zuschläge</xsl:text> + </span> + </td> + <td style="border:0px; border-top-style:double; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:ChargeTotalAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_49"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_49" select="string($altova:seqContentStrings_49)"/> + <xsl:value-of select="$altova:sContent_49"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border:0px; border-top-style:double; padding:1px; text-align:left; width:220px; "> + <span> + <xsl:text>Gesamtbetrag der Abschläge</xsl:text> + </span> + </td> + <td style="border:0px; border-top-style:double; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:AllowanceTotalAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_50"> + <xsl:value-of select="format-number(number(-1*.), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_50" select="string($altova:seqContentStrings_50)"/> + <xsl:value-of select="$altova:sContent_50"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:left; width:220px; "> + <span style="font-weight:bold; "> + <xsl:text>Rechnungssumme ohne USt.</xsl:text> + </span> + </td> + <td style="border-bottom-style:solid; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:TaxBasisTotalAmount"> + <span style="font-weight:bold; "> + <xsl:variable name="altova:seqContentStrings_51"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_51" select="string($altova:seqContentStrings_51)"/> + <xsl:value-of select="$altova:sContent_51"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border:0px; border-top-style:double; padding:1px; text-align:left; width:220px; "> + <span> + <xsl:text>Steuerbetrag</xsl:text> + </span> + </td> + <td style="border:0px; border-top-style:double; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:TaxTotalAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_52"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_52" select="string($altova:seqContentStrings_52)"/> + <xsl:value-of select="$altova:sContent_52"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border-bottom-style:double; border-bottom-width:medium; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:left; width:220px; "> + <span style="font-weight:bold; "> + <xsl:text>Bruttosumme</xsl:text> + </span> + </td> + <td style="border-bottom-style:double; border-bottom-width:medium; border-left-style:none; border-right-style:none; border-top-style:none; padding:1px; text-align:right; width:110px; "> + <xsl:for-each select="ram:GrandTotalAmount"> + <span style="font-weight:bold; "> + <xsl:variable name="altova:seqContentStrings_53"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_53" select="string($altova:seqContentStrings_53)"/> + <xsl:value-of select="$altova:sContent_53"/> + </span> + </xsl:for-each> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border:0px; border-top-style:double; padding:1px; text-align:left; width:220px; "> + <xsl:if test="(ram:TotalPrepaidAmount>=0 and fn:exists(ram:TotalPrepaidAmount)) or(fn:not(fn:exists(ram:TotalPrepaidAmount)) and fn:not(ends-with( ../../../rsm:SpecifiedExchangedDocumentContext/ram:GuidelineSpecifiedDocumentContextParameter/ram:ID , 'basic' )))"> + <span> + <xsl:text>Erhaltene Anzahlungen</xsl:text> + </span> + <br/> + </xsl:if> + <xsl:if test="ram:TotalPrepaidAmount<0 and fn:exists(ram:TotalPrepaidAmount)"> + <span> + <xsl:text>Offene Zahlungen</xsl:text> + </span> + <br/> + </xsl:if> + </td> + <td style="border:0px; border-top-style:double; padding:1px; text-align:right; width:110px; "> + <xsl:if test="fn:exists(TotalPrepaidAmount) or fn:not(ends-with( ../../../rsm:SpecifiedExchangedDocumentContext/ram:GuidelineSpecifiedDocumentContextParameter/ram:ID , 'basic' ))"> + <xsl:for-each select="ram:TotalPrepaidAmount"> + <span> + <xsl:variable name="altova:seqContentStrings_54"> + <xsl:value-of select="format-number(number(-1*.), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_54" select="string($altova:seqContentStrings_54)"/> + <xsl:value-of select="$altova:sContent_54"/> + </span> + </xsl:for-each> + </xsl:if> + </td> + </tr> + <tr> + <td style="border-style:none; "/> + <td style="border:0px; border-top-style:double; padding:1px; text-align:left; width:220px; "> + <xsl:if test="fn:exists(ram:DuePayableAmount) or fn:not(ends-with( ../../../rsm:SpecifiedExchangedDocumentContext/GuidelineSpecifiedDocumentContextParameter/ID , 'basic' ))"> + <span style="font-weight:bold; "> + <xsl:text>Zahlbetrag</xsl:text> + </span> + </xsl:if> + </td> + <td style="border:0px; border-top-style:double; padding:1px; text-align:right; width:110px; "> + <xsl:if test="fn:exists(ram:DuePayableAmount) or fn:not(ends-with( ../../../rsm:SpecifiedExchangedDocumentContext/GuidelineSpecifiedDocumentContextParameter/ID , 'basic' ))"> + <xsl:for-each select="ram:DuePayableAmount"> + <span style="font-weight:bold; "> + <xsl:variable name="altova:seqContentStrings_55"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_55" select="string($altova:seqContentStrings_55)"/> + <xsl:value-of select="$altova:sContent_55"/> + </span> + </xsl:for-each> + </xsl:if> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </td> + </tr> + </tbody> + </table> + </xsl:variable> + <xsl:variable name="altova:col-count" select="sum( for $altova:cell in $altova:table/table/(thead | tbody | tfoot)[ 1 ]/tr[ 1 ]/(th | td) return altova:col-span( $altova:cell ) )"/> + <xsl:variable name="altova:generate-cols" as="xs:boolean*" select="for $altova:pos in 1 to $altova:col-count return true()"/> + <xsl:apply-templates select="$altova:table" mode="altova:generate-table"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + <br/> + </xsl:for-each> + </xsl:for-each> + <br/> + <br/> + </body> + </html> + </xsl:template> + <xsl:template name="ram:Party"> + <xsl:for-each select="ram:ID"> + <span> + <xsl:text>Nummer        : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="@schemeID"> + <xsl:call-template name="local_Identifier"/> + </xsl:for-each> + <xsl:for-each select="ram:GlobalID"> + <br/> + <span> + <xsl:text>Globale Nummer: </xsl:text> + </span> + <xsl:apply-templates/> + <xsl:for-each select="@schemeID"> + <span> + <xsl:text> </xsl:text> + </span> + <xsl:call-template name="ram:Global_Identifier"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:Name"> + <br/> + <span style="font-weight:bold; white-space:pre-wrap; "> + <xsl:apply-templates/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:DefinedTradeContact"> + <xsl:for-each select="ram:PersonName"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:DepartmentName"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:PostalTradeAddress"> + <xsl:for-each select="ram:LineOne"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:LineTwo"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:CountryID"> + <br/> + <xsl:apply-templates/> + <span> + <xsl:text> </xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:PostcodeCode"> + <xsl:apply-templates/> + <span> + <xsl:text> </xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:CityName"> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <br/> + <xsl:for-each select="ram:DefinedTradeContact"> + <xsl:for-each select="ram:TelephoneUniversalCommunication"> + <xsl:for-each select="ram:CompleteNumber"> + <br/> + <span> + <xsl:text>Telefon      : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:FaxUniversalCommunication"> + <xsl:for-each select="ram:CompleteNumber"> + <br/> + <span> + <xsl:text>Fax          : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:EmailURIUniversalCommunication"> + <xsl:for-each select="ram:URIID"> + <br/> + <span> + <xsl:text>E-Mail       : </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select="ram:SpecifiedTaxRegistration"> + <xsl:for-each select="ram:ID"> + <br/> + <xsl:call-template name="ram:TaxRegistration"/> + </xsl:for-each> + </xsl:for-each> + <br/> + </xsl:template> + <xsl:template name="ram:TradeTax"> + <xsl:for-each select="ram:ApplicablePercent"> + <span> + <xsl:variable name="altova:seqContentStrings_56"> + <xsl:value-of select="format-number(number(string(.)), '###.##0,####', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_56" select="string($altova:seqContentStrings_56)"/> + <xsl:value-of select="$altova:sContent_56"/> + </span> + <span> + <xsl:text> %</xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:TypeCode"> + <span> + <xsl:text> </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:CategoryCode"> + <span> + <xsl:text> (</xsl:text> + </span> + <xsl:apply-templates/> + <span> + <xsl:text>)</xsl:text> + </span> + </xsl:for-each> + <xsl:for-each select="ram:CalculatedAmount"> + <span> + <xsl:text> entspricht </xsl:text> + </span> + <span> + <xsl:variable name="altova:seqContentStrings_57"> + <xsl:value-of select="format-number(number(string(.)), '##0,00', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_57" select="string($altova:seqContentStrings_57)"/> + <xsl:value-of select="$altova:sContent_57"/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:ExemptionReason"> + <br/> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:template> + <xsl:template name="ram:Positionsreferenz"> + <xsl:for-each select="ram:ID"> + <span> + <xsl:text> Nr. </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + <xsl:for-each select="ram:IssueDateTime"> + <span> + <xsl:text> vom </xsl:text> + </span> + <span> + <xsl:variable name="altova:seqContentStrings_58"> + <xsl:value-of select="format-number(number(substring(string(string(.)), 9, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(.)), 6, 2)), '00', 'format1')"/> + <xsl:variable name="sText" as="xs:string?"> + <xsl:text>. </xsl:text> + </xsl:variable> + <xsl:value-of select="$sText"/> + <xsl:value-of select="format-number(number(substring(string(string(string(.))), 1, 4)), '0000', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_58" select="string($altova:seqContentStrings_58)"/> + <xsl:value-of select="$altova:sContent_58"/> + </span> + </xsl:for-each> + <xsl:for-each select="ram:LineID"> + <span> + <xsl:text> Zeile </xsl:text> + </span> + <xsl:apply-templates/> + </xsl:for-each> + </xsl:template> + <xsl:template name="ram:Datum"> + <span> + <xsl:value-of select="if ( @format = '102') then concat(substring(.,7,2),'.',substring(.,5,2),'.',substring(.,1,4)) else +if ( @format = '610') then concat(substring(.,5,2),'-',substring(.,1,4)) else +if ( @format = '616') then concat('KW ',substring(.,5,2),' ',substring(.,1,4)) else +concat('Ungültiges Datumsformat für: ', .)"/> + </span> + </xsl:template> + <xsl:template name="ram:Versand_Identifer"> + <span> + <xsl:value-of select="if(. eq 'GSIN') then . else +if(. eq 'GINC') then . else +if(. eq 'SSCC') then 'Nummer der Versandeinheit' else +if(. eq 'FLIGHT_NO') then 'Flugnummer' else +if(. eq 'NUMBER_PLATE') then 'Nummernschild' else +if(. eq 'SHIPMENT_REFERENCE') then 'Sendungs-/Ladungsbezugsnummer' else +."/> + </span> + </xsl:template> + <xsl:template name="ram:Global_Identifier"> + <span> + <xsl:text>(</xsl:text> + </span> + <span> + <xsl:value-of select="if (. eq '0021') then 'BIC' else +if (. eq '0060') then 'DUNS' else +if (. eq '0088') then 'GTIN' else +if (. eq '0160') then 'GLN' else +if (. eq '0177') then 'OSCAR' else +."/> + </span> + <span> + <xsl:text>)</xsl:text> + </span> + </xsl:template> + <xsl:template name="ram:Menge"> + <span> + <xsl:variable name="altova:seqContentStrings_59"> + <xsl:value-of select="format-number(number(string(.)), '##0', 'format1')"/> + </xsl:variable> + <xsl:variable name="altova:sContent_59" select="string($altova:seqContentStrings_59)"/> + <xsl:value-of select="$altova:sContent_59"/> + </span> + <xsl:for-each select="@unitCode"> + <span> + <xsl:text> </xsl:text> + </span> + <span> + <xsl:value-of select="if (. eq 'C62') then 'Stk' else +if (. eq 'DAY') then 'Tag(e)' else +if (. eq 'HAR') then 'ha' else +if (. eq 'HUR') then 'Std' else +if (. eq 'KGM') then 'kg' else +if (. eq 'KTM') then 'km' else +if (. eq 'LS') then 'pausch' else +if (. eq 'LTR') then 'l' else +if (. eq 'MIN') then 'min' else +if (. eq 'MMK') then 'mm²' else +if (. eq 'MMT') then 'mm' else +if (. eq 'MTK') then 'm²' else +if (. eq 'MTQ') then 'm³' else +if (. eq 'MTR') then 'm' else +if (. eq 'NAR') then 'Anz' else +if (. eq 'NPR') then 'Paar' else +if (. eq 'P1') then '%' else +if (. eq 'SET') then 'Set' else +if (. eq 'TNE') then 't' else +if (. eq 'WEE') then 'Woche(n)' else +."/> + </span> + </xsl:for-each> + </xsl:template> + <xsl:template name="ram:TaxRegistration"> + <span> + <xsl:value-of select="if ( @schemeID = 'FC') then concat('Steuernummer : ', .) else +if ( @schemeID = 'VA') then concat('USt.-Id.-Nr. : ', .) else +concat('Unbekannte Steuernummer (', @schemeID , '): ', .)"/> + </span> + </xsl:template> + <xsl:template name="ram:VersandMode"> + <span> + <xsl:value-of select="if (. eq '0')then '0 - Nicht spezifiziert' else +if (. eq '1')then '1 - Seefracht' else +if (. eq '2')then '2 - Schiene' else +if (. eq '3')then '3 - Straße' else +if (. eq '4')then '4 - Luftfracht' else +if (. eq '5')then '5 - Post/Paketversand' else +if (. eq '6')then '6 - Multimodaler Transport/kombinierter Verkehr' else +if (. eq '7')then '7 - Feste Transportinstallation' else +if (. eq '8')then '8 - Transport auf Binnengewässern' else +if (. eq '9')then '9 - Nicht anwendbar' else +fn:concat(.,' - unbekannte Transportart')"/> + </span> + </xsl:template> + <xsl:template name="ram:PaymentType"> + <span> + <xsl:value-of select="if(. eq '1') then concat(.,' - nicht definiert') else +if(. eq '3') then concat(.,' - Belastung durch automatisierte Clearingstelle') else +if(. eq '10') then concat(.,' - Barzahlung') else +if(. eq '20') then concat(.,' - per Scheck') else +if(. eq '31') then concat(.,' - per Überweisung (SEPA)') else +if(. eq '42') then concat(.,' - per Überweisung (nicht SEPA)') else +if(. eq '48') then concat(.,' - per Kreditkarte') else +if(. eq '49') then concat(.,' - per Lastschrift') else +if(. eq '97') then concat(.,' - per Ausgleich zwischen Partnern') else +."/> + </span> + </xsl:template> + <xsl:template name="ram:Referenz"> + <span> + <xsl:value-of select="if (. eq 'AAA')then 'Auftragsbestätigung' else +if (. eq 'AAB')then 'Proforma-Rechnung' else +if (. eq 'AAG') then 'Angebot' else +if (. eq 'AAJ') then 'Lieferauftrag' else +if (. eq 'AAL') then 'Zeichnung' else +if (. eq 'AAM') then 'Frachtbrief' else +if (. eq 'AAS') then 'Transportdokument' else +if (. eq 'ABT') then 'Zollerklärung' else +if (. eq 'AER') then 'Projektspezifikation' else +if (. eq 'AGG') then 'Reklamation' else +if (. eq 'AJS') then 'Vereinbarung' else +if (. eq 'ALO') then 'Wareneingang' else +if (. eq 'ALQ') then 'Rücksendungsanzeige' else +if (. eq 'API') then 'Bestandsbericht' else +if (. eq 'ASI') then 'Abliefernachweis' else +if (. eq 'AUD') then 'Inkasso-Referenz' else +if (. eq 'AWR') then 'Ursprungsbeleg' else +if (. eq 'BO') then 'Rahmenauftrag' else +if (. eq 'BC') then 'Vertrag (Käufer)' else +if (. eq 'CD') then 'Gutschrift' else +if (. eq 'DL') then 'Belastungsanzeige' else +if (. eq 'MG') then 'Zählernummer' else +if (. eq 'OI') then 'Vorherige Rechnung' else +if (. eq 'PK') then 'Packliste' else +if (. eq 'PL') then 'Preisliste' else +if (. eq 'POR') then 'Bestellantwort' else +if (. eq 'PP') then 'Bestelländerung' else +if (. eq 'TIN') then 'Transportauftrag' else +if (. eq 'VN') then 'Auftragsnummer (Lieferant)' else +."/> + </span> + </xsl:template> + <xsl:template name="PackageQuantity"> + <xsl:for-each select="ram:PackageQuantity"> + <xsl:for-each select="@unitCode"> + <span> + <xsl:text> </xsl:text> + </span> + <span> + <xsl:value-of select="if (. eq 'BA') then 'Tonne' else +if (. eq 'BC') then 'Getränkekiste' else +if (. eq 'BG') then 'Tüte, Beutel' else +if (. eq 'BO') then 'Flasche' else +if (. eq 'BX') then 'Schachtel' else +if (. eq 'CS') then 'Kiste' else +if (. eq 'CT') then 'Karton' else +if (. eq 'CX') then 'Dose' else +if (. eq 'NE') then 'Unverpackt oder ausgepackt' else +if (. eq 'PX') then 'Palette' else +if (. eq 'RO') then 'Rolle' else +if (. eq 'SA') then 'Sack' +else ."/> + </span> + </xsl:for-each> + </xsl:for-each> + </xsl:template> + <xsl:template name="local_Identifier"> + <span> + <xsl:text>(</xsl:text> + </span> + <xsl:choose> + <xsl:when test=". instance of element()"> + <xsl:apply-templates/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="."/> + </xsl:otherwise> + </xsl:choose> + <span> + <xsl:text>)</xsl:text> + </span> + </xsl:template> + <xsl:template name="Klassifikationsart"> + <xsl:for-each select="@listID"> + <span> + <xsl:text>, Art: </xsl:text> + </span> + <span> + <xsl:value-of select="if (. eq 'GPC') then 'Global Product Classification (GS1)' else +if (. eq 'ECL') then 'eCl@ass' else +if (. eq 'UNSPSC') then 'United Nations Standard Products and Services Code® (UNSPSC®)' else +if (. eq 'HS') then 'Zolltarifnummer (Harmonised System)' else +if (. eq 'CBV') then 'Gemeinsames Vokabular für öffentliche Aufträge (Common Procurement Vocabulary - CPV)' else +if (. eq 'SELLER_ASSIGNED') then 'vom Verkäufer vergeben' else +if (. eq 'BUYER_ASSIGNED') then 'vom Käufer vergeben' else +."/> + </span> + </xsl:for-each> + </xsl:template> + <xsl:template name="DeliveryTypeCode"> + <span> + <xsl:value-of select="if (. eq 'XW') then 'ab Werk' else +if (. eq 'FCA') then 'frei Frachtführer' else +if (. eq 'FAS') then 'frei längsseits Schiff' else +if (. eq 'FOB') then 'frei an Bord' else +if (. eq 'CFR') then 'Kosten und Fracht' else +if (. eq 'CIF') then 'Kosten, Versicherung und Fracht bis zum Bestimmungshafen' else +if (. eq 'DAT') then 'geliefert Terminal' else +if (. eq 'DAP') then 'geliefert benannter Ort' else +if (. eq 'CPT') then 'Fracht bezahlt bis' else +if (. eq 'CIP') then 'Fracht und Versicherung bezahlt' else +if (. eq 'DDP') then 'geliefert Zoll bezahlt' else +."/> + </span> + </xsl:template> + <xsl:template name="AllowanceChargeReasonCode"> + <span> + <xsl:text>(</xsl:text> + </span> + <span> + <xsl:value-of select="if (. eq 'AA') then 'Werbekostenzuschuß' else +if (. eq 'ADR') then 'Andere Dienste' else +if (. eq 'AEO') then 'Sammel- und Recyclingservice' else +if (. eq 'DI') then 'Abzug (Rabatt)' else +if (. eq 'EAB') then 'Skonto' else +if (. eq 'FC') then 'Frachtgebühren' else +if (. eq 'IN') then 'Versicherung' else +if (. eq 'MAC') then 'Mindermengenzuschlag' else +if (. eq 'NAA') then 'Einwegbehälter' else +if (. eq 'PC') then 'Verpacken' else +if (. eq 'RAA') then 'Rückvergütung' else +if (. eq 'SH') then 'Spezielle Handhabungsdienstleistungen' else +."/> + </span> + <span> + <xsl:text>)</xsl:text> + </span> + </xsl:template> + <xsl:function name="altova:is-cell-empty" as="xs:boolean"> + <xsl:param name="altova:cell" as="element()"/> + <xsl:sequence select="altova:is-node-empty( $altova:cell )"/> + </xsl:function> + <xsl:function name="altova:is-node-empty" as="xs:boolean"> + <xsl:param name="altova:node" as="element()"/> + <xsl:sequence select="every $altova:child in $altova:node/child::node() satisfies ( ( boolean( $altova:child/self::text() ) and string-length( $altova:child ) = 0 ) or ( ( boolean( $altova:child/self::div ) or boolean( $altova:child/self::span ) or boolean( $altova:child/self::a ) ) and altova:is-node-empty( $altova:child ) ) )"/> + </xsl:function> + <xsl:function name="altova:col-span" as="xs:integer"> + <xsl:param name="altova:cell" as="element()"/> + <xsl:sequence select="if ( exists( $altova:cell/@colspan ) ) then xs:integer( $altova:cell/@colspan ) else 1"/> + </xsl:function> + <xsl:template match="@* | node()" mode="altova:generate-table"> + <xsl:param name="altova:generate-cols"/> + <xsl:copy> + <xsl:apply-templates select="@* | node()" mode="#current"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:copy> + </xsl:template> + <xsl:template match="tbody" mode="altova:generate-table"> + <xsl:param name="altova:generate-cols"/> + <xsl:choose> + <xsl:when test="empty(tr)"> + <xsl:copy> + <tr> + <td/> + </tr> + </xsl:copy> + </xsl:when> + <xsl:otherwise> + <xsl:copy> + <xsl:apply-templates select="@* | node()" mode="#current"> + <xsl:with-param name="altova:generate-cols" select="$altova:generate-cols"/> + </xsl:apply-templates> + </xsl:copy> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template match="th | td" mode="altova:generate-table"> + <xsl:choose> + <xsl:when test="altova:is-cell-empty( . )"> + <xsl:copy> + <xsl:apply-templates select="@*" mode="#current"/> + <xsl:text> </xsl:text> + </xsl:copy> + </xsl:when> + <xsl:otherwise> + <xsl:copy> + <xsl:apply-templates select="@* | node()" mode="#current"/> + </xsl:copy> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:function name="altova:GetChartYValuesForSingleSeries"> + <xsl:param name="seqCategoryLeafPos" as="node()*"/> + <xsl:param name="nodeSeriesLeafPos" as="node()"/> + <xsl:param name="bValuesInCategory" as="xs:boolean"/> + <xsl:for-each select="$seqCategoryLeafPos"> + <xsl:element name="altova:Value"> + <xsl:value-of select="altova:GetChartYValueForSingleSeriesPos($nodeSeriesLeafPos, ., $bValuesInCategory)"/> + </xsl:element> + </xsl:for-each> + </xsl:function> + <xsl:function name="altova:GetChartYValueForSingleSeriesPos"> + <xsl:param name="nodeSeriesLeafPos" as="node()"/> + <xsl:param name="nodeCategoryLeafPos" as="node()"/> + <xsl:param name="bValuesInCategory" as="xs:boolean"/> + <xsl:variable name="altova:seqCategoryContextIds" select="$nodeCategoryLeafPos/altova:Context/@altova:ContextId" as="xs:string*"/> + <xsl:variable name="altova:seqSeriesContextIds" select="$nodeSeriesLeafPos/altova:Context/@altova:ContextId" as="xs:string*"/> + <xsl:variable name="altova:sCommonContextId" select="for $i in $altova:seqCategoryContextIds return if (some $j in $altova:seqSeriesContextIds satisfies $i eq $j) then $i else ()" as="xs:string*"/> + <xsl:choose> + <xsl:when test="count($altova:sCommonContextId) gt 1"> + <xsl:message select="concat('Es wurden mehrere Werte anstatt eines einzigen gefunden (Contexts: ', string-join($altova:sCommonContextId, ', '), ').')" terminate="yes"/> + </xsl:when> + <xsl:when test="count($altova:sCommonContextId) lt 1"> + <xsl:message select="concat('XBRL Chart: Info: No value found for position labeled "', $nodeCategoryLeafPos/@altova:sLabel, '"')" terminate="no"/> + <xsl:sequence select="'altova:no-value'"/> + </xsl:when> + <xsl:when test="$bValuesInCategory"> + <xsl:sequence select="xs:string($nodeCategoryLeafPos/altova:Context[@altova:ContextId eq $altova:sCommonContextId]/@altova:Value)"/> + </xsl:when> + <xsl:otherwise> + <xsl:sequence select="xs:string($nodeSeriesLeafPos/altova:Context[@altova:ContextId eq $altova:sCommonContextId]/@altova:Value)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:function> + <xsl:function name="altova:GetChartLabelForPos" as="xs:string"> + <xsl:param name="nodeParam" as="node()"/> + <xsl:value-of select="string-join($nodeParam/ancestor-or-self::altova:Pos/@altova:sLabel, ' ')"/> + </xsl:function> + <xsl:function name="altova:convert-length-to-pixel" as="xs:decimal"> + <xsl:param name="altova:length"/> + <xsl:variable name="normLength" select="normalize-space($altova:length)"/> + <xsl:choose> + <xsl:when test="ends-with($normLength, 'px')"> + <xsl:value-of select="substring-before($normLength, 'px')"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'in')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'in')) * $altova:nPxPerIn"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'cm')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'cm')) * $altova:nPxPerIn div 2.54"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'mm')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'mm')) * $altova:nPxPerIn div 25.4"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'pt')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'pt')) * $altova:nPxPerIn div 72.0"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'pc')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'pc')) * $altova:nPxPerIn div 6.0"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$normLength"/> + </xsl:otherwise> + </xsl:choose> + </xsl:function> + <xsl:function name="altova:convert-length-to-mm" as="xs:decimal"> + <xsl:param name="altova:length"/> + <xsl:variable name="normLength" select="normalize-space($altova:length)"/> + <xsl:choose> + <xsl:when test="ends-with($normLength, 'px')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'px')) div $altova:nPxPerIn * 25.4"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'in')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'in')) * 25.4"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'cm')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'cm')) * 10"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'mm')"> + <xsl:value-of select="substring-before($normLength, 'mm') "/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'pt')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'pt')) * 25.4 div 72.0"/> + </xsl:when> + <xsl:when test="ends-with($normLength, 'pc')"> + <xsl:value-of select="xs:decimal(substring-before($normLength, 'pc')) * 25.4 div 6.0"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="number($normLength) div $altova:nPxPerIn * 25.4"/> + </xsl:otherwise> + </xsl:choose> + </xsl:function> +</xsl:stylesheet> diff --git a/src/main/resources/stylesheets/cii-xr.xsl b/src/main/resources/stylesheets/cii-xr.xsl new file mode 100644 index 00000000..5fca7b9d --- /dev/null +++ b/src/main/resources/stylesheets/cii-xr.xsl @@ -0,0 +1,2202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xr="urn:ce.eu:en16931:2017:xoev-de:kosit:standard:xrechnung-1" + xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" + xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" + xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100" + xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" + xmlns:saxon="http://saxon.sf.net/" + exclude-result-prefixes="#all" + version="2.0"> + <xd:doc scope="stylesheet"> + <xd:desc> + <xd:p> + <xd:b>Author:</xd:b> KoSIT Bremen (kosit@finanzen.bremen.de)</xd:p> + <xd:b>Fassung vom: 2019-03-18+01:00</xd:b> + <xd:p>Überführt eine zur EN 16931 konforme elektronische Rechnung in der konkreten Syntax UNCEFACT.CII.D16B in eine Instanz gemäß des Schemas für den Namensraum urn:ce.eu:en16931:2017:xoev-de:kosit:standard:xrechnung-1.</xd:p> + <xd:p>Das Skript setzt voraus, dass das zu verarbeitende Dokument valide bzgl. des XML Schemas und der Schematron-Regeln der Quelle ist. Für nicht valide Dokumente ist das Ergebnis nicht definiert.</xd:p> + </xd:desc> + </xd:doc> + + <xsl:output method="xml" indent="yes"/> + + <xsl:template match="/rsm:CrossIndustryInvoice"> + <xr:invoice> + <xsl:variable name="current-bg" as="element()" select="."/> + <xsl:apply-templates mode="BT-1" select="./rsm:ExchangedDocument/ram:ID"/> + <xsl:apply-templates mode="BT-2" + select="./rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString[@format = '102']"/> + <xsl:apply-templates mode="BT-3" select="./rsm:ExchangedDocument/ram:TypeCode"/> + <xsl:apply-templates mode="BT-5" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode"/> + <xsl:apply-templates mode="BT-6" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:TaxCurrencyCode"/> + <xsl:apply-templates mode="BT-7" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:TaxPointDate/udt:DateString[@format = '102']"/> + <xsl:apply-templates mode="BT-8" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:DueDateTypeCode"/> + <xsl:apply-templates mode="BT-9" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString[@format = '102']"/> + <xsl:apply-templates mode="BT-10" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"/> + <xsl:apply-templates mode="BT-11" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SpecifiedProcuringProject/ram:ID"/> + <xsl:apply-templates mode="BT-12" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:ContractReferencedDocument/ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-13" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerOrderReferencedDocument/ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-14" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerOrderReferencedDocument/ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-15" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ReceivingAdviceReferencedDocument/ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-16" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:DespatchAdviceReferencedDocument/ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-17" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='50']"/> + <xsl:apply-templates mode="BT-18" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='130']"/> + <xsl:apply-templates mode="BT-19" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ReceivableSpecifiedTradeAccountingAccount/ram:ID"/> + <xsl:apply-templates mode="BT-20" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description"/> + <xsl:apply-templates mode="BG-1" select="./rsm:ExchangedDocument/ram:IncludedNote"/> + <xsl:apply-templates mode="BG-2" select="./rsm:ExchangedDocumentContext"/> + <xsl:apply-templates mode="BG-3" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceReferencedDocument"/> + <xsl:apply-templates mode="BG-4" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty"/> + <xsl:apply-templates mode="BG-7" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty"/> + <xsl:apply-templates mode="BG-10" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty"/> + <xsl:apply-templates mode="BG-11" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty"/> + <xsl:apply-templates mode="BG-13" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty"/> + <!--Manuell: angepasst für BG-16--> + <xsl:for-each-group select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans" + group-by="ram:TypeCode"> + <xr:PAYMENT_INSTRUCTIONS> + <xsl:attribute name="xr:id" select="'BG-16'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:apply-templates mode="BT-81" select="current-group()[1]/ram:TypeCode"/> + <xsl:apply-templates mode="BT-82" select="./ram:Information"/> + <xsl:apply-templates mode="BT-83" + select="current-group()[1]/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PaymentReference"/> + <xsl:apply-templates mode="BG-17" + select="current-group()/ram:PayeePartyCreditorFinancialAccount"/> + <xsl:apply-templates mode="BG-18" + select="current-group()/ram:ApplicableTradeSettlementFinancialCard"/> + <xsl:apply-templates mode="BG-19" + select="current-group()/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement"/> + </xr:PAYMENT_INSTRUCTIONS> + </xsl:for-each-group> + <xsl:apply-templates mode="BG-20" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false']"/> + <xsl:apply-templates mode="BG-21" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true']"/> + <xsl:apply-templates mode="BG-22" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation"/> + <xsl:apply-templates mode="BG-23" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax"/> + <xsl:apply-templates mode="BG-24" + select="./rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument"/> + <xsl:apply-templates mode="BG-25" + select="./rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem"/> + </xr:invoice> + </xsl:template> + <xsl:template mode="BT-1" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID"> + <xr:Invoice_number> + <xsl:attribute name="xr:id" select="'BT-1'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Invoice_number> + </xsl:template> + <xsl:template mode="BT-2" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString[@format = '102']"> + <xr:Invoice_issue_date> + <xsl:attribute name="xr:id" select="'BT-2'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Invoice_issue_date> + </xsl:template> + <xsl:template mode="BT-3" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:TypeCode"> + <xr:Invoice_type_code> + <xsl:attribute name="xr:id" select="'BT-3'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoice_type_code> + </xsl:template> + <xsl:template mode="BT-5" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode"> + <xr:Invoice_currency_code> + <xsl:attribute name="xr:id" select="'BT-5'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoice_currency_code> + </xsl:template> + <xsl:template mode="BT-6" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:TaxCurrencyCode"> + <xr:VAT_accounting_currency_code> + <xsl:attribute name="xr:id" select="'BT-6'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:VAT_accounting_currency_code> + </xsl:template> + <xsl:template mode="BT-7" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:TaxPointDate/udt:DateString[@format = '102']"> + <xr:Value_added_tax_point_date> + <xsl:attribute name="xr:id" select="'BT-7'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Value_added_tax_point_date> + </xsl:template> + <xsl:template mode="BT-8" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:DueDateTypeCode"> + <xr:Value_added_tax_point_date_code> + <xsl:attribute name="xr:id" select="'BT-8'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Value_added_tax_point_date_code> + </xsl:template> + <xsl:template mode="BT-9" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString[@format = '102']"> + <xr:Payment_due_date> + <xsl:attribute name="xr:id" select="'BT-9'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Payment_due_date> + </xsl:template> + <xsl:template mode="BT-10" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"> + <xr:Buyer_reference> + <xsl:attribute name="xr:id" select="'BT-10'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_reference> + </xsl:template> + <xsl:template mode="BT-11" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SpecifiedProcuringProject/ram:ID"> + <xr:Project_reference> + <xsl:attribute name="xr:id" select="'BT-11'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Project_reference> + </xsl:template> + <xsl:template mode="BT-12" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:ContractReferencedDocument/ram:IssuerAssignedID"> + <xr:Contract_reference> + <xsl:attribute name="xr:id" select="'BT-12'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Contract_reference> + </xsl:template> + <xsl:template mode="BT-13" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerOrderReferencedDocument/ram:IssuerAssignedID"> + <xr:Purchase_order_reference> + <xsl:attribute name="xr:id" select="'BT-13'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Purchase_order_reference> + </xsl:template> + <xsl:template mode="BT-14" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerOrderReferencedDocument/ram:IssuerAssignedID"> + <xr:Sales_order_reference> + <xsl:attribute name="xr:id" select="'BT-14'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Sales_order_reference> + </xsl:template> + <xsl:template mode="BT-15" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ReceivingAdviceReferencedDocument/ram:IssuerAssignedID"> + <xr:Receiving_advice_reference> + <xsl:attribute name="xr:id" select="'BT-15'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Receiving_advice_reference> + </xsl:template> + <xsl:template mode="BT-16" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:DespatchAdviceReferencedDocument/ram:IssuerAssignedID"> + <xr:Despatch_advice_reference> + <xsl:attribute name="xr:id" select="'BT-16'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Despatch_advice_reference> + </xsl:template> + <xsl:template mode="BT-17" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='50']"> + <xr:Tender_or_lot_reference> + <xsl:attribute name="xr:id" select="'BT-17'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Tender_or_lot_reference> + </xsl:template> + <xsl:template mode="BT-18" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='130']"> + <xr:Invoiced_object_identifier> + <xsl:attribute name="xr:id" select="'BT-18'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"> + <xsl:with-param name="schemeID" select="following-sibling::ram:ReferenceTypeCode"/> + </xsl:call-template> + </xr:Invoiced_object_identifier> + </xsl:template> + <xsl:template mode="BT-19" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ReceivableSpecifiedTradeAccountingAccount/ram:ID"> + <xr:Buyer_accounting_reference> + <xsl:attribute name="xr:id" select="'BT-19'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_accounting_reference> + </xsl:template> + <xsl:template mode="BT-20" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description"> + <xr:Payment_terms> + <xsl:attribute name="xr:id" select="'BT-20'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payment_terms> + </xsl:template> + <xsl:template mode="BG-1" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-21" select="./ram:SubjectCode"/> + <xsl:apply-templates mode="BT-22" select="./ram:Content"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICE_NOTE> + <xsl:attribute name="xr:id" select="'BG-1'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICE_NOTE> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-21" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote/ram:SubjectCode"> + <xr:Invoice_note_subject_code> + <xsl:attribute name="xr:id" select="'BT-21'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoice_note_subject_code> + </xsl:template> + <xsl:template mode="BT-22" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote/ram:Content"> + <xr:Invoice_note> + <xsl:attribute name="xr:id" select="'BT-22'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Invoice_note> + </xsl:template> + <xsl:template mode="BG-2" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocumentContext"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:ExchangedDocumentContext der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-23" + select="./ram:BusinessProcessSpecifiedDocumentContextParameter/ram:ID"/> + <xsl:apply-templates mode="BT-24" + select="./ram:GuidelineSpecifiedDocumentContextParameter/ram:ID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PROCESS_CONTROL> + <xsl:attribute name="xr:id" select="'BG-2'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PROCESS_CONTROL> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-23" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocumentContext/ram:BusinessProcessSpecifiedDocumentContextParameter/ram:ID"> + <xr:Business_process_type> + <xsl:attribute name="xr:id" select="'BT-23'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Business_process_type> + </xsl:template> + <xsl:template mode="BT-24" + match="/rsm:CrossIndustryInvoice/rsm:ExchangedDocumentContext/ram:GuidelineSpecifiedDocumentContextParameter/ram:ID"> + <xr:Specification_identifier> + <xsl:attribute name="xr:id" select="'BT-24'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Specification_identifier> + </xsl:template> + <xsl:template mode="BG-3" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceReferencedDocument"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceReferencedDocument der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-25" select="./ram:IssuerAssignedID"/> + <xsl:apply-templates mode="BT-26" + select="./ram:FormattedIssueDateTime/qdt:DateTimeString[@format = '102']"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PRECEDING_INVOICE_REFERENCE> + <xsl:attribute name="xr:id" select="'BG-3'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PRECEDING_INVOICE_REFERENCE> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-25" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceReferencedDocument/ram:IssuerAssignedID"> + <xr:Preceding_Invoice_reference> + <xsl:attribute name="xr:id" select="'BT-25'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Preceding_Invoice_reference> + </xsl:template> + <xsl:template mode="BT-26" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceReferencedDocument/ram:FormattedIssueDateTime/qdt:DateTimeString[@format = '102']"> + <xr:Preceding_Invoice_issue_date> + <xsl:attribute name="xr:id" select="'BT-26'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Preceding_Invoice_issue_date> + </xsl:template> + <xsl:template mode="BG-4" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty der Instanz in konkreter Syntax wird auf 10 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-27" select="./ram:Name"/> + <xsl:apply-templates mode="BT-28" + select="./ram:SpecifiedLegalOrganization/ram:TradingBusinessName"/> + <xsl:apply-templates mode="BT-29" select="./ram:GlobalID[exists(@schemeID)]"/> + <xsl:apply-templates mode="BT-29" + select="./ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"/> + <xsl:apply-templates mode="BT-30" select="./ram:SpecifiedLegalOrganization/ram:ID"/> + <xsl:apply-templates mode="BT-31" + select="./ram:SpecifiedTaxRegistration/ram:ID[@schemeID=('VA', 'VAT')]"/> + <xsl:apply-templates mode="BT-32" + select="./ram:SpecifiedTaxRegistration/ram:ID[@schemeID='FC']"/> + <xsl:apply-templates mode="BT-33" select="./ram:Description"/> + <xsl:apply-templates mode="BT-34" select="./ram:URIUniversalCommunication/ram:URIID"/> + <xsl:apply-templates mode="BG-5" select="./ram:PostalTradeAddress"/> + <xsl:apply-templates mode="BG-6" select="./ram:DefinedTradeContact"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:SELLER> + <xsl:attribute name="xr:id" select="'BG-4'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:SELLER> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-27" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name"> + <xr:Seller_name> + <xsl:attribute name="xr:id" select="'BT-27'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_name> + </xsl:template> + <xsl:template mode="BT-28" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedLegalOrganization/ram:TradingBusinessName"> + <xr:Seller_trading_name> + <xsl:attribute name="xr:id" select="'BT-28'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_trading_name> + </xsl:template> + <xsl:template mode="BT-29" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:GlobalID[exists(@schemeID)]"> + <xr:Seller_identifier> + <xsl:attribute name="xr:id" select="'BT-29'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Seller_identifier> + </xsl:template> + <xsl:template mode="BT-29" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"> + <xr:Seller_identifier> + <xsl:attribute name="xr:id" select="'BT-29'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Seller_identifier> + </xsl:template> + <xsl:template mode="BT-30" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedLegalOrganization/ram:ID"> + <xr:Seller_legal_registration_identifier> + <xsl:attribute name="xr:id" select="'BT-30'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Seller_legal_registration_identifier> + </xsl:template> + <xsl:template mode="BT-31" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID=('VA', 'VAT')]"> + <xr:Seller_VAT_identifier> + <xsl:attribute name="xr:id" select="'BT-31'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Seller_VAT_identifier> + </xsl:template> + <xsl:template mode="BT-32" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID='FC']"> + <xr:Seller_tax_registration_identifier> + <xsl:attribute name="xr:id" select="'BT-32'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Seller_tax_registration_identifier> + </xsl:template> + <xsl:template mode="BT-33" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Description"> + <xr:Seller_additional_legal_information> + <xsl:attribute name="xr:id" select="'BT-33'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_additional_legal_information> + </xsl:template> + <xsl:template mode="BT-34" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:URIUniversalCommunication/ram:URIID"> + <xr:Seller_electronic_address> + <xsl:attribute name="xr:id" select="'BT-34'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Seller_electronic_address> + </xsl:template> + <xsl:template mode="BG-5" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-35" select="./ram:LineOne"/> + <xsl:apply-templates mode="BT-36" select="./ram:LineTwo"/> + <xsl:apply-templates mode="BT-162" select="./ram:LineThree"/> + <xsl:apply-templates mode="BT-37" select="./ram:CityName"/> + <xsl:apply-templates mode="BT-38" select="./ram:PostcodeCode"/> + <xsl:apply-templates mode="BT-39" select="./ram:CountrySubDivisionName"/> + <xsl:apply-templates mode="BT-40" select="./ram:CountryID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:SELLER_POSTAL_ADDRESS> + <xsl:attribute name="xr:id" select="'BG-5'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:SELLER_POSTAL_ADDRESS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-35" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineOne"> + <xr:Seller_address_line_1> + <xsl:attribute name="xr:id" select="'BT-35'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_address_line_1> + </xsl:template> + <xsl:template mode="BT-36" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineTwo"> + <xr:Seller_address_line_2> + <xsl:attribute name="xr:id" select="'BT-36'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_address_line_2> + </xsl:template> + <xsl:template mode="BT-162" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineThree"> + <xr:Seller_address_line_3> + <xsl:attribute name="xr:id" select="'BT-162'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_address_line_3> + </xsl:template> + <xsl:template mode="BT-37" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:CityName"> + <xr:Seller_city> + <xsl:attribute name="xr:id" select="'BT-37'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_city> + </xsl:template> + <xsl:template mode="BT-38" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode"> + <xr:Seller_post_code> + <xsl:attribute name="xr:id" select="'BT-38'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_post_code> + </xsl:template> + <xsl:template mode="BT-39" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:CountrySubDivisionName"> + <xr:Seller_country_subdivision> + <xsl:attribute name="xr:id" select="'BT-39'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_country_subdivision> + </xsl:template> + <xsl:template mode="BT-40" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:CountryID"> + <xr:Seller_country_code> + <xsl:attribute name="xr:id" select="'BT-40'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Seller_country_code> + </xsl:template> + <xsl:template mode="BG-6" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-41" select="./ram:DepartmentName"/> + <xsl:apply-templates mode="BT-41" select="./ram:PersonName"/> + <xsl:apply-templates mode="BT-42" + select="./ram:TelephoneUniversalCommunication/ram:CompleteNumber"/> + <xsl:apply-templates mode="BT-43" select="./ram:EmailURIUniversalCommunication/ram:URIID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:SELLER_CONTACT> + <xsl:attribute name="xr:id" select="'BG-6'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:SELLER_CONTACT> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-41" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact/ram:DepartmentName"> + <xr:Seller_contact_point> + <xsl:attribute name="xr:id" select="'BT-41'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_contact_point> + </xsl:template> + <xsl:template mode="BT-41" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact/ram:PersonName"> + <xr:Seller_contact_point> + <xsl:attribute name="xr:id" select="'BT-41'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_contact_point> + </xsl:template> + <xsl:template mode="BT-42" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact/ram:TelephoneUniversalCommunication/ram:CompleteNumber"> + <xr:Seller_contact_telephone_number> + <xsl:attribute name="xr:id" select="'BT-42'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_contact_telephone_number> + </xsl:template> + <xsl:template mode="BT-43" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:DefinedTradeContact/ram:EmailURIUniversalCommunication/ram:URIID"> + <xr:Seller_contact_email_address> + <xsl:attribute name="xr:id" select="'BT-43'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_contact_email_address> + </xsl:template> + <xsl:template mode="BG-7" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty der Instanz in konkreter Syntax wird auf 8 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-44" select="./ram:Name"/> + <xsl:apply-templates mode="BT-45" + select="./ram:SpecifiedLegalOrganization/ram:TradingBusinessName"/> + <xsl:apply-templates mode="BT-46" + select="./ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"/> + <xsl:apply-templates mode="BT-46" select="./ram:GlobalID[exists(@schemeID)]"/> + <xsl:apply-templates mode="BT-47" select="./ram:SpecifiedLegalOrganization/ram:ID"/> + <xsl:apply-templates mode="BT-48" + select="./ram:SpecifiedTaxRegistration/ram:ID[@schemeID=('VA', 'VAT')]"/> + <xsl:apply-templates mode="BT-49" select="./ram:URIUniversalCommunication/ram:URIID"/> + <xsl:apply-templates mode="BG-8" select="./ram:PostalTradeAddress"/> + <xsl:apply-templates mode="BG-9" select="./ram:DefinedTradeContact"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:BUYER> + <xsl:attribute name="xr:id" select="'BG-7'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:BUYER> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-44" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:Name"> + <xr:Buyer_name> + <xsl:attribute name="xr:id" select="'BT-44'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_name> + </xsl:template> + <xsl:template mode="BT-45" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:SpecifiedLegalOrganization/ram:TradingBusinessName"> + <xr:Buyer_trading_name> + <xsl:attribute name="xr:id" select="'BT-45'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_trading_name> + </xsl:template> + <xsl:template mode="BT-46" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"> + <xr:Buyer_identifier> + <xsl:attribute name="xr:id" select="'BT-46'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Buyer_identifier> + </xsl:template> + <xsl:template mode="BT-46" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:GlobalID[exists(@schemeID)]"> + <xr:Buyer_identifier> + <xsl:attribute name="xr:id" select="'BT-46'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Buyer_identifier> + </xsl:template> + <xsl:template mode="BT-47" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:SpecifiedLegalOrganization/ram:ID"> + <xr:Buyer_legal_registration_identifier> + <xsl:attribute name="xr:id" select="'BT-47'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Buyer_legal_registration_identifier> + </xsl:template> + <xsl:template mode="BT-48" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID=('VA', 'VAT')]"> + <xr:Buyer_VAT_identifier> + <xsl:attribute name="xr:id" select="'BT-48'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Buyer_VAT_identifier> + </xsl:template> + <xsl:template mode="BT-49" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:URIUniversalCommunication/ram:URIID"> + <xr:Buyer_electronic_address> + <xsl:attribute name="xr:id" select="'BT-49'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Buyer_electronic_address> + </xsl:template> + <xsl:template mode="BG-8" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-50" select="./ram:LineOne"/> + <xsl:apply-templates mode="BT-51" select="./ram:LineTwo"/> + <xsl:apply-templates mode="BT-163" select="./ram:LineThree"/> + <xsl:apply-templates mode="BT-52" select="./ram:CityName"/> + <xsl:apply-templates mode="BT-53" select="./ram:PostcodeCode"/> + <xsl:apply-templates mode="BT-54" select="./ram:CountrySubDivisionName"/> + <xsl:apply-templates mode="BT-55" select="./ram:CountryID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:BUYER_POSTAL_ADDRESS> + <xsl:attribute name="xr:id" select="'BG-8'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:BUYER_POSTAL_ADDRESS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-50" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineOne"> + <xr:Buyer_address_line_1> + <xsl:attribute name="xr:id" select="'BT-50'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_address_line_1> + </xsl:template> + <xsl:template mode="BT-51" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineTwo"> + <xr:Buyer_address_line_2> + <xsl:attribute name="xr:id" select="'BT-51'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_address_line_2> + </xsl:template> + <xsl:template mode="BT-163" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineThree"> + <xr:Buyer_address_line_3> + <xsl:attribute name="xr:id" select="'BT-163'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_address_line_3> + </xsl:template> + <xsl:template mode="BT-52" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CityName"> + <xr:Buyer_city> + <xsl:attribute name="xr:id" select="'BT-52'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_city> + </xsl:template> + <xsl:template mode="BT-53" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode"> + <xr:Buyer_post_code> + <xsl:attribute name="xr:id" select="'BT-53'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_post_code> + </xsl:template> + <xsl:template mode="BT-54" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CountrySubDivisionName"> + <xr:Buyer_country_subdivision> + <xsl:attribute name="xr:id" select="'BT-54'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_country_subdivision> + </xsl:template> + <xsl:template mode="BT-55" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CountryID"> + <xr:Buyer_country_code> + <xsl:attribute name="xr:id" select="'BT-55'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Buyer_country_code> + </xsl:template> + <xsl:template mode="BG-9" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-56" select="./ram:DepartmentName"/> + <xsl:apply-templates mode="BT-56" select="./ram:PersonName"/> + <xsl:apply-templates mode="BT-57" + select="./ram:TelephoneUniversalCommunication/ram:CompleteNumber"/> + <xsl:apply-templates mode="BT-58" select="./ram:EmailURIUniversalCommunication/ram:URIID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:BUYER_CONTACT> + <xsl:attribute name="xr:id" select="'BG-9'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:BUYER_CONTACT> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-56" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact/ram:DepartmentName"> + <xr:Buyer_contact_point> + <xsl:attribute name="xr:id" select="'BT-56'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_contact_point> + </xsl:template> + <xsl:template mode="BT-56" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact/ram:PersonName"> + <xr:Buyer_contact_point> + <xsl:attribute name="xr:id" select="'BT-56'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_contact_point> + </xsl:template> + <xsl:template mode="BT-57" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact/ram:TelephoneUniversalCommunication/ram:CompleteNumber"> + <xr:Buyer_contact_telephone_number> + <xsl:attribute name="xr:id" select="'BT-57'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_contact_telephone_number> + </xsl:template> + <xsl:template mode="BT-58" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:DefinedTradeContact/ram:EmailURIUniversalCommunication/ram:URIID"> + <xr:Buyer_contact_email_address> + <xsl:attribute name="xr:id" select="'BT-58'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Buyer_contact_email_address> + </xsl:template> + <xsl:template mode="BG-10" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-59" select="./ram:Name"/> + <xsl:apply-templates mode="BT-60" select="./ram:GlobalID[exists(@schemeID)]"/> + <xsl:apply-templates mode="BT-60" + select="./ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"/> + <xsl:apply-templates mode="BT-61" select="./ram:SpecifiedLegalOrganization/ram:ID/@schemeID"/> + <xsl:apply-templates mode="BT-61" select="./ram:SpecifiedLegalOrganization/ram:ID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PAYEE> + <xsl:attribute name="xr:id" select="'BG-10'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PAYEE> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-59" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty/ram:Name"> + <xr:Payee_name> + <xsl:attribute name="xr:id" select="'BT-59'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payee_name> + </xsl:template> + <xsl:template mode="BT-60" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty/ram:GlobalID[exists(@schemeID)]"> + <xr:Payee_identifier> + <xsl:attribute name="xr:id" select="'BT-60'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Payee_identifier> + </xsl:template> + <xsl:template mode="BT-60" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty/ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"> + <xr:Payee_identifier> + <xsl:attribute name="xr:id" select="'BT-60'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Payee_identifier> + </xsl:template> + <xsl:template mode="BT-61" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty/ram:SpecifiedLegalOrganization/ram:ID/@schemeID"> + <xr:Payee_legal_registration_identifier> + <xsl:attribute name="xr:id" select="'BT-61'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Payee_legal_registration_identifier> + </xsl:template> + <xsl:template mode="BT-61" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty/ram:SpecifiedLegalOrganization/ram:ID"> + <xr:Payee_legal_registration_identifier> + <xsl:attribute name="xr:id" select="'BT-61'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Payee_legal_registration_identifier> + </xsl:template> + <xsl:template mode="BG-11" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-62" select="./ram:Name"/> + <xsl:apply-templates mode="BT-63" select="./ram:SpecifiedTaxRegistration/ram:ID"/> + <xsl:apply-templates mode="BG-12" select="./ram:PostalTradeAddress"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:SELLER_TAX_REPRESENTATIVE_PARTY> + <xsl:attribute name="xr:id" select="'BG-11'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:SELLER_TAX_REPRESENTATIVE_PARTY> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-62" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:Name"> + <xr:Seller_tax_representative_name> + <xsl:attribute name="xr:id" select="'BT-62'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Seller_tax_representative_name> + </xsl:template> + <xsl:template mode="BT-63" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID"> + <xr:Seller_tax_representative_VAT_identifier> + <xsl:attribute name="xr:id" select="'BT-63'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Seller_tax_representative_VAT_identifier> + </xsl:template> + <xsl:template mode="BG-12" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-64" select="./ram:LineOne"/> + <xsl:apply-templates mode="BT-65" select="./ram:LineTwo"/> + <xsl:apply-templates mode="BT-164" select="./ram:LineThree"/> + <xsl:apply-templates mode="BT-66" select="./ram:CityName"/> + <xsl:apply-templates mode="BT-67" select="./ram:PostcodeCode"/> + <xsl:apply-templates mode="BT-68" select="./ram:CountrySubDivisionName"/> + <xsl:apply-templates mode="BT-69" select="./ram:CountryID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:SELLER_TAX_REPRESENTATIVE_POSTAL_ADDRESS> + <xsl:attribute name="xr:id" select="'BG-12'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:SELLER_TAX_REPRESENTATIVE_POSTAL_ADDRESS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-64" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:LineOne"> + <xr:Tax_representative_address_line_1> + <xsl:attribute name="xr:id" select="'BT-64'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_address_line_1> + </xsl:template> + <xsl:template mode="BT-65" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:LineTwo"> + <xr:Tax_representative_address_line_2> + <xsl:attribute name="xr:id" select="'BT-65'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_address_line_2> + </xsl:template> + <xsl:template mode="BT-164" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:LineThree"> + <xr:Tax_representative_address_line_3> + <xsl:attribute name="xr:id" select="'BT-164'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_address_line_3> + </xsl:template> + <xsl:template mode="BT-66" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:CityName"> + <xr:Tax_representative_city> + <xsl:attribute name="xr:id" select="'BT-66'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_city> + </xsl:template> + <xsl:template mode="BT-67" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:PostcodeCode"> + <xr:Tax_representative_post_code> + <xsl:attribute name="xr:id" select="'BT-67'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_post_code> + </xsl:template> + <xsl:template mode="BT-68" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:CountrySubDivisionName"> + <xr:Tax_representative_country_subdivision> + <xsl:attribute name="xr:id" select="'BT-68'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Tax_representative_country_subdivision> + </xsl:template> + <xsl:template mode="BT-69" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:PostalTradeAddress/ram:CountryID"> + <xr:Tax_representative_country_code> + <xsl:attribute name="xr:id" select="'BT-69'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Tax_representative_country_code> + </xsl:template> + <xsl:template mode="BG-13" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty der Instanz in konkreter Syntax wird auf 5 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-70" select="./ram:Name"/> + <xsl:apply-templates mode="BT-71" select="./ram:GlobalID[exists(@schemeID)]"/> + <xsl:apply-templates mode="BT-71" + select="./ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"/> + <xsl:apply-templates mode="BT-72" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime/udt:DateTimeString[@format = '102']"/> + <xsl:apply-templates mode="BG-14" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod"/> + <xsl:apply-templates mode="BG-15" select="./ram:PostalTradeAddress"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DELIVERY_INFORMATION> + <xsl:attribute name="xr:id" select="'BG-13'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DELIVERY_INFORMATION> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-70" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:Name"> + <xr:Deliver_to_party_name> + <xsl:attribute name="xr:id" select="'BT-70'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_party_name> + </xsl:template> + <xsl:template mode="BT-71" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:GlobalID[exists(@schemeID)]"> + <xr:Deliver_to_location_identifier> + <xsl:attribute name="xr:id" select="'BT-71'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Deliver_to_location_identifier> + </xsl:template> + <xsl:template mode="BT-71" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:ID[empty(following-sibling::ram:GlobalID/@schemeID)]"> + <xr:Deliver_to_location_identifier> + <xsl:attribute name="xr:id" select="'BT-71'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Deliver_to_location_identifier> + </xsl:template> + <xsl:template mode="BT-72" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime/udt:DateTimeString[@format = '102']"> + <xr:Actual_delivery_date> + <xsl:attribute name="xr:id" select="'BT-72'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Actual_delivery_date> + </xsl:template> + <xsl:template mode="BG-14" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-73" + select="./ram:StartDateTime/udt:DateTimeString[@format = '102']"/> + <xsl:apply-templates mode="BT-74" + select="./ram:EndDateTime/udt:DateTimeString[@format = '102']"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICING_PERIOD> + <xsl:attribute name="xr:id" select="'BG-14'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICING_PERIOD> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-73" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod/ram:StartDateTime/udt:DateTimeString[@format = '102']"> + <xr:Invoicing_period_start_date> + <xsl:attribute name="xr:id" select="'BT-73'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Invoicing_period_start_date> + </xsl:template> + <xsl:template mode="BT-74" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod/ram:EndDateTime/udt:DateTimeString[@format = '102']"> + <xr:Invoicing_period_end_date> + <xsl:attribute name="xr:id" select="'BT-74'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Invoicing_period_end_date> + </xsl:template> + <xsl:template mode="BG-15" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-75" select="./ram:LineOne"/> + <xsl:apply-templates mode="BT-76" select="./ram:LineTwo"/> + <xsl:apply-templates mode="BT-165" select="./ram:LineThree"/> + <xsl:apply-templates mode="BT-77" select="./ram:CityName"/> + <xsl:apply-templates mode="BT-78" select="./ram:PostcodeCode"/> + <xsl:apply-templates mode="BT-79" select="./ram:CountrySubDivisionName"/> + <xsl:apply-templates mode="BT-80" select="./ram:CountryID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DELIVER_TO_ADDRESS> + <xsl:attribute name="xr:id" select="'BG-15'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DELIVER_TO_ADDRESS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-75" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:LineOne"> + <xr:Deliver_to_address_line_1> + <xsl:attribute name="xr:id" select="'BT-75'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_address_line_1> + </xsl:template> + <xsl:template mode="BT-76" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:LineTwo"> + <xr:Deliver_to_address_line_2> + <xsl:attribute name="xr:id" select="'BT-76'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_address_line_2> + </xsl:template> + <xsl:template mode="BT-165" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:LineThree"> + <xr:Deliver_to_address_line_3> + <xsl:attribute name="xr:id" select="'BT-165'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_address_line_3> + </xsl:template> + <xsl:template mode="BT-77" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:CityName"> + <xr:Deliver_to_city> + <xsl:attribute name="xr:id" select="'BT-77'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_city> + </xsl:template> + <xsl:template mode="BT-78" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:PostcodeCode"> + <xr:Deliver_to_post_code> + <xsl:attribute name="xr:id" select="'BT-78'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_post_code> + </xsl:template> + <xsl:template mode="BT-79" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:CountrySubDivisionName"> + <xr:Deliver_to_country_subdivision> + <xsl:attribute name="xr:id" select="'BT-79'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Deliver_to_country_subdivision> + </xsl:template> + <xsl:template mode="BT-80" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:PostalTradeAddress/ram:CountryID"> + <xr:Deliver_to_country_code> + <xsl:attribute name="xr:id" select="'BT-80'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Deliver_to_country_code> + </xsl:template> + <xsl:template mode="BG-16" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans der Instanz in konkreter Syntax wird auf 6 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-81" select="./ram:TypeCode"/> + <xsl:apply-templates mode="BT-82" select="./ram:Information"/> + <xsl:apply-templates mode="BT-83" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PaymentReference"/> + <xsl:apply-templates mode="BG-17" select="./ram:PayeePartyCreditorFinancialAccount"/> + <xsl:apply-templates mode="BG-18" select="./ram:ApplicableTradeSettlementFinancialCard"/> + <xsl:apply-templates mode="BG-19" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PAYMENT_INSTRUCTIONS> + <xsl:attribute name="xr:id" select="'BG-16'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PAYMENT_INSTRUCTIONS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-81" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:TypeCode"> + <xr:Payment_means_type_code> + <xsl:attribute name="xr:id" select="'BT-81'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Payment_means_type_code> + </xsl:template> + <xsl:template mode="BT-82" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:Information"> + <xr:Payment_means_text> + <xsl:attribute name="xr:id" select="'BT-82'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payment_means_text> + </xsl:template> + <xsl:template mode="BT-83" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:PaymentReference"> + <xr:Remittance_information> + <xsl:attribute name="xr:id" select="'BT-83'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Remittance_information> + </xsl:template> + <xsl:template mode="BG-17" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-84" select="./ram:ProprietaryID"/> + <xsl:apply-templates mode="BT-84" select="./ram:IBANID"/> + <xsl:apply-templates mode="BT-85" select="./ram:AccountName"/> + <xsl:apply-templates mode="BT-86" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeeSpecifiedCreditorFinancialInstitution/ram:BICID"/> + <xsl:apply-templates mode="BT-86" + select="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeeSpecifiedCreditorFinancialInstitution/ram:BICID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:CREDIT_TRANSFER> + <xsl:attribute name="xr:id" select="'BG-17'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:CREDIT_TRANSFER> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-84" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID"> + <xr:Payment_account_identifier> + <xsl:attribute name="xr:id" select="'BT-84'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Payment_account_identifier> + </xsl:template> + <xsl:template mode="BT-84" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:IBANID"> + <xr:Payment_account_identifier> + <xsl:attribute name="xr:id" select="'BT-84'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Payment_account_identifier> + </xsl:template> + <xsl:template mode="BT-85" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:AccountName"> + <xr:Payment_account_name> + <xsl:attribute name="xr:id" select="'BT-85'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payment_account_name> + </xsl:template> + <xsl:template mode="BT-86" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeeSpecifiedCreditorFinancialInstitution/ram:BICID"> + <xr:Payment_service_provider_identifier> + <xsl:attribute name="xr:id" select="'BT-86'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Payment_service_provider_identifier> + </xsl:template> + <xsl:template mode="BT-86" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeeSpecifiedCreditorFinancialInstitution/ram:BICID"> + <xr:Payment_service_provider_identifier> + <xsl:attribute name="xr:id" select="'BT-86'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Payment_service_provider_identifier> + </xsl:template> + <xsl:template mode="BG-18" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:ApplicableTradeSettlementFinancialCard"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:ApplicableTradeSettlementFinancialCard der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-87" select="./ram:ID"/> + <xsl:apply-templates mode="BT-88" select="./ram:CardholderName"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PAYMENT_CARD_INFORMATION> + <xsl:attribute name="xr:id" select="'BG-18'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PAYMENT_CARD_INFORMATION> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-87" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:ApplicableTradeSettlementFinancialCard/ram:ID"> + <xr:Payment_card_primary_account_number> + <xsl:attribute name="xr:id" select="'BT-87'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payment_card_primary_account_number> + </xsl:template> + <xsl:template mode="BT-88" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:ApplicableTradeSettlementFinancialCard/ram:CardholderName"> + <xr:Payment_card_holder_name> + <xsl:attribute name="xr:id" select="'BT-88'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Payment_card_holder_name> + </xsl:template> + <xsl:template mode="BG-19" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement der Instanz in konkreter Syntax wird auf 3 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-89" + select="./ram:SpecifiedTradePaymentTerms/ram:DirectDebitMandateID"/> + <xsl:apply-templates mode="BT-90" select="./ram:CreditorReferenceID"/> + <xsl:apply-templates mode="BT-91" + select="./ram:SpecifiedTradeSettlementPaymentMeans/ram:PayerPartyDebtorFinancialAccount/ram:IBANID"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DIRECT_DEBIT> + <xsl:attribute name="xr:id" select="'BG-19'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DIRECT_DEBIT> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-89" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:DirectDebitMandateID"> + <xr:Mandate_reference_identifier> + <xsl:attribute name="xr:id" select="'BT-89'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Mandate_reference_identifier> + </xsl:template> + <xsl:template mode="BT-90" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:CreditorReferenceID"> + <xr:Bank_assigned_creditor_identifier> + <xsl:attribute name="xr:id" select="'BT-90'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Bank_assigned_creditor_identifier> + </xsl:template> + <xsl:template mode="BT-91" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementPaymentMeans/ram:PayerPartyDebtorFinancialAccount/ram:IBANID"> + <xr:Debited_account_identifier> + <xsl:attribute name="xr:id" select="'BT-91'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Debited_account_identifier> + </xsl:template> + <xsl:template mode="BG-20" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false']"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false'] der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-92" select="./ram:ActualAmount"/> + <xsl:apply-templates mode="BT-93" select="./ram:BasisAmount"/> + <xsl:apply-templates mode="BT-94" select="./ram:CalculationPercent"/> + <xsl:apply-templates mode="BT-95" select="./ram:CategoryTradeTax/ram:CategoryCode"/> + <xsl:apply-templates mode="BT-96" select="./ram:CategoryTradeTax/ram:RateApplicablePercent"/> + <xsl:apply-templates mode="BT-97" select="./ram:Reason"/> + <xsl:apply-templates mode="BT-98" select="./ram:ReasonCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DOCUMENT_LEVEL_ALLOWANCES> + <xsl:attribute name="xr:id" select="'BG-20'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DOCUMENT_LEVEL_ALLOWANCES> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-92" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ActualAmount"> + <xr:Document_level_allowance_amount> + <xsl:attribute name="xr:id" select="'BT-92'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Document_level_allowance_amount> + </xsl:template> + <xsl:template mode="BT-93" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:BasisAmount"> + <xr:Document_level_allowance_base_amount> + <xsl:attribute name="xr:id" select="'BT-93'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Document_level_allowance_base_amount> + </xsl:template> + <xsl:template mode="BT-94" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CalculationPercent"> + <xr:Document_level_allowance_percentage> + <xsl:attribute name="xr:id" select="'BT-94'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Document_level_allowance_percentage> + </xsl:template> + <xsl:template mode="BT-95" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CategoryTradeTax/ram:CategoryCode"> + <xr:Document_level_allowance_VAT_category_code> + <xsl:attribute name="xr:id" select="'BT-95'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Document_level_allowance_VAT_category_code> + </xsl:template> + <xsl:template mode="BT-96" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CategoryTradeTax/ram:RateApplicablePercent"> + <xr:Document_level_allowance_VAT_rate> + <xsl:attribute name="xr:id" select="'BT-96'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Document_level_allowance_VAT_rate> + </xsl:template> + <xsl:template mode="BT-97" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:Reason"> + <xr:Document_level_allowance_reason> + <xsl:attribute name="xr:id" select="'BT-97'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Document_level_allowance_reason> + </xsl:template> + <xsl:template mode="BT-98" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode"> + <xr:Document_level_allowance_reason_code> + <xsl:attribute name="xr:id" select="'BT-98'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Document_level_allowance_reason_code> + </xsl:template> + <xsl:template mode="BG-21" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true']"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true'] der Instanz in konkreter Syntax wird auf 7 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-99" select="./ram:ActualAmount"/> + <xsl:apply-templates mode="BT-100" select="./ram:BasisAmount"/> + <xsl:apply-templates mode="BT-101" select="./ram:CalculationPercent"/> + <xsl:apply-templates mode="BT-102" select="./ram:CategoryTradeTax/ram:CategoryCode"/> + <xsl:apply-templates mode="BT-103" select="./ram:CategoryTradeTax/ram:RateApplicablePercent"/> + <xsl:apply-templates mode="BT-104" select="./ram:Reason"/> + <xsl:apply-templates mode="BT-105" select="./ram:ReasonCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DOCUMENT_LEVEL_CHARGES> + <xsl:attribute name="xr:id" select="'BG-21'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DOCUMENT_LEVEL_CHARGES> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-99" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ActualAmount"> + <xr:Document_level_charge_amount> + <xsl:attribute name="xr:id" select="'BT-99'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Document_level_charge_amount> + </xsl:template> + <xsl:template mode="BT-100" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:BasisAmount"> + <xr:Document_level_charge_base_amount> + <xsl:attribute name="xr:id" select="'BT-100'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Document_level_charge_base_amount> + </xsl:template> + <xsl:template mode="BT-101" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CalculationPercent"> + <xr:Document_level_charge_percentage> + <xsl:attribute name="xr:id" select="'BT-101'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Document_level_charge_percentage> + </xsl:template> + <xsl:template mode="BT-102" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CategoryTradeTax/ram:CategoryCode"> + <xr:Document_level_charge_VAT_category_code> + <xsl:attribute name="xr:id" select="'BT-102'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Document_level_charge_VAT_category_code> + </xsl:template> + <xsl:template mode="BT-103" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CategoryTradeTax/ram:RateApplicablePercent"> + <xr:Document_level_charge_VAT_rate> + <xsl:attribute name="xr:id" select="'BT-103'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Document_level_charge_VAT_rate> + </xsl:template> + <xsl:template mode="BT-104" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:Reason"> + <xr:Document_level_charge_reason> + <xsl:attribute name="xr:id" select="'BT-104'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Document_level_charge_reason> + </xsl:template> + <xsl:template mode="BT-105" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode"> + <xr:Document_level_charge_reason_code> + <xsl:attribute name="xr:id" select="'BT-105'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Document_level_charge_reason_code> + </xsl:template> + <xsl:template mode="BG-22" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation der Instanz in konkreter Syntax wird auf 10 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-106" select="./ram:LineTotalAmount"/> + <xsl:apply-templates mode="BT-107" select="./ram:AllowanceTotalAmount"/> + <xsl:apply-templates mode="BT-108" select="./ram:ChargeTotalAmount"/> + <xsl:apply-templates mode="BT-109" select="./ram:TaxBasisTotalAmount"/> + <xsl:apply-templates mode="BT-110" + select="./ram:TaxTotalAmount[@currencyID = parent::ram:SpecifiedTradeSettlementHeaderMonetarySummation/preceding-sibling::ram:TaxCurrencyCode]"/> + <xsl:apply-templates mode="BT-111" + select="./ram:TaxTotalAmount[@currencyID = parent::ram:SpecifiedTradeSettlementHeaderMonetarySummation/preceding-sibling::ram:InvoiceCurrencyCode]"/> + <xsl:apply-templates mode="BT-112" select="./ram:GrandTotalAmount"/> + <xsl:apply-templates mode="BT-113" select="./ram:TotalPrepaidAmount"/> + <xsl:apply-templates mode="BT-114" select="./ram:RoundingAmount"/> + <xsl:apply-templates mode="BT-115" select="./ram:DuePayableAmount"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:DOCUMENT_TOTALS> + <xsl:attribute name="xr:id" select="'BG-22'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:DOCUMENT_TOTALS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-106" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:LineTotalAmount"> + <xr:Sum_of_Invoice_line_net_amount> + <xsl:attribute name="xr:id" select="'BT-106'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Sum_of_Invoice_line_net_amount> + </xsl:template> + <xsl:template mode="BT-107" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:AllowanceTotalAmount"> + <xr:Sum_of_allowances_on_document_level> + <xsl:attribute name="xr:id" select="'BT-107'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Sum_of_allowances_on_document_level> + </xsl:template> + <xsl:template mode="BT-108" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:ChargeTotalAmount"> + <xr:Sum_of_charges_on_document_level> + <xsl:attribute name="xr:id" select="'BT-108'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Sum_of_charges_on_document_level> + </xsl:template> + <xsl:template mode="BT-109" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxBasisTotalAmount"> + <xr:Invoice_total_amount_without_VAT> + <xsl:attribute name="xr:id" select="'BT-109'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_total_amount_without_VAT> + </xsl:template> + <xsl:template mode="BT-110" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID = parent::ram:SpecifiedTradeSettlementHeaderMonetarySummation/preceding-sibling::ram:TaxCurrencyCode]"> + <xr:Invoice_total_VAT_amount> + <xsl:attribute name="xr:id" select="'BT-110'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_total_VAT_amount> + </xsl:template> + <xsl:template mode="BT-111" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID = parent::ram:SpecifiedTradeSettlementHeaderMonetarySummation/preceding-sibling::ram:InvoiceCurrencyCode]"> + <xr:Invoice_total_VAT_amount_in_accounting_currency> + <xsl:attribute name="xr:id" select="'BT-111'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_total_VAT_amount_in_accounting_currency> + </xsl:template> + <xsl:template mode="BT-112" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount"> + <xr:Invoice_total_amount_with_VAT> + <xsl:attribute name="xr:id" select="'BT-112'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_total_amount_with_VAT> + </xsl:template> + <xsl:template mode="BT-113" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TotalPrepaidAmount"> + <xr:Paid_amount> + <xsl:attribute name="xr:id" select="'BT-113'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Paid_amount> + </xsl:template> + <xsl:template mode="BT-114" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:RoundingAmount"> + <xr:Rounding_amount> + <xsl:attribute name="xr:id" select="'BT-114'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Rounding_amount> + </xsl:template> + <xsl:template mode="BT-115" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:DuePayableAmount"> + <xr:Amount_due_for_payment> + <xsl:attribute name="xr:id" select="'BT-115'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Amount_due_for_payment> + </xsl:template> + <xsl:template mode="BG-23" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax der Instanz in konkreter Syntax wird auf 6 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-116" select="./ram:BasisAmount"/> + <xsl:apply-templates mode="BT-117" select="./ram:CalculatedAmount"/> + <xsl:apply-templates mode="BT-118" select="./ram:CategoryCode"/> + <xsl:apply-templates mode="BT-119" select="./ram:RateApplicablePercent"/> + <xsl:apply-templates mode="BT-120" select="./ram:ExemptionReason"/> + <xsl:apply-templates mode="BT-121" select="./ram:ExemptionReasonCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:VAT_BREAKDOWN> + <xsl:attribute name="xr:id" select="'BG-23'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:VAT_BREAKDOWN> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-116" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:BasisAmount"> + <xr:VAT_category_taxable_amount> + <xsl:attribute name="xr:id" select="'BT-116'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:VAT_category_taxable_amount> + </xsl:template> + <xsl:template mode="BT-117" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CalculatedAmount"> + <xr:VAT_category_tax_amount> + <xsl:attribute name="xr:id" select="'BT-117'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:VAT_category_tax_amount> + </xsl:template> + <xsl:template mode="BT-118" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode"> + <xr:VAT_category_code> + <xsl:attribute name="xr:id" select="'BT-118'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:VAT_category_code> + </xsl:template> + <xsl:template mode="BT-119" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent"> + <xr:VAT_category_rate> + <xsl:attribute name="xr:id" select="'BT-119'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:VAT_category_rate> + </xsl:template> + <xsl:template mode="BT-120" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:ExemptionReason"> + <xr:VAT_exemption_reason_text> + <xsl:attribute name="xr:id" select="'BT-120'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:VAT_exemption_reason_text> + </xsl:template> + <xsl:template mode="BT-121" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:ExemptionReasonCode"> + <xr:VAT_exemption_reason_code> + <xsl:attribute name="xr:id" select="'BT-121'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:VAT_exemption_reason_code> + </xsl:template> + <xsl:template mode="BG-24" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument der Instanz in konkreter Syntax wird auf 4 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-122" + select="./ram:IssuerAssignedID[following-sibling::ram:TypeCode='916']"/> + <xsl:apply-templates mode="BT-123" select="./ram:Name"/> + <xsl:apply-templates mode="BT-124" select="./ram:URIID"/> + <xsl:apply-templates mode="BT-125" select="./ram:AttachmentBinaryObject"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:ADDITIONAL_SUPPORTING_DOCUMENTS> + <xsl:attribute name="xr:id" select="'BG-24'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:ADDITIONAL_SUPPORTING_DOCUMENTS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-122" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='916']"> + <xr:Supporting_document_reference> + <xsl:attribute name="xr:id" select="'BT-122'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Supporting_document_reference> + </xsl:template> + <xsl:template mode="BT-123" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:Name"> + <xr:Supporting_document_description> + <xsl:attribute name="xr:id" select="'BT-123'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Supporting_document_description> + </xsl:template> + <xsl:template mode="BT-124" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:URIID"> + <xr:External_document_location> + <xsl:attribute name="xr:id" select="'BT-124'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:External_document_location> + </xsl:template> + <xsl:template mode="BT-125" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument/ram:AttachmentBinaryObject"> + <xr:Attached_document> + <xsl:attribute name="xr:id" select="'BT-125'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="binary_object"/> + </xr:Attached_document> + </xsl:template> + <xsl:template mode="BG-25" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem der Instanz in konkreter Syntax wird auf 14 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-126" select="./ram:AssociatedDocumentLineDocument/ram:LineID"/> + <xsl:apply-templates mode="BT-127" + select="./ram:AssociatedDocumentLineDocument/ram:IncludedNote/ram:Content"/> + <xsl:apply-templates mode="BT-128" + select="./ram:SpecifiedLineTradeSettlement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='130']"/> + <xsl:apply-templates mode="BT-129" + select="./ram:SpecifiedLineTradeDelivery/ram:BilledQuantity"/> + <xsl:apply-templates mode="BT-130" + select="./ram:SpecifiedLineTradeDelivery/ram:BilledQuantity/@unitCode"/> + <xsl:apply-templates mode="BT-131" + select="./ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount"/> + <xsl:apply-templates mode="BT-132" + select="./ram:SpecifiedLineTradeAgreement/ram:BuyerOrderReferencedDocument/ram:LineID"/> + <xsl:apply-templates mode="BT-133" + select="./ram:SpecifiedLineTradeSettlement/ram:ReceivableSpecifiedTradeAccountingAccount/ram:ID"/> + <xsl:apply-templates mode="BG-26" + select="./ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod"/> + <xsl:apply-templates mode="BG-27" + select="./ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false']"/> + <xsl:apply-templates mode="BG-28" + select="./ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true']"/> + <xsl:apply-templates mode="BG-29" select="./ram:SpecifiedLineTradeAgreement"/> + <xsl:apply-templates mode="BG-30" + select="./ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax"/> + <xsl:apply-templates mode="BG-31" select="./ram:SpecifiedTradeProduct"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICE_LINE> + <xsl:attribute name="xr:id" select="'BG-25'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICE_LINE> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-126" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:AssociatedDocumentLineDocument/ram:LineID"> + <xr:Invoice_line_identifier> + <xsl:attribute name="xr:id" select="'BT-126'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Invoice_line_identifier> + </xsl:template> + <xsl:template mode="BT-127" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:AssociatedDocumentLineDocument/ram:IncludedNote/ram:Content"> + <xr:Invoice_line_note> + <xsl:attribute name="xr:id" select="'BT-127'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Invoice_line_note> + </xsl:template> + <xsl:template mode="BT-128" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:AdditionalReferencedDocument/ram:IssuerAssignedID[following-sibling::ram:TypeCode='130']"> + <xr:Invoice_line_object_identifier> + <xsl:attribute name="xr:id" select="'BT-128'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"> + <xsl:with-param name="schemeID" select="following-sibling::ram:ReferenceTypeCode"/> + </xsl:call-template> + </xr:Invoice_line_object_identifier> + </xsl:template> + <xsl:template mode="BT-129" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeDelivery/ram:BilledQuantity"> + <xr:Invoiced_quantity> + <xsl:attribute name="xr:id" select="'BT-129'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="quantity"/> + </xr:Invoiced_quantity> + </xsl:template> + <xsl:template mode="BT-130" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeDelivery/ram:BilledQuantity/@unitCode"> + <xr:Invoiced_quantity_unit_of_measure_code> + <xsl:attribute name="xr:id" select="'BT-130'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoiced_quantity_unit_of_measure_code> + </xsl:template> + <xsl:template mode="BT-131" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount"> + <xr:Invoice_line_net_amount> + <xsl:attribute name="xr:id" select="'BT-131'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_line_net_amount> + </xsl:template> + <xsl:template mode="BT-132" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:BuyerOrderReferencedDocument/ram:LineID"> + <xr:Referenced_purchase_order_line_reference> + <xsl:attribute name="xr:id" select="'BT-132'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="document_reference"/> + </xr:Referenced_purchase_order_line_reference> + </xsl:template> + <xsl:template mode="BT-133" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ReceivableSpecifiedTradeAccountingAccount/ram:ID"> + <xr:Invoice_line_Buyer_accounting_reference> + <xsl:attribute name="xr:id" select="'BT-133'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Invoice_line_Buyer_accounting_reference> + </xsl:template> + <xsl:template mode="BG-26" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-134" + select="./ram:StartDateTime/udt:DateTimeString[@format='102']"/> + <xsl:apply-templates mode="BT-135" + select="./ram:EndDateTime/udt:DateTimeString[@format='102']"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICE_LINE_PERIOD> + <xsl:attribute name="xr:id" select="'BG-26'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICE_LINE_PERIOD> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-134" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod/ram:StartDateTime/udt:DateTimeString[@format='102']"> + <xr:Invoice_line_period_start_date> + <xsl:attribute name="xr:id" select="'BT-134'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Invoice_line_period_start_date> + </xsl:template> + <xsl:template mode="BT-135" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod/ram:EndDateTime/udt:DateTimeString[@format='102']"> + <xr:Invoice_line_period_end_date> + <xsl:attribute name="xr:id" select="'BT-135'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="date"/> + </xr:Invoice_line_period_end_date> + </xsl:template> + <xsl:template mode="BG-27" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false']"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='false'] der Instanz in konkreter Syntax wird auf 5 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-136" select="./ram:ActualAmount"/> + <xsl:apply-templates mode="BT-137" select="./ram:BasisAmount"/> + <xsl:apply-templates mode="BT-138" select="./ram:CalculationPercent"/> + <xsl:apply-templates mode="BT-139" select="./ram:Reason"/> + <xsl:apply-templates mode="BT-140" select="./ram:ReasonCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICE_LINE_ALLOWANCES> + <xsl:attribute name="xr:id" select="'BG-27'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICE_LINE_ALLOWANCES> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-136" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ActualAmount"> + <xr:Invoice_line_allowance_amount> + <xsl:attribute name="xr:id" select="'BT-136'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_line_allowance_amount> + </xsl:template> + <xsl:template mode="BT-137" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:BasisAmount"> + <xr:Invoice_line_allowance_base_amount> + <xsl:attribute name="xr:id" select="'BT-137'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_line_allowance_base_amount> + </xsl:template> + <xsl:template mode="BT-138" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CalculationPercent"> + <xr:Invoice_line_allowance_percentage> + <xsl:attribute name="xr:id" select="'BT-138'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Invoice_line_allowance_percentage> + </xsl:template> + <xsl:template mode="BT-139" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:Reason"> + <xr:Invoice_line_allowance_reason> + <xsl:attribute name="xr:id" select="'BT-139'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Invoice_line_allowance_reason> + </xsl:template> + <xsl:template mode="BT-140" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode"> + <xr:Invoice_line_allowance_reason_code> + <xsl:attribute name="xr:id" select="'BT-140'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoice_line_allowance_reason_code> + </xsl:template> + <xsl:template mode="BG-28" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true']"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator='true'] der Instanz in konkreter Syntax wird auf 5 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-141" select="./ram:ActualAmount"/> + <xsl:apply-templates mode="BT-142" select="./ram:BasisAmount"/> + <xsl:apply-templates mode="BT-143" select="./ram:CalculationPercent"/> + <xsl:apply-templates mode="BT-144" select="./ram:Reason"/> + <xsl:apply-templates mode="BT-145" select="./ram:ReasonCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:INVOICE_LINE_CHARGES> + <xsl:attribute name="xr:id" select="'BG-28'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:INVOICE_LINE_CHARGES> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-141" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ActualAmount"> + <xr:Invoice_line_charge_amount> + <xsl:attribute name="xr:id" select="'BT-141'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_line_charge_amount> + </xsl:template> + <xsl:template mode="BT-142" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:BasisAmount"> + <xr:Invoice_line_charge_base_amount> + <xsl:attribute name="xr:id" select="'BT-142'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="amount"/> + </xr:Invoice_line_charge_base_amount> + </xsl:template> + <xsl:template mode="BT-143" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:CalculationPercent"> + <xr:Invoice_line_charge_percentage> + <xsl:attribute name="xr:id" select="'BT-143'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Invoice_line_charge_percentage> + </xsl:template> + <xsl:template mode="BT-144" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:Reason"> + <xr:Invoice_line_charge_reason> + <xsl:attribute name="xr:id" select="'BT-144'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Invoice_line_charge_reason> + </xsl:template> + <xsl:template mode="BT-145" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode"> + <xr:Invoice_line_charge_reason_code> + <xsl:attribute name="xr:id" select="'BT-145'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoice_line_charge_reason_code> + </xsl:template> + <xsl:template mode="BG-29" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement der Instanz in konkreter Syntax wird auf 5 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-146" select="./ram:NetPriceProductTradePrice/ram:ChargeAmount"/> + <xsl:apply-templates mode="BT-147" + select="./ram:GrossPriceProductTradePrice/ram:AppliedTradeAllowanceCharge/ram:ActualAmount"/> + <xsl:apply-templates mode="BT-148" + select="./ram:GrossPriceProductTradePrice/ram:ChargeAmount"/> + <xsl:apply-templates mode="BT-149" + select="./ram:NetPriceProductTradePrice/ram:BasisQuantity"/> + <xsl:apply-templates mode="BT-149" + select="./ram:GrossPriceProductTradePrice/ram:BasisQuantity"/> + <xsl:apply-templates mode="BT-150" + select="./ram:GrossPriceProductTradePrice/ram:BasisQuantity/@unitCode"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:PRICE_DETAILS> + <xsl:attribute name="xr:id" select="'BG-29'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:PRICE_DETAILS> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-146" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:ChargeAmount"> + <xr:Item_net_price> + <xsl:attribute name="xr:id" select="'BT-146'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="unit_price_amount"/> + </xr:Item_net_price> + </xsl:template> + <xsl:template mode="BT-147" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:AppliedTradeAllowanceCharge/ram:ActualAmount"> + <xr:Item_price_discount> + <xsl:attribute name="xr:id" select="'BT-147'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="unit_price_amount"/> + </xr:Item_price_discount> + </xsl:template> + <xsl:template mode="BT-148" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:ChargeAmount"> + <xr:Item_gross_price> + <xsl:attribute name="xr:id" select="'BT-148'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="unit_price_amount"/> + </xr:Item_gross_price> + </xsl:template> + <xsl:template mode="BT-149" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity"> + <xr:Item_price_base_quantity> + <xsl:attribute name="xr:id" select="'BT-149'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="quantity"/> + </xr:Item_price_base_quantity> + </xsl:template> + <xsl:template mode="BT-149" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity"> + <xr:Item_price_base_quantity> + <xsl:attribute name="xr:id" select="'BT-149'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="quantity"/> + </xr:Item_price_base_quantity> + </xsl:template> + <xsl:template mode="BT-150" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity/@unitCode"> + <xr:Item_price_base_quantity_unit_of_measure> + <xsl:attribute name="xr:id" select="'BT-150'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Item_price_base_quantity_unit_of_measure> + </xsl:template> + <xsl:template mode="BG-30" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-151" select="./ram:CategoryCode"/> + <xsl:apply-templates mode="BT-152" select="./ram:RateApplicablePercent"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:LINE_VAT_INFORMATION> + <xsl:attribute name="xr:id" select="'BG-30'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:LINE_VAT_INFORMATION> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-151" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode"> + <xr:Invoiced_item_VAT_category_code> + <xsl:attribute name="xr:id" select="'BT-151'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Invoiced_item_VAT_category_code> + </xsl:template> + <xsl:template mode="BT-152" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent"> + <xr:Invoiced_item_VAT_rate> + <xsl:attribute name="xr:id" select="'BT-152'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="percentage"/> + </xr:Invoiced_item_VAT_rate> + </xsl:template> + <xsl:template mode="BG-31" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct der Instanz in konkreter Syntax wird auf 8 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-153" select="./ram:Name"/> + <xsl:apply-templates mode="BT-154" select="./ram:Description"/> + <xsl:apply-templates mode="BT-155" select="./ram:SellerAssignedID"/> + <xsl:apply-templates mode="BT-156" select="./ram:BuyerAssignedID"/> + <xsl:apply-templates mode="BT-157" select="./ram:GlobalID"/> + <xsl:apply-templates mode="BT-158" + select="./ram:DesignatedProductClassification/ram:ClassCode"/> + <xsl:apply-templates mode="BT-159" select="./ram:OriginTradeCountry/ram:ID"/> + <xsl:apply-templates mode="BG-32" select="./ram:ApplicableProductCharacteristic"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:ITEM_INFORMATION> + <xsl:attribute name="xr:id" select="'BG-31'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:ITEM_INFORMATION> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-153" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:Name"> + <xr:Item_name> + <xsl:attribute name="xr:id" select="'BT-153'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Item_name> + </xsl:template> + <xsl:template mode="BT-154" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:Description"> + <xr:Item_description> + <xsl:attribute name="xr:id" select="'BT-154'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Item_description> + </xsl:template> + <xsl:template mode="BT-155" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:SellerAssignedID"> + <xr:Item_Sellers_identifier> + <xsl:attribute name="xr:id" select="'BT-155'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Item_Sellers_identifier> + </xsl:template> + <xsl:template mode="BT-156" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:BuyerAssignedID"> + <xr:Item_Buyers_identifier> + <xsl:attribute name="xr:id" select="'BT-156'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier"/> + </xr:Item_Buyers_identifier> + </xsl:template> + <xsl:template mode="BT-157" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:GlobalID"> + <xr:Item_standard_identifier> + <xsl:attribute name="xr:id" select="'BT-157'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme"/> + </xr:Item_standard_identifier> + </xsl:template> + <xsl:template mode="BT-158" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:DesignatedProductClassification/ram:ClassCode"> + <xr:Item_classification_identifier> + <xsl:attribute name="xr:id" select="'BT-158'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="identifier-with-scheme-and-version"/> + </xr:Item_classification_identifier> + </xsl:template> + <xsl:template mode="BT-159" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:OriginTradeCountry/ram:ID"> + <xr:Item_country_of_origin> + <xsl:attribute name="xr:id" select="'BT-159'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="code"/> + </xr:Item_country_of_origin> + </xsl:template> + <xsl:template mode="BG-32" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic"> + <xsl:variable name="bg-contents" as="item()*"><!--Der Pfad /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic der Instanz in konkreter Syntax wird auf 2 Objekte der EN 16931 abgebildet. --> + <xsl:apply-templates mode="BT-160" select="./ram:Description"/> + <xsl:apply-templates mode="BT-161" select="./ram:Value"/> + </xsl:variable> + <xsl:if test="$bg-contents"> + <xr:ITEM_ATTRIBUTES> + <xsl:attribute name="xr:id" select="'BG-32'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:sequence select="$bg-contents"/> + </xr:ITEM_ATTRIBUTES> + </xsl:if> + </xsl:template> + <xsl:template mode="BT-160" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic/ram:Description"> + <xr:Item_attribute_name> + <xsl:attribute name="xr:id" select="'BT-160'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Item_attribute_name> + </xsl:template> + <xsl:template mode="BT-161" + match="/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic/ram:Value"> + <xr:Item_attribute_value> + <xsl:attribute name="xr:id" select="'BT-161'"/> + <xsl:attribute name="xr:src" select="xr:src-path(.)"/> + <xsl:call-template name="text"/> + </xr:Item_attribute_value> + </xsl:template> + <xsl:template name="text"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="date"> + <xsl:choose> + <xsl:when test="matches(normalize-space(.), '^[0-9]{8}$')"> + <xsl:value-of select="xs:date( concat(substring(.,1,4), '-', substring(.,5,2), '-', substring(.,7,2) ) )"/> + </xsl:when> + <xsl:otherwise>ILLEGAL DATE FORMAT: <para>Mit diesem Datentyp wird ein kalendarisches Datum abgebildet, wie es in der ISO 8601 Spezifikation <quote>Calendar date complete representation</quote> beschrieben ist (siehe ISO 8601:2004, Abschnitt 5.2.1.1). Das Datum beinhaltet keine Zeitangabe. Das konkret zu verwendende Format ist abhängig von der genutzten Syntax.</para> +<para>Der Datentyp basiert auf dem Typ <quote>Date Time. Type</quote>, wie in ISO 15000-5:2014 Anhang B definiert.</para></xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template name="identifier-with-scheme-and-version"> + <xsl:param name="schemeID" as="element()?"/> + <xsl:if test="@listID | @schemeID"> + <xsl:attribute name="scheme_identifier" select="($schemeID, @listID, @schemeID)[1]"/> + </xsl:if> + <xsl:if test="@schemeVersionID | @listVersionID"> + <xsl:attribute name="scheme_version_identifier" + select="(@listVersionID, @schemeVersionID)[1]"/> + </xsl:if> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="identifier-with-scheme"> + <xsl:param name="schemeID" as="element()?"/> + <xsl:if test="@schemeID"> + <xsl:attribute name="scheme_identifier" select="($schemeID, @listID, @schemeID)[1]"/> + </xsl:if> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="identifier"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="code"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="amount"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="percentage"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="binary_object"> + <xsl:if test="@mimeCode"> + <xsl:attribute name="mime_code"> + <xsl:value-of select="@mimeCode"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="@filename"> + <xsl:attribute name="filename"> + <xsl:value-of select="@filename"/> + </xsl:attribute> + </xsl:if> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="unit_price_amount"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="quantity"> + <xsl:value-of select="."/> + </xsl:template> + <xsl:template name="document_reference"> + <xsl:value-of select="."/> + </xsl:template> + <xd:doc> + <xd:desc> Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. </xd:desc> + <xd:param name="n"/> + </xd:doc> + <xsl:function name="xr:src-path" as="xs:string"> + <xsl:param name="n" as="node()"/> + <xsl:variable name="segments" as="xs:string*"> + <xsl:apply-templates select="$n" mode="xr:src-path"/> + </xsl:variable> + <xsl:sequence select="string-join($segments, '')"/> + </xsl:function> + <xd:doc> + <xd:desc> Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. </xd:desc> + <xd:param name="n"/> + </xd:doc> + <xsl:template match="node() | @*" mode="xr:src-path"> + <xsl:for-each select="ancestor-or-self::*"> + <xsl:text>/</xsl:text> + <xsl:value-of select="name(.)"/> + <xsl:if test="preceding-sibling::*[name(.) = name(current())] or following-sibling::*[name(.) = name(current())]"> + <xsl:text>[</xsl:text> + <xsl:value-of select="count(preceding-sibling::*[name(.) = name(current())]) + 1"/> + <xsl:text>]</xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:if test="not(self::*)"> + <xsl:text/>/@<xsl:value-of select="name(.)"/> + </xsl:if> + </xsl:template> +</xsl:stylesheet> diff --git a/src/main/resources/stylesheets/xrechnung-html.xsl b/src/main/resources/stylesheets/xrechnung-html.xsl new file mode 100644 index 00000000..5e15f314 --- /dev/null +++ b/src/main/resources/stylesheets/xrechnung-html.xsl @@ -0,0 +1,1188 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:xr="urn:ce.eu:en16931:2017:xoev-de:kosit:standard:xrechnung-1" + xmlns:xrv="http://www.example.org/XRechnung-Viewer"> + + <xsl:output indent="yes" method="html" encoding="UTF-8" /> + + <xsl:decimal-format name="decimal" decimal-separator="," grouping-separator="." NaN="" /> + + + <!-- MAIN HTML --> + <xsl:template match="/xr:invoice"> + + <html lang="de"> + <head> + <meta charset="UTF-8"/> + <title>XRechnung + + + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ + + +
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+ + + +
+ + + +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+
+ + + +
+
Informationen zum Käufer
+
+
+
Leitweg-ID:
+
+
+
+
Name:
+
+
+
+
Straße / Hausnummer:
+
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
+
+
+
Ort:
+
+
+
+
Land:
+
+
+
+
Kennung:
+
+
+
+
Schema der Kennung:
+
+
+
+
Name:
+
+
+
+
Telefon:
+
+
+
+
E-Mail-Adresse:
+
+
+
+
+
+ + + +
+
Informationen zum Verkäufer
+
+
+
Firmenname:
+
+
+
+
Straße / Hausnummer:
+
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
+
+
+
Ort:
+
+
+
+
Bundesland:
+
+
+
+
Ländercode:
+
+
+
+
Kennung:
+
+
+
+
Schema der Kennung:
+
+
+
+
Name:
+
+
+
+
Telefon:
+
+
+
+
E-Mail-Adresse:
+
+
+
+
+
+ + + +
+
+
Rechnungsdaten
+
+
+
+
+
Rechnungsnummer:
+
+
+
+
Rechnungsdatum:
+
+
+
+
Rechnungsart:
+
+
+
+
Währung:
+
+
+
+

Abrechnungszeitraum:

+
+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
+
+
+
Projektnummer:
+
+
+
+
Vertragsnummer:
+
+
+
+
Bestellnummer:
+
+
+
+
Auftragsnummer:
+
+
+
+

Vorausgegangene Rechnungen:

+ +
+
+
+
+
+ + +
+
+
Rechnungsnummer:
+
+
+
+
Rechnungsdatum:
+
+
+
+
+ + + +
+
+
Gesamtbeträge der Rechnung
+
+
+
Summe aller Positionen
+
netto
+
+
+
+
Summe Nachlässe
+
netto
+
+
+
+
Summe Zuschläge
+
netto
+
+
+
+
Gesamtsumme
+
netto
+
+
+
+
Summe Umsatzsteuer
+
+
+
+
+
Summe Umsatzsteuer in Abrechnungswährung
+
+
+
+
+
Gesamtsumme
+
brutto
+
+
+
+
Gezahlter Betrag
+
brutto
+
+
+
+
Rundungsbetrag
+
brutto
+
+
+
+
Fälliger Betrag
+
brutto
+
+
+
+
+
+
+ + + +
+
+
Aufschlüsselung der Umsatzsteuer auf Ebene der Rechnung
+
+
+
Umsatzsteuerkategorie:
+
+
+
+
+
Gesamtsumme
+
netto
+
+
+
+
Umsatzsteuersatz
+
+
%
+
+
+
Umsatzsteuerbetrag
+
+
+
+
+ +
+
Befreiungsgrund:
+
Kennung für den Befreiungsgrund:
+
+
+
+
+ + + +
+
+
Nachlass auf Ebene der Rechnung
+
+
+
Umsatzsteuerkategorie des Nachlasses:
+
+
+
+
+
Grundbetrag
+
netto
+
+
+
+
Prozentsatz
+
+
%
+
+
+
Nachlass
+
netto
+
+
+
+
Umsatzsteuersatz des Nachlasses
+
+
+
+
+
+
Grund für den Nachlass:
+
Document level allowance reason code:
+
+
+
+
+
+ + + +
+
+
Zuschlag auf Ebene der Rechnung
+
+
+
Umsatzsteuerkategorie des Zuschlages:
+
+
+
+
+
Grundbetrag
+
netto
+
+
+
+
Prozentsatz
+
+
%
+
+
+
Zuschlag
+
netto
+
+
+
+
Umsatzsteuersatz des Zuschlages
+
+
+
+
+
+
Grund für den Zuschlag:
+
Document level charge reason code:
+
+
+
+
+
+ + + +
+
Zahlungsdaten
+
+
+
Skonto; weitere Zahlungsbedingungen:
+
+
+
+
Fälligkeitsdatum:
+
+
+
+
Code für das Zahlungsmittel:
+
+
+
+
Zahlungsmittel:
+
+
+
+
Verwendungszweck:
+
+
+
+
+
+ + + +
+
Karteninformation
+
+
+
Kartennummer:
+
+
+
+
Karteninhaber:
+
+
+
+
+
+ + + +
+
Lastschrift
+
+
+
Mandatsreferenznr.:
+
+
+
+
IBAN:
+
+
+
+
Gläubiger-ID:
+
+
+
+
+
+ + + +
+
Überweisung
+
+
+
Kontoinhaber:
+
+
+
+
IBAN:
+
+
+
+
BIC:
+
+
+
+
+
+ + + +
+
Bemerkung zur Rechnung
+
+
+
Betreff:
+
+
+
+
Bemerkung:
+
+
+
+
+
+ + + +
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+ +
+
+ + + +
+
+
+
Position
+
+
+
Freitext:
+
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
Nummer der Auftragsposition:
+
+
+
+
Kontierungshinweis:
+
+
+

Abrechnungszeitraum:

+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
Preiseinzelheiten
+
+
+
Menge
+
+
+
+
Einheit
+
+
+
+
Preis pro Einheit (netto)
+
+
+
+
Gesamtpreis (netto)
+
+
+
+
+
+
Rabatt (netto):
+
+
+
+
Listenpreis (netto):
+
+
+
+
Anzahl der Einheit:
+
+
+
+
Code der Maßeinheit:
+
+
+
+
Umsatzsteuer:
+
+
+
+
Umsatzsteuersatz in Prozent:
+
%
+
+
+
+
+
+
+
+
+
Nachlässe auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Nachlass (netto)
+
+
+
+
+
Grund des Nachlasses:
+
Code für den Nachlassgrund:
+
+
+
+
Zuschläge auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Zuschlag (netto)
+
+
+
+
+
Grund des Zuschlags:
+
Code für den Zuschlagsgrund:
+
+
+
+
+
+
+
+
Artikelinformationen
+
+
+
+
+
+
Bezeichnung:
+
+
+
+
Beschreibung:
+
+
+
+
Artikelnummer:
+
+
+
+
Artikelkennung des Käufers:
+
+
+

Eigenschaften des Artikels:

+ +
+
+
+
+
+
+
Artikelkennung:
+
+
+
+
Schema der Artikelkennung:
+
+
+
+
Code der Artikelklassifizierung:
+
+
+
+
Kennung zur Bildung des Schemas:
+
+
+
+
Version zur Bildung des Schemas:
+
+
+
+
Code des Herkunftslandes:
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+ + + +
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ + + +
+
Informationen zum Verkäufer
+
+
+
Abweichender Handelsname:
+
+
+
+
Bundesland:
+
+
+
+
Elektronische Adresse:
+
+
+
+
Schema der elektronischen Adresse:
+
+
+
+
Register-/Registriernummer:
+
+
+
+
Umsatzsteuer-ID:
+
+
+
+
Steuernummer:
+
+
+
+
Schema der Steuernummer:
+
+
+
+
Weitere rechtliche Informationen:
+
+
+
+
Code der Umsatzsteuerwährung:
+
+
+
+
+
+ + + +
+
Steuervertreter des Verkäufers
+
+
+
Name:
+
+
+
+
Straße / Hausnummer:
+
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
+
+
+
Ort:
+
+
+
+
Bundesland:
+
+
+
+
Ländercode:
+
+
+
+
Umsatzsteuer-ID:
+
+
+
+
+
+ + + +
+
Informationen zum Käufer
+
+
+
Abweichender Handelsname:
+
+
+
+
Bundesland:
+
+
+
+
Elektronische Adresse:
+
+
+
+
Schema der elektronischen Adresse:
+
+
+
+
Register-/Registriernummer:
+
+
+
+
Schema der Register-/Registriernummer:
+
+
+
+
Umsatzsteuer-ID:
+
+
+
+
Abrechnungsdatum der Umsatzsteuer:
+
+
+
+
Code des Umsatzsteuer-Abrechnungsdatums:
+
+
+
+
Kontierungsinformation:
+
+
+
+
+
+ + + +
+
Lieferinformationen
+
+
+
Kennung des Lieferorts:
+
+
+
+
Schema der Kennung:
+
+
+
+
Lieferdatum:
+
+
+
+
Name des Empfängers:
+
+
+
+
Straße / Hausnummer:
+
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
+
+
+
Ort:
+
+
+
+
Bundesland:
+
+
+
+
Land:
+
+
+
+
+
+ + + +
+
Informationen zum Vertrag
+
+
+
Vergabenummer:
+
+
+
+
Kennung der Empfangsbestätigung:
+
+
+
+
Kennung der Versandanzeige:
+
+
+
+
Prozesskennung:
+
+
+
+
Spezifikationskennung:
+
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
+
+ + + +
+
Vom Verkäufer abweichender Zahlungsempfänger
+
+
+
Name:
+
+
+
+
Kennung:
+
+
+
+
Schema der Kennung:
+
+
+
+
Register-/Registriernummer:
+
+
+
+
Schema der Register-/Registriernummer:
+
+
+
+
+
+ + + +
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+
+
Rechnungsbegründende Unterlagen
+ +
+
+
+
+
+ + + +
+
+
Kennung:
+
+
+
+
Beschreibung:
+
+
+
+
Verweis (z.B. Internetadresse):
+
+
+
+
Anhangsdokument:
+
+ Öffnen +
+ + +
+
+
Format des Anhangdokuments:
+
+
+
+
Name des Anhangsdokuments:
+
+
+
+
+ + + +
+
+
+
+
Bearbeitungshistorie
+ +
+
+
+
+
+ + + +
+
+
Datum/Uhrzeit:
+
+
+
+
Betreff:
+
+
+
+
Text:
+
+
+
+
Details:
+
+
+
+
+ +
diff --git a/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf b/src/test/resources/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c4ae5582f811026979dfb671f1f830045eede1f GIT binary patch literal 87968 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 literal 0 HcmV?d00001 From ca05dbc0dcde2378a879b4887f5ba552c2bbe70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 13:45:04 +0200 Subject: [PATCH 06/48] no message --- xrechnung-viewer.css | 917 +++++++++++++++++++++++++++++++++++++++++++ xrechnung-viewer.js | 145 +++++++ 2 files changed, 1062 insertions(+) create mode 100644 xrechnung-viewer.css create mode 100644 xrechnung-viewer.js diff --git a/xrechnung-viewer.css b/xrechnung-viewer.css new file mode 100644 index 00000000..adea4c9b --- /dev/null +++ b/xrechnung-viewer.css @@ -0,0 +1,917 @@ +/* Grundformatierung ********************************************/ + +*, +*:after, +*:before +{ + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.clear:after +{ + content: "."; + clear: both; + display: block; + visibility: hidden; + height: 0; +} + +html, +body +{ + height: 100%; + min-width: 320px; + margin: 0; + padding: 0; + color: #000; + font-size: 14px; +} + +body +{ + overflow-y: scroll; + background-color: rgba(4, 101, 161, 0.08); +} + +h4 +{ + color: inherit; + font-size: inherit; + margin-bottom: 0.5rem; +} + + +/* Grundaufbau *************************************************/ + +.menue +{ + position: relative; + z-index: 2000; + background-color: #000; + margin-bottom: 30px; +} + +.innen +{ + max-width: 1080px; + margin: 0 auto; + padding: 0 2%; +} + + + +/* Formatierungen *************************************************/ + +.color2 +{ + color: rgba(0, 0, 0, 0.6); +} + +.schwarz +{ + color: #555 !important; +} + +.normal +{ + font-weight: normal; +} + +.bold +{ + font-weight: bold; +} + +.abstandUnten +{ + margin-bottom: 5px; +} + +.abstandUntenKlein +{ + margin-bottom: 10px; +} + +.noPaddingTop +{ + padding-top: 0 !important; +} + +.ausrichtungRechts +{ + text-align: right; +} + + + + +/* Menü ********************************************************/ + +button +{ + position: relative; + font-family: serif; + padding-top: 15px; + padding-left: 0; + padding-right: 0; + margin-right: 2%; +} + +.btnAktiv +{ + font-size: 22px; + color: #ffb619; + height: 50px; + outline: none; + border: none; + background: none; +} + +.btnAktiv:after +{ + content: ""; + display: block; + position: absolute; + top: 50px; + left: 50%; + z-index: 10; + font-size: 0; + line-height: 0; + height: 0; + padding: 0; + margin: 0; + transform: translateX(-50%); + border: 15px solid #000; + border-right-color: transparent; + border-bottom-color: transparent; + border-left-color: transparent; +} + +.btnInaktiv, +.tab +{ + font-size: 22px; + color: #fff; + height: 50px; + z-index: 0; + outline: none; + border: none; + background: none; + transition: color 0.3s ease; +} + +.btnInaktiv:hover, +.tab:hover +{ + color: #ffb619; + cursor: pointer; +} + +.divHide +{ + display: none; +} + +/* Content *********************************************************************/ + +.inhalt +{ + font-family: sans-serif; + margin-bottom: 30px; +} + +.haftungausschluss +{ + color: #000; + text-align: center; + padding: 7px; + margin-bottom: 30px; + width: 100%; + border: 1px solid #ffb619; + background-color: #fff; +} + +.box +{ + position: relative; + display: table-cell; + padding: 0; + border: 1px solid rgba(4, 101, 161, 0.2); + background-color: #fff; +} + +.subBox +{ + border-top: none; + width: 50%; +} + +.subBox:last-child +{ + border-left: none; +} + +.first > .boxzeile > .subBox +{ + border-top: 1px solid rgba(4, 101, 161, 0.2) !important; +} + +.boxtitel +{ + display: inline-block; + background-color: #0465A1; + padding: 7px 10px; + color: #fff; + font-weight: bold; +} + +.boxBorderTop +{ + border-top: none; +} + +.boxBorderLeft +{ + border-left: none; +} + +.boxtitelSub +{ + color: #000; + background-color: rgba(4, 101, 161, 0.1); + border-right: 1px solid rgba(4, 101, 161, 0.2); + border-bottom: 1px solid rgba(4, 101, 161, 0.2); +} + +.boxinhalt +{ + padding: 15px 20px; +} + +.boxtabelle +{ + display: table; + width: 100%; +} + +.borderSpacing +{ + border-spacing: 0 5px; +} + +.boxabstandtop +{ + margin-top: 30px; +} + +.boxzeile +{ + display: table-row; +} + +.boxzeile .box:last-child +{ + margin-bottom: 0; +} + +.boxdaten +{ + display: table-cell; + padding: 5px 0; + vertical-align: middle; + height: 38px; + /* + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +*/ +} + +.boxdaten.wert +{ + padding: 5px 10px; +} + +.boxcell +{ + display: table-cell; +} + +.boxdatenBlock +{ + display: block; + padding: 3px 0; + /* + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +*/ +} + +.noBreak +{ + -ms-word-break: keep-all; + word-break: keep-all; + word-break: keep-all; + -webkit-hyphens: none; + -moz-hyphens: none; + hyphens: none; +} + +.boxabstand +{ + display: table-cell; + width: 30px; +} + +.legende +{ + color: rgba(0, 0, 0, 0.6); + width: 170px; + font-size: 13px; + line-height: 16px; + padding-right: 5px; +} + +.wert +{ + background-color: rgba(4, 101, 161, 0.03); +} + +.boxtabelleEinspaltig +{ + width: 49%; +} + +.boxtabelleZweispaltig, +.boxtabelleDreispaltig +{ + width: 100%; +} + +.box5050 +{ + width: 50%; +} + +.boxEinspaltig +{ + width: 100%; +} + +.boxZweispaltig +{ + width: 48.5%; +} + +.boxSpalte1 { + width: 50%; +} + +.boxSpalte2 { + width: 50%; + padding-left: 20px; +} + +.paddingLeft { + padding-left: 0.1em; +} + +.noPadding { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.rechnungsZeile +{ + display: table-row; +} + +.rechnungsZeile .boxdaten +{ + height: auto; +} + +.rechnungSp1 +{ + width: 65%; + font-size: 16px; +} + +.rechnungSp2 +{ + width: 10%; +} + +.rechnungSp3 +{ + width: 25%; + font-size: 16px; + text-align: right; +} + +.detailSp1, +.detailSp2 +{ + width: 50%; +} + +.detailSp2 +{ + text-align: right; +} + +.line1Bottom +{ + border-bottom: 1px solid #000; +} + +.line1BottomLight +{ + padding-bottom: 5px; + border-bottom: 1px solid #f0f0f0; + margin-bottom: 5px; +} + +.line2Bottom +{ + border-bottom: 2px solid #000; +} + +.paddingTop +{ + padding-top: 10px; +} + +.paddingBottom +{ + padding-bottom: 10px; +} + +.grund +{ + font-size: 16px; + display: block; + width: 100%; + padding: 0 20px 15px 20px; +} + +.grundDetail +{ + display: block; + width: 100%; + padding: 0 20px 15px 20px; +} + +/* Übersichtformatierungen */ +#uebersichtLastschrift.box, +#uebersichtUeberweisung.box +{ + border-top: none; +} + +#uebersichtUeberweisung.box +{ + border-left: none; +} + + +/* Formatierungen Detailseite */ + +.detailsSpalte1, +.detailsSpalte2 +{ + width: 30%; + float: left; + font-size: 90%; + line-height: 115%; + margin-right: 5%; +} + +.detailsSpalte3 +{ + width: 30%; + float: left; + font-size: 90%; + line-height: 115%; +} + +.detailsSpalte1 .legende, +.detailsSpalte2 .legende, +.detailsSpalte3 .legende +{ + width: 145px; +} + +.titelPosition +{ + font-size: 17px; + font-weight: bold; +} + + +/* Laufzettelformatierungen */ +#laufzettelHistorie .boxtabelle:not(:nth-child(2)) +{ + border-top: 1px solid rgba(4, 101, 161, 0.2); + padding-top: 10px; + margin-top: 10px; +} + + + + + +/* 1023px und kleiner ************************************************/ + +@media screen and (max-width : 1023px) { + + .box + { + display: block; + width: 100%; + margin-bottom: 20px; + } + + .boxabstandtop + { + margin-top: 15px; + } + + .subBox:first-child + { + margin-bottom: 0 !important; + } + + .subBox:last-child + { + border-left: 1px solid rgba(4, 101, 161, 0.2); + } + + .first > .boxzeile > .subBox + { + border-top: none !important; + } + + .first > .boxzeile > .subBox:first-child + { + border-top: 1px solid rgba(4, 101, 161, 0.2) !important; + } + + .first > .boxzeile + { + margin-bottom: 0; + } + + #uebersichtUeberweisung.box + { + border-left: 1px solid rgba(4, 101, 161, 0.2); + } + + #uebersichtLastschrift.box + { + margin-bottom: 0; + } + + .boxzeile + { + display: block; + margin-bottom: 5px; + } + + .boxzeile:after + { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } + + #details > .boxtabelle > .boxzeile + { + margin-bottom: 0px; + } + + .boxcell + { + display: block; + } + + .boxcell:last-child + { + margin-top: 20px; + } + + .boxZweispaltig + { + width: 100%; + } + + .legende + { + display: block; + float: left; + width: 170px; + padding: 5px 0; + height: auto; + } + + .wert + { + display: block; + float: left; + width: calc(100% - 170px); + padding: 11px 10px !important; + line-height: 1.3; + min-height: 38px; + height: auto; + } + + .boxdaten .legende + { + height: auto; + } + + .rechnungsZeile .boxdaten + { + padding: 5px 0; + } + + .boxabstand + { + display: none; + } + + .boxtabelleEinspaltig { + width: 100%; + } + + .boxSpalte1 { + display: block; + width: auto; + } + + .boxSpalte2 { + display: block; + width: auto; + padding-left: 0px; + margin-top: 1.2rem; + } + + .detailsSpalte1, + .detailsSpalte2, + .detailsSpalte3 + { + width: 100%; + float: none; + padding-right: 0px; + } + + .detailsSpalte2, + .detailsSpalte3 + { + margin-top: 15px; + } + + .detailsSpalte2, + .detailsSpalte3 + { + margin-top: 10px; + } + + .tableNumberAlignRight + { + display: block; + width: 130px; + text-align: right; + } +} + + + +/* 800px und kleiner ************************************************/ + +@media screen and (max-width : 800px) { + + button + { + padding-top: 10px; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 20px; + height: 40px; + } + + .btnAktiv:after + { + top: 40px; + } + + .rechnungSp1 + { + width: 55%; + font-size: 15px; + } + + .rechnungSp2 + { + width: 10%; + } + + .rechnungSp3 + { + width: 35%; + text-align: right; + font-size: 15px; + } + + .grund + { + font-size: 15px; + } +} + +/* 450px und kleiner ************************************************/ + +@media screen and (max-width : 450px) +{ + + html, + body + { + font-size: 12px; + } + + .menue + { + margin-bottom: 20px; + } + + button + { + padding-top: 5px; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 17px; + height: 35px; + } + + .btnAktiv:after + { + top: 35px; + } + + .legende + { + font-size: 12px; + width: 100%; + } + + .wert + { + font-size: 12px; + line-height: 1.3; + width: 100%; + margin-bottom: 10px + } + + .boxzeile + { + margin-bottom: 0px + } + + .boxdaten + { + height: auto; + } + + .haftungausschluss + { + margin-bottom: 20px; + } + + .boxinhalt + { + margin-top: 0px; + } + + .boxabstandtop + { + margin-top: 20px; + } + + .boxtitel + { + padding: 7px 8px; + } + + .box + { + margin-bottom: 10px; + padding: 0; + } + + .boxabstandtop + { + margin-top: 10px; + } + + .boxdaten, + .boxdatenBlock + { + padding: 2px 0; + } + + .rechnungSp1 + { + width: 50%; + font-size: inherit; + } + + .rechnungSp2 + { + width: 15%; + } + + .rechnungSp3 + { + width: 35%; + font-size: inherit; + text-align: right; + } + + .grund + { + font-size: inherit; + } + + .titelPosition + { + font-size: 15px; + } + + .abstandUnten + { + margin-bottom: 5px; + } + + .detailsSpalte1, + .detailsSpalte2, + .detailsSpalte3 + { + font-size: inherit; + line-height: inherit; + } +} + +/* 380px und kleiner ************************************************/ + +@media screen and (max-width : 380px) { + + html, + body + { + font-size: 11px; + line-height: 100%; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 15px; + } + + .boxdaten +.boxdatenBlock + { + padding: 2px 0; + } + + .boxinhalt + { + margin-top: 0px; + } + + .boxtitel + { + padding: 5px 7px; + } +} diff --git a/xrechnung-viewer.js b/xrechnung-viewer.js new file mode 100644 index 00000000..2d547b86 --- /dev/null +++ b/xrechnung-viewer.js @@ -0,0 +1,145 @@ + +/* Tab-Container aufbauen **************************************************/ + +var a = new Array("uebersicht", "details", "zusaetze", "anlagen", "laufzettel"); +var b = new Array("menueUebersicht", "menueDetails", "menueZusaetze", "menueAnlagen", "menueLaufzettel"); + +function show(e) { + var i = 0; + var j = 1; + for (var t = 0; t < b.length; t++) { + if (b[t] === e.id) { + i = t; + if (i > 0) { + j = 0; + } else { + j = i + 1; + } + break; + } + } + e.setAttribute("class", "btnAktiv"); + for (var k = 0; k < b.length; k++) { + if (k === i && (document.getElementById(a[k]) != null)) { + document.getElementById(a[k]).style.display = "block"; + if (i === j) + j = i + 1; + } else { + if (document.getElementById(a[k]) != null) { + document.getElementById(a[j]).style.display = "none"; + document.getElementById(b[j]).setAttribute("class", "btnInaktiv"); + j += 1; + } + } + } +} +window.onload = function () { + document.getElementById(b[0]).setAttribute("class", "btnAktiv"); +} + +/* Eingebettete Binaerdaten runterladen ************************************/ + + +function base64_to_binary (data) { + var chars = atob(data); + var bytes = new Array(chars.length); + for (var i = 0; i < chars.length; i++) { + bytes[i] = chars.charCodeAt(i); + } + return new Uint8Array(bytes); +} + +function downloadData (element_id) { + var data_element = document.getElementById(element_id); + var mimetype = data_element.getAttribute('mimeType'); + var filename = data_element.getAttribute('filename'); + var text = data_element.innerHTML; + var binary = base64_to_binary(text); + var blob = new Blob([binary], { + type: mimetype, size: binary.length + }); + + if (window.navigator && window.navigator.msSaveOrOpenBlob) { + // IE + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + // Non-IE + var url = window.URL.createObjectURL(blob); + window.open(url); + } +} + + +/* Polyfill IE atob/btoa ************************************/ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function () { + factory(root); + }); + } else factory(root); + // node.js has always supported base64 conversions, while browsers that support + // web workers support base64 too, but you may never know. +})(typeof exports !== "undefined" ? exports: this, function (root) { + if (root.atob) { + // Some browsers' implementation of atob doesn't support whitespaces + // in the encoded string (notably, IE). This wraps the native atob + // in a function that strips the whitespaces. + // The original function can be retrieved in atob.original + try { + root.atob(" "); + } + catch (e) { + root.atob = (function (atob) { + var func = function (string) { + return atob(String(string).replace(/[\t\n\f\r ]+/g, "")); + }; + func.original = atob; + return func; + })(root.atob); + } + return; + } + + // base64 character set, plus padding character (=) + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + // Regular expression to check formal correctness of base64 encoded strings + b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + + root.btoa = function (string) { + string = String(string); + var bitmap, a, b, c, + result = "", i = 0, + rest = string.length % 3; // To determine the final padding + + for (; i < string.length;) { + if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string.charCodeAt(i++)) > 255) + throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); + + bitmap = (a << 16) | (b << 8) | c; + result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); + } + + // If there's need of padding, replace the last 'A's with equal signs + return rest ? result.slice(0, rest - 3) + "===".substring(rest): result; + }; + + root.atob = function (string) { + // atob can work with strings with whitespaces, even inside the encoded part, + // but only \t, \n, \f, \r and ' ', which can be stripped. + string = String(string).replace(/[\t\n\f\r ]+/g, ""); + if (! b64re.test(string)) + throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); + + // Adding the padding if missing, for semplicity + string += "==".slice(2 - (string.length & 3)); + var bitmap, result = "", r1, r2, i = 0; + for (; i < string.length;) { + bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); + + result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255): r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255): String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); + } + return result; + }; +}); \ No newline at end of file From afb6ae9a8db9e41d61bb5dff914d62005d16343a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 13:51:36 +0200 Subject: [PATCH 07/48] no message --- History.md | 1 + .../ZUGFeRD/ZUGFeRDVisualizer.java | 134 - .../org/mustangproject/toecount/Toecount.java | 44 - src/main/resources/stylesheets/cii-xr.xsl | 2202 ----------------- .../resources/stylesheets/xrechnung-html.xsl | 1188 --------- 5 files changed, 1 insertion(+), 3568 deletions(-) delete mode 100644 src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java delete mode 100644 src/main/resources/stylesheets/cii-xr.xsl delete mode 100644 src/main/resources/stylesheets/xrechnung-html.xsl diff --git a/History.md b/History.md index f24355a2..704cc024 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,7 @@ 1.7.2 ===== +2019-07-06 Support BuyerReference (r+w), as well as SpecifiedLegalOrganization (w) and DefinedTradeContact (w) use dom4j to format output xml document diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java deleted file mode 100644 index 03b820b3..00000000 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java +++ /dev/null @@ -1,134 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.ZUGFeRD; - -import javax.xml.transform.*; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class ZUGFeRDVisualizer { - - static final ClassLoader CLASS_LOADER = ZUGFeRDVisualizer.class.getClassLoader(); - private static final String RESOURCE_PATH = ""; //$NON-NLS-1$ - private static final Logger LOG = Logger.getLogger(ZUGFeRDVisualizer.class.getName()); - // private static File createTempFileResult(final Transformer transformer, final StreamSource toTransform, -// final String suffix) throws TransformerException, IOException { -// File result = File.createTempFile("ZUV_", suffix); //$NON-NLS-1$ -// result.deleteOnExit(); -// -// try (FileOutputStream fos = new FileOutputStream(result)) { -// transformer.transform(toTransform, new StreamResult(fos)); -// } -// return result; -// } - private TransformerFactory mFactory = null; - private Templates mXsltXRTemplate = null; - private Templates mXsltHTMLTemplate = null; - - public ZUGFeRDVisualizer() { - mFactory = new net.sf.saxon.TransformerFactoryImpl(); - //fact = TransformerFactory.newInstance(); - mFactory.setURIResolver(new ClasspathResourceURIResolver()); - try { - mXsltXRTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/cii-xr.xsl"))); - mXsltHTMLTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/xrechnung-html.xsl"))); - } catch (TransformerConfigurationException ex) { - LOG.log(Level.SEVERE, null, ex); - } - } - - public String visualize(String xmlFilename) throws FileNotFoundException, TransformerException, UnsupportedEncodingException { - /** - * * - * http://www.unece.org/fileadmin/DAM/cefact/xml/XML-Naming-And-Design-Rules-V2_1.pdf - * http://www.ferd-net.de/upload/Dokumente/FACTUR-X_ZUGFeRD_2p0_Teil1_Profil_EN16931_1p03.pdf - * http://countwordsfree.com/xmlviewer - */ - ByteArrayOutputStream iaos = new ByteArrayOutputStream(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - applySchematronXsl(new FileInputStream(xmlFilename), iaos); - // take the copy of the stream and re-write it to an InputStream - PipedInputStream in = new PipedInputStream(); - PipedOutputStream out; - try { - out = new PipedOutputStream(in); - new Thread(new Runnable() { - public void run () { - try { - // write the original OutputStream to the PipedOutputStream - // note that in order for the below method to work, you need - // to ensure that the data has finished writing to the - // ByteArrayOutputStream - iaos.writeTo(out); - } - catch (IOException e) { - // logging and exception handling should go here - } - finally { - // close the PipedOutputStream here because we're done writing data - // once this thread has completed its run - if (out != null) { - // close the PipedOutputStream cleanly - try { - out.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - }).start(); - applySchematronXsl2(in, baos); - } catch (IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - return baos.toString("UTF-8"); - } - - public void applySchematronXsl(final InputStream xmlFile, - final OutputStream HTMLOutstream) throws TransformerException { - Transformer transformer = mXsltXRTemplate.newTransformer(); - - transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); - } - - public void applySchematronXsl2(final InputStream xmlFile, - final OutputStream HTMLOutstream) throws TransformerException { - Transformer transformer = mXsltHTMLTemplate.newTransformer(); - - transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); - } - - private static class ClasspathResourceURIResolver implements URIResolver { - ClasspathResourceURIResolver() { - // Do nothing, just prevents synthetic access warning. - } - - @Override - public Source resolve(String href, String base) throws TransformerException { - return new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + href)); - } - } -} diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index 06843a4c..34b58526 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -324,8 +324,6 @@ public class Toecount { performConvert(sourceName, outName); } else if (upgradeRequested) { performUpgrade(sourceName, outName); - } else if (action.equals("convertToHTML")) { - performVisualization(sourceName, outName); } else { // no argument or argument unknown printUsage(); @@ -339,48 +337,6 @@ public class Toecount { } - private static void performVisualization(String sourceName, String outName) { - // Get params from user if not already defined - if (sourceName == null) { - sourceName = getFilenameFromUser("ZUGFeRD XML source", "zugferd-invoice.xml", "xml", true, false); - } else { - System.out.println("ZUGFeRD XML source set to " + sourceName); - } - if (outName == null) { - outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "factur-x.html", "html", false, true); - } else { - System.out.println("ZUGFeRD 1.0 XML source set to " + outName); - } - - // Verify params - try { - ensureFileExists(sourceName); - ensureFileNotExists(outName); - - //stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - - ZUGFeRDVisualizer zvi = new ZUGFeRDVisualizer(); - String xml = null; - try { - xml = zvi.visualize(sourceName); - Files.write(Paths.get(outName), xml.getBytes()); - } catch (FileNotFoundException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (UnsupportedEncodingException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (TransformerException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - System.out.println("Written to " + outName); - - - } - private static void performUpgrade(String xmlName, String outName) throws IOException, TransformerException { // Get params from user if not already defined diff --git a/src/main/resources/stylesheets/cii-xr.xsl b/src/main/resources/stylesheets/cii-xr.xsl deleted file mode 100644 index 5fca7b9d..00000000 --- a/src/main/resources/stylesheets/cii-xr.xsl +++ /dev/null @@ -1,2202 +0,0 @@ - - - - - - Author: KoSIT Bremen (kosit@finanzen.bremen.de) - Fassung vom: 2019-03-18+01:00 - Überführt eine zur EN 16931 konforme elektronische Rechnung in der konkreten Syntax UNCEFACT.CII.D16B in eine Instanz gemäß des Schemas für den Namensraum urn:ce.eu:en16931:2017:xoev-de:kosit:standard:xrechnung-1. - Das Skript setzt voraus, dass das zu verarbeitende Dokument valide bzgl. des XML Schemas und der Schematron-Regeln der Quelle ist. Für nicht valide Dokumente ist das Ergebnis nicht definiert. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ILLEGAL DATE FORMAT: <para>Mit diesem Datentyp wird ein kalendarisches Datum abgebildet, wie es in der ISO 8601 Spezifikation <quote>Calendar date complete representation</quote> beschrieben ist (siehe ISO 8601:2004, Abschnitt 5.2.1.1). Das Datum beinhaltet keine Zeitangabe. Das konkret zu verwendende Format ist abhängig von der genutzten Syntax.</para> -<para>Der Datentyp basiert auf dem Typ <quote>Date Time. Type</quote>, wie in ISO 15000-5:2014 Anhang B definiert.</para> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. - - - - - - - - - - - Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. - - - - - / - - - [ - - ] - - - - /@ - - - diff --git a/src/main/resources/stylesheets/xrechnung-html.xsl b/src/main/resources/stylesheets/xrechnung-html.xsl deleted file mode 100644 index 5e15f314..00000000 --- a/src/main/resources/stylesheets/xrechnung-html.xsl +++ /dev/null @@ -1,1188 +0,0 @@ - - - - - - - - - - - - - - - XRechnung - - - - -
- -
-
-
- - - - - -
-
- - - -
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
- - - -
- - - -
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
-
- - -
-
- -
-
- - -
-
- -
-
- -
-
-
-
- - - -
-
Informationen zum Käufer
-
-
-
Leitweg-ID:
-
-
-
-
Name:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Land:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Name:
-
-
-
-
Telefon:
-
-
-
-
E-Mail-Adresse:
-
-
-
-
-
- - - -
-
Informationen zum Verkäufer
-
-
-
Firmenname:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Ländercode:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Name:
-
-
-
-
Telefon:
-
-
-
-
E-Mail-Adresse:
-
-
-
-
-
- - - -
-
-
Rechnungsdaten
-
-
-
-
-
Rechnungsnummer:
-
-
-
-
Rechnungsdatum:
-
-
-
-
Rechnungsart:
-
-
-
-
Währung:
-
-
-
-

Abrechnungszeitraum:

-
-
-
von:
-
-
-
-
bis:
-
-
-
-
-
-
-
-
-
Projektnummer:
-
-
-
-
Vertragsnummer:
-
-
-
-
Bestellnummer:
-
-
-
-
Auftragsnummer:
-
-
-
-

Vorausgegangene Rechnungen:

- -
-
-
-
-
- - -
-
-
Rechnungsnummer:
-
-
-
-
Rechnungsdatum:
-
-
-
-
- - - -
-
-
Gesamtbeträge der Rechnung
-
-
-
Summe aller Positionen
-
netto
-
-
-
-
Summe Nachlässe
-
netto
-
-
-
-
Summe Zuschläge
-
netto
-
-
-
-
Gesamtsumme
-
netto
-
-
-
-
Summe Umsatzsteuer
-
-
-
-
-
Summe Umsatzsteuer in Abrechnungswährung
-
-
-
-
-
Gesamtsumme
-
brutto
-
-
-
-
Gezahlter Betrag
-
brutto
-
-
-
-
Rundungsbetrag
-
brutto
-
-
-
-
Fälliger Betrag
-
brutto
-
-
-
-
-
-
- - - -
-
-
Aufschlüsselung der Umsatzsteuer auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie:
-
-
-
-
-
Gesamtsumme
-
netto
-
-
-
-
Umsatzsteuersatz
-
-
%
-
-
-
Umsatzsteuerbetrag
-
-
-
-
- -
-
Befreiungsgrund:
-
Kennung für den Befreiungsgrund:
-
-
-
-
- - - -
-
-
Nachlass auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie des Nachlasses:
-
-
-
-
-
Grundbetrag
-
netto
-
-
-
-
Prozentsatz
-
-
%
-
-
-
Nachlass
-
netto
-
-
-
-
Umsatzsteuersatz des Nachlasses
-
-
-
-
-
-
Grund für den Nachlass:
-
Document level allowance reason code:
-
-
-
-
-
- - - -
-
-
Zuschlag auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie des Zuschlages:
-
-
-
-
-
Grundbetrag
-
netto
-
-
-
-
Prozentsatz
-
-
%
-
-
-
Zuschlag
-
netto
-
-
-
-
Umsatzsteuersatz des Zuschlages
-
-
-
-
-
-
Grund für den Zuschlag:
-
Document level charge reason code:
-
-
-
-
-
- - - -
-
Zahlungsdaten
-
-
-
Skonto; weitere Zahlungsbedingungen:
-
-
-
-
Fälligkeitsdatum:
-
-
-
-
Code für das Zahlungsmittel:
-
-
-
-
Zahlungsmittel:
-
-
-
-
Verwendungszweck:
-
-
-
-
-
- - - -
-
Karteninformation
-
-
-
Kartennummer:
-
-
-
-
Karteninhaber:
-
-
-
-
-
- - - -
-
Lastschrift
-
-
-
Mandatsreferenznr.:
-
-
-
-
IBAN:
-
-
-
-
Gläubiger-ID:
-
-
-
-
-
- - - -
-
Überweisung
-
-
-
Kontoinhaber:
-
-
-
-
IBAN:
-
-
-
-
BIC:
-
-
-
-
-
- - - -
-
Bemerkung zur Rechnung
-
-
-
Betreff:
-
-
-
-
Bemerkung:
-
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
- -
-
- - - -
-
-
-
Position
-
-
-
Freitext:
-
-
-
-
Objektkennung:
-
-
-
-
Schema der Objektkennung:
-
-
-
-
Nummer der Auftragsposition:
-
-
-
-
Kontierungshinweis:
-
-
-

Abrechnungszeitraum:

-
-
von:
-
-
-
-
bis:
-
-
-
-
-
-
Preiseinzelheiten
-
-
-
Menge
-
-
-
-
Einheit
-
-
-
-
Preis pro Einheit (netto)
-
-
-
-
Gesamtpreis (netto)
-
-
-
-
-
-
Rabatt (netto):
-
-
-
-
Listenpreis (netto):
-
-
-
-
Anzahl der Einheit:
-
-
-
-
Code der Maßeinheit:
-
-
-
-
Umsatzsteuer:
-
-
-
-
Umsatzsteuersatz in Prozent:
-
%
-
-
-
-
-
-
-
-
-
Nachlässe auf Ebene der Rechnungsposition
-
-
-
Grundbetrag (netto)
-
-
-
-
Prozentsatz
-
%
-
-
-
Nachlass (netto)
-
-
-
-
-
Grund des Nachlasses:
-
Code für den Nachlassgrund:
-
-
-
-
Zuschläge auf Ebene der Rechnungsposition
-
-
-
Grundbetrag (netto)
-
-
-
-
Prozentsatz
-
%
-
-
-
Zuschlag (netto)
-
-
-
-
-
Grund des Zuschlags:
-
Code für den Zuschlagsgrund:
-
-
-
-
-
-
-
-
Artikelinformationen
-
-
-
-
-
-
Bezeichnung:
-
-
-
-
Beschreibung:
-
-
-
-
Artikelnummer:
-
-
-
-
Artikelkennung des Käufers:
-
-
-

Eigenschaften des Artikels:

- -
-
-
-
-
-
-
Artikelkennung:
-
-
-
-
Schema der Artikelkennung:
-
-
-
-
Code der Artikelklassifizierung:
-
-
-
-
Kennung zur Bildung des Schemas:
-
-
-
-
Version zur Bildung des Schemas:
-
-
-
-
Code des Herkunftslandes:
-
-
-
-
-
-
-
-
-
-
- - - -
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
- -
- -
-
-
-
- -
- -
-
-
-
- -
- -
-
-
-
- - - -
-
Informationen zum Verkäufer
-
-
-
Abweichender Handelsname:
-
-
-
-
Bundesland:
-
-
-
-
Elektronische Adresse:
-
-
-
-
Schema der elektronischen Adresse:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
Steuernummer:
-
-
-
-
Schema der Steuernummer:
-
-
-
-
Weitere rechtliche Informationen:
-
-
-
-
Code der Umsatzsteuerwährung:
-
-
-
-
-
- - - -
-
Steuervertreter des Verkäufers
-
-
-
Name:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Ländercode:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
-
- - - -
-
Informationen zum Käufer
-
-
-
Abweichender Handelsname:
-
-
-
-
Bundesland:
-
-
-
-
Elektronische Adresse:
-
-
-
-
Schema der elektronischen Adresse:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Schema der Register-/Registriernummer:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
Abrechnungsdatum der Umsatzsteuer:
-
-
-
-
Code des Umsatzsteuer-Abrechnungsdatums:
-
-
-
-
Kontierungsinformation:
-
-
-
-
-
- - - -
-
Lieferinformationen
-
-
-
Kennung des Lieferorts:
-
-
-
-
Schema der Kennung:
-
-
-
-
Lieferdatum:
-
-
-
-
Name des Empfängers:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Land:
-
-
-
-
-
- - - -
-
Informationen zum Vertrag
-
-
-
Vergabenummer:
-
-
-
-
Kennung der Empfangsbestätigung:
-
-
-
-
Kennung der Versandanzeige:
-
-
-
-
Prozesskennung:
-
-
-
-
Spezifikationskennung:
-
-
-
-
Objektkennung:
-
-
-
-
Schema der Objektkennung:
-
-
-
-
-
- - - -
-
Vom Verkäufer abweichender Zahlungsempfänger
-
-
-
Name:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Schema der Register-/Registriernummer:
-
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
-
-
Rechnungsbegründende Unterlagen
- -
-
-
-
-
- - - -
-
-
Kennung:
-
-
-
-
Beschreibung:
-
-
-
-
Verweis (z.B. Internetadresse):
-
-
-
-
Anhangsdokument:
-
- Öffnen -
- - -
-
-
Format des Anhangdokuments:
-
-
-
-
Name des Anhangsdokuments:
-
-
-
-
- - - -
-
-
-
-
Bearbeitungshistorie
- -
-
-
-
-
- - - -
-
-
Datum/Uhrzeit:
-
-
-
-
Betreff:
-
-
-
-
Text:
-
-
-
-
Details:
-
-
-
-
- -
From 560556fbd4f7a425ecdf5f89887e5c1f3fca204f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 13:52:32 +0200 Subject: [PATCH 08/48] [maven-release-plugin] prepare release mustang-1.7.2 --- pom.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 67a0bb2a..4c6a7b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,9 @@ - + 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2-SNAPSHOT + 1.7.2 jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -14,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.5.2 + mustang-1.7.2 @@ -203,8 +202,7 @@ 2.4.3 - + org.mustangproject.toecount.Toecount From a08a5ec344c7273590e69b5503a7c6a3d270d154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 13:52:39 +0200 Subject: [PATCH 09/48] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4c6a7b8e..ad1bfc0b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2 + 1.7.3-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.7.2 + mustang-1.5.2 From 97766c749463131ce26d3f6c41460ddaa7f61645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 21:39:37 +0200 Subject: [PATCH 10/48] no message --- pom.xml | 2 +- .../java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index ad1bfc0b..ed9d55d5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3-SNAPSHOT + 1.7.2-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index c9004873..a33ea2e3 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -128,8 +128,9 @@ public class ZUGFeRDImporter { private void extractFiles(Map names) throws IOException { for (String alias : names.keySet()) { - String filename=names.get(alias).getFilename(); - + + PDComplexFileSpecification fileSpec = names.get(alias); + String filename=fileSpec.getFilename(); /** * currently (in the release candidate of version 1) only one attached file with * the name ZUGFeRD-invoice.xml is allowed @@ -137,7 +138,6 @@ public class ZUGFeRDImporter { if ((filename.equals("ZUGFeRD-invoice.xml") || (filename.equals("zugferd-invoice.xml")) || filename.equals("factur-x.xml"))) { //$NON-NLS-1$ containsMeta = true; - PDComplexFileSpecification fileSpec = names.get(filename); PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); // String embeddedFilename = filePath + filename; // File file = new File(filePath + filename); @@ -154,7 +154,6 @@ public class ZUGFeRDImporter { } if (filename.startsWith("additional_data")) { - PDComplexFileSpecification fileSpec = names.get(filename); PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); additionalXMLs.put(filename, embeddedFile.toByteArray()); From a7b26247d2796886779f247be416a23b61aedbc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 21:40:21 +0200 Subject: [PATCH 11/48] [maven-release-plugin] prepare release mustang-1.7.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ed9d55d5..4c6a7b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2-SNAPSHOT + 1.7.2 jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.5.2 + mustang-1.7.2 From 976d3813a3b55f814433dcf7ae225b55e786678d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sat, 6 Jul 2019 21:40:29 +0200 Subject: [PATCH 12/48] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4c6a7b8e..ad1bfc0b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2 + 1.7.3-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.7.2 + mustang-1.5.2 From 636829aed34c2aad0ca7b631946015c49d4087d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Mon, 8 Jul 2019 19:03:33 +0200 Subject: [PATCH 13/48] Bankleitzahl (german bank code) is invalid in the schema file and in the spec of ZF2 --- .../java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 331e2a96..40ccc6eb 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -412,8 +412,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { + " \n" //$NON-NLS-1$ + " \n" //$NON-NLS-1$ + " " + payment.getOwnBIC() + "\n" //$NON-NLS-1$ //$NON-NLS-2$ - + " " + payment.getOwnBLZ() //$NON-NLS-1$ - + "\n" //$NON-NLS-1$ // + " "+trans.getOwnBankName()+"\n" //$NON-NLS-1$ // //$NON-NLS-2$ + " \n" //$NON-NLS-1$ From 96522d3af42d9f3a8796154db6cecb61636f9102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Mon, 8 Jul 2019 19:11:43 +0200 Subject: [PATCH 14/48] release without german national bank code in zf2 --- History.md | 3 ++- pom.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 704cc024..1a50736f 100644 --- a/History.md +++ b/History.md @@ -1,7 +1,7 @@ 1.7.2 ===== -2019-07-06 +2019-07-08 Support BuyerReference (r+w), as well as SpecifiedLegalOrganization (w) and DefinedTradeContact (w) use dom4j to format output xml document @@ -9,6 +9,7 @@ corrected some exception logging glitches upgrade PDFBox to 2.0.15+ extraction to use proper filename instead of alias #98 NullPointerException in ZUGFeRDImporter.extractLowLevel #96 +Removed Bankleitzahl from ZF2 1.7.1 diff --git a/pom.xml b/pom.xml index ad1bfc0b..ed9d55d5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3-SNAPSHOT + 1.7.2-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs From d6c45c65eea7c63ffedcb0e003d8203f0ec4071c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Mon, 8 Jul 2019 19:12:29 +0200 Subject: [PATCH 15/48] [maven-release-plugin] prepare release mustang-1.7.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ed9d55d5..4c6a7b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2-SNAPSHOT + 1.7.2 jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.5.2 + mustang-1.7.2 From b8163a407fcf08118850ffd501120dcc69c46e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Mon, 8 Jul 2019 19:14:20 +0200 Subject: [PATCH 16/48] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4c6a7b8e..ad1bfc0b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.2 + 1.7.3-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.7.2 + mustang-1.5.2 From 94453bbd031d04a3c8777dfc6dcbbeafd84bfe48 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 8 Jul 2019 22:25:48 +0200 Subject: [PATCH 17/48] skip over BOM in XML input --- .../ZUGFeRD/ZUGFeRDImporter.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index a33ea2e3..be95f293 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -180,11 +180,40 @@ public class ZUGFeRDImporter { DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); xmlFact.setNamespaceAware(false); DocumentBuilder builder = xmlFact.newDocumentBuilder(); - Document doc = builder.parse(new ByteArrayInputStream(rawXML)); + ByteArrayInputStream is = new ByteArrayInputStream(rawXML); + is.skip(guessBOMSize(is)); + Document doc = builder.parse(is); //prettyPrint(doc); return doc; } + /** + * Skips over a BOM at the beginning of the given ByteArrayInputStream, if one exists. + * @param is the ByteArrayInputStream used + * @throws IOException + * @see Autodetection of Character Encodings + */ + private int guessBOMSize(ByteArrayInputStream is) throws IOException { + byte[] pad = new byte[4]; + is.read(pad); + is.reset(); + int test2 = ((pad[0] & 0xFF) << 8) | (pad[1] & 0xFF); + int test3 = ((test2 & 0xFFFF) << 8) | (pad[2] & 0xFF); + int test4 = ((test3 & 0xFFFFFF) << 8) | (pad[3] & 0xFF); + // + if (test4 == 0x0000FEFF || test4 == 0xFFFE0000 || test4 == 0x0000FFFE || test4 == 0xFEFF0000) { + // UCS-4: BOM takes 4 bytes + return 4; + } else if (test3 == 0xEFBBFF) { + // UTF-8: BOM takes 3 bytes + return 3; + } else if (test2 == 0xFEFF || test2 == 0xFFFE) { + // UTF-16: BOM takes 2 bytes + return 2; + } + return 0; + } + private String extractString(String xpathStr) { if (!containsMeta) { throw new ZUGFeRDExportException("No suitable data/ZUGFeRD file could be found."); From 7e74739023f18590580e3ca56266075c3db679db Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Tue, 9 Jul 2019 21:29:08 +0200 Subject: [PATCH 18/48] updates for 2.0 compatibility (IncludedNote, SpecifiedTaxRegistration) --- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 40ccc6eb..e2f7f09d 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -214,9 +214,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); //$NON-NLS-1$ String senderReg = ""; if (trans.getOwnOrganisationFullPlaintextInfo() != null) { - senderReg = "" + "\n" + " \n" + senderReg = "" + "\n" + " \n" + trans.getOwnOrganisationFullPlaintextInfo() + " \n" - + "REG\n" + "\n"; + + "REG\n" + "\n"; } @@ -378,11 +378,13 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { + " " + trans.getRecipient().getStreet() + "\n" //$NON-NLS-1$ //$NON-NLS-2$ + " " + trans.getRecipient().getLocation() + "\n" //$NON-NLS-1$ //$NON-NLS-2$ + " " + trans.getRecipient().getCountry() + "\n" //$NON-NLS-1$ //$NON-NLS-2$ - + " \n" //$NON-NLS-1$ - + " \n" //$NON-NLS-1$ + + " \n"; //$NON-NLS-1$ + if (trans.getRecipient().getVATID() != null) { + xml += " \n" //$NON-NLS-1$ + " " + trans.getRecipient().getVATID() + "\n" //$NON-NLS-1$ //$NON-NLS-2$ - + " \n" //$NON-NLS-1$ - + " \n" //$NON-NLS-1$ + + " \n"; //$NON-NLS-1$ + } + xml += " \n" //$NON-NLS-1$ // + " \n" // + " 20130301\n" // + " 2013-471331\n" From d045073c78466b7a971003ec93977c8082515922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Wed, 10 Jul 2019 17:53:13 +0200 Subject: [PATCH 19/48] refer to (external) css and js file instead of embedding them --- src/main/resources/stylesheets/xrechnung-html.xsl | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/resources/stylesheets/xrechnung-html.xsl b/src/main/resources/stylesheets/xrechnung-html.xsl index 5e15f314..54a0de84 100644 --- a/src/main/resources/stylesheets/xrechnung-html.xsl +++ b/src/main/resources/stylesheets/xrechnung-html.xsl @@ -18,9 +18,7 @@ XRechnung - +
@@ -44,9 +42,7 @@ - + From fb53501c61d7873d43c2eea0df97dc6601d5cb0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Wed, 10 Jul 2019 18:41:06 +0200 Subject: [PATCH 20/48] zf1 visualization, recognition if file is zf1 or zf2 --- .../ZUGFeRD/ZUGFeRDVisualizer.java | 141 +++++++++++------- .../stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt | 2 +- 2 files changed, 87 insertions(+), 56 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java index 03b820b3..eb75f9dd 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDVisualizer.java @@ -21,7 +21,11 @@ package org.mustangproject.ZUGFeRD; import javax.xml.transform.*; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; + import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.logging.Level; import java.util.logging.Logger; @@ -30,94 +34,121 @@ public class ZUGFeRDVisualizer { static final ClassLoader CLASS_LOADER = ZUGFeRDVisualizer.class.getClassLoader(); private static final String RESOURCE_PATH = ""; //$NON-NLS-1$ private static final Logger LOG = Logger.getLogger(ZUGFeRDVisualizer.class.getName()); - // private static File createTempFileResult(final Transformer transformer, final StreamSource toTransform, -// final String suffix) throws TransformerException, IOException { -// File result = File.createTempFile("ZUV_", suffix); //$NON-NLS-1$ -// result.deleteOnExit(); -// -// try (FileOutputStream fos = new FileOutputStream(result)) { -// transformer.transform(toTransform, new StreamResult(fos)); -// } -// return result; -// } + // private static File createTempFileResult(final Transformer transformer, final + // StreamSource toTransform, + // final String suffix) throws TransformerException, IOException { + // File result = File.createTempFile("ZUV_", suffix); //$NON-NLS-1$ + // result.deleteOnExit(); + // + // try (FileOutputStream fos = new FileOutputStream(result)) { + // transformer.transform(toTransform, new StreamResult(fos)); + // } + // return result; + // } private TransformerFactory mFactory = null; private Templates mXsltXRTemplate = null; private Templates mXsltHTMLTemplate = null; + private Templates mXsltZF1HTMLTemplate = null; public ZUGFeRDVisualizer() { mFactory = new net.sf.saxon.TransformerFactoryImpl(); - //fact = TransformerFactory.newInstance(); + // fact = TransformerFactory.newInstance(); mFactory.setURIResolver(new ClasspathResourceURIResolver()); try { - mXsltXRTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/cii-xr.xsl"))); - mXsltHTMLTemplate = mFactory.newTemplates(new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/xrechnung-html.xsl"))); + mXsltXRTemplate = mFactory.newTemplates( + new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/cii-xr.xsl"))); + mXsltHTMLTemplate = mFactory.newTemplates(new StreamSource( + CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/xrechnung-html.xsl"))); + mXsltZF1HTMLTemplate = mFactory.newTemplates(new StreamSource( + CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt"))); } catch (TransformerConfigurationException ex) { LOG.log(Level.SEVERE, null, ex); } } - public String visualize(String xmlFilename) throws FileNotFoundException, TransformerException, UnsupportedEncodingException { + public String visualize(String xmlFilename) + throws FileNotFoundException, TransformerException, UnsupportedEncodingException { /** * * * http://www.unece.org/fileadmin/DAM/cefact/xml/XML-Naming-And-Design-Rules-V2_1.pdf * http://www.ferd-net.de/upload/Dokumente/FACTUR-X_ZUGFeRD_2p0_Teil1_Profil_EN16931_1p03.pdf * http://countwordsfree.com/xmlviewer */ + FileInputStream fis=new FileInputStream(xmlFilename); + String fileContent=""; + try { + fileContent = new String(Files.readAllBytes(Paths.get(xmlFilename))); + } catch (IOException e2) { + LOG.log(Level.SEVERE, null, e2); + } + ByteArrayOutputStream iaos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - applySchematronXsl(new FileInputStream(xmlFilename), iaos); - // take the copy of the stream and re-write it to an InputStream - PipedInputStream in = new PipedInputStream(); - PipedOutputStream out; - try { - out = new PipedOutputStream(in); - new Thread(new Runnable() { - public void run () { - try { - // write the original OutputStream to the PipedOutputStream - // note that in order for the below method to work, you need - // to ensure that the data has finished writing to the - // ByteArrayOutputStream - iaos.writeTo(out); - } - catch (IOException e) { - // logging and exception handling should go here - } - finally { - // close the PipedOutputStream here because we're done writing data - // once this thread has completed its run - if (out != null) { - // close the PipedOutputStream cleanly - try { - out.close(); + + String zf1Signature = "rsm:CrossIndustryDocument"; + if (fileContent.contains(zf1Signature)) { + applyZF1SchematronXsl(fis, baos); + + } else { + //zf2 or fx + applySchematronXsl(fis, iaos); + // take the copy of the stream and re-write it to an InputStream + PipedInputStream in = new PipedInputStream(); + PipedOutputStream out; + try { + out = new PipedOutputStream(in); + new Thread(new Runnable() { + public void run() { + try { + // write the original OutputStream to the PipedOutputStream + // note that in order for the below method to work, you need + // to ensure that the data has finished writing to the + // ByteArrayOutputStream + iaos.writeTo(out); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + LOG.log(Level.SEVERE, null, e); + } finally { + // close the PipedOutputStream here because we're done writing data + // once this thread has completed its run + if (out != null) { + // close the PipedOutputStream cleanly + try { + out.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + LOG.log(Level.SEVERE, null, e); + } + } } - } - } - } - }).start(); - applySchematronXsl2(in, baos); - } catch (IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); + } + }).start(); + applySchematronXsl2(in, baos); + } catch (IOException e1) { + LOG.log(Level.SEVERE, null, e1); + } } return baos.toString("UTF-8"); } - public void applySchematronXsl(final InputStream xmlFile, - final OutputStream HTMLOutstream) throws TransformerException { + public void applySchematronXsl(final InputStream xmlFile, final OutputStream HTMLOutstream) + throws TransformerException { Transformer transformer = mXsltXRTemplate.newTransformer(); - + transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); } - public void applySchematronXsl2(final InputStream xmlFile, - final OutputStream HTMLOutstream) throws TransformerException { + public void applyZF1SchematronXsl(final InputStream xmlFile, final OutputStream HTMLOutstream) + throws TransformerException { + Transformer transformer = mXsltZF1HTMLTemplate.newTransformer(); + + transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); + } + + public void applySchematronXsl2(final InputStream xmlFile, final OutputStream HTMLOutstream) + throws TransformerException { Transformer transformer = mXsltHTMLTemplate.newTransformer(); - + transformer.transform(new StreamSource(xmlFile), new StreamResult(HTMLOutstream)); } diff --git a/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt b/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt index 97f444fe..bf0b71e4 100644 --- a/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt +++ b/src/main/resources/stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt @@ -57,7 +57,7 @@ Kosten, Verluste bzw. Schäden hätte normalerweise vorhergesehen werden können - + From 020ca043b60295feaff5540cb2753d54168f742a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sun, 14 Jul 2019 10:53:20 +0200 Subject: [PATCH 21/48] updated javadoc --- History.md | 3 + .../ZUGFeRD/IExporterFactory.java | 12 ++- .../ZUGFeRD/IZUGFeRDExportableContact.java | 4 +- .../ZUGFeRD/IZUGFeRDExportableProduct.java | 2 +- .../IZUGFeRDExportableTransaction.java | 4 +- .../org/mustangproject/ZUGFeRD/VATAmount.java | 5 +- .../ZUGFeRD/XMPSchemaZugferd.java | 7 +- .../ZUGFeRD/ZUGFeRDExporter.java | 85 +++++++++++++++---- .../ZUGFeRD/ZUGFeRDExporterFromA3Factory.java | 6 +- .../ZUGFeRD/ZUGFeRDImporter.java | 1 + .../org/mustangproject/toecount/Toecount.java | 15 ++-- 11 files changed, 106 insertions(+), 38 deletions(-) diff --git a/History.md b/History.md index 1a50736f..0a274709 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,6 @@ +- migration: testIndicator entfernen +- in ram:ExchangedDocument: ram:name entfernen +- updated javadoc 1.7.2 ===== diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java b/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java index 47c22cc6..6822d744 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IExporterFactory.java @@ -22,6 +22,13 @@ import java.io.IOException; import java.io.InputStream; public interface IExporterFactory { + /** + * factory: loads a PDF file and returns an appropriate exporter + * + * @param pdfFilename binary of a PDF/A1 compliant document + * @return the generated exporter + * @throws IOException if anything is wrong with filename + */ public ZUGFeRDExporter load(String pdfFilename) throws IOException; /** @@ -29,6 +36,8 @@ public interface IExporterFactory { * metadata level, this will not e.g. convert graphics to JPG-2000) * * @param pdfBinary binary of a PDF/A1 compliant document + * @return the generated exporter + * @throws IOException (should not happen at all) */ public ZUGFeRDExporter load(byte[] pdfBinary) throws IOException; @@ -37,7 +46,8 @@ public interface IExporterFactory { * metadata level, this will not e.g. convert graphics to JPG-2000) * * @param pdfSource source to read a PDF/A1 compliant document from - * @throws IOException + * @throws IOException if anything is wrong with inputstream + * @return the generated ZUGFeRDExporter */ public ZUGFeRDExporter load(InputStream pdfSource) throws IOException; diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java index 7b7e1c89..6b154b67 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java @@ -19,11 +19,11 @@ package org.mustangproject.ZUGFeRD; /** - * Mustangproject's ZUGFeRD implementation Neccessary interface for ZUGFeRD exporter Licensed under the APLv2 + * Mustangproject's ZUGFeRD implementation neccessary interface for ZUGFeRD exporter Licensed under the APLv2 * * @author jstaerk * @version 1.2.0 - * @date 2014-05-10 + * dated 2014-05-10 */ diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java index d58a2588..ea41877f 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java @@ -27,7 +27,7 @@ import java.math.BigDecimal; * * @author jstaerk * @version 1.2.0 - * @date 2014-05-10 + * dated 2014-05-10 */ public interface IZUGFeRDExportableProduct { diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 6addf89f..0de986c1 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -64,7 +64,7 @@ public interface IZUGFeRDExportableTransaction { /** * this should be the full sender institution name, details, manager and tax registration. It is one of the few functions which may return null. e.g. - *

+ *

* Lieferant GmbH Lieferantenstraße 20 80333 München Deutschland Geschäftsführer: Hans Muster Handelsregisternummer: H A 123 * * @return null or full sender institution name, details, manager and tax registration @@ -115,6 +115,8 @@ public interface IZUGFeRDExportableTransaction { /** * the creditors payment informations + * + * @return an array of IZUGFeRDTradeSettlementPayment */ IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment(); diff --git a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java index 817595f6..3ba0acc1 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java @@ -27,7 +27,7 @@ import java.math.BigDecimal; * * @author jstaerk * @version 1.2.0 - * @date 2015-10-29 + * dated 2015-10-29 */ public class VATAmount { @@ -61,6 +61,7 @@ public class VATAmount { /** * * @deprecated Use {@link #getCategoryCode() instead} + * @return String with category code */ @Deprecated public String getDocumentCode() { @@ -68,7 +69,7 @@ public class VATAmount { } /** - * + * @param documentCode as String * @deprecated Use {@link #setCategoryCode(String)} instead */ @Deprecated diff --git a/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java b/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java index 57cc5197..c2a4bde5 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java @@ -31,8 +31,13 @@ import org.apache.xmpbox.schema.XMPSchema; public class XMPSchemaZugferd extends XMPSchema { - /** + /*** * This is what needs to be added to the RDF metadata - basically the name of the embedded Zugferd file + * @param metadata the xmp to be added to + * @param conformanceLevel e.g. conformanceLevel.EN16931 + * @param URN the xml URI for the XMP + * @param prefix the xml namespace prefix for the XMP, zf for ZUGFeRD, fx for Factur-X + * @param filename the filename of the invoice */ public XMPSchemaZugferd(XMPMetadata metadata, ZUGFeRDConformanceLevel conformanceLevel, String URN, String prefix, String filename) { super(metadata, URN, prefix, "ZUGFeRD Schema"); diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java index 211a8397..af5dd4cc 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java @@ -195,15 +195,16 @@ public class ZUGFeRDExporter implements Closeable { /** * All files are PDF/A-3, setConformance refers to the level conformance. - *

+ * * PDF/A-3 has three conformance levels, called "A", "U" and "B". - *

+ *

* PDF/A-3-B where B means only visually preservable, U -standard for Mustang- * means visually and unicode preservable and A means full compliance, i.e. * visually, unicode and structurally preservable and tagged PDF, i.e. useful * metainformation for blind people. - *

+ *

* Feel free to pass "A" as new level if you know what you are doing :-) + * @param newLevel "A", "U" or "B" * * @deprecated Use {@link ZUGFeRDExporterFromA1Factory} instead */ @@ -217,16 +218,17 @@ public class ZUGFeRDExporter implements Closeable { /** * All files are PDF/A-3, setConformance refers to the level conformance. - *

+ *

* PDF/A-3 has three conformance levels, called "A", "U" and "B". - *

+ *

* PDF/A-3-B where B means only visually preservable, U -standard for Mustang- * means visually and unicode preservable and A means full compliance, i.e. * visually, unicode and structurally preservable and tagged PDF, i.e. useful * metainformation for blind people. - *

+ *

* Feel free to pass "A" as new level if you know what you are doing :-) * + * @param newLevel "A", "U" or "B" * @deprecated Use * {@link #setConformanceLevel(org.mustangproject.ZUGFeRD.PDFAConformanceLevel)} * instead @@ -251,27 +253,45 @@ public class ZUGFeRDExporter implements Closeable { ignoreA1Errors = true; } - /** + /*** + * load from a pdf which is already A/3 + * @param filename the PDF + * @throws IOException if anything is wrong with filename * @deprecated Use the factory method {@link #createFromPDFA3(String)} instead */ @Deprecated public void loadPDFA3(String filename) throws IOException { doc = PDDocument.load(new File(filename)); } - + + /*** + * factory create a ZUGFeRD exporter for a PDF/A-3 pdf file + * @param filename of the pdf + * @return the created ZUGFeRDExporter + * @throws IOException if something is wrong with filename + */ public static ZUGFeRDExporter createFromPDFA3(String filename) throws IOException { return new ZUGFeRDExporter(PDDocument.load(new File(filename))); } /** - * @deprecated Use the factory method {@link #createFromPDFA3(InputStream)} - * instead + * load from a pdf which is already A/3 from filestream + * @param file InputStream to load pdf from + * @deprecated Use the factory method {@link #createFromPDFA3(InputStream)} instead + * @throws IOException in case anything is wrong with file + * */ @Deprecated public void loadPDFA3(InputStream file) throws IOException { doc = PDDocument.load(file); } + /*** + * factory create a ZUGFeRD exporter for a PDF/A-3 inputstream + * @param pdfSource the InputStream of the pdf + * @return the created ZUGFeRDExporter + * @throws IOException (should not happen) + */ public static ZUGFeRDExporter createFromPDFA3(InputStream pdfSource) throws IOException { return new ZUGFeRDExporter(PDDocument.load(pdfSource)); } @@ -279,7 +299,13 @@ public class ZUGFeRDExporter implements Closeable { /** * Makes A PDF/A3a-compliant document from a PDF-A1 compliant document (on the * metadata level, this will not e.g. convert graphics to JPG-2000) - * + * @param filename the pdf + * @param producer the name of the xmp producer (app) + * @param creator the name of the xmp creator (user) + * @param attachZugferdHeaders whether to attach XMP ZUGFeRD headers + * @return the created PDFbox PDDocumentCatalog + * @throws IOException if anything is wrong with file + * @throws TransformerException in case of xml (XMP) parsing issues * @deprecated use the {@link ZUGFeRDExporterFromA1Factory} instead */ @Deprecated @@ -291,7 +317,18 @@ public class ZUGFeRDExporter implements Closeable { return doc.getDocumentCatalog(); } - /** + /*** + * + * Makes A PDF/A3a-compliant document from a PDF-A1 compliant document (on the + * metadata level, this will not e.g. convert graphics to JPG-2000) + + * @param file the InputStream of the pdf + * @param producer the name of the xmp producer (app) + * @param creator the name of the xmp creator (user) + * @param attachZugferdHeaders whether to attach XMP ZUGFeRD headers + * @return the created PDFbox PDDocumentCatalog + * @throws IOException if anything is wrong with file + * @throws TransformerException in case of xml (XMP) parsing issues * @deprecated use the {@link ZUGFeRDExporterFromA1Factory} instead */ @Deprecated @@ -303,6 +340,7 @@ public class ZUGFeRDExporter implements Closeable { return doc.getDocumentCatalog(); } + private IExporterFactory createPDFA1Factory() { ZUGFeRDExporterFromA1Factory factory = new ZUGFeRDExporterFromA1Factory(); if (ignoreA1Errors) { @@ -325,6 +363,7 @@ public class ZUGFeRDExporter implements Closeable { * populate the XML. This parameter may be null, if so the XML data * should hav ebeen set via * setZUGFeRDXMLData(byte[] zugferdData) + * @throws IOException if anything is wrong with already loaded PDF */ public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans) throws IOException { prepareDocument(); @@ -339,6 +378,11 @@ public class ZUGFeRDExporter implements Closeable { } } + /*** + * Perform the final export to a now ZUGFeRD-enriched PDF file + * @param ZUGFeRDfilename the pdf file name + * @throws IOException if anything is wrong in the target location + */ public void export(String ZUGFeRDfilename) throws IOException { if (!documentPrepared) { prepareDocument(); @@ -353,6 +397,12 @@ public class ZUGFeRDExporter implements Closeable { } } + + /*** + * Perform the final export to a now ZUGFeRD-enriched PDF file as OutputStream + * @param output the OutputStream + * @throws IOException if anything is wrong in the OutputStream + */ public void export(OutputStream output) throws IOException { if (!documentPrepared) { prepareDocument(); @@ -376,7 +426,7 @@ public class ZUGFeRDExporter implements Closeable { * @param description Human-readable description of the file content * @param subType type of the data e.g. could be "text/xml" - mime like * @param data the binary data of the file/attachment - * @throws java.io.IOException + * @throws java.io.IOException if anything is wrong with filename */ public void PDFAttachGenericFile(PDDocument doc, String filename, String relationship, String description, String subType, byte[] data) throws IOException { @@ -446,6 +496,7 @@ public class ZUGFeRDExporter implements Closeable { * API or component. * * @param zugferdData XML data to be set as a byte array (XML file in raw form). + * @throws IOException (should not happen) */ public void setZUGFeRDXMLData(byte[] zugferdData) throws IOException { CustomXMLProvider cus = new CustomXMLProvider(); @@ -495,7 +546,7 @@ public class ZUGFeRDExporter implements Closeable { * neccessary PDF/A schema extension description to be able to add this * information to RDF * - * @param metadata + * @param metadata the PDFbox XMPMetadata object */ protected void addXMP(XMPMetadata metadata) { @@ -607,7 +658,7 @@ public class ZUGFeRDExporter implements Closeable { /** * the human author (use factory method instead) * - * @param creator + * @param creator the (human) name who created the PDF */ @Deprecated public void setCreator(String creator) { @@ -617,7 +668,7 @@ public class ZUGFeRDExporter implements Closeable { /** * the CreatorTool attribute for the PDF * - * @param creator + * @param creatorTool the application which created the PDF */ protected void setCreatorTool(String creatorTool) { this.creatorTool = creatorTool; @@ -626,7 +677,7 @@ public class ZUGFeRDExporter implements Closeable { /** * the authoring software (use factory method instead) * - * @param producer + * @param producer the authoring software */ @Deprecated public void setProducer(String producer) { diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java index a0a5cb20..ffed7bb7 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3Factory.java @@ -173,14 +173,14 @@ public class ZUGFeRDExporterFromA3Factory implements IExporterFactory { /** * All files are PDF/A-3, setConformance refers to the level conformance. - *

+ *

* PDF/A-3 has three coformance levels, called "A", "U" and "B". - *

+ *

* PDF/A-3-B where B means only visually preservable, U -standard for Mustang- * means visually and unicode preservable and A means full compliance, i.e. * visually, unicode and structurally preservable and tagged PDF, i.e. useful * metainformation for blind people. - *

+ *

* Feel free to pass "A" as new level if you know what you are doing :-) */ public IExporterFactory setConformanceLevel(PDFAConformanceLevel newLevel) { diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index be95f293..a9f1c9c2 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -378,6 +378,7 @@ public class ZUGFeRDImporter { /** * Returns the raw XML data as extracted from the ZUGFeRD PDF file. + * @return the raw ZUGFeRD XML data */ public byte[] getRawXML() { return rawXML; diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index f6f235a0..1cb1c7ce 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -162,16 +162,11 @@ public class Toecount { /** * Prompts the user for a input or output filename * - * @param the - * text the user is asked - * @param a - * default Filename - * @param expectedExtension - * will warn if filename does not match expected file extension - * @param ensureFileExists - * will warn if file does NOT exist (for input files) - * @param ensureFileNotExists - * will warn if file DOES exist (for output files) + * @param prompt the text the user is asked + * @param defaultFilename a default Filename + * @param expectedExtension will warn if filename does not match expected file extension + * @param ensureFileExists will warn if file does NOT exist (for input files) + * @param ensureFileNotExists will warn if file DOES exist (for output files) * @return String */ protected static String getFilenameFromUser(String prompt, String defaultFilename, String expectedExtension, From 24b27a9b516df3bf753119a31f0788c23b990396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 18 Jul 2019 11:08:57 +0200 Subject: [PATCH 22/48] added unit test for problematic cases also for zf2 --- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java diff --git a/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java new file mode 100644 index 00000000..21f9131f --- /dev/null +++ b/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -0,0 +1,212 @@ +/** ********************************************************************** + * + * Copyright 2019 Jochen Staerk + * + * Use is subject to license terms. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *********************************************************************** */ +package org.mustangproject.ZUGFeRD; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class ZF2EdgeTest extends MustangReaderTestCase { + final String TARGET_PDF = "./target/testout-ZF2newEdge.pdf"; + + @Override + public Date getDeliveryDate() { + return new GregorianCalendar(2017, Calendar.MAY, 7).getTime(); + } + + @Override + public Date getDueDate() { + return new GregorianCalendar(2017, Calendar.MAY, 30).getTime(); + } + + @Override + public Date getIssueDate() { + return new GregorianCalendar(2017, Calendar.MAY, 9).getTime(); + } + + @Override + public String getNumber() { + return "RE-20170509/505"; + } + + @Override + public String getOwnCountry() { + return "DE"; + } + + @Override + public String getOwnLocation() { + return "Stadthausen"; + } + + @Override + public String getOwnOrganisationName() { + return "Bei Spiel GmbH"; + } + + @Override + public String getOwnStreet() { + return "Ecke 12"; + } + + + @Override + public IZUGFeRDExportableContact getOwnContact() { + return new SenderContact(); + + } + + @Override + public String getOwnTaxID() { + return "22/815/0815/4"; + } + + @Override + public String getOwnVATID() { + return "DE136695976"; + } + + @Override + public String getOwnZIP() { + return "12345"; + } + + @Override + public IZUGFeRDExportableContact getRecipient() { + return new RecipientContact(); + } + + @Override + public String getOwnOrganisationFullPlaintextInfo() { + return null; + } + + @Override + public String getCurrency() { + return "EUR"; + } + + @Override + public IZUGFeRDExportableItem[] getZFItems() { + Item[] allItems = new Item[3]; + Product designProduct = new Product("", "Künstlerische Gestaltung (Stunde): Einer Beispielrechnung", "HUR", new BigDecimal("7.000000")); + Product balloonProduct = new Product("", "Bestellerweiterung für E&F Umbau", "C62", new BigDecimal("19.000000")); + Product airProduct = new Product("", "Heiße Luft pro Liter", "LTR", new BigDecimal("19.000000")); + + allItems[0] = new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct); + allItems[1] = new Item(new BigDecimal("0.79"), new BigDecimal("400"), balloonProduct); + allItems[2] = new Item(new BigDecimal("0.10"), new BigDecimal("200"), airProduct); + return allItems; + } + + @Override + public String getPaymentTermDescription() { + SimpleDateFormat germanDateFormat = new SimpleDateFormat("dd.MM.yyyy"); + return "Zahlbar ohne Abzug bis zum " + germanDateFormat.format(getDueDate()); + } + + @Override + public IZUGFeRDAllowanceCharge[] getZFAllowances() { + return null; + } + + @Override + public IZUGFeRDAllowanceCharge[] getZFCharges() { + return null; + } + + @Override + public IZUGFeRDAllowanceCharge[] getZFLogisticsServiceCharges() { + return null; + } + + @Override + public String getReferenceNumber() { + return "AB321"; + } + + /** + * Create the test case + * + * @param testName name of the test case + */ + public ZF2EdgeTest(String testName) { + super(testName); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() { + return new TestSuite(ZF2EdgeTest.class); + } + + // //////// TESTS ////////////////////////////////////////////////////////////////////////////////////////// + + /** + * The exporter test bases on @{code ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf}, adds metadata, + * writes + * to @{code ./target/testout-*} and then imports to check the values. + * It would not make sense to have it run before the less complex importer test (which is probably redundant) + * --> as only Name Ascending is supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export + */ + public void testEdgeExport() throws Exception { + + // the writing part + + try (InputStream SOURCE_PDF = + this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf"); + + ZUGFeRDExporter ze = new ZUGFeRDExporterFromA3Factory() + .setProducer("My Application") + .setCreator(System.getProperty("user.name")) + .setZUGFeRDVersion(2) + .ignorePDFAErrors() + .load(SOURCE_PDF)) { + ze.setZUGFeRDVersion(1); + ze.PDFattachZugferdFile(this); + String theXML = new String(ze.getProvider().getXML()); + assertTrue(theXML.contains(" Date: Sun, 21 Jul 2019 17:55:41 +0200 Subject: [PATCH 23/48] closes #104 --- History.md | 1 + .../java/org/mustangproject/toecount/Toecount.java | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/History.md b/History.md index 0a274709..9f3087f8 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,7 @@ - migration: testIndicator entfernen - in ram:ExchangedDocument: ram:name entfernen - updated javadoc +- fixed #104 nullpointerex when specifying no parameter 1.7.2 ===== diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index 1cb1c7ce..dd3bea00 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -299,19 +299,19 @@ public class Toecount { } // Retrieve all options + String action = parser.getOptionValue(actionOption); String directoryName = parser.getOptionValue(dirnameOption); Boolean filesFromStdIn = parser.getOptionValue(filesFromStdInOption, Boolean.FALSE); - Boolean combineRequested = parser.getOptionValue(combineOption, Boolean.FALSE); - Boolean extractRequested = parser.getOptionValue(extractOption, Boolean.FALSE); - Boolean helpRequested = parser.getOptionValue(helpOption, Boolean.FALSE); - Boolean upgradeRequested = parser.getOptionValue(upgradeOption, Boolean.FALSE); + Boolean combineRequested = parser.getOptionValue(combineOption, Boolean.FALSE) || ((action!=null)&&(action.equals("combine"))); + Boolean extractRequested = parser.getOptionValue(extractOption, Boolean.FALSE) || ((action!=null)&&(action.equals("extract"))); + Boolean helpRequested = parser.getOptionValue(helpOption, Boolean.FALSE) || ((action!=null)&&(action.equals("help"))); + Boolean upgradeRequested = parser.getOptionValue(upgradeOption, Boolean.FALSE) || ((action!=null)&&(action.equals("upgrade"))); Boolean ignoreFileExt = parser.getOptionValue(ignoreFileExtOption, Boolean.FALSE); - Boolean a3only = parser.getOptionValue(a3onlyOption, Boolean.FALSE); + Boolean a3only = parser.getOptionValue(a3onlyOption, Boolean.FALSE) || ((action!=null)&&(action.equals("a3"))); String sourceName = parser.getOptionValue(sourceOption); String sourceXMLName = parser.getOptionValue(sourceXmlOption); String outName = parser.getOptionValue(outOption); String format = parser.getOptionValue(formatOption); - String action = parser.getOptionValue(actionOption); String zugferdVersion = parser.getOptionValue(zugferdVersionOption); String zugferdProfile = parser.getOptionValue(zugferdProfileOption); @@ -327,7 +327,7 @@ public class Toecount { performConvert(sourceName, outName); } else if (upgradeRequested) { performUpgrade(sourceName, outName); - } else if (action.equals("visualize")) { + } else if ((action!=null)&&(action.equals("visualize"))) { performVisualization(sourceName, outName); } else { // no argument or argument unknown From df3b54bef2f75bc21ec28896f990d2a63a4e61f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Sun, 21 Jul 2019 20:13:23 +0200 Subject: [PATCH 24/48] work on #105 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad1bfc0b..01a48584 100644 --- a/pom.xml +++ b/pom.xml @@ -277,7 +277,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.3.1 + 2.5.0 xjc From 780d92575b70a762912deba1d52dd2e40c7e85ae Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 22 Jul 2019 10:42:38 +0200 Subject: [PATCH 25/48] iron out javadoc errors and warnings IntelliJ now succeeds in building javadoc --- .../MustangReaderWriterCustomXMLTest.java | 6 ++--- .../ZUGFeRD/MustangReaderWriterEdgeTest.java | 17 ++++++------- .../ZUGFeRD/MustangReaderWriterTest.java | 25 ++++++++----------- .../ZUGFeRD/ResourceUtilities.java | 10 +++++++- .../ZUGFeRD/VersionMigrationTest.java | 2 +- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 11 ++++---- 6 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java index 42277aba..72f9285b 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java @@ -49,7 +49,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { // //////// TESTS // ////////////////////////////////////////////////////////////////////////////////////////// - public void testCustomZF2Export() throws Exception { + public void testCustomZF2Export() { final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20171118_506custom.pdf"; // the writing part @@ -288,10 +288,10 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { * ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf}, adds * metadata, writes to @{code ./target/testout-*} and then imports to check the * values. It would not make sense to have it run before the less complex - * importer test (which is probably redundant) --> as only Name Ascending is + * importer test (which is probably redundant). As only Name Ascending is * supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export */ - public void testCustomZF1Export() throws Exception { + public void testCustomZF1Export() { final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505custom.pdf"; // the writing part diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java index 74dee7e6..db00461a 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java @@ -170,13 +170,11 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { /** * The importer test imports from ./src/test/MustangGnuaccountingBeispielRE-20170509_505.pdf to check the values. - * --> as only Name Ascending is supported for Test Unit sequence, I renamed the this test-A-Export to run before + * As only Name Ascending is supported for Test Unit sequence, I renamed the this test-A-Import to run before * testZExport - * - * @throws IOException */ - public void testAImport() throws IOException { + public void testAImport() { InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf"); ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream); @@ -195,12 +193,11 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { /** * The exporter test bases on @{code ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf}, adds metadata, - * writes - * to @{code ./target/testout-*} and then imports to check the values. - * It would not make sense to have it run before the less complex importer test (which is probably redundant) - * --> as only Name Ascending is supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export + * writes to @{code ./target/testout-*} and then imports to check the values. + * It would not make sense to have it run before the less complex importer test (which is probably redundant). + * As only Name Ascending is supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export */ - public void testEdgeExport() throws Exception { + public void testEdgeExport() { final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf"; // the writing part @@ -218,6 +215,8 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { String theXML = new String(ze.getProvider().getXML()); assertTrue(theXML.contains(" as only Name Ascending is supported for Test Unit sequence, I - * renamed the this test-A-Export to run before testZExport - * - * @throws IOException + * The importer test imports from ./src/test/MustangGnuaccountingBeispielRE-20170509_505.pdf to check the + * values. As only Name Ascending is supported for Test Unit sequence, I renamed the this testAImport + * to run before testZExport */ - public void testAImport() throws IOException { + public void testAImport() { InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf"); ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream); @@ -206,7 +203,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { assertEquals(zi.getForeignReference(), "RE-20170509/505"); } - public void testForeignImport() throws IOException { + public void testForeignImport() { InputStream inputStream = this.getClass().getResourceAsStream("/zugferd_invoice.pdf"); ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream); @@ -343,10 +340,10 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { * ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf}, adds * metadata, writes to @{code ./target/testout-*} and then imports to check the * values. It would not make sense to have it run before the less complex - * importer test (which is probably redundant) --> as only Name Ascending is + * importer test (which is probably redundant). As only Name Ascending is * supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export */ - public void testZExport() throws Exception { + public void testZExport() { final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20171118_506new.pdf"; @@ -370,6 +367,8 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // assertFalse(pdfContent.indexOf("zf") == -1); // assertFalse(pdfContent.indexOf("urn:zugferd:pdfa:CrossIndustryDocument:invoice:2p0#") == -1); + } catch (IOException e) { + fail("IOException should not happen in testZExport"); } // now check the contents (like MustangReaderTest) @@ -423,11 +422,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { assertEquals(zi.getForeignReference(), getNumber()); } - /** - * @throws Exception - * @Test(expected = IndexOutOfBoundsException.class) - */ - public void testExceptionOnPDF14() throws Exception { + public void testExceptionOnPDF14() { final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505new.pdf"; diff --git a/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java b/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java index 2a36e4ef..cf908e72 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/ResourceUtilities.java @@ -34,6 +34,10 @@ public class ResourceUtilities { /** * Loading a File into a String using a certain encoding and file path + * @param encoding the charset used in the file + * @param path the path to the file + * @return the file contents as a String + * @throws IOException if the file cannot be read */ public static String readFile(Charset encoding, String path) throws IOException { byte[] content = Files.readAllBytes(Paths.get(path)); @@ -42,6 +46,10 @@ public class ResourceUtilities { /** * Saving a String as a file to a certain file path + * @param encoding the charset used in the file + * @param path the path to the file + * @param content the contents of the file + * @throws FileNotFoundException if the file cannot be found */ public static void saveFile(Charset encoding, String path, String content) throws FileNotFoundException { @@ -147,7 +155,7 @@ public class ResourceUtilities { /** * To fix the 3 slashes bug for File URI: For example: - * file:/C:/work/test.txt -> file:///C:/work/test.txt + * file:/C:/work/test.txt gives file:///C:/work/test.txt * * @param u - the File URI * @return the String of the URI diff --git a/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java b/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java index ab628dcd..62e83b67 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/VersionMigrationTest.java @@ -41,7 +41,7 @@ import static org.junit.Assert.assertFalse; * will be migrated to src/test/resources/migration/output. * If there is a similar named file as test reference src/test/resources/migration/reference a test * will be triggered for every single file. - *

+ * * Note: Any 'ZUGFeRD1' will be exchanged to 'ZUGFeRD2' during migration and adequate reference will be searched for. */ @RunWith(Parameterized.class) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 21f9131f..c0c56af4 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -170,13 +170,10 @@ public class ZF2EdgeTest extends MustangReaderTestCase { // //////// TESTS ////////////////////////////////////////////////////////////////////////////////////////// /** - * The exporter test bases on @{code ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf}, adds metadata, - * writes - * to @{code ./target/testout-*} and then imports to check the values. - * It would not make sense to have it run before the less complex importer test (which is probably redundant) - * --> as only Name Ascending is supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export + * The exporter test bases on @{code ./src/test/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf}, adds metadata, + * writes to @{code ./target/testout-*} and then imports to check the values. */ - public void testEdgeExport() throws Exception { + public void testEdgeExport() { // the writing part @@ -194,6 +191,8 @@ public class ZF2EdgeTest extends MustangReaderTestCase { String theXML = new String(ze.getProvider().getXML()); assertTrue(theXML.contains(" Date: Mon, 22 Jul 2019 18:50:35 +0200 Subject: [PATCH 26/48] added dependencies for coretto 11 (windows build) --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 01a48584..4ca4bb50 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,17 @@ jaxb-runtime 2.2.11 + + javax.xml.bind + jaxb-api + 2.2.11 + + + javax.activation + activation + 1.1 + + org.apache.pdfbox preflight From 04da31d37c4ecb3f1337f455d773cadaa1c846c0 Mon Sep 17 00:00:00 2001 From: Jochen Staerk Date: Mon, 22 Jul 2019 20:00:01 +0200 Subject: [PATCH 27/48] closes #23 --- History.md | 1 + .../ZUGFeRD/ZUGFeRD2PullProvider.java | 26 +++----- .../org/mustangproject/ZUGFeRD/BaseTest.java | 65 +++++++++++++++++++ 3 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java diff --git a/History.md b/History.md index 9f3087f8..dc797fd2 100644 --- a/History.md +++ b/History.md @@ -2,6 +2,7 @@ - in ram:ExchangedDocument: ram:name entfernen - updated javadoc - fixed #104 nullpointerex when specifying no parameter +- closed #23 1.7.2 ===== diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index e2f7f09d..12b17673 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -77,7 +77,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { public void setTest() { } - private String nDigitFormat(BigDecimal value, int scale) { + public static String nDigitFormat(BigDecimal value, int scale) { /* * I needed 123,45, locale independent.I tried * NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is locale @@ -92,16 +92,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { * http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html in the * end I decided to calculate myself and take eur+sparator+cents * - * This function will cut off, i.e. floor() subcent values Tests: - * System.err.println(utils.currencyFormat(new BigDecimal(0), - * ".")+"\n"+utils.currencyFormat(new BigDecimal("-1.10"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.1"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.01"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3489"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3419"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("12"), ",")); - * - * results 0.00 -1,10 -1,10 -1,01 20000123,34 20000123,34 12,00 */ value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round so that e.g. // 1.189999999999999946709294817992486059665679931640625 @@ -111,25 +101,29 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(); otherSymbols.setDecimalSeparator('.'); - DecimalFormat dec = new DecimalFormat("0." + new String(repeat), otherSymbols); + String baseFormat="0"; + if (scale>0) { + baseFormat+="."; + } + DecimalFormat dec = new DecimalFormat(baseFormat + new String(repeat), otherSymbols); return dec.format(value); } private String vatFormat(BigDecimal value) { - return nDigitFormat(value, 2); + return ZUGFeRD2PullProvider.nDigitFormat(value, 2); } private String currencyFormat(BigDecimal value) { - return nDigitFormat(value, 2); + return ZUGFeRD2PullProvider.nDigitFormat(value, 2); } private String priceFormat(BigDecimal value) { - return nDigitFormat(value, 4); + return ZUGFeRD2PullProvider.nDigitFormat(value, 4); } private String quantityFormat(BigDecimal value) { - return nDigitFormat(value, 4); + return ZUGFeRD2PullProvider.nDigitFormat(value, 4); } @Override diff --git a/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java b/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java new file mode 100644 index 00000000..8d3152b6 --- /dev/null +++ b/src/test/java/org/mustangproject/ZUGFeRD/BaseTest.java @@ -0,0 +1,65 @@ +/** ********************************************************************** + * + * Copyright 2019 Jochen Staerk + * + * Use is subject to license terms. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *********************************************************************** */ +package org.mustangproject.ZUGFeRD; + +import junit.framework.Test; +import junit.framework.TestSuite; +import junit.framework.TestCase; + +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class BaseTest extends TestCase { + /** + * Create the test case + * + * @param testName name of the test case + */ + public BaseTest(String testName) { + super(testName); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() { + return new TestSuite(BaseTest.class); + } + + public void testCorrectDigits() { + assertEquals("0.00", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal(0),2)); + assertEquals("-1.10", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("-1.10"),2)); + assertEquals("-1.10", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("-1.1"),2)); + assertEquals("-1.01", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("-1.01"),2)); + assertEquals("20000123.35", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("20000123.3489"),2)); + assertEquals("20000123.34", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("20000123.3419"),2)); + assertEquals("12.00", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("12"),2)); + assertEquals("12", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("12"),0)); + assertEquals("20000123.342", ZUGFeRD2PullProvider.nDigitFormat(new BigDecimal("20000123.3419"),3)); + } + +} From a10d9bdf3fa6cc91b5dafa6903f8d9fc1f063fb6 Mon Sep 17 00:00:00 2001 From: Jochen Staerk Date: Mon, 22 Jul 2019 20:10:06 +0200 Subject: [PATCH 28/48] ndigitformat was ment to return string --- .../ZUGFeRDTransactionModelConverter.java | 62 +++---------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 206b5a2e..8e63ec71 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -843,70 +843,26 @@ class ZUGFeRDTransactionModelConverter { private BigDecimal vatFormat(BigDecimal value) { - return nDigitFormat(value, 2); - } + return value.setScale(2, BigDecimal.ROUND_HALF_UP); + } private BigDecimal currencyFormat(BigDecimal value) { - return nDigitFormat(value, 2); - } + return value.setScale(2, BigDecimal.ROUND_HALF_UP); + } private BigDecimal priceFormat(BigDecimal value) { - return nDigitFormat(value, 4); - } + return value.setScale(4, BigDecimal.ROUND_HALF_UP); + } private BigDecimal quantityFormat(BigDecimal value) { - return nDigitFormat(value, 4); - } - - - private BigDecimal nDigitFormat(BigDecimal value, int scale) { - /* - * I needed 123,45, locale independent.I tried - * NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is - * locale specific.I also tried DecimalFormat df = new DecimalFormat( - * "0,00" ); df.setDecimalSeparatorAlwaysShown(true); - * df.setGroupingUsed(false); DecimalFormatSymbols symbols = new - * DecimalFormatSymbols(); symbols.setDecimalSeparator(','); - * symbols.setGroupingSeparator(' '); - * df.setDecimalFormatSymbols(symbols); - * - * but that would not switch off grouping. Although I liked very much - * the (incomplete) "BNF diagram" in - * http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html - * in the end I decided to calculate myself and take eur+sparator+cents - * - * This function will cut off, i.e. floor() subcent values Tests: - * System.err.println(utils.currencyFormat(new BigDecimal(0), - * ".")+"\n"+utils.currencyFormat(new BigDecimal("-1.10"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.1"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.01"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3489"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3419"), - * ",")+"\n"+utils.currencyFormat(new BigDecimal("12"), ",")); - * - * results 0.00 -1,10 -1,10 -1,01 20000123,34 20000123,34 12,00 - */ - value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round - // so that - // e.g. - // 1.189999999999999946709294817992486059665679931640625 - // becomes - // 1.19 - char[] repeat = new char[scale]; - Arrays.fill(repeat, '0'); - - DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(); - otherSymbols.setDecimalSeparator('.'); - DecimalFormat dec = new DecimalFormat("0." + new String(repeat), - otherSymbols); - return new BigDecimal(dec.format(value)); - - } + return value.setScale(4, BigDecimal.ROUND_HALF_UP); + } + /** * which taxes have been used with which amounts in this transaction, empty for no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable to 19% VAT * (=>190 EUR VAT) and 200 EUR were applicable to 7% (=>14 EUR VAT) 190 Eur From 2e5818f8e79bf1a9ac796263747b6ccad57c5c2e Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 22 Jul 2019 21:17:12 +0200 Subject: [PATCH 29/48] specify charset to avoid platform specific defaults --- .../ZUGFeRD/MustangReaderWriterCustomXMLTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java index 72f9285b..42c1a118 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java @@ -27,6 +27,7 @@ import org.junit.runners.MethodSorters; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MustangReaderWriterCustomXMLTest extends TestCase { @@ -64,7 +65,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { /* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. * test the export with bom (which is valid) because this will also test the import (which also needs to work and needs to be tested) * */ - String ownZUGFeRDXML = new String(UTF8ByteOrderMark) + "\n" + + String ownZUGFeRDXML = new String(UTF8ByteOrderMark, StandardCharsets.UTF_8) + "\n" + "\n" + " \n" + " false\n" + From deac979877456dfc4422d20374f05b43de65c4f3 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 22 Jul 2019 21:27:47 +0200 Subject: [PATCH 30/48] use RoundingMode enumeration and locale-safe BigDecimal.toPlainString --- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 16 ++-------------- .../ZUGFeRDTransactionModelConverter.java | 9 +++++---- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 12b17673..03db8e0c 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.SimpleDateFormat; @@ -93,20 +94,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { * end I decided to calculate myself and take eur+sparator+cents * */ - value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round so that e.g. - // 1.189999999999999946709294817992486059665679931640625 - // becomes 1.19 - char[] repeat = new char[scale]; - Arrays.fill(repeat, '0'); - - DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(); - otherSymbols.setDecimalSeparator('.'); - String baseFormat="0"; - if (scale>0) { - baseFormat+="."; - } - DecimalFormat dec = new DecimalFormat(baseFormat + new String(repeat), otherSymbols); - return dec.format(value); + return value.setScale(scale, RoundingMode.HALF_UP).toPlainString(); } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 8e63ec71..456e38df 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -19,6 +19,7 @@ package org.mustangproject.ZUGFeRD; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.SimpleDateFormat; @@ -843,22 +844,22 @@ class ZUGFeRDTransactionModelConverter { private BigDecimal vatFormat(BigDecimal value) { - return value.setScale(2, BigDecimal.ROUND_HALF_UP); + return value.setScale(2, RoundingMode.HALF_UP); } private BigDecimal currencyFormat(BigDecimal value) { - return value.setScale(2, BigDecimal.ROUND_HALF_UP); + return value.setScale(2, RoundingMode.HALF_UP); } private BigDecimal priceFormat(BigDecimal value) { - return value.setScale(4, BigDecimal.ROUND_HALF_UP); + return value.setScale(4, RoundingMode.HALF_UP); } private BigDecimal quantityFormat(BigDecimal value) { - return value.setScale(4, BigDecimal.ROUND_HALF_UP); + return value.setScale(4, RoundingMode.HALF_UP); } From 5816929617cda65d656976bbbf8943326aaf423c Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Wed, 24 Jul 2019 15:24:35 +0200 Subject: [PATCH 31/48] make document name and globalID configurable by implementers --- .../ZUGFeRD/IZUGFeRDExportableContact.java | 18 ++++++++++++++++++ .../ZUGFeRD/IZUGFeRDExportableTransaction.java | 8 ++++++++ .../ZUGFeRDTransactionModelConverter.java | 8 +++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java index 6b154b67..4704ab4f 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java @@ -38,6 +38,24 @@ public interface IZUGFeRDExportableContact { return null; } + /** + * customer global identification assigned by the seller + * + * @return customer identification + */ + default String getGlobalID() { + return null; + } + + /** + * customer global identification scheme + * + * @return customer identification + */ + default String getGlobalIDScheme() { + return null; + } + /** * First and last name of the recipient diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 0de986c1..03a93e7d 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -33,6 +33,14 @@ import java.util.Date; public interface IZUGFeRDExportableTransaction { + /** + * appears in /rsm:CrossIndustryDocument/rsm:HeaderExchangedDocument/ram:Name + * @return Name of document + */ + default String getDocumentName() { + return "RECHNUNG"; + } + /** * * diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 8e63ec71..ef65035c 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -149,7 +149,7 @@ class ZUGFeRDTransactionModelConverter { document.setTypeCode(documentCodeType); TextType name = xmlFactory.createTextType(); - name.setValue("RECHNUNG"); + name.setValue(trans.getDocumentName()); document.getName().add(name); if (trans.getOwnOrganisationFullPlaintextInfo() != null) { @@ -212,6 +212,12 @@ class ZUGFeRDTransactionModelConverter { buyerID.setValue(trans.getRecipient().getID()); buyerTradeParty.getID().add(buyerID); } + if (trans.getRecipient().getGlobalID() != null) { + IDType globalID = xmlFactory.createIDType(); + globalID.setValue(trans.getRecipient().getGlobalID()); + globalID.setSchemeID(trans.getRecipient().getGlobalIDScheme()); + buyerTradeParty.getGlobalID().add(globalID); + } TextType buyerName = xmlFactory.createTextType(); buyerName.setValue(trans.getRecipient().getName()); From ce5af7b012ca2182c3d51ac6f54d136265bc5324 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 25 Jul 2019 16:55:28 +0200 Subject: [PATCH 32/48] complete profile options for v1 see "Das ZUGFeRD-Format_1p0", p. 98, lines 1982 ff. --- .../ZUGFeRD/model/DocumentContextParameterTypeConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java b/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java index 57033f6d..d90eabd1 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/model/DocumentContextParameterTypeConstants.java @@ -19,7 +19,7 @@ package org.mustangproject.ZUGFeRD.model; public class DocumentContextParameterTypeConstants { + public static final String BASIC = "urn:ferd:CrossIndustryDocument:invoice:1p0:basic"; public static final String COMFORT = "urn:ferd:CrossIndustryDocument:invoice:1p0:comfort"; public static final String EXTENDED = "urn:ferd:CrossIndustryDocument:invoice:1p0:extended"; - // this does not look complete :-/ } From 0720751d350c3de96d438fb23ed8f30e0ca28f0f Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 25 Jul 2019 17:42:03 +0200 Subject: [PATCH 33/48] failing test case to check for correct v1 profile string --- .../ZUGFeRD/MustangReaderWriterTest.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 9b1f1f42..72d0f9b0 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -30,6 +30,7 @@ import org.apache.xmpbox.xml.DomXmpParser; import org.apache.xmpbox.xml.XmpParsingException; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; +import org.mustangproject.ZUGFeRD.model.DocumentContextParameterTypeConstants; import java.io.ByteArrayOutputStream; import java.io.File; @@ -349,7 +350,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // the writing part try (InputStream SOURCE_PDF = this.getClass() - .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); + .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setZUGFeRDVersion(2).setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.EN16931).load(SOURCE_PDF)) { @@ -366,7 +367,49 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // assertFalse(pdfContent.indexOf("EN 16931") == -1); // assertFalse(pdfContent.indexOf("zf") == -1); // assertFalse(pdfContent.indexOf("urn:zugferd:pdfa:CrossIndustryDocument:invoice:2p0#") == -1); - + + } catch (IOException e) { + fail("IOException should not happen in testZExport"); + } + + // now check the contents (like MustangReaderTest) + ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF); + + // Reading ZUGFeRD + assertEquals(zi.getAmount(), "571.04"); + assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); + assertEquals(zi.getReference(), getReferenceNumber()); + assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); + assertEquals(zi.getKTO(), getTradeSettlementPayment()[0].getOwnKto()); + assertEquals(zi.getHolder(), getOwnOrganisationName()); + assertEquals(zi.getForeignReference(), getNumber()); + } + + /** + * Quick and dirty copy of testZExport to check if v1 files contain + * the correct profile string when the comfort profile is selected. + */ + public void testZExportv1Profile() { + + final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20171118_506new.pdf"; + + // the writing part + try (InputStream SOURCE_PDF = this.getClass() + .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); + + ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setZUGFeRDVersion(1).setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.COMFORT).load(SOURCE_PDF)) { + + ze.PDFattachZugferdFile(this); + ze.disableAutoClose(true); + ze.export(TARGET_PDF); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ze.export(baos); + ze.close(); + String pdfContent = baos.toString("UTF-8"); + assertFalse(pdfContent.indexOf(DocumentContextParameterTypeConstants.EXTENDED) >= 0); + assertTrue(pdfContent.indexOf(DocumentContextParameterTypeConstants.COMFORT) >= 0); + } catch (IOException e) { fail("IOException should not happen in testZExport"); } From b701bf25c8ca928be5e2fe77074c5c500e869463 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 25 Jul 2019 17:59:18 +0200 Subject: [PATCH 34/48] failing test case to check for correct v1 profile string --- .../ZUGFeRD/MustangReaderWriterTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 72d0f9b0..94c9fa4f 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -407,24 +407,13 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { ze.export(baos); ze.close(); String pdfContent = baos.toString("UTF-8"); + assertFalse(pdfContent.indexOf(DocumentContextParameterTypeConstants.BASIC) >= 0); assertFalse(pdfContent.indexOf(DocumentContextParameterTypeConstants.EXTENDED) >= 0); assertTrue(pdfContent.indexOf(DocumentContextParameterTypeConstants.COMFORT) >= 0); } catch (IOException e) { fail("IOException should not happen in testZExport"); } - - // now check the contents (like MustangReaderTest) - ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF); - - // Reading ZUGFeRD - assertEquals(zi.getAmount(), "571.04"); - assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); - assertEquals(zi.getReference(), getReferenceNumber()); - assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); - assertEquals(zi.getKTO(), getTradeSettlementPayment()[0].getOwnKto()); - assertEquals(zi.getHolder(), getOwnOrganisationName()); - assertEquals(zi.getForeignReference(), getNumber()); } From 9681b4fa6d087efd88df5cd07b00fbea7dd1c6a3 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 25 Jul 2019 18:33:14 +0200 Subject: [PATCH 35/48] extend IProfileProvider to allow modification of profile --- .../ZUGFeRD/CustomXMLProvider.java | 12 +++++++++++- .../ZUGFeRD/IProfileProvider.java | 2 ++ .../ZUGFeRD/ZUGFeRD1PullProvider.java | 19 +++++++++++++++++-- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 5 +++++ .../ZUGFeRD/ZUGFeRDExporter.java | 2 +- .../ZUGFeRDTransactionModelConverter.java | 8 +++++++- 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java index dfd8be88..6ac2c275 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java @@ -18,7 +18,7 @@ *********************************************************************** */ package org.mustangproject.ZUGFeRD; -public class CustomXMLProvider implements IXMLProvider { +public class CustomXMLProvider implements IXMLProvider, IProfileProvider { protected byte[] zugferdData; @@ -48,4 +48,14 @@ public class CustomXMLProvider implements IXMLProvider { } + @Override + public String getProfile() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setProfile(ZUGFeRDConformanceLevel level) { + // TODO Auto-generated method stub + } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java index adc695df..d4469edb 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java @@ -21,5 +21,7 @@ package org.mustangproject.ZUGFeRD; public interface IProfileProvider { public String getProfile(); + + public void setProfile(ZUGFeRDConformanceLevel level); } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index 3c782866..f8278a32 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -19,6 +19,7 @@ package org.mustangproject.ZUGFeRD; import org.mustangproject.ZUGFeRD.model.CrossIndustryDocumentType; +import org.mustangproject.ZUGFeRD.model.DocumentContextParameterTypeConstants; import org.mustangproject.ZUGFeRD.model.ZFNamespacePrefixMapper; import javax.xml.bind.JAXBContext; @@ -27,13 +28,27 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.io.ByteArrayOutputStream; -public class ZUGFeRD1PullProvider implements IXMLProvider { +public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { protected byte[] zugferdData; private Marshaller marshaller; private boolean isTest; + private ZUGFeRDConformanceLevel level; + + + public void setProfile(ZUGFeRDConformanceLevel level) { + this.level = level; + } + + public String getProfile() { + switch (level) { + case BASIC: return DocumentContextParameterTypeConstants.BASIC; + case COMFORT: return DocumentContextParameterTypeConstants.COMFORT; + default: return DocumentContextParameterTypeConstants.EXTENDED; + } + } /** @@ -59,7 +74,7 @@ public class ZUGFeRD1PullProvider implements IXMLProvider { private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans) { JAXBElement jaxElement = - new ZUGFeRDTransactionModelConverter(trans).withTest(isTest).convertToModel(); + new ZUGFeRDTransactionModelConverter(trans).withTest(isTest).withProfile(getProfile()).convertToModel(); try { return marshalJaxToXMLString(jaxElement); diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 03db8e0c..7e12cdfe 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -71,6 +71,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { protected byte[] zugferdData; private IZUGFeRDExportableTransaction trans; + private ZUGFeRDConformanceLevel level; + + public void setProfile(ZUGFeRDConformanceLevel level) { + this.level = level; + } /** * enables the flag to indicate a test invoice in the XML structure diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java index af5dd4cc..f6796991 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java @@ -367,7 +367,7 @@ public class ZUGFeRDExporter implements Closeable { */ public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans) throws IOException { prepareDocument(); - + ((IProfileProvider) xmlProvider).setProfile(profile); xmlProvider.generateXML(trans); String filename = getFilenameForVersion(ZFVersion); PDFAttachGenericFile(doc, filename, "Alternative", diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 330619ee..6896dd2a 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -85,6 +85,7 @@ class ZUGFeRDTransactionModelConverter { private final Totals totals; private boolean isTest; private String currency = "EUR"; + private String profile; ZUGFeRDTransactionModelConverter(IZUGFeRDExportableTransaction trans) { @@ -114,7 +115,7 @@ class ZUGFeRDTransactionModelConverter { DocumentContextParameterType contextParameter = xmlFactory .createDocumentContextParameterType(); IDType idType = xmlFactory.createIDType(); - idType.setValue(DocumentContextParameterTypeConstants.EXTENDED); + idType.setValue(profile); contextParameter.setID(idType); context.getGuidelineSpecifiedDocumentContextParameter().add( contextParameter); @@ -955,6 +956,11 @@ class ZUGFeRDTransactionModelConverter { return this; } + public ZUGFeRDTransactionModelConverter withProfile(String profile) { + this.profile = profile; + return this; + } + private class LineCalc { private BigDecimal totalGross; From a7e9d72d3a3b0556a4bfc4977921ea9e2a0fee59 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 25 Jul 2019 20:35:11 +0200 Subject: [PATCH 36/48] make BuyerOrderReferencedDocument accessible --- .../IZUGFeRDExportableTransaction.java | 11 ++++ .../ZUGFeRDTransactionModelConverter.java | 55 ++++--------------- 2 files changed, 21 insertions(+), 45 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 03a93e7d..3be30215 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -246,4 +246,15 @@ public interface IZUGFeRDExportableTransaction { return null; } + /** + * get the ID of the BuyerOrderReferencedDocument, which sits in the ApplicableSupplyChainTradeAgreement + * @return the ID of the document + */ + default String getBuyerOrderReferencedDocumentID() { return null; } + + /** + * get the issue timestamp of the BuyerOrderReferencedDocument, which sits in the ApplicableSupplyChainTradeAgreement + * @return the IssueDateTime in format CCYY-MM-DDTHH:MM:SS + */ + default String getBuyerOrderReferencedDocumentIssueDateTime() { return null; } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 330619ee..fc20245c 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -31,51 +31,7 @@ import java.util.List; import javax.xml.bind.JAXBElement; -import org.mustangproject.ZUGFeRD.model.AmountType; -import org.mustangproject.ZUGFeRD.model.CodeType; -import org.mustangproject.ZUGFeRD.model.CountryIDType; -import org.mustangproject.ZUGFeRD.model.CreditorFinancialAccountType; -import org.mustangproject.ZUGFeRD.model.CreditorFinancialInstitutionType; -import org.mustangproject.ZUGFeRD.model.CrossIndustryDocumentType; -import org.mustangproject.ZUGFeRD.model.DateTimeType; -import org.mustangproject.ZUGFeRD.model.DateTimeTypeConstants; -import org.mustangproject.ZUGFeRD.model.DocumentCodeType; -import org.mustangproject.ZUGFeRD.model.DocumentContextParameterType; -import org.mustangproject.ZUGFeRD.model.DocumentContextParameterTypeConstants; -import org.mustangproject.ZUGFeRD.model.DocumentLineDocumentType; -import org.mustangproject.ZUGFeRD.model.ExchangedDocumentContextType; -import org.mustangproject.ZUGFeRD.model.ExchangedDocumentType; -import org.mustangproject.ZUGFeRD.model.IDType; -import org.mustangproject.ZUGFeRD.model.IndicatorType; -import org.mustangproject.ZUGFeRD.model.LogisticsServiceChargeType; -import org.mustangproject.ZUGFeRD.model.NoteType; -import org.mustangproject.ZUGFeRD.model.NoteTypeConstants; -import org.mustangproject.ZUGFeRD.model.ObjectFactory; -import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeType; -import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeTypeConstants; -import org.mustangproject.ZUGFeRD.model.PercentType; -import org.mustangproject.ZUGFeRD.model.QuantityType; -import org.mustangproject.ZUGFeRD.model.SupplyChainEventType; -import org.mustangproject.ZUGFeRD.model.SupplyChainTradeAgreementType; -import org.mustangproject.ZUGFeRD.model.SupplyChainTradeDeliveryType; -import org.mustangproject.ZUGFeRD.model.SupplyChainTradeLineItemType; -import org.mustangproject.ZUGFeRD.model.SupplyChainTradeSettlementType; -import org.mustangproject.ZUGFeRD.model.SupplyChainTradeTransactionType; -import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeType; -import org.mustangproject.ZUGFeRD.model.TaxRegistrationType; -import org.mustangproject.ZUGFeRD.model.TaxRegistrationTypeConstants; -import org.mustangproject.ZUGFeRD.model.TaxTypeCodeType; -import org.mustangproject.ZUGFeRD.model.TaxTypeCodeTypeConstants; -import org.mustangproject.ZUGFeRD.model.TextType; -import org.mustangproject.ZUGFeRD.model.TradeAddressType; -import org.mustangproject.ZUGFeRD.model.TradeAllowanceChargeType; -import org.mustangproject.ZUGFeRD.model.TradePartyType; -import org.mustangproject.ZUGFeRD.model.TradePaymentTermsType; -import org.mustangproject.ZUGFeRD.model.TradePriceType; -import org.mustangproject.ZUGFeRD.model.TradeProductType; -import org.mustangproject.ZUGFeRD.model.TradeSettlementMonetarySummationType; -import org.mustangproject.ZUGFeRD.model.TradeSettlementPaymentMeansType; -import org.mustangproject.ZUGFeRD.model.TradeTaxType; +import org.mustangproject.ZUGFeRD.model.*; class ZUGFeRDTransactionModelConverter { private static final SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); @@ -200,6 +156,15 @@ class ZUGFeRDTransactionModelConverter { tradeAgreement.setBuyerTradeParty(getBuyer()); tradeAgreement.setSellerTradeParty(getSeller()); + if (trans.getBuyerOrderReferencedDocumentID() != null) { + ReferencedDocumentType refdoc = xmlFactory.createReferencedDocumentType(); + IDType id = xmlFactory.createIDType(); + id.setValue(trans.getBuyerOrderReferencedDocumentID()); + refdoc.getID().add(id); + refdoc.setIssueDateTime(trans.getBuyerOrderReferencedDocumentIssueDateTime()); + tradeAgreement.getBuyerOrderReferencedDocument().add(refdoc); + } + return tradeAgreement; } From da01149a4126c35d3cb2cbe753008e556a3cbcc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 25 Jul 2019 22:29:25 +0200 Subject: [PATCH 37/48] have css and js file in resources and write to working dir on visualization --- History.md | 2 + pom.xml | 2 +- .../org/mustangproject/toecount/Toecount.java | 49 + src/main/resources/xrechnung-viewer.css | 917 ++++++++++++++++++ src/main/resources/xrechnung-viewer.js | 145 +++ 5 files changed, 1114 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/xrechnung-viewer.css create mode 100644 src/main/resources/xrechnung-viewer.js diff --git a/History.md b/History.md index dc797fd2..6fbb57bd 100644 --- a/History.md +++ b/History.md @@ -1,8 +1,10 @@ +- 1.8.0 feature: --action=visualize convert zugferd xml to html - migration: testIndicator entfernen - in ram:ExchangedDocument: ram:name entfernen - updated javadoc - fixed #104 nullpointerex when specifying no parameter - closed #23 +- #112 1.7.2 ===== diff --git a/pom.xml b/pom.xml index 4ca4bb50..c8783537 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3-SNAPSHOT + 1.8.0-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index dd3bea00..3d1ff415 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -31,9 +31,13 @@ import javax.xml.transform.TransformerException; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -82,6 +86,7 @@ public class Toecount { System.out.println("Mustangproject.org " + org.mustangproject.ZUGFeRD.Version.VERSION + " \r\n" + "A Apache Public License library and command line tool for statistics on PDF invoices with\r\n" + "ZUGFeRD Metadata (http://www.zugferd.org)\r\n" + "\r\n" + getUsage() + "\r\n" + + "* --action=visualize to convert XML to HTML or \\r\\n" + "* Count operations\r\n" + "\t-d, --directory\tcount ZUGFeRD files in directory to be scanned\r\n" + "\t\tIf it is a directory, it will recurse.\r\n" + "\t-l, --listfromstdin\tcount ZUGFeRD files from a list of linefeed separated files on runtime.\r\n" @@ -381,7 +386,51 @@ public class Toecount { } System.out.println("Written to " + outName); + try { + ExportResource("/xrechnung-viewer.css"); + ExportResource("/xrechnung-viewer.js"); + + System.out.println("xrechnung-viewer.css and xrechnung-viewer.js written as well (to local working dir)"); + } catch (Exception e) { + Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); + } + + } + + /** + * Export a resource embedded into a Jar file to the local file path. + * + * @param resourceName ie.: "/SmartLibrary.dll" + * @return The path to the exported resource + * @throws Exception + */ + static public String ExportResource(String resourceName) throws Exception { + InputStream stream = null; + OutputStream resStreamOut = null; + String jarFolder; + try { + stream = Toecount.class.getResourceAsStream(resourceName);//note that each / is a directory down in the "jar tree" been the jar the root of the tree + if(stream == null) { + throw new Exception("Cannot get resource \"" + resourceName + "\" from Jar file."); + } + + int readBytes; + byte[] buffer = new byte[4096]; + jarFolder = System.getProperty("user.dir"); + resStreamOut = new FileOutputStream(jarFolder + resourceName); + while ((readBytes = stream.read(buffer)) > 0) { + resStreamOut.write(buffer, 0, readBytes); + } + } catch (Exception ex) { + throw ex; + } finally { + stream.close(); + resStreamOut.close(); + } + + return jarFolder + resourceName; + } private static void performUpgrade(String xmlName, String outName) throws IOException, TransformerException { diff --git a/src/main/resources/xrechnung-viewer.css b/src/main/resources/xrechnung-viewer.css new file mode 100644 index 00000000..adea4c9b --- /dev/null +++ b/src/main/resources/xrechnung-viewer.css @@ -0,0 +1,917 @@ +/* Grundformatierung ********************************************/ + +*, +*:after, +*:before +{ + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.clear:after +{ + content: "."; + clear: both; + display: block; + visibility: hidden; + height: 0; +} + +html, +body +{ + height: 100%; + min-width: 320px; + margin: 0; + padding: 0; + color: #000; + font-size: 14px; +} + +body +{ + overflow-y: scroll; + background-color: rgba(4, 101, 161, 0.08); +} + +h4 +{ + color: inherit; + font-size: inherit; + margin-bottom: 0.5rem; +} + + +/* Grundaufbau *************************************************/ + +.menue +{ + position: relative; + z-index: 2000; + background-color: #000; + margin-bottom: 30px; +} + +.innen +{ + max-width: 1080px; + margin: 0 auto; + padding: 0 2%; +} + + + +/* Formatierungen *************************************************/ + +.color2 +{ + color: rgba(0, 0, 0, 0.6); +} + +.schwarz +{ + color: #555 !important; +} + +.normal +{ + font-weight: normal; +} + +.bold +{ + font-weight: bold; +} + +.abstandUnten +{ + margin-bottom: 5px; +} + +.abstandUntenKlein +{ + margin-bottom: 10px; +} + +.noPaddingTop +{ + padding-top: 0 !important; +} + +.ausrichtungRechts +{ + text-align: right; +} + + + + +/* Menü ********************************************************/ + +button +{ + position: relative; + font-family: serif; + padding-top: 15px; + padding-left: 0; + padding-right: 0; + margin-right: 2%; +} + +.btnAktiv +{ + font-size: 22px; + color: #ffb619; + height: 50px; + outline: none; + border: none; + background: none; +} + +.btnAktiv:after +{ + content: ""; + display: block; + position: absolute; + top: 50px; + left: 50%; + z-index: 10; + font-size: 0; + line-height: 0; + height: 0; + padding: 0; + margin: 0; + transform: translateX(-50%); + border: 15px solid #000; + border-right-color: transparent; + border-bottom-color: transparent; + border-left-color: transparent; +} + +.btnInaktiv, +.tab +{ + font-size: 22px; + color: #fff; + height: 50px; + z-index: 0; + outline: none; + border: none; + background: none; + transition: color 0.3s ease; +} + +.btnInaktiv:hover, +.tab:hover +{ + color: #ffb619; + cursor: pointer; +} + +.divHide +{ + display: none; +} + +/* Content *********************************************************************/ + +.inhalt +{ + font-family: sans-serif; + margin-bottom: 30px; +} + +.haftungausschluss +{ + color: #000; + text-align: center; + padding: 7px; + margin-bottom: 30px; + width: 100%; + border: 1px solid #ffb619; + background-color: #fff; +} + +.box +{ + position: relative; + display: table-cell; + padding: 0; + border: 1px solid rgba(4, 101, 161, 0.2); + background-color: #fff; +} + +.subBox +{ + border-top: none; + width: 50%; +} + +.subBox:last-child +{ + border-left: none; +} + +.first > .boxzeile > .subBox +{ + border-top: 1px solid rgba(4, 101, 161, 0.2) !important; +} + +.boxtitel +{ + display: inline-block; + background-color: #0465A1; + padding: 7px 10px; + color: #fff; + font-weight: bold; +} + +.boxBorderTop +{ + border-top: none; +} + +.boxBorderLeft +{ + border-left: none; +} + +.boxtitelSub +{ + color: #000; + background-color: rgba(4, 101, 161, 0.1); + border-right: 1px solid rgba(4, 101, 161, 0.2); + border-bottom: 1px solid rgba(4, 101, 161, 0.2); +} + +.boxinhalt +{ + padding: 15px 20px; +} + +.boxtabelle +{ + display: table; + width: 100%; +} + +.borderSpacing +{ + border-spacing: 0 5px; +} + +.boxabstandtop +{ + margin-top: 30px; +} + +.boxzeile +{ + display: table-row; +} + +.boxzeile .box:last-child +{ + margin-bottom: 0; +} + +.boxdaten +{ + display: table-cell; + padding: 5px 0; + vertical-align: middle; + height: 38px; + /* + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +*/ +} + +.boxdaten.wert +{ + padding: 5px 10px; +} + +.boxcell +{ + display: table-cell; +} + +.boxdatenBlock +{ + display: block; + padding: 3px 0; + /* + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +*/ +} + +.noBreak +{ + -ms-word-break: keep-all; + word-break: keep-all; + word-break: keep-all; + -webkit-hyphens: none; + -moz-hyphens: none; + hyphens: none; +} + +.boxabstand +{ + display: table-cell; + width: 30px; +} + +.legende +{ + color: rgba(0, 0, 0, 0.6); + width: 170px; + font-size: 13px; + line-height: 16px; + padding-right: 5px; +} + +.wert +{ + background-color: rgba(4, 101, 161, 0.03); +} + +.boxtabelleEinspaltig +{ + width: 49%; +} + +.boxtabelleZweispaltig, +.boxtabelleDreispaltig +{ + width: 100%; +} + +.box5050 +{ + width: 50%; +} + +.boxEinspaltig +{ + width: 100%; +} + +.boxZweispaltig +{ + width: 48.5%; +} + +.boxSpalte1 { + width: 50%; +} + +.boxSpalte2 { + width: 50%; + padding-left: 20px; +} + +.paddingLeft { + padding-left: 0.1em; +} + +.noPadding { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.rechnungsZeile +{ + display: table-row; +} + +.rechnungsZeile .boxdaten +{ + height: auto; +} + +.rechnungSp1 +{ + width: 65%; + font-size: 16px; +} + +.rechnungSp2 +{ + width: 10%; +} + +.rechnungSp3 +{ + width: 25%; + font-size: 16px; + text-align: right; +} + +.detailSp1, +.detailSp2 +{ + width: 50%; +} + +.detailSp2 +{ + text-align: right; +} + +.line1Bottom +{ + border-bottom: 1px solid #000; +} + +.line1BottomLight +{ + padding-bottom: 5px; + border-bottom: 1px solid #f0f0f0; + margin-bottom: 5px; +} + +.line2Bottom +{ + border-bottom: 2px solid #000; +} + +.paddingTop +{ + padding-top: 10px; +} + +.paddingBottom +{ + padding-bottom: 10px; +} + +.grund +{ + font-size: 16px; + display: block; + width: 100%; + padding: 0 20px 15px 20px; +} + +.grundDetail +{ + display: block; + width: 100%; + padding: 0 20px 15px 20px; +} + +/* Übersichtformatierungen */ +#uebersichtLastschrift.box, +#uebersichtUeberweisung.box +{ + border-top: none; +} + +#uebersichtUeberweisung.box +{ + border-left: none; +} + + +/* Formatierungen Detailseite */ + +.detailsSpalte1, +.detailsSpalte2 +{ + width: 30%; + float: left; + font-size: 90%; + line-height: 115%; + margin-right: 5%; +} + +.detailsSpalte3 +{ + width: 30%; + float: left; + font-size: 90%; + line-height: 115%; +} + +.detailsSpalte1 .legende, +.detailsSpalte2 .legende, +.detailsSpalte3 .legende +{ + width: 145px; +} + +.titelPosition +{ + font-size: 17px; + font-weight: bold; +} + + +/* Laufzettelformatierungen */ +#laufzettelHistorie .boxtabelle:not(:nth-child(2)) +{ + border-top: 1px solid rgba(4, 101, 161, 0.2); + padding-top: 10px; + margin-top: 10px; +} + + + + + +/* 1023px und kleiner ************************************************/ + +@media screen and (max-width : 1023px) { + + .box + { + display: block; + width: 100%; + margin-bottom: 20px; + } + + .boxabstandtop + { + margin-top: 15px; + } + + .subBox:first-child + { + margin-bottom: 0 !important; + } + + .subBox:last-child + { + border-left: 1px solid rgba(4, 101, 161, 0.2); + } + + .first > .boxzeile > .subBox + { + border-top: none !important; + } + + .first > .boxzeile > .subBox:first-child + { + border-top: 1px solid rgba(4, 101, 161, 0.2) !important; + } + + .first > .boxzeile + { + margin-bottom: 0; + } + + #uebersichtUeberweisung.box + { + border-left: 1px solid rgba(4, 101, 161, 0.2); + } + + #uebersichtLastschrift.box + { + margin-bottom: 0; + } + + .boxzeile + { + display: block; + margin-bottom: 5px; + } + + .boxzeile:after + { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } + + #details > .boxtabelle > .boxzeile + { + margin-bottom: 0px; + } + + .boxcell + { + display: block; + } + + .boxcell:last-child + { + margin-top: 20px; + } + + .boxZweispaltig + { + width: 100%; + } + + .legende + { + display: block; + float: left; + width: 170px; + padding: 5px 0; + height: auto; + } + + .wert + { + display: block; + float: left; + width: calc(100% - 170px); + padding: 11px 10px !important; + line-height: 1.3; + min-height: 38px; + height: auto; + } + + .boxdaten .legende + { + height: auto; + } + + .rechnungsZeile .boxdaten + { + padding: 5px 0; + } + + .boxabstand + { + display: none; + } + + .boxtabelleEinspaltig { + width: 100%; + } + + .boxSpalte1 { + display: block; + width: auto; + } + + .boxSpalte2 { + display: block; + width: auto; + padding-left: 0px; + margin-top: 1.2rem; + } + + .detailsSpalte1, + .detailsSpalte2, + .detailsSpalte3 + { + width: 100%; + float: none; + padding-right: 0px; + } + + .detailsSpalte2, + .detailsSpalte3 + { + margin-top: 15px; + } + + .detailsSpalte2, + .detailsSpalte3 + { + margin-top: 10px; + } + + .tableNumberAlignRight + { + display: block; + width: 130px; + text-align: right; + } +} + + + +/* 800px und kleiner ************************************************/ + +@media screen and (max-width : 800px) { + + button + { + padding-top: 10px; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 20px; + height: 40px; + } + + .btnAktiv:after + { + top: 40px; + } + + .rechnungSp1 + { + width: 55%; + font-size: 15px; + } + + .rechnungSp2 + { + width: 10%; + } + + .rechnungSp3 + { + width: 35%; + text-align: right; + font-size: 15px; + } + + .grund + { + font-size: 15px; + } +} + +/* 450px und kleiner ************************************************/ + +@media screen and (max-width : 450px) +{ + + html, + body + { + font-size: 12px; + } + + .menue + { + margin-bottom: 20px; + } + + button + { + padding-top: 5px; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 17px; + height: 35px; + } + + .btnAktiv:after + { + top: 35px; + } + + .legende + { + font-size: 12px; + width: 100%; + } + + .wert + { + font-size: 12px; + line-height: 1.3; + width: 100%; + margin-bottom: 10px + } + + .boxzeile + { + margin-bottom: 0px + } + + .boxdaten + { + height: auto; + } + + .haftungausschluss + { + margin-bottom: 20px; + } + + .boxinhalt + { + margin-top: 0px; + } + + .boxabstandtop + { + margin-top: 20px; + } + + .boxtitel + { + padding: 7px 8px; + } + + .box + { + margin-bottom: 10px; + padding: 0; + } + + .boxabstandtop + { + margin-top: 10px; + } + + .boxdaten, + .boxdatenBlock + { + padding: 2px 0; + } + + .rechnungSp1 + { + width: 50%; + font-size: inherit; + } + + .rechnungSp2 + { + width: 15%; + } + + .rechnungSp3 + { + width: 35%; + font-size: inherit; + text-align: right; + } + + .grund + { + font-size: inherit; + } + + .titelPosition + { + font-size: 15px; + } + + .abstandUnten + { + margin-bottom: 5px; + } + + .detailsSpalte1, + .detailsSpalte2, + .detailsSpalte3 + { + font-size: inherit; + line-height: inherit; + } +} + +/* 380px und kleiner ************************************************/ + +@media screen and (max-width : 380px) { + + html, + body + { + font-size: 11px; + line-height: 100%; + } + + .btnAktiv, + .btnInaktiv, + .tab + { + font-size: 15px; + } + + .boxdaten +.boxdatenBlock + { + padding: 2px 0; + } + + .boxinhalt + { + margin-top: 0px; + } + + .boxtitel + { + padding: 5px 7px; + } +} diff --git a/src/main/resources/xrechnung-viewer.js b/src/main/resources/xrechnung-viewer.js new file mode 100644 index 00000000..2d547b86 --- /dev/null +++ b/src/main/resources/xrechnung-viewer.js @@ -0,0 +1,145 @@ + +/* Tab-Container aufbauen **************************************************/ + +var a = new Array("uebersicht", "details", "zusaetze", "anlagen", "laufzettel"); +var b = new Array("menueUebersicht", "menueDetails", "menueZusaetze", "menueAnlagen", "menueLaufzettel"); + +function show(e) { + var i = 0; + var j = 1; + for (var t = 0; t < b.length; t++) { + if (b[t] === e.id) { + i = t; + if (i > 0) { + j = 0; + } else { + j = i + 1; + } + break; + } + } + e.setAttribute("class", "btnAktiv"); + for (var k = 0; k < b.length; k++) { + if (k === i && (document.getElementById(a[k]) != null)) { + document.getElementById(a[k]).style.display = "block"; + if (i === j) + j = i + 1; + } else { + if (document.getElementById(a[k]) != null) { + document.getElementById(a[j]).style.display = "none"; + document.getElementById(b[j]).setAttribute("class", "btnInaktiv"); + j += 1; + } + } + } +} +window.onload = function () { + document.getElementById(b[0]).setAttribute("class", "btnAktiv"); +} + +/* Eingebettete Binaerdaten runterladen ************************************/ + + +function base64_to_binary (data) { + var chars = atob(data); + var bytes = new Array(chars.length); + for (var i = 0; i < chars.length; i++) { + bytes[i] = chars.charCodeAt(i); + } + return new Uint8Array(bytes); +} + +function downloadData (element_id) { + var data_element = document.getElementById(element_id); + var mimetype = data_element.getAttribute('mimeType'); + var filename = data_element.getAttribute('filename'); + var text = data_element.innerHTML; + var binary = base64_to_binary(text); + var blob = new Blob([binary], { + type: mimetype, size: binary.length + }); + + if (window.navigator && window.navigator.msSaveOrOpenBlob) { + // IE + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + // Non-IE + var url = window.URL.createObjectURL(blob); + window.open(url); + } +} + + +/* Polyfill IE atob/btoa ************************************/ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function () { + factory(root); + }); + } else factory(root); + // node.js has always supported base64 conversions, while browsers that support + // web workers support base64 too, but you may never know. +})(typeof exports !== "undefined" ? exports: this, function (root) { + if (root.atob) { + // Some browsers' implementation of atob doesn't support whitespaces + // in the encoded string (notably, IE). This wraps the native atob + // in a function that strips the whitespaces. + // The original function can be retrieved in atob.original + try { + root.atob(" "); + } + catch (e) { + root.atob = (function (atob) { + var func = function (string) { + return atob(String(string).replace(/[\t\n\f\r ]+/g, "")); + }; + func.original = atob; + return func; + })(root.atob); + } + return; + } + + // base64 character set, plus padding character (=) + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + // Regular expression to check formal correctness of base64 encoded strings + b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + + root.btoa = function (string) { + string = String(string); + var bitmap, a, b, c, + result = "", i = 0, + rest = string.length % 3; // To determine the final padding + + for (; i < string.length;) { + if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string.charCodeAt(i++)) > 255) + throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); + + bitmap = (a << 16) | (b << 8) | c; + result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); + } + + // If there's need of padding, replace the last 'A's with equal signs + return rest ? result.slice(0, rest - 3) + "===".substring(rest): result; + }; + + root.atob = function (string) { + // atob can work with strings with whitespaces, even inside the encoded part, + // but only \t, \n, \f, \r and ' ', which can be stripped. + string = String(string).replace(/[\t\n\f\r ]+/g, ""); + if (! b64re.test(string)) + throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); + + // Adding the padding if missing, for semplicity + string += "==".slice(2 - (string.length & 3)); + var bitmap, result = "", r1, r2, i = 0; + for (; i < string.length;) { + bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); + + result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255): r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255): String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); + } + return result; + }; +}); \ No newline at end of file From f9f018e895dedd9e805e0049fa33463900a879de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 25 Jul 2019 22:49:49 +0200 Subject: [PATCH 38/48] removed visualization, it remains in v1.8.0 branch but master aims at 1.7.3 since I might want to try to add unit tests and some documentation for the new feature --- History.md | 3 +- pom.xml | 2 +- .../org/mustangproject/toecount/Toecount.java | 88 - src/main/resources/stylesheets/cii-xr.xsl | 2202 ----------------- .../resources/stylesheets/xrechnung-html.xsl | 1184 --------- src/main/resources/xrechnung-viewer.css | 917 ------- src/main/resources/xrechnung-viewer.js | 145 -- xrechnung-viewer.css | 917 ------- xrechnung-viewer.js | 145 -- 9 files changed, 3 insertions(+), 5600 deletions(-) delete mode 100644 src/main/resources/stylesheets/cii-xr.xsl delete mode 100644 src/main/resources/stylesheets/xrechnung-html.xsl delete mode 100644 src/main/resources/xrechnung-viewer.css delete mode 100644 src/main/resources/xrechnung-viewer.js delete mode 100644 xrechnung-viewer.css delete mode 100644 xrechnung-viewer.js diff --git a/History.md b/History.md index 6fbb57bd..f4b57df7 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,7 @@ -- 1.8.0 feature: --action=visualize convert zugferd xml to html +todo - migration: testIndicator entfernen - in ram:ExchangedDocument: ram:name entfernen +done - updated javadoc - fixed #104 nullpointerex when specifying no parameter - closed #23 diff --git a/pom.xml b/pom.xml index c8783537..4ca4bb50 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.8.0-SNAPSHOT + 1.7.3-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs diff --git a/src/main/java/org/mustangproject/toecount/Toecount.java b/src/main/java/org/mustangproject/toecount/Toecount.java index 3d1ff415..84edf28b 100755 --- a/src/main/java/org/mustangproject/toecount/Toecount.java +++ b/src/main/java/org/mustangproject/toecount/Toecount.java @@ -86,7 +86,6 @@ public class Toecount { System.out.println("Mustangproject.org " + org.mustangproject.ZUGFeRD.Version.VERSION + " \r\n" + "A Apache Public License library and command line tool for statistics on PDF invoices with\r\n" + "ZUGFeRD Metadata (http://www.zugferd.org)\r\n" + "\r\n" + getUsage() + "\r\n" - + "* --action=visualize to convert XML to HTML or \\r\\n" + "* Count operations\r\n" + "\t-d, --directory\tcount ZUGFeRD files in directory to be scanned\r\n" + "\t\tIf it is a directory, it will recurse.\r\n" + "\t-l, --listfromstdin\tcount ZUGFeRD files from a list of linefeed separated files on runtime.\r\n" @@ -332,8 +331,6 @@ public class Toecount { performConvert(sourceName, outName); } else if (upgradeRequested) { performUpgrade(sourceName, outName); - } else if ((action!=null)&&(action.equals("visualize"))) { - performVisualization(sourceName, outName); } else { // no argument or argument unknown printUsage(); @@ -347,91 +344,6 @@ public class Toecount { } - private static void performVisualization(String sourceName, String outName) { - // Get params from user if not already defined - if (sourceName == null) { - sourceName = getFilenameFromUser("ZUGFeRD XML source", "zugferd-invoice.xml", "xml", true, false); - } else { - System.out.println("ZUGFeRD XML source set to " + sourceName); - } - if (outName == null) { - outName = getFilenameFromUser("ZUGFeRD 2.0 XML target", "factur-x.html", "html", false, true); - } else { - System.out.println("ZUGFeRD 1.0 XML source set to " + outName); - } - - // Verify params - try { - ensureFileExists(sourceName); - ensureFileNotExists(outName); - - // stylesheets/ZUGFeRD_1p0_c1p0_s1p0.xslt - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - - ZUGFeRDVisualizer zvi = new ZUGFeRDVisualizer(); - String xml = null; - try { - xml = zvi.visualize(sourceName); - Files.write(Paths.get(outName), xml.getBytes()); - } catch (FileNotFoundException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (UnsupportedEncodingException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (TransformerException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } catch (IOException e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - System.out.println("Written to " + outName); - - try { - ExportResource("/xrechnung-viewer.css"); - ExportResource("/xrechnung-viewer.js"); - - System.out.println("xrechnung-viewer.css and xrechnung-viewer.js written as well (to local working dir)"); - } catch (Exception e) { - Logger.getLogger(Toecount.class.getName()).log(Level.SEVERE, null, e); - } - - - } - - /** - * Export a resource embedded into a Jar file to the local file path. - * - * @param resourceName ie.: "/SmartLibrary.dll" - * @return The path to the exported resource - * @throws Exception - */ - static public String ExportResource(String resourceName) throws Exception { - InputStream stream = null; - OutputStream resStreamOut = null; - String jarFolder; - try { - stream = Toecount.class.getResourceAsStream(resourceName);//note that each / is a directory down in the "jar tree" been the jar the root of the tree - if(stream == null) { - throw new Exception("Cannot get resource \"" + resourceName + "\" from Jar file."); - } - - int readBytes; - byte[] buffer = new byte[4096]; - jarFolder = System.getProperty("user.dir"); - resStreamOut = new FileOutputStream(jarFolder + resourceName); - while ((readBytes = stream.read(buffer)) > 0) { - resStreamOut.write(buffer, 0, readBytes); - } - } catch (Exception ex) { - throw ex; - } finally { - stream.close(); - resStreamOut.close(); - } - - return jarFolder + resourceName; - } - private static void performUpgrade(String xmlName, String outName) throws IOException, TransformerException { // Get params from user if not already defined diff --git a/src/main/resources/stylesheets/cii-xr.xsl b/src/main/resources/stylesheets/cii-xr.xsl deleted file mode 100644 index 5fca7b9d..00000000 --- a/src/main/resources/stylesheets/cii-xr.xsl +++ /dev/null @@ -1,2202 +0,0 @@ - - - - - - Author: KoSIT Bremen (kosit@finanzen.bremen.de) - Fassung vom: 2019-03-18+01:00 - Überführt eine zur EN 16931 konforme elektronische Rechnung in der konkreten Syntax UNCEFACT.CII.D16B in eine Instanz gemäß des Schemas für den Namensraum urn:ce.eu:en16931:2017:xoev-de:kosit:standard:xrechnung-1. - Das Skript setzt voraus, dass das zu verarbeitende Dokument valide bzgl. des XML Schemas und der Schematron-Regeln der Quelle ist. Für nicht valide Dokumente ist das Ergebnis nicht definiert. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ILLEGAL DATE FORMAT: <para>Mit diesem Datentyp wird ein kalendarisches Datum abgebildet, wie es in der ISO 8601 Spezifikation <quote>Calendar date complete representation</quote> beschrieben ist (siehe ISO 8601:2004, Abschnitt 5.2.1.1). Das Datum beinhaltet keine Zeitangabe. Das konkret zu verwendende Format ist abhängig von der genutzten Syntax.</para> -<para>Der Datentyp basiert auf dem Typ <quote>Date Time. Type</quote>, wie in ISO 15000-5:2014 Anhang B definiert.</para> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. - - - - - - - - - - - Liefert einen XPath-Pfad, welches $n eindeutig identifiziert. - - - - - / - - - [ - - ] - - - - /@ - - - diff --git a/src/main/resources/stylesheets/xrechnung-html.xsl b/src/main/resources/stylesheets/xrechnung-html.xsl deleted file mode 100644 index 54a0de84..00000000 --- a/src/main/resources/stylesheets/xrechnung-html.xsl +++ /dev/null @@ -1,1184 +0,0 @@ - - - - - - - - - - - - - - - XRechnung - - - - - -

- -
-
- - - - - -
-
- - - -
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
- - - -
- - - -
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
-
- - -
-
- -
-
- - -
-
- -
-
- -
-
-
-
- - - -
-
Informationen zum Käufer
-
-
-
Leitweg-ID:
-
-
-
-
Name:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Land:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Name:
-
-
-
-
Telefon:
-
-
-
-
E-Mail-Adresse:
-
-
-
-
-
- - - -
-
Informationen zum Verkäufer
-
-
-
Firmenname:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Ländercode:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Name:
-
-
-
-
Telefon:
-
-
-
-
E-Mail-Adresse:
-
-
-
-
-
- - - -
-
-
Rechnungsdaten
-
-
-
-
-
Rechnungsnummer:
-
-
-
-
Rechnungsdatum:
-
-
-
-
Rechnungsart:
-
-
-
-
Währung:
-
-
-
-

Abrechnungszeitraum:

-
-
-
von:
-
-
-
-
bis:
-
-
-
-
-
-
-
-
-
Projektnummer:
-
-
-
-
Vertragsnummer:
-
-
-
-
Bestellnummer:
-
-
-
-
Auftragsnummer:
-
-
-
-

Vorausgegangene Rechnungen:

- -
-
-
-
-
- - -
-
-
Rechnungsnummer:
-
-
-
-
Rechnungsdatum:
-
-
-
-
- - - -
-
-
Gesamtbeträge der Rechnung
-
-
-
Summe aller Positionen
-
netto
-
-
-
-
Summe Nachlässe
-
netto
-
-
-
-
Summe Zuschläge
-
netto
-
-
-
-
Gesamtsumme
-
netto
-
-
-
-
Summe Umsatzsteuer
-
-
-
-
-
Summe Umsatzsteuer in Abrechnungswährung
-
-
-
-
-
Gesamtsumme
-
brutto
-
-
-
-
Gezahlter Betrag
-
brutto
-
-
-
-
Rundungsbetrag
-
brutto
-
-
-
-
Fälliger Betrag
-
brutto
-
-
-
-
-
-
- - - -
-
-
Aufschlüsselung der Umsatzsteuer auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie:
-
-
-
-
-
Gesamtsumme
-
netto
-
-
-
-
Umsatzsteuersatz
-
-
%
-
-
-
Umsatzsteuerbetrag
-
-
-
-
- -
-
Befreiungsgrund:
-
Kennung für den Befreiungsgrund:
-
-
-
-
- - - -
-
-
Nachlass auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie des Nachlasses:
-
-
-
-
-
Grundbetrag
-
netto
-
-
-
-
Prozentsatz
-
-
%
-
-
-
Nachlass
-
netto
-
-
-
-
Umsatzsteuersatz des Nachlasses
-
-
-
-
-
-
Grund für den Nachlass:
-
Document level allowance reason code:
-
-
-
-
-
- - - -
-
-
Zuschlag auf Ebene der Rechnung
-
-
-
Umsatzsteuerkategorie des Zuschlages:
-
-
-
-
-
Grundbetrag
-
netto
-
-
-
-
Prozentsatz
-
-
%
-
-
-
Zuschlag
-
netto
-
-
-
-
Umsatzsteuersatz des Zuschlages
-
-
-
-
-
-
Grund für den Zuschlag:
-
Document level charge reason code:
-
-
-
-
-
- - - -
-
Zahlungsdaten
-
-
-
Skonto; weitere Zahlungsbedingungen:
-
-
-
-
Fälligkeitsdatum:
-
-
-
-
Code für das Zahlungsmittel:
-
-
-
-
Zahlungsmittel:
-
-
-
-
Verwendungszweck:
-
-
-
-
-
- - - -
-
Karteninformation
-
-
-
Kartennummer:
-
-
-
-
Karteninhaber:
-
-
-
-
-
- - - -
-
Lastschrift
-
-
-
Mandatsreferenznr.:
-
-
-
-
IBAN:
-
-
-
-
Gläubiger-ID:
-
-
-
-
-
- - - -
-
Überweisung
-
-
-
Kontoinhaber:
-
-
-
-
IBAN:
-
-
-
-
BIC:
-
-
-
-
-
- - - -
-
Bemerkung zur Rechnung
-
-
-
Betreff:
-
-
-
-
Bemerkung:
-
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
- -
-
- - - -
-
-
-
Position
-
-
-
Freitext:
-
-
-
-
Objektkennung:
-
-
-
-
Schema der Objektkennung:
-
-
-
-
Nummer der Auftragsposition:
-
-
-
-
Kontierungshinweis:
-
-
-

Abrechnungszeitraum:

-
-
von:
-
-
-
-
bis:
-
-
-
-
-
-
Preiseinzelheiten
-
-
-
Menge
-
-
-
-
Einheit
-
-
-
-
Preis pro Einheit (netto)
-
-
-
-
Gesamtpreis (netto)
-
-
-
-
-
-
Rabatt (netto):
-
-
-
-
Listenpreis (netto):
-
-
-
-
Anzahl der Einheit:
-
-
-
-
Code der Maßeinheit:
-
-
-
-
Umsatzsteuer:
-
-
-
-
Umsatzsteuersatz in Prozent:
-
%
-
-
-
-
-
-
-
-
-
Nachlässe auf Ebene der Rechnungsposition
-
-
-
Grundbetrag (netto)
-
-
-
-
Prozentsatz
-
%
-
-
-
Nachlass (netto)
-
-
-
-
-
Grund des Nachlasses:
-
Code für den Nachlassgrund:
-
-
-
-
Zuschläge auf Ebene der Rechnungsposition
-
-
-
Grundbetrag (netto)
-
-
-
-
Prozentsatz
-
%
-
-
-
Zuschlag (netto)
-
-
-
-
-
Grund des Zuschlags:
-
Code für den Zuschlagsgrund:
-
-
-
-
-
-
-
-
Artikelinformationen
-
-
-
-
-
-
Bezeichnung:
-
-
-
-
Beschreibung:
-
-
-
-
Artikelnummer:
-
-
-
-
Artikelkennung des Käufers:
-
-
-

Eigenschaften des Artikels:

- -
-
-
-
-
-
-
Artikelkennung:
-
-
-
-
Schema der Artikelkennung:
-
-
-
-
Code der Artikelklassifizierung:
-
-
-
-
Kennung zur Bildung des Schemas:
-
-
-
-
Version zur Bildung des Schemas:
-
-
-
-
Code des Herkunftslandes:
-
-
-
-
-
-
-
-
-
-
- - - -
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
- -
- -
-
-
-
- -
- -
-
-
-
- -
- -
-
-
-
- - - -
-
Informationen zum Verkäufer
-
-
-
Abweichender Handelsname:
-
-
-
-
Bundesland:
-
-
-
-
Elektronische Adresse:
-
-
-
-
Schema der elektronischen Adresse:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
Steuernummer:
-
-
-
-
Schema der Steuernummer:
-
-
-
-
Weitere rechtliche Informationen:
-
-
-
-
Code der Umsatzsteuerwährung:
-
-
-
-
-
- - - -
-
Steuervertreter des Verkäufers
-
-
-
Name:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Ländercode:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
-
- - - -
-
Informationen zum Käufer
-
-
-
Abweichender Handelsname:
-
-
-
-
Bundesland:
-
-
-
-
Elektronische Adresse:
-
-
-
-
Schema der elektronischen Adresse:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Schema der Register-/Registriernummer:
-
-
-
-
Umsatzsteuer-ID:
-
-
-
-
Abrechnungsdatum der Umsatzsteuer:
-
-
-
-
Code des Umsatzsteuer-Abrechnungsdatums:
-
-
-
-
Kontierungsinformation:
-
-
-
-
-
- - - -
-
Lieferinformationen
-
-
-
Kennung des Lieferorts:
-
-
-
-
Schema der Kennung:
-
-
-
-
Lieferdatum:
-
-
-
-
Name des Empfängers:
-
-
-
-
Straße / Hausnummer:
-
-
-
-
Postfach:
-
-
-
-
Adresszusatz:
-
-
-
-
PLZ:
-
-
-
-
Ort:
-
-
-
-
Bundesland:
-
-
-
-
Land:
-
-
-
-
-
- - - -
-
Informationen zum Vertrag
-
-
-
Vergabenummer:
-
-
-
-
Kennung der Empfangsbestätigung:
-
-
-
-
Kennung der Versandanzeige:
-
-
-
-
Prozesskennung:
-
-
-
-
Spezifikationskennung:
-
-
-
-
Objektkennung:
-
-
-
-
Schema der Objektkennung:
-
-
-
-
-
- - - -
-
Vom Verkäufer abweichender Zahlungsempfänger
-
-
-
Name:
-
-
-
-
Kennung:
-
-
-
-
Schema der Kennung:
-
-
-
-
Register-/Registriernummer:
-
-
-
-
Schema der Register-/Registriernummer:
-
-
-
-
-
- - - -
-
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
-
-
-
-
Rechnungsbegründende Unterlagen
- -
-
-
-
-
- - - -
-
-
Kennung:
-
-
-
-
Beschreibung:
-
-
-
-
Verweis (z.B. Internetadresse):
-
-
-
-
Anhangsdokument:
-
- Öffnen -
- - -
-
-
Format des Anhangdokuments:
-
-
-
-
Name des Anhangsdokuments:
-
-
-
-
- - - -
-
-
-
-
Bearbeitungshistorie
- -
-
-
-
-
- - - -
-
-
Datum/Uhrzeit:
-
-
-
-
Betreff:
-
-
-
-
Text:
-
-
-
-
Details:
-
-
-
-
- - diff --git a/src/main/resources/xrechnung-viewer.css b/src/main/resources/xrechnung-viewer.css deleted file mode 100644 index adea4c9b..00000000 --- a/src/main/resources/xrechnung-viewer.css +++ /dev/null @@ -1,917 +0,0 @@ -/* Grundformatierung ********************************************/ - -*, -*:after, -*:before -{ - box-sizing: border-box; - -moz-box-sizing: border-box; -} - -.clear:after -{ - content: "."; - clear: both; - display: block; - visibility: hidden; - height: 0; -} - -html, -body -{ - height: 100%; - min-width: 320px; - margin: 0; - padding: 0; - color: #000; - font-size: 14px; -} - -body -{ - overflow-y: scroll; - background-color: rgba(4, 101, 161, 0.08); -} - -h4 -{ - color: inherit; - font-size: inherit; - margin-bottom: 0.5rem; -} - - -/* Grundaufbau *************************************************/ - -.menue -{ - position: relative; - z-index: 2000; - background-color: #000; - margin-bottom: 30px; -} - -.innen -{ - max-width: 1080px; - margin: 0 auto; - padding: 0 2%; -} - - - -/* Formatierungen *************************************************/ - -.color2 -{ - color: rgba(0, 0, 0, 0.6); -} - -.schwarz -{ - color: #555 !important; -} - -.normal -{ - font-weight: normal; -} - -.bold -{ - font-weight: bold; -} - -.abstandUnten -{ - margin-bottom: 5px; -} - -.abstandUntenKlein -{ - margin-bottom: 10px; -} - -.noPaddingTop -{ - padding-top: 0 !important; -} - -.ausrichtungRechts -{ - text-align: right; -} - - - - -/* Menü ********************************************************/ - -button -{ - position: relative; - font-family: serif; - padding-top: 15px; - padding-left: 0; - padding-right: 0; - margin-right: 2%; -} - -.btnAktiv -{ - font-size: 22px; - color: #ffb619; - height: 50px; - outline: none; - border: none; - background: none; -} - -.btnAktiv:after -{ - content: ""; - display: block; - position: absolute; - top: 50px; - left: 50%; - z-index: 10; - font-size: 0; - line-height: 0; - height: 0; - padding: 0; - margin: 0; - transform: translateX(-50%); - border: 15px solid #000; - border-right-color: transparent; - border-bottom-color: transparent; - border-left-color: transparent; -} - -.btnInaktiv, -.tab -{ - font-size: 22px; - color: #fff; - height: 50px; - z-index: 0; - outline: none; - border: none; - background: none; - transition: color 0.3s ease; -} - -.btnInaktiv:hover, -.tab:hover -{ - color: #ffb619; - cursor: pointer; -} - -.divHide -{ - display: none; -} - -/* Content *********************************************************************/ - -.inhalt -{ - font-family: sans-serif; - margin-bottom: 30px; -} - -.haftungausschluss -{ - color: #000; - text-align: center; - padding: 7px; - margin-bottom: 30px; - width: 100%; - border: 1px solid #ffb619; - background-color: #fff; -} - -.box -{ - position: relative; - display: table-cell; - padding: 0; - border: 1px solid rgba(4, 101, 161, 0.2); - background-color: #fff; -} - -.subBox -{ - border-top: none; - width: 50%; -} - -.subBox:last-child -{ - border-left: none; -} - -.first > .boxzeile > .subBox -{ - border-top: 1px solid rgba(4, 101, 161, 0.2) !important; -} - -.boxtitel -{ - display: inline-block; - background-color: #0465A1; - padding: 7px 10px; - color: #fff; - font-weight: bold; -} - -.boxBorderTop -{ - border-top: none; -} - -.boxBorderLeft -{ - border-left: none; -} - -.boxtitelSub -{ - color: #000; - background-color: rgba(4, 101, 161, 0.1); - border-right: 1px solid rgba(4, 101, 161, 0.2); - border-bottom: 1px solid rgba(4, 101, 161, 0.2); -} - -.boxinhalt -{ - padding: 15px 20px; -} - -.boxtabelle -{ - display: table; - width: 100%; -} - -.borderSpacing -{ - border-spacing: 0 5px; -} - -.boxabstandtop -{ - margin-top: 30px; -} - -.boxzeile -{ - display: table-row; -} - -.boxzeile .box:last-child -{ - margin-bottom: 0; -} - -.boxdaten -{ - display: table-cell; - padding: 5px 0; - vertical-align: middle; - height: 38px; - /* - -ms-word-break: break-all; - word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -*/ -} - -.boxdaten.wert -{ - padding: 5px 10px; -} - -.boxcell -{ - display: table-cell; -} - -.boxdatenBlock -{ - display: block; - padding: 3px 0; - /* - -ms-word-break: break-all; - word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -*/ -} - -.noBreak -{ - -ms-word-break: keep-all; - word-break: keep-all; - word-break: keep-all; - -webkit-hyphens: none; - -moz-hyphens: none; - hyphens: none; -} - -.boxabstand -{ - display: table-cell; - width: 30px; -} - -.legende -{ - color: rgba(0, 0, 0, 0.6); - width: 170px; - font-size: 13px; - line-height: 16px; - padding-right: 5px; -} - -.wert -{ - background-color: rgba(4, 101, 161, 0.03); -} - -.boxtabelleEinspaltig -{ - width: 49%; -} - -.boxtabelleZweispaltig, -.boxtabelleDreispaltig -{ - width: 100%; -} - -.box5050 -{ - width: 50%; -} - -.boxEinspaltig -{ - width: 100%; -} - -.boxZweispaltig -{ - width: 48.5%; -} - -.boxSpalte1 { - width: 50%; -} - -.boxSpalte2 { - width: 50%; - padding-left: 20px; -} - -.paddingLeft { - padding-left: 0.1em; -} - -.noPadding { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.rechnungsZeile -{ - display: table-row; -} - -.rechnungsZeile .boxdaten -{ - height: auto; -} - -.rechnungSp1 -{ - width: 65%; - font-size: 16px; -} - -.rechnungSp2 -{ - width: 10%; -} - -.rechnungSp3 -{ - width: 25%; - font-size: 16px; - text-align: right; -} - -.detailSp1, -.detailSp2 -{ - width: 50%; -} - -.detailSp2 -{ - text-align: right; -} - -.line1Bottom -{ - border-bottom: 1px solid #000; -} - -.line1BottomLight -{ - padding-bottom: 5px; - border-bottom: 1px solid #f0f0f0; - margin-bottom: 5px; -} - -.line2Bottom -{ - border-bottom: 2px solid #000; -} - -.paddingTop -{ - padding-top: 10px; -} - -.paddingBottom -{ - padding-bottom: 10px; -} - -.grund -{ - font-size: 16px; - display: block; - width: 100%; - padding: 0 20px 15px 20px; -} - -.grundDetail -{ - display: block; - width: 100%; - padding: 0 20px 15px 20px; -} - -/* Übersichtformatierungen */ -#uebersichtLastschrift.box, -#uebersichtUeberweisung.box -{ - border-top: none; -} - -#uebersichtUeberweisung.box -{ - border-left: none; -} - - -/* Formatierungen Detailseite */ - -.detailsSpalte1, -.detailsSpalte2 -{ - width: 30%; - float: left; - font-size: 90%; - line-height: 115%; - margin-right: 5%; -} - -.detailsSpalte3 -{ - width: 30%; - float: left; - font-size: 90%; - line-height: 115%; -} - -.detailsSpalte1 .legende, -.detailsSpalte2 .legende, -.detailsSpalte3 .legende -{ - width: 145px; -} - -.titelPosition -{ - font-size: 17px; - font-weight: bold; -} - - -/* Laufzettelformatierungen */ -#laufzettelHistorie .boxtabelle:not(:nth-child(2)) -{ - border-top: 1px solid rgba(4, 101, 161, 0.2); - padding-top: 10px; - margin-top: 10px; -} - - - - - -/* 1023px und kleiner ************************************************/ - -@media screen and (max-width : 1023px) { - - .box - { - display: block; - width: 100%; - margin-bottom: 20px; - } - - .boxabstandtop - { - margin-top: 15px; - } - - .subBox:first-child - { - margin-bottom: 0 !important; - } - - .subBox:last-child - { - border-left: 1px solid rgba(4, 101, 161, 0.2); - } - - .first > .boxzeile > .subBox - { - border-top: none !important; - } - - .first > .boxzeile > .subBox:first-child - { - border-top: 1px solid rgba(4, 101, 161, 0.2) !important; - } - - .first > .boxzeile - { - margin-bottom: 0; - } - - #uebersichtUeberweisung.box - { - border-left: 1px solid rgba(4, 101, 161, 0.2); - } - - #uebersichtLastschrift.box - { - margin-bottom: 0; - } - - .boxzeile - { - display: block; - margin-bottom: 5px; - } - - .boxzeile:after - { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; - } - - #details > .boxtabelle > .boxzeile - { - margin-bottom: 0px; - } - - .boxcell - { - display: block; - } - - .boxcell:last-child - { - margin-top: 20px; - } - - .boxZweispaltig - { - width: 100%; - } - - .legende - { - display: block; - float: left; - width: 170px; - padding: 5px 0; - height: auto; - } - - .wert - { - display: block; - float: left; - width: calc(100% - 170px); - padding: 11px 10px !important; - line-height: 1.3; - min-height: 38px; - height: auto; - } - - .boxdaten .legende - { - height: auto; - } - - .rechnungsZeile .boxdaten - { - padding: 5px 0; - } - - .boxabstand - { - display: none; - } - - .boxtabelleEinspaltig { - width: 100%; - } - - .boxSpalte1 { - display: block; - width: auto; - } - - .boxSpalte2 { - display: block; - width: auto; - padding-left: 0px; - margin-top: 1.2rem; - } - - .detailsSpalte1, - .detailsSpalte2, - .detailsSpalte3 - { - width: 100%; - float: none; - padding-right: 0px; - } - - .detailsSpalte2, - .detailsSpalte3 - { - margin-top: 15px; - } - - .detailsSpalte2, - .detailsSpalte3 - { - margin-top: 10px; - } - - .tableNumberAlignRight - { - display: block; - width: 130px; - text-align: right; - } -} - - - -/* 800px und kleiner ************************************************/ - -@media screen and (max-width : 800px) { - - button - { - padding-top: 10px; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 20px; - height: 40px; - } - - .btnAktiv:after - { - top: 40px; - } - - .rechnungSp1 - { - width: 55%; - font-size: 15px; - } - - .rechnungSp2 - { - width: 10%; - } - - .rechnungSp3 - { - width: 35%; - text-align: right; - font-size: 15px; - } - - .grund - { - font-size: 15px; - } -} - -/* 450px und kleiner ************************************************/ - -@media screen and (max-width : 450px) -{ - - html, - body - { - font-size: 12px; - } - - .menue - { - margin-bottom: 20px; - } - - button - { - padding-top: 5px; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 17px; - height: 35px; - } - - .btnAktiv:after - { - top: 35px; - } - - .legende - { - font-size: 12px; - width: 100%; - } - - .wert - { - font-size: 12px; - line-height: 1.3; - width: 100%; - margin-bottom: 10px - } - - .boxzeile - { - margin-bottom: 0px - } - - .boxdaten - { - height: auto; - } - - .haftungausschluss - { - margin-bottom: 20px; - } - - .boxinhalt - { - margin-top: 0px; - } - - .boxabstandtop - { - margin-top: 20px; - } - - .boxtitel - { - padding: 7px 8px; - } - - .box - { - margin-bottom: 10px; - padding: 0; - } - - .boxabstandtop - { - margin-top: 10px; - } - - .boxdaten, - .boxdatenBlock - { - padding: 2px 0; - } - - .rechnungSp1 - { - width: 50%; - font-size: inherit; - } - - .rechnungSp2 - { - width: 15%; - } - - .rechnungSp3 - { - width: 35%; - font-size: inherit; - text-align: right; - } - - .grund - { - font-size: inherit; - } - - .titelPosition - { - font-size: 15px; - } - - .abstandUnten - { - margin-bottom: 5px; - } - - .detailsSpalte1, - .detailsSpalte2, - .detailsSpalte3 - { - font-size: inherit; - line-height: inherit; - } -} - -/* 380px und kleiner ************************************************/ - -@media screen and (max-width : 380px) { - - html, - body - { - font-size: 11px; - line-height: 100%; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 15px; - } - - .boxdaten -.boxdatenBlock - { - padding: 2px 0; - } - - .boxinhalt - { - margin-top: 0px; - } - - .boxtitel - { - padding: 5px 7px; - } -} diff --git a/src/main/resources/xrechnung-viewer.js b/src/main/resources/xrechnung-viewer.js deleted file mode 100644 index 2d547b86..00000000 --- a/src/main/resources/xrechnung-viewer.js +++ /dev/null @@ -1,145 +0,0 @@ - -/* Tab-Container aufbauen **************************************************/ - -var a = new Array("uebersicht", "details", "zusaetze", "anlagen", "laufzettel"); -var b = new Array("menueUebersicht", "menueDetails", "menueZusaetze", "menueAnlagen", "menueLaufzettel"); - -function show(e) { - var i = 0; - var j = 1; - for (var t = 0; t < b.length; t++) { - if (b[t] === e.id) { - i = t; - if (i > 0) { - j = 0; - } else { - j = i + 1; - } - break; - } - } - e.setAttribute("class", "btnAktiv"); - for (var k = 0; k < b.length; k++) { - if (k === i && (document.getElementById(a[k]) != null)) { - document.getElementById(a[k]).style.display = "block"; - if (i === j) - j = i + 1; - } else { - if (document.getElementById(a[k]) != null) { - document.getElementById(a[j]).style.display = "none"; - document.getElementById(b[j]).setAttribute("class", "btnInaktiv"); - j += 1; - } - } - } -} -window.onload = function () { - document.getElementById(b[0]).setAttribute("class", "btnAktiv"); -} - -/* Eingebettete Binaerdaten runterladen ************************************/ - - -function base64_to_binary (data) { - var chars = atob(data); - var bytes = new Array(chars.length); - for (var i = 0; i < chars.length; i++) { - bytes[i] = chars.charCodeAt(i); - } - return new Uint8Array(bytes); -} - -function downloadData (element_id) { - var data_element = document.getElementById(element_id); - var mimetype = data_element.getAttribute('mimeType'); - var filename = data_element.getAttribute('filename'); - var text = data_element.innerHTML; - var binary = base64_to_binary(text); - var blob = new Blob([binary], { - type: mimetype, size: binary.length - }); - - if (window.navigator && window.navigator.msSaveOrOpenBlob) { - // IE - window.navigator.msSaveOrOpenBlob(blob, filename); - } else { - // Non-IE - var url = window.URL.createObjectURL(blob); - window.open(url); - } -} - - -/* Polyfill IE atob/btoa ************************************/ - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - factory(root); - }); - } else factory(root); - // node.js has always supported base64 conversions, while browsers that support - // web workers support base64 too, but you may never know. -})(typeof exports !== "undefined" ? exports: this, function (root) { - if (root.atob) { - // Some browsers' implementation of atob doesn't support whitespaces - // in the encoded string (notably, IE). This wraps the native atob - // in a function that strips the whitespaces. - // The original function can be retrieved in atob.original - try { - root.atob(" "); - } - catch (e) { - root.atob = (function (atob) { - var func = function (string) { - return atob(String(string).replace(/[\t\n\f\r ]+/g, "")); - }; - func.original = atob; - return func; - })(root.atob); - } - return; - } - - // base64 character set, plus padding character (=) - var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", - // Regular expression to check formal correctness of base64 encoded strings - b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; - - root.btoa = function (string) { - string = String(string); - var bitmap, a, b, c, - result = "", i = 0, - rest = string.length % 3; // To determine the final padding - - for (; i < string.length;) { - if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string.charCodeAt(i++)) > 255) - throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); - - bitmap = (a << 16) | (b << 8) | c; - result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); - } - - // If there's need of padding, replace the last 'A's with equal signs - return rest ? result.slice(0, rest - 3) + "===".substring(rest): result; - }; - - root.atob = function (string) { - // atob can work with strings with whitespaces, even inside the encoded part, - // but only \t, \n, \f, \r and ' ', which can be stripped. - string = String(string).replace(/[\t\n\f\r ]+/g, ""); - if (! b64re.test(string)) - throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); - - // Adding the padding if missing, for semplicity - string += "==".slice(2 - (string.length & 3)); - var bitmap, result = "", r1, r2, i = 0; - for (; i < string.length;) { - bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); - - result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255): r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255): String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); - } - return result; - }; -}); \ No newline at end of file diff --git a/xrechnung-viewer.css b/xrechnung-viewer.css deleted file mode 100644 index adea4c9b..00000000 --- a/xrechnung-viewer.css +++ /dev/null @@ -1,917 +0,0 @@ -/* Grundformatierung ********************************************/ - -*, -*:after, -*:before -{ - box-sizing: border-box; - -moz-box-sizing: border-box; -} - -.clear:after -{ - content: "."; - clear: both; - display: block; - visibility: hidden; - height: 0; -} - -html, -body -{ - height: 100%; - min-width: 320px; - margin: 0; - padding: 0; - color: #000; - font-size: 14px; -} - -body -{ - overflow-y: scroll; - background-color: rgba(4, 101, 161, 0.08); -} - -h4 -{ - color: inherit; - font-size: inherit; - margin-bottom: 0.5rem; -} - - -/* Grundaufbau *************************************************/ - -.menue -{ - position: relative; - z-index: 2000; - background-color: #000; - margin-bottom: 30px; -} - -.innen -{ - max-width: 1080px; - margin: 0 auto; - padding: 0 2%; -} - - - -/* Formatierungen *************************************************/ - -.color2 -{ - color: rgba(0, 0, 0, 0.6); -} - -.schwarz -{ - color: #555 !important; -} - -.normal -{ - font-weight: normal; -} - -.bold -{ - font-weight: bold; -} - -.abstandUnten -{ - margin-bottom: 5px; -} - -.abstandUntenKlein -{ - margin-bottom: 10px; -} - -.noPaddingTop -{ - padding-top: 0 !important; -} - -.ausrichtungRechts -{ - text-align: right; -} - - - - -/* Menü ********************************************************/ - -button -{ - position: relative; - font-family: serif; - padding-top: 15px; - padding-left: 0; - padding-right: 0; - margin-right: 2%; -} - -.btnAktiv -{ - font-size: 22px; - color: #ffb619; - height: 50px; - outline: none; - border: none; - background: none; -} - -.btnAktiv:after -{ - content: ""; - display: block; - position: absolute; - top: 50px; - left: 50%; - z-index: 10; - font-size: 0; - line-height: 0; - height: 0; - padding: 0; - margin: 0; - transform: translateX(-50%); - border: 15px solid #000; - border-right-color: transparent; - border-bottom-color: transparent; - border-left-color: transparent; -} - -.btnInaktiv, -.tab -{ - font-size: 22px; - color: #fff; - height: 50px; - z-index: 0; - outline: none; - border: none; - background: none; - transition: color 0.3s ease; -} - -.btnInaktiv:hover, -.tab:hover -{ - color: #ffb619; - cursor: pointer; -} - -.divHide -{ - display: none; -} - -/* Content *********************************************************************/ - -.inhalt -{ - font-family: sans-serif; - margin-bottom: 30px; -} - -.haftungausschluss -{ - color: #000; - text-align: center; - padding: 7px; - margin-bottom: 30px; - width: 100%; - border: 1px solid #ffb619; - background-color: #fff; -} - -.box -{ - position: relative; - display: table-cell; - padding: 0; - border: 1px solid rgba(4, 101, 161, 0.2); - background-color: #fff; -} - -.subBox -{ - border-top: none; - width: 50%; -} - -.subBox:last-child -{ - border-left: none; -} - -.first > .boxzeile > .subBox -{ - border-top: 1px solid rgba(4, 101, 161, 0.2) !important; -} - -.boxtitel -{ - display: inline-block; - background-color: #0465A1; - padding: 7px 10px; - color: #fff; - font-weight: bold; -} - -.boxBorderTop -{ - border-top: none; -} - -.boxBorderLeft -{ - border-left: none; -} - -.boxtitelSub -{ - color: #000; - background-color: rgba(4, 101, 161, 0.1); - border-right: 1px solid rgba(4, 101, 161, 0.2); - border-bottom: 1px solid rgba(4, 101, 161, 0.2); -} - -.boxinhalt -{ - padding: 15px 20px; -} - -.boxtabelle -{ - display: table; - width: 100%; -} - -.borderSpacing -{ - border-spacing: 0 5px; -} - -.boxabstandtop -{ - margin-top: 30px; -} - -.boxzeile -{ - display: table-row; -} - -.boxzeile .box:last-child -{ - margin-bottom: 0; -} - -.boxdaten -{ - display: table-cell; - padding: 5px 0; - vertical-align: middle; - height: 38px; - /* - -ms-word-break: break-all; - word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -*/ -} - -.boxdaten.wert -{ - padding: 5px 10px; -} - -.boxcell -{ - display: table-cell; -} - -.boxdatenBlock -{ - display: block; - padding: 3px 0; - /* - -ms-word-break: break-all; - word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -*/ -} - -.noBreak -{ - -ms-word-break: keep-all; - word-break: keep-all; - word-break: keep-all; - -webkit-hyphens: none; - -moz-hyphens: none; - hyphens: none; -} - -.boxabstand -{ - display: table-cell; - width: 30px; -} - -.legende -{ - color: rgba(0, 0, 0, 0.6); - width: 170px; - font-size: 13px; - line-height: 16px; - padding-right: 5px; -} - -.wert -{ - background-color: rgba(4, 101, 161, 0.03); -} - -.boxtabelleEinspaltig -{ - width: 49%; -} - -.boxtabelleZweispaltig, -.boxtabelleDreispaltig -{ - width: 100%; -} - -.box5050 -{ - width: 50%; -} - -.boxEinspaltig -{ - width: 100%; -} - -.boxZweispaltig -{ - width: 48.5%; -} - -.boxSpalte1 { - width: 50%; -} - -.boxSpalte2 { - width: 50%; - padding-left: 20px; -} - -.paddingLeft { - padding-left: 0.1em; -} - -.noPadding { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.rechnungsZeile -{ - display: table-row; -} - -.rechnungsZeile .boxdaten -{ - height: auto; -} - -.rechnungSp1 -{ - width: 65%; - font-size: 16px; -} - -.rechnungSp2 -{ - width: 10%; -} - -.rechnungSp3 -{ - width: 25%; - font-size: 16px; - text-align: right; -} - -.detailSp1, -.detailSp2 -{ - width: 50%; -} - -.detailSp2 -{ - text-align: right; -} - -.line1Bottom -{ - border-bottom: 1px solid #000; -} - -.line1BottomLight -{ - padding-bottom: 5px; - border-bottom: 1px solid #f0f0f0; - margin-bottom: 5px; -} - -.line2Bottom -{ - border-bottom: 2px solid #000; -} - -.paddingTop -{ - padding-top: 10px; -} - -.paddingBottom -{ - padding-bottom: 10px; -} - -.grund -{ - font-size: 16px; - display: block; - width: 100%; - padding: 0 20px 15px 20px; -} - -.grundDetail -{ - display: block; - width: 100%; - padding: 0 20px 15px 20px; -} - -/* Übersichtformatierungen */ -#uebersichtLastschrift.box, -#uebersichtUeberweisung.box -{ - border-top: none; -} - -#uebersichtUeberweisung.box -{ - border-left: none; -} - - -/* Formatierungen Detailseite */ - -.detailsSpalte1, -.detailsSpalte2 -{ - width: 30%; - float: left; - font-size: 90%; - line-height: 115%; - margin-right: 5%; -} - -.detailsSpalte3 -{ - width: 30%; - float: left; - font-size: 90%; - line-height: 115%; -} - -.detailsSpalte1 .legende, -.detailsSpalte2 .legende, -.detailsSpalte3 .legende -{ - width: 145px; -} - -.titelPosition -{ - font-size: 17px; - font-weight: bold; -} - - -/* Laufzettelformatierungen */ -#laufzettelHistorie .boxtabelle:not(:nth-child(2)) -{ - border-top: 1px solid rgba(4, 101, 161, 0.2); - padding-top: 10px; - margin-top: 10px; -} - - - - - -/* 1023px und kleiner ************************************************/ - -@media screen and (max-width : 1023px) { - - .box - { - display: block; - width: 100%; - margin-bottom: 20px; - } - - .boxabstandtop - { - margin-top: 15px; - } - - .subBox:first-child - { - margin-bottom: 0 !important; - } - - .subBox:last-child - { - border-left: 1px solid rgba(4, 101, 161, 0.2); - } - - .first > .boxzeile > .subBox - { - border-top: none !important; - } - - .first > .boxzeile > .subBox:first-child - { - border-top: 1px solid rgba(4, 101, 161, 0.2) !important; - } - - .first > .boxzeile - { - margin-bottom: 0; - } - - #uebersichtUeberweisung.box - { - border-left: 1px solid rgba(4, 101, 161, 0.2); - } - - #uebersichtLastschrift.box - { - margin-bottom: 0; - } - - .boxzeile - { - display: block; - margin-bottom: 5px; - } - - .boxzeile:after - { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; - } - - #details > .boxtabelle > .boxzeile - { - margin-bottom: 0px; - } - - .boxcell - { - display: block; - } - - .boxcell:last-child - { - margin-top: 20px; - } - - .boxZweispaltig - { - width: 100%; - } - - .legende - { - display: block; - float: left; - width: 170px; - padding: 5px 0; - height: auto; - } - - .wert - { - display: block; - float: left; - width: calc(100% - 170px); - padding: 11px 10px !important; - line-height: 1.3; - min-height: 38px; - height: auto; - } - - .boxdaten .legende - { - height: auto; - } - - .rechnungsZeile .boxdaten - { - padding: 5px 0; - } - - .boxabstand - { - display: none; - } - - .boxtabelleEinspaltig { - width: 100%; - } - - .boxSpalte1 { - display: block; - width: auto; - } - - .boxSpalte2 { - display: block; - width: auto; - padding-left: 0px; - margin-top: 1.2rem; - } - - .detailsSpalte1, - .detailsSpalte2, - .detailsSpalte3 - { - width: 100%; - float: none; - padding-right: 0px; - } - - .detailsSpalte2, - .detailsSpalte3 - { - margin-top: 15px; - } - - .detailsSpalte2, - .detailsSpalte3 - { - margin-top: 10px; - } - - .tableNumberAlignRight - { - display: block; - width: 130px; - text-align: right; - } -} - - - -/* 800px und kleiner ************************************************/ - -@media screen and (max-width : 800px) { - - button - { - padding-top: 10px; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 20px; - height: 40px; - } - - .btnAktiv:after - { - top: 40px; - } - - .rechnungSp1 - { - width: 55%; - font-size: 15px; - } - - .rechnungSp2 - { - width: 10%; - } - - .rechnungSp3 - { - width: 35%; - text-align: right; - font-size: 15px; - } - - .grund - { - font-size: 15px; - } -} - -/* 450px und kleiner ************************************************/ - -@media screen and (max-width : 450px) -{ - - html, - body - { - font-size: 12px; - } - - .menue - { - margin-bottom: 20px; - } - - button - { - padding-top: 5px; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 17px; - height: 35px; - } - - .btnAktiv:after - { - top: 35px; - } - - .legende - { - font-size: 12px; - width: 100%; - } - - .wert - { - font-size: 12px; - line-height: 1.3; - width: 100%; - margin-bottom: 10px - } - - .boxzeile - { - margin-bottom: 0px - } - - .boxdaten - { - height: auto; - } - - .haftungausschluss - { - margin-bottom: 20px; - } - - .boxinhalt - { - margin-top: 0px; - } - - .boxabstandtop - { - margin-top: 20px; - } - - .boxtitel - { - padding: 7px 8px; - } - - .box - { - margin-bottom: 10px; - padding: 0; - } - - .boxabstandtop - { - margin-top: 10px; - } - - .boxdaten, - .boxdatenBlock - { - padding: 2px 0; - } - - .rechnungSp1 - { - width: 50%; - font-size: inherit; - } - - .rechnungSp2 - { - width: 15%; - } - - .rechnungSp3 - { - width: 35%; - font-size: inherit; - text-align: right; - } - - .grund - { - font-size: inherit; - } - - .titelPosition - { - font-size: 15px; - } - - .abstandUnten - { - margin-bottom: 5px; - } - - .detailsSpalte1, - .detailsSpalte2, - .detailsSpalte3 - { - font-size: inherit; - line-height: inherit; - } -} - -/* 380px und kleiner ************************************************/ - -@media screen and (max-width : 380px) { - - html, - body - { - font-size: 11px; - line-height: 100%; - } - - .btnAktiv, - .btnInaktiv, - .tab - { - font-size: 15px; - } - - .boxdaten -.boxdatenBlock - { - padding: 2px 0; - } - - .boxinhalt - { - margin-top: 0px; - } - - .boxtitel - { - padding: 5px 7px; - } -} diff --git a/xrechnung-viewer.js b/xrechnung-viewer.js deleted file mode 100644 index 2d547b86..00000000 --- a/xrechnung-viewer.js +++ /dev/null @@ -1,145 +0,0 @@ - -/* Tab-Container aufbauen **************************************************/ - -var a = new Array("uebersicht", "details", "zusaetze", "anlagen", "laufzettel"); -var b = new Array("menueUebersicht", "menueDetails", "menueZusaetze", "menueAnlagen", "menueLaufzettel"); - -function show(e) { - var i = 0; - var j = 1; - for (var t = 0; t < b.length; t++) { - if (b[t] === e.id) { - i = t; - if (i > 0) { - j = 0; - } else { - j = i + 1; - } - break; - } - } - e.setAttribute("class", "btnAktiv"); - for (var k = 0; k < b.length; k++) { - if (k === i && (document.getElementById(a[k]) != null)) { - document.getElementById(a[k]).style.display = "block"; - if (i === j) - j = i + 1; - } else { - if (document.getElementById(a[k]) != null) { - document.getElementById(a[j]).style.display = "none"; - document.getElementById(b[j]).setAttribute("class", "btnInaktiv"); - j += 1; - } - } - } -} -window.onload = function () { - document.getElementById(b[0]).setAttribute("class", "btnAktiv"); -} - -/* Eingebettete Binaerdaten runterladen ************************************/ - - -function base64_to_binary (data) { - var chars = atob(data); - var bytes = new Array(chars.length); - for (var i = 0; i < chars.length; i++) { - bytes[i] = chars.charCodeAt(i); - } - return new Uint8Array(bytes); -} - -function downloadData (element_id) { - var data_element = document.getElementById(element_id); - var mimetype = data_element.getAttribute('mimeType'); - var filename = data_element.getAttribute('filename'); - var text = data_element.innerHTML; - var binary = base64_to_binary(text); - var blob = new Blob([binary], { - type: mimetype, size: binary.length - }); - - if (window.navigator && window.navigator.msSaveOrOpenBlob) { - // IE - window.navigator.msSaveOrOpenBlob(blob, filename); - } else { - // Non-IE - var url = window.URL.createObjectURL(blob); - window.open(url); - } -} - - -/* Polyfill IE atob/btoa ************************************/ - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - factory(root); - }); - } else factory(root); - // node.js has always supported base64 conversions, while browsers that support - // web workers support base64 too, but you may never know. -})(typeof exports !== "undefined" ? exports: this, function (root) { - if (root.atob) { - // Some browsers' implementation of atob doesn't support whitespaces - // in the encoded string (notably, IE). This wraps the native atob - // in a function that strips the whitespaces. - // The original function can be retrieved in atob.original - try { - root.atob(" "); - } - catch (e) { - root.atob = (function (atob) { - var func = function (string) { - return atob(String(string).replace(/[\t\n\f\r ]+/g, "")); - }; - func.original = atob; - return func; - })(root.atob); - } - return; - } - - // base64 character set, plus padding character (=) - var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", - // Regular expression to check formal correctness of base64 encoded strings - b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; - - root.btoa = function (string) { - string = String(string); - var bitmap, a, b, c, - result = "", i = 0, - rest = string.length % 3; // To determine the final padding - - for (; i < string.length;) { - if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string.charCodeAt(i++)) > 255) - throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); - - bitmap = (a << 16) | (b << 8) | c; - result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); - } - - // If there's need of padding, replace the last 'A's with equal signs - return rest ? result.slice(0, rest - 3) + "===".substring(rest): result; - }; - - root.atob = function (string) { - // atob can work with strings with whitespaces, even inside the encoded part, - // but only \t, \n, \f, \r and ' ', which can be stripped. - string = String(string).replace(/[\t\n\f\r ]+/g, ""); - if (! b64re.test(string)) - throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); - - // Adding the padding if missing, for semplicity - string += "==".slice(2 - (string.length & 3)); - var bitmap, result = "", r1, r2, i = 0; - for (; i < string.length;) { - bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); - - result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255): r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255): String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); - } - return result; - }; -}); \ No newline at end of file From 8f34fa90103a44310190cb86898a65292d55c5d5 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Wed, 31 Jul 2019 21:49:24 +0200 Subject: [PATCH 39/48] add getter for TotalPrepaidAmount to IZUGFeRDExportableTransaction interface --- .../ZUGFeRD/IZUGFeRDExportableTransaction.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 3be30215..9d3306aa 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -29,6 +29,7 @@ package org.mustangproject.ZUGFeRD; import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants; +import java.math.BigDecimal; import java.util.Date; public interface IZUGFeRDExportableTransaction { @@ -257,4 +258,12 @@ public interface IZUGFeRDExportableTransaction { * @return the IssueDateTime in format CCYY-MM-DDTHH:MM:SS */ default String getBuyerOrderReferencedDocumentIssueDateTime() { return null; } + + /** + * get the TotalPrepaidAmount located in SpecifiedTradeSettlementMonetarySummation (v1) or + * SpecifiedTradeSettlementHeaderMonetarySummation (v2) + * @return the total sum (incl. VAT) of prepayments, i.e. the difference between GrandTotalAmount + * and DuePayableAmount + */ + default BigDecimal getTotalPrepaidAmount() { return BigDecimal.ZERO; } } From e668a460fb9b64e4392755e888a22a4d3be85688 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Wed, 31 Jul 2019 21:54:00 +0200 Subject: [PATCH 40/48] add totalPrepaidAmount to monetarySummation and use value to calculate duePayableAmount --- .../ZUGFeRD/ZUGFeRDTransactionModelConverter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 6610f0f2..e8ca6841 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -659,9 +659,14 @@ class ZUGFeRDTransactionModelConverter { grandTotalAmount.setValue(currencyFormat(totals.getTotalGross())); monetarySummation.getGrandTotalAmount().add(grandTotalAmount); + AmountType totalPrepaidAmount = xmlFactory.createAmountType(); + totalPrepaidAmount.setCurrencyID(currency); + totalPrepaidAmount.setValue(currencyFormat(trans.getTotalPrepaidAmount())); + monetarySummation.getTotalPrepaidAmount().add(totalPrepaidAmount); + AmountType duePayableAmount = xmlFactory.createAmountType(); duePayableAmount.setCurrencyID(currency); - duePayableAmount.setValue(currencyFormat(totals.getTotalGross())); + duePayableAmount.setValue(currencyFormat(totals.getTotalGross().subtract(trans.getTotalPrepaidAmount()))); monetarySummation.getDuePayableAmount().add(duePayableAmount); return monetarySummation; From 70643a3ff7a303161a5b7d57094dc25a442951ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 1 Aug 2019 19:49:19 +0200 Subject: [PATCH 41/48] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4ca4bb50..8e7763ad 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3-SNAPSHOT + 1.7.4-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -113,7 +113,7 @@ com.sanityinc jargs - 2.0-SNAPSHOT + 2.0 From 91cb384d9ff6c8008031b9c0e4e96d7499534528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 1 Aug 2019 19:52:24 +0200 Subject: [PATCH 42/48] corrected for release --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8e7763ad..3fa41d78 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.4-SNAPSHOT + 1.7.3-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -13,7 +13,7 @@ scm:git:https://github.com/ZUGFeRD/mustangproject.git scm:git:https://github.com/ZUGFeRD/mustangproject.git https://github.com/ZUGFeRD/mustangproject - mustang-1.5.2 + mustang-1.7.3 From de5241769cadeb338de6af54f6749de5e96c75a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 1 Aug 2019 19:53:53 +0200 Subject: [PATCH 43/48] [maven-release-plugin] prepare release mustang-1.7.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3fa41d78..3b7f7798 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3-SNAPSHOT + 1.7.3 jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs @@ -113,7 +113,7 @@ com.sanityinc jargs - 2.0 + 2.0-SNAPSHOT From 60868a3914b7000f60caac7856d16adbe37f50d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 1 Aug 2019 19:56:43 +0200 Subject: [PATCH 44/48] updated history for 1.7.3 --- History.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/History.md b/History.md index f4b57df7..fdfa3e44 100644 --- a/History.md +++ b/History.md @@ -1,11 +1,15 @@ -todo -- migration: testIndicator entfernen -- in ram:ExchangedDocument: ram:name entfernen -done +1.7.3 +===== +2019-08-01 + +- #105 does not build in windows +- #99 BOMs confuse parser - updated javadoc - fixed #104 nullpointerex when specifying no parameter -- closed #23 -- #112 +- PR #112 complete profile options for v1 +- access to TotalPrepaidAmount in ZF v1 #118 +- have unit tests for nDigitFormat #23 + 1.7.2 ===== From 4fff136fa5010e6e0855b3ca2ed9e5fa6338c466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 1 Aug 2019 19:57:21 +0200 Subject: [PATCH 45/48] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3b7f7798..77463aa8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mustangproject.ZUGFeRD mustang - 1.7.3 + 1.7.4-SNAPSHOT jar Mustang The Mustang project is a java library to read and write ZUGFeRD meta data inside your invoice PDFs From 81635bb0952fc466b65e9a19ed3d6b328b0d2177 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Thu, 1 Aug 2019 20:16:54 +0200 Subject: [PATCH 46/48] use totalPrepaidAmount to calculate duePayableAmount (for v2) --- .../org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 7e12cdfe..58818aaa 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -145,6 +145,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { } + private BigDecimal getTotalPrepaid() { + return trans.getTotalPrepaidAmount(); + } + private BigDecimal getTotalGross() { BigDecimal res = getTotal(); @@ -477,8 +481,8 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { + " " + currencyFormat(getTotalGross()) + "\n" //$NON-NLS-1$ //$NON-NLS-2$ // // // currencyID=\"EUR\" - // + " 0.00\n" - + " " + currencyFormat(getTotalGross()) + "\n" //$NON-NLS-1$ //$NON-NLS-2$ + + " " + currencyFormat(getTotalPrepaid()) + "\n" + + " " + currencyFormat(getTotalGross().subtract(getTotalPrepaid())) + "\n" //$NON-NLS-1$ //$NON-NLS-2$ // // // currencyID=\"EUR\" + " \n" //$NON-NLS-1$ From c74e21ca87664f4110f4351c1cdc0608097dc075 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 5 Aug 2019 14:53:42 +0200 Subject: [PATCH 47/48] add missing ram: to closing tag --- .../java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 58818aaa..4b5f00d2 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -481,7 +481,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { + " " + currencyFormat(getTotalGross()) + "\n" //$NON-NLS-1$ //$NON-NLS-2$ // // // currencyID=\"EUR\" - + " " + currencyFormat(getTotalPrepaid()) + "\n" + + " " + currencyFormat(getTotalPrepaid()) + "\n" + " " + currencyFormat(getTotalGross().subtract(getTotalPrepaid())) + "\n" //$NON-NLS-1$ //$NON-NLS-2$ // // // currencyID=\"EUR\" From bbd22852d4708c6f8dedd10b4896ae4ece978031 Mon Sep 17 00:00:00 2001 From: Stefan Schmiedl Date: Mon, 5 Aug 2019 15:04:51 +0200 Subject: [PATCH 48/48] parse rawXML into document only once --- .../ZUGFeRD/ZUGFeRDImporter.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index a9f1c9c2..639230ed 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -68,6 +68,7 @@ public class ZUGFeRDImporter { */ private byte[] rawXML = null; private String xmpString = null; // XMP metadata + private Document document; public ZUGFeRDImporter(String pdfFilename) { @@ -146,8 +147,7 @@ public class ZUGFeRDImporter { // ByteArrayOutputStream(); // FileOutputStream fos = new FileOutputStream(file); - rawXML = embeddedFile.toByteArray(); - setMeta(new String(rawXML)); + setRawXML(embeddedFile.toByteArray()); // fos.write(embeddedFile.getByteArray()); // fos.close(); @@ -176,15 +176,25 @@ public class ZUGFeRDImporter { System.err.println(output); } - private Document getDocument() throws ParserConfigurationException, IOException, SAXException, TransformerException { + private Document getDocument() { return document; } + + public void setRawXML(byte[] rawXML) throws IOException { + this.rawXML = rawXML; + try { + setDocument(); + } catch (ParserConfigurationException | SAXException e) { + Logger.getLogger(ZUGFeRDImporter.class.getName()).log(Level.SEVERE, null, e); + throw new ZUGFeRDExportException(e); + } + } + + private void setDocument() throws ParserConfigurationException, IOException, SAXException { DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); xmlFact.setNamespaceAware(false); DocumentBuilder builder = xmlFact.newDocumentBuilder(); ByteArrayInputStream is = new ByteArrayInputStream(rawXML); is.skip(guessBOMSize(is)); - Document doc = builder.parse(is); - //prettyPrint(doc); - return doc; + document = builder.parse(is); } /** @@ -224,10 +234,7 @@ public class ZUGFeRDImporter { XPathFactory xpathFact = XPathFactory.newInstance(); XPath xpath = xpathFact.newXPath(); result = xpath.evaluate(xpathStr, document); - } catch (ParserConfigurationException e) { - Logger.getLogger(ZUGFeRDImporter.class.getName()).log(Level.SEVERE, null, e); - throw new ZUGFeRDExportException(e); - } catch (IOException | SAXException | TransformerException | XPathExpressionException e) { + } catch (XPathExpressionException e) { Logger.getLogger(ZUGFeRDImporter.class.getName()).log(Level.SEVERE, null, e); throw new ZUGFeRDExportException(e); } @@ -332,8 +339,8 @@ public class ZUGFeRDImporter { /** * @param meta raw XML to be set */ - public void setMeta(String meta) { - this.rawXML = meta.getBytes(); + public void setMeta(String meta) throws IOException { + setRawXML(meta.getBytes()); } /**