====== std.edi.payment ====== Zahlungs- und Bankdaten per EDIFACT. Alle 13 Nachrichtentypen teilen dieselbe Header-Struktur (EDI_PAY_HDR). Spezifische Validierungen schützen vor häufigen Fehlern: fehlendes Rechnungsreferenz in REMADV (Warnung), fehlendes Mandat in DIRDEB (Fehler), fehlendes Transaktionskennzeichen in FINCAN (Fehler). Alle Beträge werden als ''int64 × 100'' gespeichert (Festkomma). IBAN-Validierung (MOD-97) und BIC-Format-Prüfung (8 oder 11 Zeichen) sind direkt in dieser Unit enthalten. | **REMADV** (481) | Zahlungsavis — Zuordnung von Zahlung zu Rechnungen | | **PAYMUL** (452) | Multizahlungsauftrag — Sammelmuster mehrerer Einzelzahlungen | | **PAYORD** (450) | Einzelzahlungsauftrag | | **PAYEXT** (455) | Erweiterter Zahlungsauftrag | | **DEBADV** (479) | Belastungsavis | | **CREEXT** (462) | Erweiterter Gutschriftauftrag | | **CREMUL** (454) | Sammelmuster Gutschriften | | **DEBMUL** (453) | Sammelmuster Belastungen | | **BANSTA** (391) | Kontoauszug | | **DIRDEB** (431) | Lastschrifteinzug (Mandat-Referenz Pflicht) | | **FINCAN** (456) | Finanz-Stornierung (Transaktionskennzeichen Pflicht) | | **DOCAPP** (760) | Akkreditiv-Eröffnungsantrag | | **DOCINF** (763) | Akkreditiv-Information | import std.edi.payment; // IBAN und BIC validieren var iban: pchar := "DE89370400440532013000"; var bic: pchar := "COBADEFFXXX"; if (EdiIbanCheck(iban as int64, 22) == 1) { PrintLn("IBAN ok"); } if (EdiBicCheck(bic as int64, 11) == 1) { PrintLn("BIC ok"); } // Einfachen PAYORD aufbauen var hdr: int64 := alloc(EDI_PAY_HDR_SIZE); poke64(hdr + EDI_PAY_HDR_REF, "PAY-2026-001" as int64); poke64(hdr + EDI_PAY_HDR_REFLEN, 12); poke64(hdr + EDI_PAY_HDR_DATE, "20261201" as int64); poke64(hdr + EDI_PAY_HDR_AMOUNT, 250000); // 2500,00 EUR poke64(hdr + EDI_PAY_HDR_CURRENCY, "EUR" as int64); poke64(hdr + EDI_PAY_HDR_CURLEN, 3); poke64(hdr + EDI_PAY_HDR_CREDIBAN, iban as int64); poke64(hdr + EDI_PAY_HDR_CREDILEN, 22); poke64(hdr + EDI_PAY_HDR_BIC, bic as int64); poke64(hdr + EDI_PAY_HDR_BICLEN, 11); var out: int64 := alloc(4096); var n: int64 := EdiPayordWrite(hdr, out, 4096); free(hdr, EDI_PAY_HDR_SIZE); free(out, 4096); ---- ===== Imports ===== * ''std.edi.core'' * ''std.alloc'' ---- ===== Structs ===== ==== EdiPayHdr (EDI_PAY_HDR_SIZE = 160 Bytes) ==== Gemeinsamer Header für alle 13 Nachrichtentypen. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_PAY_HDR_BGMQUAL'' | BGM-Qualifier (automatisch gesetzt durch Write-Funktionen) | | ''EDI_PAY_HDR_REF / EDI_PAY_HDR_REFLEN'' | Zahlungs-/Auftragsreferenz | | ''EDI_PAY_HDR_DATE / EDI_PAY_HDR_DATELEN'' | Buchungsdatum "YYYYMMDD" | | ''EDI_PAY_HDR_AMOUNT'' | Betrag × 100 (MOA+9) | | ''EDI_PAY_HDR_CURRENCY / EDI_PAY_HDR_CURLEN'' | Währungscode | | ''EDI_PAY_HDR_CREDIBAN / EDI_PAY_HDR_CREDILEN'' | IBAN Empfänger (FII+CR) | | ''EDI_PAY_HDR_DEBTIBAN / EDI_PAY_HDR_DEBTILEN'' | IBAN Auftraggeber (FII+DB) | | ''EDI_PAY_HDR_BIC / EDI_PAY_HDR_BICLEN'' | BIC Empfängerbank | | ''EDI_PAY_HDR_MANDATEREF / EDI_PAY_HDR_MANDATELEN'' | DIRDEB: Mandatsreferenz (RFF+MR) | | ''EDI_PAY_HDR_INVOICEREF / EDI_PAY_HDR_INVOICELEN'' | REMADV: Rechnungsreferenz (RFF+IV) | | ''EDI_PAY_HDR_TXNREF / EDI_PAY_HDR_TXNREFLEN'' | FINCAN: Transaktionskennzeichen (RFF+TN) | ==== EdiPaymulItem (EDI_PAYMUL_ITEM_SIZE = 56 Bytes) ==== Eine Einzelzahlung innerhalb eines PAYMUL/CREMUL/DEBMUL. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_PAYMUL_ITEM_AMOUNT'' | Betrag × 100 (MOA+203) | | ''EDI_PAYMUL_ITEM_REF / EDI_PAYMUL_ITEM_REFLEN'' | Referenz dieser Zahlung (RFF+CN) | | ''EDI_PAYMUL_ITEM_DEBTIBAN / EDI_PAYMUL_ITEM_DEBTILEN'' | IBAN Auftraggeber dieser Position | | ''EDI_PAYMUL_ITEM_CREDIBAN / EDI_PAYMUL_ITEM_CREDILEN'' | IBAN Empfänger dieser Position | ==== EdiDocappHdr (EDI_DOCAPP_HDR_SIZE = 88 Bytes) ==== Akkreditiv-Kopf (DOCAPP/DOCINF). ^ Offset-Konstante ^ Inhalt ^ | ''EDI_DOCAPP_HDR_CREDITNUM / EDI_DOCAPP_HDR_CREDITNUMLEN'' | Akkreditivnummer | | ''EDI_DOCAPP_HDR_BENEFICIARY / EDI_DOCAPP_HDR_BENEFLEN'' | Begünstigter (NAD+BF) | | ''EDI_DOCAPP_HDR_BANKBIC / EDI_DOCAPP_HDR_BANKBICLEN'' | BIC der akkreditivstellenden Bank | | ''EDI_DOCAPP_HDR_AMOUNT'' | Akkreditivbetrag × 100 | | ''EDI_DOCAPP_HDR_CURRENCY / EDI_DOCAPP_HDR_CURLEN'' | Währung | | ''EDI_DOCAPP_HDR_VALIDUNTIL / EDI_DOCAPP_HDR_VALIDUNTILLEN'' | Gültig bis "YYYYMMDD" (DTM+36) | ==== EdiDocappDoc (EDI_DOCAPP_DOC_SIZE = 24 Bytes) ==== Ein Akkreditiv-Dokument (z. B. Konnossement, Packzettel). ^ Offset-Konstante ^ Inhalt ^ | ''EDI_DOCAPP_DOC_CODE / EDI_DOCAPP_DOC_CODELEN'' | Dokumentencode | | ''EDI_DOCAPP_DOC_COPIES'' | Anzahl Kopien | ---- ===== Validierungsfunktionen ===== ^ Signatur ^ Beschreibung ^ | ''EdiIbanCheck(ptr: int64, len: int64): int64'' | IBAN MOD-97-Prüfung. Gibt 1=gültig, 0=ungültig. Erste 4 Zeichen werden ans Ende verschoben, Buchstaben in zweistellige Zahlen umgewandelt. | | ''EdiBicCheck(ptr: int64, len: int64): int64'' | BIC-Format: 8 oder 11 Zeichen; erste 4 = Bankcode (A-Z), Zeichen 5-6 = ISO-Ländercode (A-Z). Gibt 1=gültig, 0=ungültig. | | ''EdiRemadvCheck(hdr: int64): int64'' | Gibt 1 (Warnung) wenn keine Rechnungsreferenz (RFF+IV) vorhanden. | | ''EdiDirdebCheck(hdr: int64): int64'' | Gibt 2 (Fehler) wenn keine Mandatsreferenz (RFF+MR) vorhanden. | | ''EdiFincanCheck(hdr: int64): int64'' | Gibt 2 (Fehler) wenn kein Transaktionskennzeichen (RFF+TN) vorhanden. | | ''EdiPaymulValidate(hdr: int64, items: int64, itemCount: int64): int64'' | Prüft ob Summe der Einzelbeträge dem Gesamtbetrag im Header entspricht. Abweichung > 1 Cent → gibt 2. | ---- ===== Funktionen ===== ==== Einfache Zahlungsnachrichten ==== ^ Write-Funktion ^ Read-Funktion ^ Beschreibung ^ | ''EdiRemadvWrite(hdr, out, outMax)'' | ''EdiRemadvRead(buf, bufLen, hdr)'' | Zahlungsavis | | ''EdiPayordWrite(hdr, out, outMax)'' | ''EdiPayordRead(buf, bufLen, hdr)'' | Einzelzahlungsauftrag | | ''EdiPayextWrite(hdr, out, outMax)'' | ''EdiPayextRead(buf, bufLen, hdr)'' | Erweiterter Zahlungsauftrag | | ''EdiDebadvWrite(hdr, out, outMax)'' | ''EdiDebadvRead(buf, bufLen, hdr)'' | Belastungsavis | | ''EdiCreextWrite(hdr, out, outMax)'' | ''EdiCreextRead(buf, bufLen, hdr)'' | Erweiterter Gutschriftauftrag | | ''EdiBanstaWrite(hdr, out, outMax)'' | ''EdiBanstaRead(buf, bufLen, hdr)'' | Kontoauszug | | ''EdiDirdebWrite(hdr, out, outMax)'' | ''EdiDirdebRead(buf, bufLen, hdr)'' | Lastschrifteinzug | | ''EdiFincanWrite(hdr, out, outMax)'' | ''EdiFincanRead(buf, bufLen, hdr)'' | Finanz-Stornierung | Alle einfachen Write-Funktionen setzen automatisch den BGM-Qualifier und schreiben die spezifischen Pflicht-Referenzen (REMADV: RFF+IV, DIRDEB: RFF+MR, FINCAN: RFF+TN). ==== Sammel-Zahlungsnachrichten ==== ^ Write-Funktion ^ Read-Funktion ^ Beschreibung ^ | ''EdiPaymulWrite(hdr, items, itemCount, out, outMax)'' | ''EdiPaymulRead(buf, bufLen, hdr, items, maxItems)'' | Sammelmuster Zahlungen | | ''EdiCremulWrite(hdr, items, itemCount, out, outMax)'' | ''EdiCremulRead(buf, bufLen, hdr, items, maxItems)'' | Sammelmuster Gutschriften | | ''EdiDebmulWrite(hdr, items, itemCount, out, outMax)'' | ''EdiDebmulRead(buf, bufLen, hdr, items, maxItems)'' | Sammelmuster Belastungen | ==== Akkreditiv ==== ^ Signatur ^ Beschreibung ^ | ''EdiDocappWrite(hdr: int64, docs: int64, docCount: int64, out: int64, outMax: int64): int64'' | Schreibt DOCAPP | | ''EdiDocappRead(buf: int64, bufLen: int64, hdr: int64, docs: int64, maxDocs: int64): int64'' | Parst DOCAPP; gibt Dokumentenanzahl zurück | | ''EdiDocinfrWrite(hdr: int64, docs: int64, docCount: int64, out: int64, outMax: int64): int64'' | Schreibt DOCINF | | ''EdiDocinfrRead(buf: int64, bufLen: int64, hdr: int64, docs: int64, maxDocs: int64): int64'' | Parst DOCINF | ---- ===== Codebeispiel — REMADV mit Rechnungsreferenz ===== import std.edi.payment; var hdr: int64 := alloc(EDI_PAY_HDR_SIZE); poke64(hdr + EDI_PAY_HDR_REF, "REMADV-001" as int64); poke64(hdr + EDI_PAY_HDR_REFLEN, 10); poke64(hdr + EDI_PAY_HDR_DATE, "20261201" as int64); poke64(hdr + EDI_PAY_HDR_AMOUNT, 119000); // 1190,00 EUR poke64(hdr + EDI_PAY_HDR_INVOICEREF, "RE-2026-042" as int64); poke64(hdr + EDI_PAY_HDR_INVOICELEN, 11); // Validierung vor dem Senden var rc: int64 := EdiRemadvCheck(hdr); if (rc == 1) { PrintLn("Warnung: keine Rechnungsreferenz"); } var out: int64 := alloc(4096); var n: int64 := EdiRemadvWrite(hdr, out, 4096); free(hdr, EDI_PAY_HDR_SIZE); free(out, 4096); ---- ===== Hinweise ===== * **IBAN im FII-Segment**: Der Wire-Format ist ''IBAN:BIC:25'' — die Zahl 25 ist der EDIFACT-Code für IBAN. * **BGM-Qualifier automatisch**: Alle Write-Funktionen überschreiben ''EDI_PAY_HDR_BGMQUAL'' mit dem richtigen Wert — nicht manuell setzen. * **PAYMUL Gesamtbetrag**: ''EdiPaymulWrite'' schreibt den Wert aus ''EDI_PAY_HDR_AMOUNT'' als MOA+9. ''EdiPaymulValidate'' vergleicht diesen Wert mit der Summe der Item-Beträge. ---- ===== Quelldatei ===== ^ Unit ^ Datei ^ | ''std.edi.payment'' | ''std/edi/payment.lyx'' | Letzte Aktualisierung: 2026-06-16