# EDIFACT

> **EDIFACT** – Eingang für klassische EDI-Nachrichten nach UN-Standard. Benötigtes Addon: `connector_edifact`.

## Überblick

EDIFACT (Electronic Data Interchange For Administration, Commerce and Transport) ist ein UN-Standard für den elektronischen Austausch von Geschäftsdokumenten. Im deutschsprachigen B2B-Handel ist EDIFACT besonders bei Großhändlern, Einkaufsgenossenschaften und im Einzelhandel verbreitet.

EDIFACT-Nachrichten sind weder XML noch JSON, sondern ein spezielles Textformat mit Trennzeichen:

```
UNA:+.? '
UNB+UNOC:3+AbsenderGLN:14+EmpfaengerGLN:14+240906:0846+Referenz++ORDERS'
UNH+1+ORDERS:D:01B:UN:EAN010'
BGM+220+Bestellnummer+9'
...
```

Orderport empfängt und parst EDIFACT-ORDERS-Nachrichten, normalisiert sie und transformiert sie in Ihr Zielformat (openTrans XML oder JSON).

## Kompatibilität

### Unterstützte Versionen

| Bereich | Version |
|---|---|
| Nachrichtentyp | **ORDERS** (Bestellung) |
| Subset | EANCOM ORDERS D:01B (getestet) – andere Subsets meist kompatibel |
| Content-Type | `application/edifact` oder `text/plain` |
| Zeichensatz | UNOC (Level 3) und UNOA |

### Bekannte Einschränkungen

- **Nur ORDERS.** Andere Nachrichtentypen (ORDRSP, DESADV, INVOIC) werden nicht unterstützt.
- **Keine ORDRSP zurück.** Orderport sendet keine Bestellbestätigungen ins sendende System. Ist eine ORDRSP vertraglich verlangt, muss sie aus Ihrem Zielsystem (ERP) stammen.
- **Adressdaten-Lücken.** Wenn die NAD-Segmente nur GLN enthalten (ohne Klartext-Adresse), müssen Straße/PLZ/Ort als **Static-Mapping** im Feldmapping hinterlegt werden.
- **Keine Signaturprüfung.** EDIFACT-Inhalte werden nicht kryptografisch validiert – Authentifizierung erfolgt ausschließlich über die Transport-Schicht (HTTP-Auth oder IP-Allowlist).
- **EDIFACT-Subsets** jenseits EANCOM D:01B sind in Einzelfällen zu prüfen; wir reagieren auf gemeldete Parsing-Probleme.

## Authentifizierung

EDIFACT selbst trägt keine Authentifizierung. In Orderport sichern Sie den Eingang über eine Credential vom Typ **Bearer Token** oder **Shared-Secret-Header** – je nachdem, was Ihr Partner liefern kann.

- Empfohlen: **Bearer Token** im `Authorization`-Header
- Alternativ: Custom-Header (z. B. `X-API-Key`) mit **Shared-Secret-Header**

Zusätzlich kann die **IP-Allowlist** auf Tenant-Ebene den Zugriff auf bekannte Absender-IPs beschränken.

## Einrichten in Orderport

### Pipeline anlegen

1. **Pipelines → Neue Pipeline**
2. Eingabeformat: **EDIFACT**, Ausgabeformat: **openTrans** oder **JSON**
3. Auto-Mapping wird generiert
4. Transport wählen: HTTP, REST API, E-Mail oder FTP

### Credential anlegen

Auf der Pipeline-Detailseite **Credentials → Hinzufügen**:

- Typ: **Bearer Token** oder **Shared-Secret-Header**
- Secret wird einmalig angezeigt und dem Partner mitgeteilt

### Festwerte im Mapping

Weil NAD-Segmente oft nur GLN enthalten, fehlen häufig Klartext-Adressen für den Käufer oder die Lieferadresse. Hinterlegen Sie die fehlenden Werte als **Static-Mapping**:

| Zielfeld | Mapping-Typ | Empfohlener Wert |
|---|---|---|
| Käufer-Name | Static | Ihr Firmenname |
| Käufer-Straße | Static | Ihre Firmenadresse |
| Käufer-PLZ | Static | Ihre PLZ |
| Käufer-Ort | Static | Ihr Ort |
| Käufer-Land | Static | DE |
| Währung | Static | EUR |
| Lieferadresse | Static | Ihre Lager-/Lieferadresse |

## Einrichten im Quellsystem

Der konkrete Versandweg hängt vom Partner ab:

