Renamed methods in domain to the names of API
This commit is contained in:
parent
2d42e58d0f
commit
f37ee036f0
14
README.md
14
README.md
|
@ -9,11 +9,11 @@ Tools for working with eInvoicing according to EU standard EU 16931.
|
||||||
```kotlin
|
```kotlin
|
||||||
val reader = EInvoiceReader()
|
val reader = EInvoiceReader()
|
||||||
|
|
||||||
// read a ZUGFeRD or Factor-X PDF that contains eInvoice XML as attachment
|
// extract invoice data from a ZUGFeRD or Factor-X PDF that contains eInvoice XML as attachment
|
||||||
val invoiceFromPDF = reader.extractFromPdf(File("ZUGFeRD.pdf"))
|
val invoiceFromPDF = reader.extractFromPdf(File("ZUGFeRD.pdf"))
|
||||||
|
|
||||||
// read a eInvoice XML file like XRechnung:
|
// extract eInvoice data from a XML file like XRechnung:
|
||||||
val invoiceFromXml = reader.readFromXml(File("XRechnung.xml"))
|
val invoiceFromXml = reader.extractFromXml(File("XRechnung.xml"))
|
||||||
```
|
```
|
||||||
|
|
||||||
### Find all invoices of an IMAP email account
|
### Find all invoices of an IMAP email account
|
||||||
|
@ -51,10 +51,10 @@ fun create() {
|
||||||
val creator = EInvoiceCreator()
|
val creator = EInvoiceCreator()
|
||||||
|
|
||||||
// create a PDF that also contains the eInvoice as XML attachment
|
// create a PDF that also contains the eInvoice as XML attachment
|
||||||
creator.createZugferdPdf(invoice, pdfResultFile)
|
creator.createFacturXPdf(invoice, pdfResultFile)
|
||||||
|
|
||||||
// create only the XML file
|
// create only the XML file
|
||||||
val xml = creator.createZugferdXml(invoice)
|
val xml = creator.createFacturXXml(invoice)
|
||||||
|
|
||||||
// create a XRechnung
|
// create a XRechnung
|
||||||
val xRechnung = creator.createXRechnungXml(invoice)
|
val xRechnung = creator.createXRechnungXml(invoice)
|
||||||
|
@ -78,10 +78,10 @@ val output = File("Zugferd.pdf")
|
||||||
|
|
||||||
val creator = EInvoiceCreator()
|
val creator = EInvoiceCreator()
|
||||||
|
|
||||||
creator.combinePdfAndInvoiceXml(invoice, existingPdf, output)
|
creator.attachInvoiceXmlToPdf(invoice, existingPdf, output)
|
||||||
|
|
||||||
// or if you already have the invoice XML:
|
// or if you already have the invoice XML:
|
||||||
val invoiceXml: String = "..." // e.g. creator.createZugferdXml(invoice)
|
val invoiceXml: String = "..." // e.g. creator.createZugferdXml(invoice)
|
||||||
|
|
||||||
creator.combinePdfAndInvoiceXml(invoiceXml, existingPdf, output)
|
creator.attachInvoiceXmlToPdf(invoiceXml, existingPdf, output)
|
||||||
```
|
```
|
|
@ -23,12 +23,12 @@ class InvoicingService {
|
||||||
creator.createXRechnungXml(invoice)
|
creator.createXRechnungXml(invoice)
|
||||||
|
|
||||||
fun createFacturXXml(invoice: Invoice): String =
|
fun createFacturXXml(invoice: Invoice): String =
|
||||||
creator.createZugferdXml(invoice)
|
creator.createFacturXXml(invoice)
|
||||||
|
|
||||||
fun createFacturXPdf(invoice: Invoice): Path {
|
fun createFacturXPdf(invoice: Invoice): Path {
|
||||||
val resultFile = createTempPdfFile()
|
val resultFile = createTempPdfFile()
|
||||||
|
|
||||||
creator.createZugferdPdf(invoice, resultFile.toFile())
|
creator.createFacturXPdf(invoice, resultFile.toFile())
|
||||||
|
|
||||||
return resultFile
|
return resultFile
|
||||||
}
|
}
|
||||||
|
@ -36,14 +36,14 @@ class InvoicingService {
|
||||||
fun attachInvoiceXmlToPdf(invoice: Invoice, pdf: Path): Path {
|
fun attachInvoiceXmlToPdf(invoice: Invoice, pdf: Path): Path {
|
||||||
val resultFile = createTempPdfFile()
|
val resultFile = createTempPdfFile()
|
||||||
|
|
||||||
creator.combinePdfAndInvoiceXml(invoice, pdf.toFile(), resultFile.toFile())
|
creator.attachInvoiceXmlToPdf(invoice, pdf.toFile(), resultFile.toFile())
|
||||||
|
|
||||||
return resultFile
|
return resultFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun extractInvoiceData(invoiceFile: Path) = when (invoiceFile.extension.lowercase()) {
|
fun extractInvoiceData(invoiceFile: Path) = when (invoiceFile.extension.lowercase()) {
|
||||||
"xml" -> reader.readFromXml(invoiceFile.toFile())
|
"xml" -> reader.extractFromXml(invoiceFile.toFile())
|
||||||
"pdf" -> reader.extractFromPdf(invoiceFile.toFile())
|
"pdf" -> reader.extractFromPdf(invoiceFile.toFile())
|
||||||
else -> throw IllegalArgumentException("We can only extract eInvoice data from .xml and .pdf files")
|
else -> throw IllegalArgumentException("We can only extract eInvoice data from .xml and .pdf files")
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,15 +16,26 @@ class EInvoiceCreator(
|
||||||
return createXml(provider, invoice)
|
return createXml(provider, invoice)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createZugferdXml(invoice: Invoice): String {
|
|
||||||
|
/**
|
||||||
|
* Synonym for [createFacturXXml] (ZUGFeRD 2 is a synonym for Factur-X).
|
||||||
|
*/
|
||||||
|
fun createZugferdXml(invoice: Invoice) = createFacturXXml(invoice)
|
||||||
|
|
||||||
|
fun createFacturXXml(invoice: Invoice): String {
|
||||||
val exporter = ZUGFeRDExporterFromA3()
|
val exporter = ZUGFeRDExporterFromA3()
|
||||||
.setProfile("EN16931") // required for XML?
|
.setProfile("EN16931") // required for XML?
|
||||||
|
|
||||||
return createXml(exporter.provider, invoice)
|
return createXml(exporter.provider, invoice)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createZugferdPdf(invoice: Invoice, outputFile: File) {
|
/**
|
||||||
val xml = createZugferdXml(invoice)
|
* Synonym for [createFacturXPdf] (ZUGFeRD 2 is a synonym for Factur-X).
|
||||||
|
*/
|
||||||
|
fun createZugferdPdf(invoice: Invoice, outputFile: File) = createFacturXPdf(invoice, outputFile)
|
||||||
|
|
||||||
|
fun createFacturXPdf(invoice: Invoice, outputFile: File) {
|
||||||
|
val xml = createFacturXXml(invoice)
|
||||||
val xmlFile = File.createTempFile(outputFile.nameWithoutExtension, ".xml")
|
val xmlFile = File.createTempFile(outputFile.nameWithoutExtension, ".xml")
|
||||||
.also { it.writeText(xml) }
|
.also { it.writeText(xml) }
|
||||||
val pdfFile = File(xmlFile.parentFile, xmlFile.nameWithoutExtension + ".pdf")
|
val pdfFile = File(xmlFile.parentFile, xmlFile.nameWithoutExtension + ".pdf")
|
||||||
|
@ -32,16 +43,17 @@ class EInvoiceCreator(
|
||||||
val visualizer = ZUGFeRDVisualizer()
|
val visualizer = ZUGFeRDVisualizer()
|
||||||
visualizer.toPDF(xmlFile.absolutePath, pdfFile.absolutePath)
|
visualizer.toPDF(xmlFile.absolutePath, pdfFile.absolutePath)
|
||||||
|
|
||||||
combinePdfAndInvoiceXml(xml, pdfFile, outputFile)
|
attachInvoiceXmlToPdf(xml, pdfFile, outputFile)
|
||||||
|
|
||||||
xmlFile.delete()
|
xmlFile.delete()
|
||||||
pdfFile.delete()
|
pdfFile.delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun combinePdfAndInvoiceXml(invoice: Invoice, pdfFile: File, outputFile: File) =
|
|
||||||
combinePdfAndInvoiceXml(createZugferdXml(invoice), pdfFile, outputFile)
|
|
||||||
|
|
||||||
fun combinePdfAndInvoiceXml(invoiceXml: String, pdfFile: File, outputFile: File) {
|
fun attachInvoiceXmlToPdf(invoice: Invoice, pdfFile: File, outputFile: File) =
|
||||||
|
attachInvoiceXmlToPdf(createFacturXXml(invoice), pdfFile, outputFile)
|
||||||
|
|
||||||
|
fun attachInvoiceXmlToPdf(invoiceXml: String, pdfFile: File, outputFile: File) {
|
||||||
val exporter = ZUGFeRDExporterFromA3()
|
val exporter = ZUGFeRDExporterFromA3()
|
||||||
.setZUGFeRDVersion(2)
|
.setZUGFeRDVersion(2)
|
||||||
.setProfile("EN16931") // available values: MINIMUM, BASICWL, BASIC, CIUS, EN16931, EXTENDED, XRECHNUNG
|
.setProfile("EN16931") // available values: MINIMUM, BASICWL, BASIC, CIUS, EN16931, EXTENDED, XRECHNUNG
|
||||||
|
|
|
@ -37,7 +37,7 @@ class FilesystemInvoiceReader(
|
||||||
if (extension == "pdf") {
|
if (extension == "pdf") {
|
||||||
eInvoiceReader.extractFromPdf(file.inputStream())
|
eInvoiceReader.extractFromPdf(file.inputStream())
|
||||||
} else if (extension == "xml") {
|
} else if (extension == "xml") {
|
||||||
eInvoiceReader.readFromXml(file.inputStream())
|
eInvoiceReader.extractFromXml(file.inputStream())
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ class MailReader(
|
||||||
if (filename.endsWith(".pdf") || contentType.startsWith("application/pdf") || contentType.startsWith("application/octet-stream")) {
|
if (filename.endsWith(".pdf") || contentType.startsWith("application/pdf") || contentType.startsWith("application/octet-stream")) {
|
||||||
eInvoiceReader.extractFromPdf(part.inputStream)
|
eInvoiceReader.extractFromPdf(part.inputStream)
|
||||||
} else if (filename.endsWith(".xml") || contentType.startsWith("application/xml") || contentType.startsWith("text/xml")) {
|
} else if (filename.endsWith(".xml") || contentType.startsWith("application/xml") || contentType.startsWith("text/xml")) {
|
||||||
eInvoiceReader.readFromXml(part.inputStream)
|
eInvoiceReader.extractFromXml(part.inputStream)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,11 @@ class EInvoiceReader(
|
||||||
private val mapper: MustangMapper = MustangMapper()
|
private val mapper: MustangMapper = MustangMapper()
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun readFromXml(xmlFile: File) = readFromXml(xmlFile.inputStream())
|
fun extractFromXml(xmlFile: File) = extractFromXml(xmlFile.inputStream())
|
||||||
|
|
||||||
fun readFromXml(stream: InputStream) = readFromXml(stream.reader().readText())
|
fun extractFromXml(stream: InputStream) = extractFromXml(stream.reader().readText())
|
||||||
|
|
||||||
fun readFromXml(xml: String): Invoice {
|
fun extractFromXml(xml: String): Invoice {
|
||||||
val importer = ZUGFeRDInvoiceImporter() // XRechnungImporter only reads properties but not to a Invoice object
|
val importer = ZUGFeRDInvoiceImporter() // XRechnungImporter only reads properties but not to a Invoice object
|
||||||
importer.fromXML(xml)
|
importer.fromXML(xml)
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,11 @@ class Demonstration {
|
||||||
fun read() {
|
fun read() {
|
||||||
val reader = EInvoiceReader()
|
val reader = EInvoiceReader()
|
||||||
|
|
||||||
// read a ZUGFeRD or Factor-X PDF that contains eInvoice XML as attachment
|
// extract invoice data from a ZUGFeRD or Factor-X PDF that contains eInvoice XML as attachment
|
||||||
val invoiceFromPDF = reader.extractFromPdf(File("ZUGFeRD.pdf"))
|
val invoiceFromPDF = reader.extractFromPdf(File("ZUGFeRD.pdf"))
|
||||||
|
|
||||||
// read a eInvoice XML file like XRechnung:
|
// extract eInvoice data from a XML file like XRechnung:
|
||||||
val invoiceFromXml = reader.readFromXml(File("XRechnung.xml"))
|
val invoiceFromXml = reader.extractFromXml(File("XRechnung.xml"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fromMail() {
|
fun fromMail() {
|
||||||
|
@ -53,28 +53,28 @@ class Demonstration {
|
||||||
val creator = EInvoiceCreator()
|
val creator = EInvoiceCreator()
|
||||||
|
|
||||||
// create a PDF that also contains the eInvoice as XML attachment
|
// create a PDF that also contains the eInvoice as XML attachment
|
||||||
creator.createZugferdPdf(invoice, pdfResultFile)
|
creator.createFacturXPdf(invoice, pdfResultFile)
|
||||||
|
|
||||||
// create only the XML file
|
// create only the XML file
|
||||||
val xml = creator.createZugferdXml(invoice)
|
val xml = creator.createFacturXXml(invoice)
|
||||||
|
|
||||||
// create a XRechnung
|
// create a XRechnung
|
||||||
val xRechnung = creator.createXRechnungXml(invoice)
|
val xRechnung = creator.createXRechnungXml(invoice)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun combinePdfAndInvoiceXml() {
|
fun attachInvoiceXmlToPdf() {
|
||||||
val invoice: Invoice = createInvoice()
|
val invoice: Invoice = createInvoice()
|
||||||
val existingPdf = File("Invoice.pdf")
|
val existingPdf = File("Invoice.pdf")
|
||||||
val output = File("Zugferd.pdf")
|
val output = File("Zugferd.pdf")
|
||||||
|
|
||||||
val creator = EInvoiceCreator()
|
val creator = EInvoiceCreator()
|
||||||
|
|
||||||
creator.combinePdfAndInvoiceXml(invoice, existingPdf, output)
|
creator.attachInvoiceXmlToPdf(invoice, existingPdf, output)
|
||||||
|
|
||||||
// or if you already have the invoice XML:
|
// or if you already have the invoice XML:
|
||||||
val invoiceXml: String = "..." // e.g. creator.createZugferdXml(invoice)
|
val invoiceXml: String = "..." // e.g. creator.createZugferdXml(invoice)
|
||||||
|
|
||||||
creator.combinePdfAndInvoiceXml(invoiceXml, existingPdf, output)
|
creator.attachInvoiceXmlToPdf(invoiceXml, existingPdf, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,20 +21,20 @@ class EInvoiceCreatorTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun createZugferdXml() {
|
fun createFacturXXml() {
|
||||||
val invoice = createInvoice()
|
val invoice = createInvoice()
|
||||||
|
|
||||||
val result = underTest.createZugferdXml(invoice)
|
val result = underTest.createFacturXXml(invoice)
|
||||||
|
|
||||||
assertInvoiceXml(result)
|
assertInvoiceXml(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun createZugferdPdf() {
|
fun createFacturXPdf() {
|
||||||
val invoice = createInvoice()
|
val invoice = createInvoice()
|
||||||
val testFile = File.createTempFile("Zugferd", ".pdf")
|
val testFile = File.createTempFile("Zugferd", ".pdf")
|
||||||
|
|
||||||
underTest.createZugferdPdf(invoice, testFile)
|
underTest.createFacturXPdf(invoice, testFile)
|
||||||
|
|
||||||
val importer = ZUGFeRDInvoiceImporter(testFile.inputStream())
|
val importer = ZUGFeRDInvoiceImporter(testFile.inputStream())
|
||||||
val xml = String(importer.rawXML, Charsets.UTF_8)
|
val xml = String(importer.rawXML, Charsets.UTF_8)
|
||||||
|
|
|
@ -11,8 +11,8 @@ class EInvoiceReaderTest {
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun readFromXml() {
|
fun extractFromXml() {
|
||||||
val result = underTest.readFromXml(getTestFile("XRechnung.xml"))
|
val result = underTest.extractFromXml(getTestFile("XRechnung.xml"))
|
||||||
|
|
||||||
assertInvoice(result)
|
assertInvoice(result)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue