import assert from "node:assert/strict" import test from "node:test" import { PDFDocument } from "pdf-lib" import { detectElectronicInvoice } from "../src/modules/einvoice/detectElectronicInvoice" import { parseElectronicInvoice } from "../src/modules/einvoice/parseElectronicInvoice" import { mapElectronicInvoiceToIncomingInvoice } from "../src/modules/einvoice/mapElectronicInvoice" const ciiInvoice = Buffer.from(` urn:factur-x.eu:1p0:en16931 RE-2026-10038020260721 Wartung 2 S19100.00 Leitweg-1Beispiel GmbHDE123456789 EUR5820260820100.0019.00119.00119.00 `) const ublInvoice = Buffer.from(` urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0XR-422026-07-212026-08-20EUR UBL LieferantDE987654321VAT 30 7.00 100.00107.00107.00 11100.00MaterialS7 `) test("erkennt und liest eine eingebettete Factur-X-Rechnung", async () => { const document = await PDFDocument.create() document.addPage() await document.attach(ciiInvoice, "factur-x.xml", { mimeType: "application/xml", afRelationship: "Data" }) const detection = await detectElectronicInvoice(Buffer.from(await document.save()), { name: "rechnung.pdf" }) assert.equal(detection?.container, "pdf") assert.equal(detection?.syntax, "cii") const parsed = parseElectronicInvoice(detection!.xml, detection!.syntax) assert.equal(parsed.invoiceNumber, "RE-2026-100") assert.equal(parsed.seller.vatId, "DE123456789") assert.equal(parsed.items[0].grossAmount, 119) assert.deepEqual(parsed.validation.errors, []) }) test("liest eine eigenständige UBL-XRechnung und mappt sie nach FEDEO", async () => { const detection = await detectElectronicInvoice(ublInvoice, { name: "xrechnung.xml" }) assert.equal(detection?.syntax, "ubl-invoice") const parsed = parseElectronicInvoice(detection!.xml, detection!.syntax) const mapped = mapElectronicInvoiceToIncomingInvoice(parsed, 5, 12, "xml", "xrechnung.xml") assert.equal(mapped.reference, "XR-42") assert.equal(mapped.vendor, 12) assert.equal(mapped.paymentType, "Überweisung") assert.equal(mapped.state, "Vorbereitet") assert.equal(mapped.accounts[0].amountTax, 7) }) test("markiert Summenabweichungen als Prüfungsfehler", () => { const invalid = Buffer.from(ciiInvoice.toString("utf8").replace("100.00", "90.00")) const parsed = parseElectronicInvoice(invalid, "cii") assert.match(parsed.validation.errors.join(" "), /Positionssumme/) })