diff --git a/e-invoicing-domain/src/main/kotlin/net/codinux/invoicing/creation/EInvoiceCreator.kt b/e-invoicing-domain/src/main/kotlin/net/codinux/invoicing/creation/EInvoiceCreator.kt index 21b202c..4d9e117 100644 --- a/e-invoicing-domain/src/main/kotlin/net/codinux/invoicing/creation/EInvoiceCreator.kt +++ b/e-invoicing-domain/src/main/kotlin/net/codinux/invoicing/creation/EInvoiceCreator.kt @@ -1,10 +1,9 @@ package net.codinux.invoicing.creation +import net.codinux.invoicing.mapper.MustangMapper import net.codinux.invoicing.model.Invoice -import org.mustangproject.ZUGFeRD.IXMLProvider -import org.mustangproject.ZUGFeRD.Profiles -import org.mustangproject.ZUGFeRD.ZUGFeRD2PullProvider -import org.mustangproject.ZUGFeRD.ZUGFeRDExporterFromA3 +import org.mustangproject.ZUGFeRD.* +import java.io.File class EInvoiceCreator( private val mapper: MustangMapper = MustangMapper() @@ -17,14 +16,40 @@ class EInvoiceCreator( return createXml(provider, invoice) } - fun createZugferdXml(invoice: Invoice, zugferdVersion: Int = 2): String { + fun createZugferdXml(invoice: Invoice): String { val exporter = ZUGFeRDExporterFromA3() - .setZUGFeRDVersion(zugferdVersion) - .setProfile("EN16931") + .setProfile("EN16931") // required for XML? + + return createXml(exporter.provider, invoice) + } + + fun createZugferdPdf(invoice: Invoice, outputFile: File) { + val xml = createZugferdXml(invoice) + val xmlFile = File.createTempFile(outputFile.nameWithoutExtension, ".xml") + .also { it.writeText(xml) } + val pdfFile = File(xmlFile.parentFile, xmlFile.nameWithoutExtension + ".pdf") + + val visualizer = ZUGFeRDVisualizer() + visualizer.toPDF(xmlFile.absolutePath, pdfFile.absolutePath) + + combinePdfAndXml(pdfFile, xml, outputFile) + + xmlFile.delete() + pdfFile.delete() + } + + fun combinePdfAndXml(pdfFile: File, xml: String, outputFile: File) { + val exporter = ZUGFeRDExporterFromA3() + .setZUGFeRDVersion(2) + .setProfile("EN16931") // available values: MINIMUM, BASICWL, BASIC, CIUS, EN16931, EXTENDED, XRECHNUNG +// .disableFacturX() .setProducer("danki die geile Sau") .setCreator(System.getProperty("user.name")) - return createXml(exporter.provider, invoice) + exporter.load(pdfFile.inputStream()) + exporter.setXML(xml.toByteArray()) + + exporter.export(outputFile.outputStream()) } diff --git a/e-invoicing-domain/src/test/kotlin/net/codinux/invoicing/creation/EInvoiceCreatorTest.kt b/e-invoicing-domain/src/test/kotlin/net/codinux/invoicing/creation/EInvoiceCreatorTest.kt index 0c2d921..cfb250e 100644 --- a/e-invoicing-domain/src/test/kotlin/net/codinux/invoicing/creation/EInvoiceCreatorTest.kt +++ b/e-invoicing-domain/src/test/kotlin/net/codinux/invoicing/creation/EInvoiceCreatorTest.kt @@ -4,6 +4,8 @@ import assertk.assertThat import assertk.assertions.isNotEmpty import net.codinux.invoicing.test.DataGenerator import net.codinux.invoicing.test.XPathAsserter +import org.mustangproject.ZUGFeRD.ZUGFeRDInvoiceImporter +import java.io.File import java.math.BigDecimal import kotlin.test.Test @@ -30,6 +32,19 @@ class EInvoiceCreatorTest { assertInvoiceXml(result) } + @Test + fun createZugferdPdf() { + val testFile = File.createTempFile("Zugferd", ".pdf") + val invoice = createInvoice() + + underTest.createZugferdPdf(invoice, testFile) + + val importer = ZUGFeRDInvoiceImporter(testFile.inputStream()) + val xml = String(importer.rawXML, Charsets.UTF_8) + + assertInvoiceXml(xml) + } + private fun createInvoice() = DataGenerator.createInvoice()