- **HTTP POST** mit Content-Type `application/edifact` auf Ihre Webhook-URL
- **SFTP-Drop** durch einen EDI-Konverter (z. B. SEEBURGER, Lobster, ecosio) – Orderport akzeptiert derzeit nur HTTP-Inbound; der Konverter müsste den SFTP-Drop per Worker in einen HTTP-Request umsetzen
- **EANCOM-Gateways** (wie IBM Sterling, SEEBURGER Cloud Services) konfigurieren Sie so, dass die ORDERS-Nachricht an die Orderport-Webhook-URL zugestellt wird

## Technische Details

### Unterstützte Segmente

| Segment | Bedeutung | Beispiel |
|---|---|---|
| BGM | Bestellnummer und Dokumenttyp | `BGM+220+12345+9` |
| DTM | Bestell- und Lieferdatum | `DTM+137:20240817:102` |
| NAD | Käufer, Lieferant, Lieferadresse (GLN + optional Adresse) | `NAD+BY+4012345000009::9` |
| LIN | Positionsnummer und EAN/GTIN | `LIN+1++4003969945418:SRV` |
| PIA | Zusätzliche Artikelnummern (Lieferant/Käufer) | `PIA+1+ART001:SA` |
| IMD | Artikelbeschreibung | `IMD+A++:::Kopierpapier A4` |
| QTY | Bestellmenge und Mengeneinheit | `QTY+21:4:PA` |
| PRI | Einzelpreis (netto/brutto) | `PRI+AAA:12.50` |
| MOA | Beträge (Positions- und Gesamtbetrag) | `MOA+203:125.00:EUR` |

### Verfügbare Quellfelder (nach Parsing)

#### Bestellkopf

| Feld | Segment | Beschreibung |
|---|---|---|
| `order.number` | BGM | Bestellnummer |
| `order.date` | DTM+137 | Bestelldatum |
| `order.type` | BGM | Dokumenttyp (220 = Bestellung) |
| `order.total` | MOA+86 | Gesamtbetrag (wenn vorhanden) |
| `order.currency` | MOA | Währung (wenn vorhanden) |
| `delivery.date` | DTM+2 | Gewünschtes Lieferdatum |

#### Parteien

| Feld | Segment | Beschreibung |
|---|---|---|
| `buyer.gln` | NAD+BY | GLN des Käufers |
| `buyer.name` | NAD+BY | Name (wenn in NAD enthalten) |
| `buyer.street` | NAD+BY | Straße (wenn in NAD enthalten) |
| `supplier.gln` | NAD+SU | GLN des Lieferanten |
| `delivery_party.gln` | NAD+DP | GLN der Lieferadresse |

#### Positionen

| Feld | Segment | Beschreibung |
|---|---|---|
| `lines.*.ean` | LIN | EAN/GTIN |
| `lines.*.supplier_sku` | PIA+SA | Lieferanten-Artikelnummer |
| `lines.*.description` | IMD | Artikelbeschreibung |
| `lines.*.quantity` | QTY+21 | Bestellmenge |
| `lines.*.unit` | QTY+21 | Mengeneinheit (PA, ST, KGM, …) |
| `lines.*.price` | PRI+AAA | Nettopreis (wenn vorhanden) |
| `lines.*.amount` | MOA+203 | Positionsbetrag (wenn vorhanden) |

### Endpoint

Webhook-URL je Pipeline: `https://orderport.app/api/v1/webhook/{token}`.

## Fehlerbehebung

| Symptom | Ursache | Lösung |
|---|---|---|
| „Konnte Segment BGM nicht lesen" | Nachricht ist nicht UNOC-codiert oder Trennzeichen aus UNA unterscheiden sich | UNA-Header prüfen (muss am Anfang jeder Nachricht stehen) |
| Beträge stimmen nicht | PRI+AAA wird als netto interpretiert | Mit Ihrem Partner prüfen, ob `AAA` (netto) oder `AAB` (brutto) gesendet wird; ggf. Transform-Mapping `multiply` anwenden |
| Lieferadresse fehlt im Zielformat | NAD+DP enthält nur GLN | Static-Mapping für Lieferadresse hinterlegen |
| 406 Not Acceptable | Falscher Content-Type | `application/edifact` oder `text/plain` senden |

## Nächste Schritte

- [Feldmapping](/docs/feldmapping)
- [Zugangsdaten](/docs/credentials)
- [Limits & Kontingente](/docs/limits-und-kontingente)
