Skip to content

Order-to-Cash (Gesamtflow) ​

Transaktionen: SAL15 Angebote, SAL16 Aufträge, SAL17 Lieferscheine, SAL18 Rechnungen
Zentrale API: /api/salesHead (SalesHeadApiController)
Domänen: SalesHead, SalesItem, Customer, SendPacks

Business-Zweck ​

Der Order-to-Cash (O2C)-Prozess beschreibt den vollständigen Weg vom Kundeninteresse bis zur bezahlten Rechnung in reybex. Für Partner ist dieser Flow der Integrations-Leitfaden: Welche Stammdaten zuerst, welche Belegarten in welcher Reihenfolge, welche APIs pro Phase und welche Querschnittstellen zu BAS, INV, SMP, PUR, FIN und OMP relevant sind.

Diese Seite ist die Master-Dokumentation für SAL – Detailseiten zu einzelnen Belegarten verlinken vertiefende Inhalte.

Gesamtarchitektur – Belegkette mit Modulen ​

Status-Codes – Übersicht ​

Partner-Integrationen müssen mehrere parallele Statusfelder unterscheiden – auf Kopf- und Positionsebene.

SalesHead – Kopfstatus ​

FeldWerteBedeutungPartner-Relevanz
connectorStatus0 offen, 1 geschlossenConnector-/Shop-Polling abgeschlossenGET /connector liefert nur 0; nach Rückmeldung saveForConnector → 1
sendStatus0 offen, 2 versendetVersandfortschritt KopfMit isSend und SendPacks kombinieren
statusmandantenspezifisch, oft 2 = geschlossenBeleg-/PositionsabschlussFilter in getOpenOrders, showForConnector
blockedDeliveryBooleanLiefersperreBeleg erscheint in blockedSalesHeads bei Folgedokumenten
orderStatusOrderStatus-TypConnector-Workflow (in Bearbeitung / abgeschlossen)Wird bei saveForConnector gesetzt

SalesItem – Positionsstatus ​

FeldWerteBedeutung
deliveryStatus0 offen, 1 teilweise geliefert, 2 geschlossenLieferfortschritt je Position
invoiceStatus0 offen, 1 teilweise, 2 geschlossenFakturierungsfortschritt
deliveredQuantityDecimalBereits gelieferte Menge
invoicedQuantityDecimalBereits fakturierte Menge
openQuantityDecimalNoch offene Menge

Abfrage-Endpoints für Status ​

EndpointLiefert
GET /api/salesHead/status/{id}Bearbeitungsstatus inkl. Positionsdetails
GET /api/salesHead/isSend/{id}Versand abgeschlossen (sendStatus=2, isSend, aktive Packs)
GET /api/salesHead/getOpenOrdersOffene Aufträge für Fulfillment
GET /api/salesHead/connectorOffene Connector-Aufträge (connectorStatus=0)

Phase 1 – Stammdaten (Customer, Material, Preise) ​

Ohne konsistente Stammdaten scheitern Importe still oder mit BusinessExceptions.

1.1 Kunde (Debitor) ​

SchrittAktionAPI / Transaktion
1Kunde anlegen oder per Adress-Matching findenPOST /api/customer/ (SAL01)
2Liefer-/Rechnungsadressen pflegenPOST /api/customer/saveAddress
3Kontaktperson für BelegversandSAL04 / Contact Person API
4CRM-Interessent → KundeGET /api/customer/convertProspectToCustomer/{id}

Beispiel – Kunde minimal anlegen:

json
{
  "name": "Muster GmbH",
  "street": "Industriestraße 12",
  "zipcode": "80331",
  "city": "München",
  "country": { "id": 1 },
  "email": "einkauf@muster.de",
  "currency": { "id": 1 },
  "paymcond": { "id": 100001 },
  "salesPriceListHead": { "id": 200001 }
}

→ Details: Kunden & Kontakte, Customer API, CRM Modulübersicht

1.2 Artikel (Material) ​

VoraussetzungModulHinweis
Verkaufbares MaterialBAS02matCode, EAN, ME, USt
LagerführungBAS02 + INVwarehouse in Position für Reservierung
Varianten/AttributeBAS02variantCode, attributeCode in SalesItem

→ Artikelstamm BAS02, Artikel Import Wizard

1.3 Preise ​

Preisfindung erfolgt in dieser Priorität (vereinfacht):

  1. Kundensonderpreis (SAL06)
  2. Kunden-/Artikelgruppen-Zuschlag (SAL07)
  3. VK-Preisliste des Kunden bzw. Standardliste (SAL09)
  4. Material-VK-Preis (BAS02)

Preis vor Auftrag prüfen:

bash
curl -X POST "$BASE_URL/api/salesHead/getSalesPrice" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "customerId": 1000001,
    "materialId": 2000001,
    "quantity": 5,
    "docDate": "2026-09-10"
  }'

→ Preise & Konditionen


Phase 2 – Angebot (optional, SAL15) ​

Angebote sind optional im O2C, aber üblich bei B2B mit Freigabe vor Auftrag.

Angebot → Auftrag (UI/API):

json
POST /api/salesHead/createProposalFromSalesHead
{
  "salesHeads": [1234567890123456]
}

→ Angebote


Phase 3 – Auftrag anlegen (SAL16) ​

Varianten ​

VarianteEndpointEinsatz
Standard-APIPOST /api/salesHead/Einzelauftrag, volle Kontrolle
Connector-BulkPOST /api/salesHead/connector (Import) + PollingShop-Systeme
CSV/ImportPOST /api/salesHead/importFromCSVBatch aus Datei
Marktplatz OMPOMP-Job / Marktplace-KonfigurationAmazon, eBay etc.

Beispiel – Auftrag mit Positionen ​

json
{
  "docType": { "id": 300001 },
  "customer": { "id": 1000001 },
  "orderDate": "2026-09-10",
  "orderDescription": "Shop-Bestellung #SHOP-998877",
  "marktplaceOrderId": "SHOP-998877",
  "paymcond": { "id": 100001 },
  "currency": { "id": 1 },
  "items": [
    {
      "itemNumber": 1,
      "material": { "matCode": "ART-10001" },
      "quantity": 2,
      "price": 49.90,
      "vatKey": { "id": 1 },
      "warehouse": { "id": 500001 },
      "deliveryDate": "2026-09-15"
    },
    {
      "itemNumber": 2,
      "material": { "matCode": "ART-20002" },
      "quantity": 1,
      "price": 19.90,
      "vatKey": { "id": 1 }
    }
  ]
}

Response (Auszug):

json
{
  "id": 1234567890123456,
  "docNumber": "AU-2026-00456",
  "totalAmount": 119.70,
  "connectorStatus": 0,
  "items": [
    { "id": 9876543210, "itemNumber": 1, "deliveryStatus": 0, "openQuantity": 2 }
  ]
}

Idempotenz über marktplaceOrderId ​

Bei erneutem Import mit gleicher externer Order-ID soll kein Duplikat entstehen. Partner prüfen vor Anlage:

  • GET /api/salesHead/salesOrders mit Filter auf marktplaceOrderId
  • oder interne Duplicate-Logik im Connector-Flow

→ Aufträge, Shop-Import & Connector


Phase 4 – Reservierung & Bestand (INV) ​

Nach Auftragsspeicherung reserviert reybex Bestand auf StockList, sofern Material lagergeführt ist.

Bestand abfragen ​

bash
curl -G "$BASE_URL/api/salesHead/getStockData" \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "materialId=2000001" \
  --data-urlencode "warehouseId=500001"

Typische Response-Felder:

FeldBedeutung
availableQuantityVerfügbar (ATP)
reservedQuantityBereits reserviert
stockQuantityPhysischer Bestand

Positions-Validierung ​

json
POST /api/salesItem/validateAvailableStock
{
  "salesItemIds": [9876543210, 9876543211]
}

Bei Unterdeckung: Beschaffung über PUR (POST /api/salesItem/createPurchaseRequest) oder Teillieferung via splitSales.

→ INV Modulübersicht, Bestandsliste


Phase 5 – Kommissionierung, Packen, Versand (INV06 / SMP) ​

Versanddaten aktualisieren ​

json
POST /api/salesHead/updateShipping
{
  "salesHeadId": 1234567890123456,
  "shipping": { "id": 600001 },
  "carrier": { "id": 700001 }
}

Versand validieren vor Lieferschein ​

bash
curl -G "$BASE_URL/api/salesHead/validateShipment" \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "salesHeadId=1234567890123456"

→ Kommissionierung INV06, Aufträge – Versand


Phase 6 – Lieferschein (SAL17) ​

Lieferscheine dokumentieren die Warenentnahme und reduzieren offene Liefermengen.

Folgedokument Auftrag → Lieferschein ​

json
POST /api/salesHead/referencingDocuments
{
  "salesHeadIds": [1234567890123456],
  "docType1": { "id": 300002 },
  "isDocument1Created": true,
  "isDocument2Created": false,
  "closeRefDocAsManuel": false
}

docType1 muss isDelnote=true sein und in SalesHeadDocRule vom Auftrags-DocType erlaubt.

Teillieferung – nur bestimmte Positionen:

json
{
  "salesHeadIds": [1234567890123456],
  "docType1": { "id": 300002 },
  "isDocument1Created": true,
  "isDocument2Created": false,
  "salesItemsToCopy": [
    { "salesItemId": 9876543210, "quantity": 1 }
  ]
}

Nach Erzeugung: deliveryStatus der Quellpositionen steigt; bei Vollieferung → 2.

→ Lieferscheine, SalesHead – Folgedokumente


Phase 7 – Rechnung (SAL18) ​

Pfad A: Auftrag → Rechnung (direkt) ​

json
POST /api/salesHead/referencingDocuments
{
  "salesHeadIds": [1234567890123456],
  "docType1": { "id": 300003 },
  "isDocument1Created": true,
  "isDocument2Created": false
}

Pfad B: Auftrag → Lieferschein → Rechnung (Standard B2B) ​

Zweistufig – siehe Phase 6, dann:

json
POST /api/salesHead/referencingDocuments
{
  "salesHeadIds": [1111222233334444],
  "docType1": { "id": 300003 },
  "isDocument1Created": true,
  "isDocument2Created": false
}

(1111222233334444 = Lieferschein-ID)

Pfad C: Sammelrechnung aus Lieferscheinen ​

bash
curl -G "$BASE_URL/api/salesHead/createInvoicesFromDelNotes" \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "salesHeadIds=1111222233334444,1111222233334445"

Connector-Kombi (LS + RE + Tracking in einem Schritt) ​

json
POST /api/salesHead/connector
{
  "salesHeads": [
    {
      "id": 1234567890123456,
      "referencingDocuments": {
        "deliveryNoteDocTypeName": "Lieferschein Standard",
        "invoiceDocTypeName": "Rechnung Standard",
        "sendPackDocTypeName": "Lieferschein Standard",
        "trackingNumber": "00340434161234567890",
        "carrierName": "DHL Paket"
      }
    }
  ]
}

→ Rechnungen, Auftrag → Rechnung


Phase 8 – FiBu-Übergabe (SAL11 / FIN) ​

Nicht übergebene Rechnungen listen ​

bash
curl -G "$BASE_URL/api/salesHead/listAllNonTransferedInvoices" \
  -H "Authorization: Bearer $TOKEN"

Batch-Übergabe ​

json
POST /api/salesHead/transferInvoicesToFinance
{
  "salesHeadIds": [2222333344445555, 2222333344445556],
  "transferDate": "2026-09-10"
}

Response:

json
{
  "success": true,
  "transferred": [
    { "salesHeadId": 2222333344445555, "finHeadId": 8888999900001111, "docNumber": "RE-2026-00123" }
  ],
  "errors": []
}

→ Rechnungslauf & FiBu, FIN Modulübersicht


Phase 9 – E-Rechnung (SAL13) ​

bash
curl -G "$BASE_URL/api/salesHead/getXInvoiceXml/2222333344445555" \
  -H "Authorization: Bearer $TOKEN"

Liefert XRechnung-/ZUGFeRD-kompatibles XML für Übergabe an Peppol, E-Mail-Gateway oder Archiv.

→ E-Rechnung


Teillieferung – splitSales ​

Wenn nicht alle Positionen gleichzeitig versendet werden können:

json
POST /api/salesHead/splitSales
{
  "salesHeadId": 1234567890123456,
  "items": [
    { "salesItemId": 9876543210, "quantity": 1 },
    { "salesItemId": 9876543211, "quantity": 1 }
  ]
}

Ergebnis: neuer Auftrag mit ausgelagerten Positionen; Original behält Restmengen. Anschließend getrennt kommissionieren und Lieferscheine erzeugen.

→ Aufträge – Teillieferung


Fehlerquellen-Matrix ​

PhaseSymptomTypische UrsacheMaßnahme
1Kunde nicht gefundenFalsche customerNo / fehlender ImportSAL01 anlegen, Adress-Matching
1Preis = 0Keine Preisliste / kein MaterialpreisSAL09/SAL06 prüfen, getSalesPrice
3Duplikat-AuftragmarktplaceOrderId nicht geprüftVor POST suchen, Idempotenz-Key
3BusinessException MaterialmatCode unbekanntBAS02 Import
4Reservierung fehlgeschlagenKein Bestand / falsches LagerINV Bestand, getStockData
5validateShipment FehlerPick unvollständigINV06 Status prüfen
6blockedSalesHeadsblockedDelivery=trueSperre aufheben SAL16
6salesHeadDocRule.not.foundDocType-Kette nicht konfiguriertSalesHeadDocRule pflegen
7TeilfakturierunginvoiceStatus / offene MengensalesItemsToCopy nutzen
8FiBu-FehlerRechnung bereits übergebenlistAllNonTransferedInvoices
9E-Rechnung leerPflichtfelder Kunde/UStSAL13 Konfiguration, Kundenstamm

Partner-Szenarien (nummeriert) ​

Szenario 1 – Standard-Shop B2C (Connector) ​

  1. Kunde + Artikel + Preise synchronisieren (Phase 1)
  2. GET /api/salesHead/connector – offene Aufträge holen (connectorStatus=0)
  3. Fulfillment im WMS; Tracking erfassen
  4. POST /api/salesHead/connector mit referencingDocuments oder sendPacks
  5. Optional FiBu + E-Rechnung

→ Shop-Import & Connector

Szenario 2 – B2B mit Lieferscheinpflicht ​

  1. Auftrag per API (Phase 3)
  2. Kommissionierung INV06 (Phase 5)
  3. Lieferschein referencingDocuments (Phase 6)
  4. Rechnung aus Lieferschein (Phase 7B)
  5. FiBu-Übergabe (Phase 8)

Szenario 3 – Direktrechnung ohne LS ​

  1. Auftrag anlegen
  2. referencingDocuments mit Rechnungs-DocType (Phase 7A)
  3. FiBu + E-Rechnung

→ Auftrag → Rechnung

Szenario 4 – Marktplatz OMP vs. Connector ​

KanalMechanismusDoku
OMPMarktplace-Job, MarktplaceOrderTransferOMP-Modul
ConnectorREST Polling GET/POST /connectorShop-Import

Szenario 5 – Retoure im O2C ​

Retoure bricht den Forward-Flow; Rückfluss über SAL20.

→ Retouren, Return Head API


Voraussetzungen (Checkliste) ​

  • [ ] Mandant, OAuth/API-Token (Authentifizierung)
  • [ ] DocTypes + SalesHeadDocRule für Offer→Order→DelNote→Invoice
  • [ ] Nummernkreise je DocType
  • [ ] Kunden (SAL01), Material (BAS02), VK-Preise (SAL09)
  • [ ] Lager + Reservierungslogik (INV)
  • [ ] Versandarten / Carrier (SMP/BAS)
  • [ ] FiBu-Schnittstelle konfiguriert (FIN)
  • [ ] E-Rechnungs-Profil (SAL13)

Auswirkungen im ERP ​

PhaseDomänen-Impact
AuftragStockList-Reservierung, ggf. MRP (materialIdsForMrp)
LieferscheinBestandsabgang INV, deliveryStatus Positionen
RechnungForderung, invoiceStatus, Umsatz
FiBuFinHead, DATEV-Export
E-RechnungXML-Archiv, Versandstatus isInvoiceSend
RetoureGutschrift, Bestandszugang

Weiterlesen ​

ThemaLink
Modulübersicht + Integrations-PlaybookSAL Übersicht
Shop/Connector DetailShop-Import & Connector
Domänen & StatusKern-Domänen
API Gesamt—
Folgedokumente—
StammdatenBAS
LagerINV
Einkauf Drop-ShipPUR
FiBuFIN

Nur für reybex-Partner. Nicht für Endkunden bestimmt.