# Belegausgang (cXML)

Mit dem Add-on **Belegausgang (cXML)** kehrt Orderport die gewohnte Richtung um:
Statt Bestellungen zu empfangen, holt Orderport Folgebelege — **Bestellbestätigungen,
Rechnungen und Gutschriften** — aus Ihrem System ab, wandelt sie in cXML und stellt
sie an Beschaffungsnetzwerke wie SAP Ariba oder Coupa zu.

| Belegtyp | Erzeugtes cXML-Dokument |
|---|---|
| Bestellbestätigung | `ConfirmationRequest` |
| Rechnung | `InvoiceDetailRequest` (purpose `standard`) |
| Teilrechnung | `InvoiceDetailRequest` — normale Rechnung mit Teilmengen gegen dieselbe Bestellung |
| Gutschrift | `InvoiceDetailRequest` (purpose `creditMemo`) |

## So funktioniert es

1. **Pipeline pro Belegtyp anlegen** — im Experten-Wizard wählen Sie in Schritt 1
   den Dokumenttyp (z.B. „Rechnung"). Als Eingangsformat steht **Generisches XML**
   zur Verfügung, als Ausgangsformat **cXML**.
2. **Abholung konfigurieren** — auf der Pipeline-Seite stellen Sie den Eingang auf
   **FTP/SFTP-Pull** um und geben Verzeichnis und Dateimuster an (z.B. `RE_*.xml`
   für Rechnungen). Pro Belegtyp empfiehlt sich ein eigenes Verzeichnis oder
   Dateimuster. Orderport prüft alle 5 Minuten auf neue Dateien.
3. **XML-Eingang beschreiben** — hinterlegen Sie ein **Beispieldokument** Ihres
   XML-Formats; daraus ermittelt Orderport die Quellfelder für das Mapping und die
   KI-Vorschläge. Zusätzlich konfigurieren Sie:
   - **Belegnummer-Pfad** (z.B. `Rechnung.Kopf.Nummer`) — für die Duplikat-Erkennung.
   - **Positions-Pfad** (z.B. `Rechnung.Positionen.Position`) — damit auch Belege
     mit nur einer Position korrekt gemappt werden.
4. **Mapping erstellen** — im Feldmapping ordnen Sie Ihre XML-Pfade den
   cXML-Zielfeldern zu. Pflichtfelder: Belegnummer (`Invoice.InvoiceID` bzw.
   `Confirmation.ConfirmID`), die referenzierte **Bestellnummer**
   (`Invoice.OrderID` / `Confirmation.OrderID`) und mindestens eine Position.
5. **cXML-Zustellung konfigurieren** — From-/To-Identity (z.B. Ihre Supplier-ANID
   und die Buyer-ANID), SharedSecret und den Deployment-Modus (`test` /
   `production`). Das SharedSecret wird verschlüsselt gespeichert.
6. **Transport anlegen** — HTTP POST an die Empfangs-URL des Netzwerks. Orderport
   prüft die cXML-Antwort des Empfängers: Ein innerer Status ≥ 300 gilt als
   fehlgeschlagene Zustellung und löst die normale Retry-Kette aus
   (1 min / 5 min / 30 min / 2 h / 24 h).

## Duplikat-Erkennung

Die Belegnummer aus dem konfigurierten Pfad dient als eindeutiger Schlüssel pro
Pipeline: Eine erneut abgelegte Datei mit derselben Rechnungsnummer wird nicht
noch einmal zugestellt. Teilrechnungen erhalten eigene Rechnungsnummern und sind
dadurch automatisch keine Duplikate.

## Die Belegarten im Detail

Jede Belegart läuft über eine **eigene Pipeline** mit eigenem Mapping. Die
Zielfelder unterscheiden sich je Belegart; fehlende Pflichtfelder führen zu
einer klaren Fehlermeldung (Status „fehlgeschlagen"), bevor irgendetwas
versendet wird.

### Auftragsbestätigung (ConfirmationRequest)

Bestätigt die Bestellung des Einkäufers — komplett, mit Abweichungen oder als
Ablehnung.

| Zielfeld | Bedeutung | Pflicht |
|---|---|---|
| `Confirmation.OrderID` | Bestellnummer des Einkäufers (Bezug) | **ja** |
| `Confirmation.ConfirmID` | Ihre Bestätigungsnummer | nein |
| `Confirmation.NoticeDate` | Bestätigungsdatum (Default: Verarbeitungszeit) | nein |
| `Confirmation.Type` | `accept`, `detail` oder `reject` (Default `detail`) | nein |
| `Confirmation.OrderDate` / `Confirmation.Comment` | Bestelldatum / Kommentar | nein |
| `Total.Amount` / `Total.Currency` | Gesamtbetrag | nein |
| `Items.LineNumber`, `Items.Quantity`, `Items.UnitOfMeasure`, `Items.DeliveryDate` | bestätigte Positionen mit Menge und Liefertermin | nein |

**Tipp:** Mit `Confirmation.Type = detail` und abweichenden Positionsmengen bzw.
`Items.DeliveryDate` bestätigen Sie Teillieferungen und geänderte Termine.

### Rechnung (InvoiceDetailRequest)

Die elektronische Rechnung gegen die Bestellung, mit Positionsdaten, Summen
und Umsatzsteuer.

| Zielfeld | Bedeutung | Pflicht |
|---|---|---|
| `Invoice.InvoiceID` | Ihre Rechnungsnummer (Dedup-Schlüssel) | **ja** |
| `Invoice.OrderID` | Bestellnummer des Einkäufers (Bezug) | **ja** |
| `Items.*` | mindestens **eine** Position (`LineNumber`, `Quantity`, `UnitOfMeasure`, `SupplierPartID`, `Description`, `UnitPrice`, `SubtotalAmount`) | **ja (≥ 1)** |
| `Invoice.InvoiceDate` | Rechnungsdatum (Default: Verarbeitungszeit) | nein |
| `Summary.Currency` | Währung (Default EUR) | nein |
| `Summary.SubtotalAmount` | Nettosumme (Default: Summe der Positionen) | nein |
| `Summary.TaxRate`, `Summary.TaxAmount`, `Summary.TaxDescription` | Umsatzsteuer — mit `TaxRate` entsteht ein vollständiges `TaxDetail` (category, percentageRate, TaxableAmount) | empfohlen |
| `Summary.GrossAmount`, `Summary.NetAmount`, `Summary.DueAmount` | Brutto-/Zahl-/Fälligkeitsbetrag (`DueAmount` fällt auf `GrossAmount` zurück) | empfohlen |

V1 deckt den **einfachen Umsatzsteuer-Fall** ab (ein Steuersatz, Steuer in der
Summary). Länderspezifische Sonderfälle wie Reverse Charge sind bewusst
ausgeklammert — sprechen Sie uns an.

### Teilrechnung

Teilrechnungen sind **normale Rechnungen** mit eigener Rechnungsnummer und
Teilmengen gegen dieselbe Bestellung — genau so sehen es cXML und die
Netzwerke vor, ein Sonderformat existiert nicht. Sie laufen über dieselbe
Rechnungs-Pipeline; dank eigener Belegnummer greift die Duplikat-Erkennung
korrekt. Beachten Sie, dass manche Einkäufer kumulierte Mengen gegen die
Bestellung prüfen.

### Gutschrift (InvoiceDetailRequest, purpose="creditMemo")

Gutschriften nutzen dieselben Zielfelder wie Rechnungen, plus:

| Zielfeld | Bedeutung | Pflicht |
|---|---|---|
| `Invoice.OriginalInvoiceID` | Nummer der Originalrechnung → wird als `InvoiceIDInfo` referenziert | empfohlen |

Standardmäßig erzeugt Orderport `purpose="creditMemo"` (Beleg-Ebene). Für
positionsbezogene Gutschriften stellen Sie in der cXML-Zustellungs-Konfiguration
der Pipeline auf `lineLevelCreditMemo` um. Ob Beträge positiv oder negativ
erwartet werden, ist Konvention des Empfängers — vorab klären.

## Hinweise

- Laden Sie Dateien auf dem SFTP-Server **atomar** hoch (temporärer Name, dann
  umbenennen), damit keine halb geschriebenen Dateien abgeholt werden.
- Nutzen Sie pro Belegart ein eigenes Dateimuster (z. B. `AB_*.xml`, `RE_*.xml`,
  `GS_*.xml`) oder eigene Verzeichnisse, damit jede Datei in der richtigen
  Pipeline landet.
