std.edi.invoice

Fakturierung per EDIFACT: Rechnungen, Gutschriften, Streitfälle und Kontoauszüge. EdiInvoicWrite berechnet Netto-, Steuer- und Bruttosummen aus den Positionen selbst — Summenwerte im Header werden ignoriert und überschrieben.

  • INVOIC (BGM 380=Rechnung, 381=Gutschrift, 383=Belastung, 386=Vorauszahlungsanforderung)
  • INVCON (BGM 44) — Dauerrechnung / Rahmenvertrag
  • COMDIS (BGM 34) — Handelsstreit mit Freitext-Begründung
  • COACSU (BGM 36) — Kontoauszug (Netto- und Bruttosaldo)

Steuertypen:

Konstante Code Satz
EDI_INVOIC_TAX_S S 19 % Standard
EDI_INVOIC_TAX_AA AA 7 % Ermäßigt
EDI_INVOIC_TAX_Z Z 0 % Nullsatz
EDI_INVOIC_TAX_E E 0 % Steuerfrei

import std.edi.invoice;

// Rechnung mit 2 Positionen
var hdr:   int64 := alloc(EDI_INVOIC_HDR_SIZE);
var lines: int64 := alloc(2 * EDI_INVOIC_LINE_SIZE);

poke64(hdr + EDI_INVOIC_HDR_NUM,      "RE-2026-1042" as int64);
poke64(hdr + EDI_INVOIC_HDR_NUMLEN,   12);
poke64(hdr + EDI_INVOIC_HDR_DATE,     "20261201" as int64);
poke64(hdr + EDI_INVOIC_HDR_BGMQUAL,  380);  // Rechnung

// Position 1: 10 × 19,99 € (19 % USt)
poke64(lines + EDI_INVOIC_LINE_GTIN,    "04012345678901" as int64);
poke64(lines + EDI_INVOIC_LINE_GTINLEN, 14);
poke64(lines + EDI_INVOIC_LINE_QTY,     10);
poke64(lines + EDI_INVOIC_LINE_PRICE,   1999);   // 19,99 €
poke64(lines + EDI_INVOIC_LINE_NETAMT,  19990);  // 10 × 19,99 €
poke64(lines + EDI_INVOIC_LINE_TAXTYPE, EDI_INVOIC_TAX_S);

var out: int64 := alloc(16384);
var n: int64 := EdiInvoicWrite(hdr, lines, 2, out, 16384);
// EdiInvoicWrite berechnet Netto/Steuer/Brutto aus den Zeilen neu

free(lines, 2 * EDI_INVOIC_LINE_SIZE);
free(hdr,   EDI_INVOIC_HDR_SIZE);
free(out,   16384);


Imports

  • std.edi.core
  • std.alloc

Structs

EdiInvoicHdr (EDI_INVOIC_HDR_SIZE = 112 Bytes)

Offset-Konstante Inhalt
EDI_INVOIC_HDR_NUM / EDI_INVOIC_HDR_NUMLEN Rechnungsnummer
EDI_INVOIC_HDR_DATE / EDI_INVOIC_HDR_DATELEN Rechnungsdatum
EDI_INVOIC_HDR_BGMQUAL BGM-Qualifier: 380=Rechnung, 381=Gutschrift, 383=Belastung, 386=Vorauszahlung
EDI_INVOIC_HDR_SUPPLIER / EDI_INVOIC_HDR_SUPLEN NAD+SU Lieferant (Zeiger/Länge)
EDI_INVOIC_HDR_BUYER / EDI_INVOIC_HDR_BUYLEN NAD+BY Käufer
EDI_INVOIC_HDR_CURRENCY / EDI_INVOIC_HDR_CURLEN Währungscode (z. B. „EUR“)
EDI_INVOIC_HDR_NETTOTAL Nettobetrag × 100 (MOA+77) — wird von Write neu berechnet
EDI_INVOIC_HDR_TAXTOTAL Steuerbetrag × 100 (MOA+176) — wird von Write neu berechnet
EDI_INVOIC_HDR_GROSSTOTAL Bruttobetrag × 100 (MOA+9) — wird von Write neu berechnet

EdiInvoicLine (EDI_INVOIC_LINE_SIZE = 56 Bytes)

Offset-Konstante Inhalt
EDI_INVOIC_LINE_GTIN / EDI_INVOIC_LINE_GTINLEN GTIN-Zeiger und -Länge
EDI_INVOIC_LINE_QTY Menge
EDI_INVOIC_LINE_PRICE Einzelpreis × 100
EDI_INVOIC_LINE_NETAMT Zeilenbetrag × 100 (Qty × Price)
EDI_INVOIC_LINE_TAXTYPE Steuertyp: EDI_INVOIC_TAX_*
EDI_INVOIC_LINE_LINENO Zeilennummer

