====== std.edi.customs ======
Zoll-Nachrichten per EDIFACT für den grenzüberschreitenden Warenverkehr. Alle vier Nachrichtentypen teilen denselben Header (EDI_CUS_HDR) mit Absender, Empfänger, Herkunfts-/Zielort, Zollbehörde-Referenz und Zollwert.
* **CUSCAR** (BGM 85) — Customs Cargo Report: Carrier meldet Ladung bei Zollbehörde
* **CUSDEC** (BGM 960) — Customs Declaration: Anmeldung durch Zollanmelder
* **CUSEXP** (BGM 962) — Customs Express: Express-Sendungsmanifest (Kurier)
* **CUSRSP** (BGM 961) — Customs Response: Antwort der Zollbehörde
CUSRSP-Statuscodes:
^ Konstante ^ Wert ^ Bedeutung ^
| ''EDI_CUSRSP_ACCEPTED'' | 1 | Anmeldung akzeptiert |
| ''EDI_CUSRSP_REJECTED'' | 2 | Anmeldung abgelehnt |
| ''EDI_CUSRSP_QUERIED'' | 3 | Rückfrage / weitere Informationen benötigt |
| ''EDI_CUSRSP_RELEASED'' | 4 | Waren freigegeben |
import std.edi.customs;
// Zollanmeldung (CUSDEC)
var hdr: int64 := alloc(EDI_CUS_HDR_SIZE);
var items: int64 := alloc(10 * EDI_CUS_ITEM_SIZE);
poke64(hdr + EDI_CUS_HDR_BGMQUAL, EDI_CUS_BGM_CUSDEC);
poke64(hdr + EDI_CUS_HDR_REF, "DECL-2026-001" as int64);
poke64(hdr + EDI_CUS_HDR_REFLEN, 13);
poke64(hdr + EDI_CUS_HDR_DATE, "20261201" as int64);
poke64(hdr + EDI_CUS_HDR_ORIGIN, "CN" as int64); // China
poke64(hdr + EDI_CUS_HDR_ORIGLEN, 2);
poke64(hdr + EDI_CUS_HDR_DEST, "DE" as int64); // Deutschland
poke64(hdr + EDI_CUS_HDR_DESTLEN, 2);
poke64(hdr + EDI_CUS_HDR_CUSTVALUE, 450000); // 4500,00 EUR Zollwert
poke64(hdr + EDI_CUS_HDR_CURRENCY, "EUR" as int64);
poke64(hdr + EDI_CUS_HDR_CURLEN, 3);
poke64(hdr + EDI_CUS_HDR_DECLREF, "ADE-2026-777" as int64);
poke64(hdr + EDI_CUS_HDR_DECLREFLEN,12);
// Position 1
poke64(items + EDI_CUS_ITEM_DESC, "Elektronikbauteile" as int64);
poke64(items + EDI_CUS_ITEM_DESCLEN, 18);
poke64(items + EDI_CUS_ITEM_QTY, 500);
poke64(items + EDI_CUS_ITEM_VALUE, 450000);
poke64(items + EDI_CUS_ITEM_HSCODE, "85423190" as int64);
poke64(items + EDI_CUS_ITEM_HSCODELEN,8);
var out: int64 := alloc(8192);
var n: int64 := EdiCusdecWrite(hdr, items, 1, out, 8192);
free(items, 10 * EDI_CUS_ITEM_SIZE);
free(hdr, EDI_CUS_HDR_SIZE);
free(out, 8192);
----
===== Imports =====
* ''std.edi.core''
* ''std.alloc''
----
===== Structs =====
==== EdiCusHdr (EDI_CUS_HDR_SIZE = 160 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_CUS_HDR_BGMQUAL'' | BGM-Qualifier (''EDI_CUS_BGM_*'') |
| ''EDI_CUS_HDR_REF / EDI_CUS_HDR_REFLEN'' | Referenz/Dokumentnummer |
| ''EDI_CUS_HDR_DATE / EDI_CUS_HDR_DATELEN'' | Datum |
| ''EDI_CUS_HDR_ORIGIN / EDI_CUS_HDR_ORIGLEN'' | Herkunftsland (LOC+87, z. B. "CN") |
| ''EDI_CUS_HDR_DEST / EDI_CUS_HDR_DESTLEN'' | Bestimmungsland (LOC+88, z. B. "DE") |
| ''EDI_CUS_HDR_DECLARANT / EDI_CUS_HDR_DECLLEN'' | Zollanmelder (NAD+DT) |
| ''EDI_CUS_HDR_CARRIER / EDI_CUS_HDR_CARRLEN'' | Beförderer (NAD+CA) |
| ''EDI_CUS_HDR_CUSTVALUE'' | Zollwert × 100 (MOA+126) |
| ''EDI_CUS_HDR_CURRENCY / EDI_CUS_HDR_CURLEN'' | Währungscode |
| ''EDI_CUS_HDR_DECLREF / EDI_CUS_HDR_DECLREFLEN'' | Zollanmeldungsnummer (RFF+ADE) |
| ''EDI_CUS_HDR_RSPCODE'' | CUSRSP-Statuscode (1–4) |
| ''EDI_CUS_HDR_PROCCODE'' | Zollverfahrenscode |
==== EdiCusItem (EDI_CUS_ITEM_SIZE = 48 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_CUS_ITEM_DESC / EDI_CUS_ITEM_DESCLEN'' | Warenbeschreibung (LIN) |
| ''EDI_CUS_ITEM_QTY'' | Menge |
| ''EDI_CUS_ITEM_VALUE'' | Positionswert × 100 (MOA+66) |
| ''EDI_CUS_ITEM_HSCODE / EDI_CUS_ITEM_HSCODELEN'' | HS-Zolltarifnummer (RFF+HS) |
----
===== Funktionen =====
^ Write-Funktion ^ Read-Funktion ^ Beschreibung ^
| ''EdiCuscarWrite(hdr, items, itemCount, out, outMax)'' | ''EdiCuscarRead(buf, bufLen, hdr, items, maxItems)'' | Cargo Report |
| ''EdiCusdecWrite(hdr, items, itemCount, out, outMax)'' | ''EdiCusdecRead(buf, bufLen, hdr, items, maxItems)'' | Zollanmeldung |
| ''EdiCusexpWrite(hdr, items, itemCount, out, outMax)'' | ''EdiCusexpRead(buf, bufLen, hdr, items, maxItems)'' | Express-Manifest |
| ''EdiCusrspWrite(hdr, out, outMax)'' | ''EdiCusrspRead(buf, bufLen, hdr)'' | Zollantwort (kein Item-Array) |
Alle Write-Funktionen setzen automatisch den BGM-Qualifier. Read-Funktionen geben die Anzahl der Items zurück (für CUSRSP: 1=ok, 0=Fehler).
----
===== Codebeispiel — Zollantwort auswerten =====
import std.edi.customs;
var hdr: int64 := alloc(EDI_CUS_HDR_SIZE);
EdiCusrspRead(inBuf, inBufLen, hdr);
var code: int64 := peek64(hdr + EDI_CUS_HDR_RSPCODE);
if (code == EDI_CUSRSP_RELEASED) {
PrintLn("Ware freigegeben.");
} else if (code == EDI_CUSRSP_REJECTED) {
PrintLn("Anmeldung abgelehnt.");
} else if (code == EDI_CUSRSP_QUERIED) {
PrintLn("Rückfrage der Zollbehörde.");
}
free(hdr, EDI_CUS_HDR_SIZE);
----
===== Hinweise =====
* **HS-Code (RFF+HS)**: Die 6- bis 10-stellige HS-Zolltarifnummer identifiziert die Warengruppe international. Korrekte HS-Codes sind Voraussetzung für den automatisierten Zollabschluss.
* **Zollwert (MOA+126)**: Muss in der Währung aus CUX angegeben werden. Festkomma × 100.
* **CUSRSP ohne Items**: ''EdiCusrspWrite/Read'' hat kein Item-Array — die Antwort bezieht sich immer auf die gesamte Anmeldung.
----
===== Quelldatei =====
^ Unit ^ Datei ^
| ''std.edi.customs'' | ''std/edi/customs.lyx'' |
Letzte Aktualisierung: 2026-06-16