====== 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