EdiInvconHdr (EDI_INVCON_HDR_SIZE = 72 Bytes)

Offset-Konstante Inhalt
EDI_INVCON_HDR_CONTRACTNUM / EDI_INVCON_HDR_NUMLEN Vertragsnummer
EDI_INVCON_HDR_DATE / EDI_INVCON_HDR_DATELEN Vertrags-/Abrechnungsdatum
EDI_INVCON_HDR_INVOICEREF / EDI_INVCON_HDR_REFLEN Referenz auf Ausgangsrechnung
EDI_INVCON_HDR_AMOUNT / EDI_INVCON_HDR_CURRENCY Betrag × 100 + Währungszeiger

EdiComdisHdr (EDI_COMDIS_HDR_SIZE = 72 Bytes)

Offset-Konstante Inhalt
EDI_COMDIS_HDR_DISPUTEREF Streitfall-Referenz
EDI_COMDIS_HDR_INVOICEREF Bezogene Rechnungsnummer
EDI_COMDIS_HDR_AMOUNT Strittiger Betrag × 100
EDI_COMDIS_HDR_REASON / EDI_COMDIS_HDR_REASONLEN Freitext-Begründung

EdiCoacsuHdr (EDI_COACSU_HDR_SIZE = 64 Bytes)

Offset-Konstante Inhalt
EDI_COACSU_HDR_ACCOUNTREF Konto-Referenz
EDI_COACSU_HDR_NETBALANCE Nettosaldo × 100
EDI_COACSU_HDR_GROSSBALANCE Bruttosaldo × 100
EDI_COACSU_HDR_CURRENCY Währungszeiger

Funktionen

INVOIC

Signatur Beschreibung
EdiInvoicWrite(hdr: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64 Schreibt INVOIC. Netto/Steuer/Brutto werden aus den Positionen neu berechnet.
EdiInvoicRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64 Parst INVOIC; gibt Zeilenanzahl zurück.
EdiInvoicValidate(hdr: int64, lines: int64, lineCount: int64): int64 Prüft Berechnungsintegrität. Gibt 0=ok, 1=Nettofehler, 3=Bruttofehler. Toleranz 1 Cent.

INVCON

Signatur Beschreibung
EdiInvconWrite(hdr: int64, out: int64, outMax: int64): int64 Schreibt INVCON (Dauerrechnung)
EdiInvconRead(buf: int64, bufLen: int64, hdr: int64): int64 Parst INVCON; gibt 1=ok, 0=Fehler

COMDIS

Signatur Beschreibung
EdiComdisWrite(hdr: int64, out: int64, outMax: int64): int64 Schreibt COMDIS (Handelsstreit)
EdiComdisRead(buf: int64, bufLen: int64, hdr: int64): int64 Parst COMDIS

COACSU

Signatur Beschreibung
EdiCoacsuWrite(hdr: int64, out: int64, outMax: int64): int64 Schreibt COACSU (Kontoauszug)
EdiCoacsuRead(buf: int64, bufLen: int64, hdr: int64): int64 Parst COACSU

Codebeispiel — Eingehende Rechnung validieren

import std.edi.invoice;

var hdr:   int64 := alloc(EDI_INVOIC_HDR_SIZE);
var lines: int64 := alloc(200 * EDI_INVOIC_LINE_SIZE);

var count: int64 := EdiInvoicRead(inBuf, inBufLen, hdr, lines, 200);

var rc: int64 := EdiInvoicValidate(hdr, lines, count);
if (rc == 0) {
    PrintLn("Rechnung korrekt. Brutto: " +
        IntToStr(peek64(hdr + EDI_INVOIC_HDR_GROSSTOTAL) / 100) + " EUR");
} else {
    PrintLn("Berechnungsfehler: " + IntToStr(rc));
}

free(lines, 200 * EDI_INVOIC_LINE_SIZE);
free(hdr,   EDI_INVOIC_HDR_SIZE);


Hinweise

  • EdiInvoicWrite berechnet Summen selbst: Header-Felder NETTOTAL/TAXTOTAL/GROSSTOTAL werden vor dem Schreiben aus den Zeilen neu berechnet. Vorab gesetzte Werte werden ignoriert.
  • Steuertyp-Codes: Der Typ ist eine interne Konstante (EDI_INVOIC_TAX_S = 1). Intern wird daraus S (Standard), AA (Ermäßigt) etc. im EDIFACT-Format.
  • BGM 380 vs 381: Für Gutschriften BGM-Qualifier auf 381 setzen; alle anderen Felder identisch.

Quelldatei

Unit Datei
std.edi.invoice std/edi/invoice.lyx

Letzte Aktualisierung: 2026-06-16