Darstellung
Lager und Inventur – Vollständige API-Referenz
Fach-API für Lager, Bestand, manuelle Buchung, Umlagerung, Wareneingang und Inventur. Basis ist https://core-backend.reybex.com/api (Staging: https://io-staging-partner.reybex.com/api). Authentifizierung wie im API: --header "authorization: Basic $TOKEN".
Artikel unter Artikelstamm-Verwaltung, die Bestellung vor dem Wareneingang unter Einkauf-Verwaltung. Die Artikel-Lagerzeile (materialStock, Pickplatz, Meldebestand) bleibt im Artikelstamm, Abschnitt Bestand.
Der Bestand StockList entsteht durch Buchungen. Er wird gelesen, nicht als Beleg angelegt. Der schreibende Weg für Zugang und Abgang ohne Bestellung ist POST /api/stockHead/book.
1. Grundlagen
| Objekt | Rolle |
|---|---|
Warehouse | Lager, Suchschlüssel code, sonst name |
StockPlace | Lagerplatz, Suchschlüssel stockplaceCode oder name, immer mit Lager |
StockMoveType | Bewegungsart, Code moveTypeCode |
InvDocType | Inventurbelegart der Lagerbuchung |
StockHead / StockItem | Gebuchter Lagerbeleg und seine Positionen |
StockList | Aktueller Bestand je Artikel, Lager, Platz, Charge, Variante |
StockTakingHead | Inventur. Zählen ändert den Bestand erst mit postedStatus |
Die Zahlen in den Beispielen sind Beispiel-Ids eines Mandanten. 7001 ist Lager HAUPT, 8001 der Platz WE-01, 100100 der Artikel ART-1000, 100200 der Artikel LM-2000, 6001 die Einheit ST.
1.1 Zwei Datumsformate
| Aufruf | Format |
|---|---|
POST /api/stockHead/book | dd.MM.yyyy |
POST /api/stock/transfer, POST /api/stock/transferFifo | yyyy-MM-dd |
POST /api/incomingGoods/ | yyyy-MM-dd |
Inventur, Feld reloadStockDeadline | yyyy-MM-dd |
1.2 Antwort- und Fehlerformat
Lesen eines Inventurbelegs kapselt den Datensatz:
json
{
"data": { "id": 90001, "docNumber": "INV-10001" },
"meta": { "domain": "StockTakingHead", "total": 1 }
}| Situation | HTTP | Körper |
|---|---|---|
| Datensatz nicht gefunden | oft 404 | { "error": "…" } |
| Fachlicher Abbruch | Status der Ausnahme | { "error": "…" } |
POST /api/incomingGoods/bookVouchers – gesperrte Ressource | 500 | Text zur Sperre |
POST /api/incomingGoods/bookVouchers – Constraint oder zu große Daten | 400 | Text zum Datenbankfehler |
| Fehlende Anmeldung | 401 | — |
2. Lager und Lagerplatz
Lager und Lagerplatz sind Domänen. Anlegen und ändern: POST /api/domains/warehouse und POST /api/domains/stockPlace. Die Antwort ist { "id": … }.
2.1 Lager
json
{
"code": "HAUPT",
"name": "Hauptlager",
"isStockkeeping": true,
"isDefault": true,
"isStockplaceMust": true,
"isActiveForAvailabilityCheck": true,
"isPriceEvaluation": true
}| Feld | Bedeutung |
|---|---|
code, name | Suchschlüssel |
isStockkeeping | Lager führt Bestand |
isStockplaceMust | Jede Buchung braucht einen Lagerplatz |
isDefault | Standardlager |
isExternal | Fremdlager |
isConsignmentStock | Konsignation |
isVirtual | Virtuelles Lager |
isTransit | Transit |
isAvailabilityCheckDisabled | Verfügbarkeit ignoriert dieses Lager |
isNoMrp | Disposition ignoriert das Lager |
isNegativeStockAllowed steht am Platz | Negativbestand am Lagerplatz |
incomingGoodsStockPlace | Standardplatz des Wareneingangs, wenn der Aufruf keinen Platz sendet |
customer, vendor, stockOwner | Partner am Lager, Suchschlüssel customerNo |
Lesen: GET /api/domains/warehouse?code=eq(HAUPT)&take=1.
2.2 Lagerplatz
Der Platz hängt am Lager. stockplaceCode ist je Lager eindeutig.
json
{
"stockplaceCode": "WE-01",
"name": "Wareneingang 01",
"warehouse": { "code": "HAUPT" },
"isDefault": true,
"isStockkeeping": true,
"isPickplace": true,
"isNegativeStockAllowed": false,
"pickOrder": 10
}| Feld | Bedeutung |
|---|---|
stockplaceCode, name | Suchschlüssel, immer zusammen mit warehouse |
isDefault | Standardplatz. Die Inventur nimmt ihn, wenn kein Platz gesendet wird |
isPickplace | Kommissionierplatz |
isNegativeStockAllowed | Negativer Bestand erlaubt |
reservationCheckType | Prüfung der Reservierung |
ignorePickAvailability | Verfügbarkeit beim Kommissionieren ignorieren |
pickOrder | Wegreihenfolge |
Lesen: GET /api/domains/stockPlace?stockplaceCode=eq(WE-01)&take=20. Ein Platz über die Fach-API: GET /api/stockPlace/{id}. Die Platzliste der Buchungsmaske: GET /api/stockHead/stockList.
3. Bewegungsart und Belegart
GET /api/domains/stockMoveType?take=100 und GET /api/domains/invDocType?take=100.
StockMoveType.statPostway: 0 Wareneingang, 1 Warenausgang, 2 nicht anzeigen. statFactor 1 erhöht die Statistik, -1 verringert sie.
Ohne Bewegungsart setzt POST /api/stockHead/book bei positiver Menge 110 und bei negativer Menge 120. bookingSource purchase setzt 210. POST /api/incomingGoods/bookIncomingGoods setzt immer 210.
| Code | Verwendung |
|---|---|
110 | Manueller Zugang und POST /api/incomingGoods/bookVouchers |
120 | Manueller Abgang und DELETE /api/incomingGoods/cancelVouchers |
210 | Wareneingang zur Bestellung |
450 / 451 | Umlagerungspaar. Fehlt targetCode, wird aus 450 die Gegenart 451 |
InvDocType:
| Feld | Bedeutung |
|---|---|
isArrival | Zugang |
isDeparture | Abgang |
isManual | Manuelle Buchung |
isStockTaking | Inventur. Die Anlage sucht die erste Belegart mit diesem Schalter |
GET /api/stockHead/stockHeadManualBooking liefert Lager, Bewegungsarten und die Schalter isLicenseKeyUsed und isBatchnumUsed.
4. Bestand
StockList je Kombination aus Artikel, Lager, Platz, Sonderbestand, Charge, Variante, Attributcode und NVE.
| Feld | Bedeutung |
|---|---|
total | Gesamtbestand |
avail | Verfügbar |
reserved | Reserviert |
blocked | Gesperrt |
quality | Qualitätssperre |
batchnum, vendorBatchnum, expiryDate | Charge, Lieferantencharge, Mindesthaltbarkeit |
variantCode, attributeCode | Variante und Attribut |
licenseKey | Lizenzschlüssel |
nve | Versandeinheit |
specialstock | Sonderbestand |
unit | Mengeneinheit der Zeile |
4.1 Lesen
Kompakte Liste:
GET /api/stock/simpleList?materialId=100100&warehouseId=7001&stockplaceId=8001
Die Zeile enthält Artikel-Id und SKU, total, avail, Lager, Platz und Charge.
Bestandsliste ohne Werte: GET /api/stock/ und GET /api/stock/stockListWithoutValue. Mit exportingFormat=csv kommt die Datei inv03.csv. Mit exportingFormat=pdf ein Bericht inventoryList.
Bestand mit Vorlauf: GET /api/stock/currentStockAmounts. Export über isExport=1.
Bewertungsliste: GET /api/stock/listStock. Export über isExport=1, Datei inv05.csv.
Historie: GET /api/stock/stockHistory.
Summe: POST /api/stock/getSumOfStocks
json
{
"warehouseId": 7001,
"matCode": "ART-1000",
"stockPlaceId": 8001
}Response: { "totalSum": 50 }
materialId statt matCode ist ebenfalls möglich. Optional attributeCode.
Bestandszeile direkt: GET /api/stockList/{id}. Variantenzeilen: GET /api/stockList/variants. Archivsicht: GET /api/stockList/dataVault/stock.
Reservierungen: GET /api/stock/reservations. Neu aufbauen: POST /api/stock/regenerateStockReservationList, Antwort { "success": true }. Bestand aus den Reservierungen nachziehen: POST /api/stock/syncStockListFromReservations, dieselbe Antwort.
Lizenzschlüssel eines Artikels: GET /api/stock/licenseKeyStocksBySku?sku=ART-1000.
5. Manuelle Buchung
POST /api/stockHead/book bucht Zugang oder Abgang. Der Body ist flach. Jede Position ist eine Liste mit demselben Index, nicht ein Objekt unter items[].
Das Datum hat die Form dd.MM.yyyy.
5.1 Zugang
json
{
"bookingSource": "manual",
"stockHead.docDate": "13.10.2026",
"stockHead.postDate": "13.10.2026",
"stockHead.invDocType.id": 8802,
"stockHead.description": "Anfangsbestand Tasche",
"items.number": [10],
"items.matCode": ["ART-1000"],
"items.name": ["Tasche"],
"items.quantity": ["50"],
"items.total": ["50"],
"items.warehouse.id": ["7001"],
"items.unit.id": ["6001"],
"items.stockPlaceCode": ["WE-01"],
"items.stockMoveType.moveTypeCode": ["110"]
}8802 ist die Id einer manuellen Zugangs-Belegart (isArrival, isManual). 6001 ist die Einheit ST.
Response
json
{
"message": "…",
"stockHead": { "id": 220100 },
"isBatchnumMissing": false
}message enthält die vergebene Belegnummer. Ist die Charge pflichtig und fehlt sie, setzt der Aufruf isBatchnumMissing und bucht nicht. areMissingBatchnumsIgnored true überspringt diese Prüfung.
Fehlende Menge: message.no.stock.item.quantity.entered.error. Fehlende Einheit: message.no.stock.item.unit.selected.error.
5.2 Abgang
Negative Menge wird positiv gespeichert. Ohne Bewegungsart wird daraus 120.
json
{
"bookingSource": "manual",
"stockHead.docDate": "13.10.2026",
"stockHead.postDate": "13.10.2026",
"stockHead.invDocType.id": 8803,
"stockHead.description": "Schwund Tasche",
"items.number": [10],
"items.matCode": ["ART-1000"],
"items.name": ["Tasche"],
"items.quantity": ["-2"],
"items.total": ["-2"],
"items.warehouse.id": ["7001"],
"items.unit.id": ["6001"],
"items.stockPlaceCode": ["WE-01"],
"items.stockMoveType.moveTypeCode": ["120"]
}8803 ist die manuelle Abgangs-Belegart (isDeparture, isManual).
5.3 Charge
Am Artikel müssen isLotEnabled und bei MHD isShelfLife gesetzt sein.
json
{
"bookingSource": "manual",
"stockHead.docDate": "13.10.2026",
"stockHead.postDate": "13.10.2026",
"stockHead.invDocType.id": 8802,
"stockHead.description": "Zugang Charge",
"items.number": [10],
"items.matCode": ["LM-2000"],
"items.name": ["Haferdrink 1 l"],
"items.quantity": ["24"],
"items.total": ["24"],
"items.warehouse.id": ["7001"],
"items.unit.id": ["6001"],
"items.stockPlaceCode": ["WE-01"],
"items.batchnum": ["LOT-2026-10-A"],
"items.stockMoveType.moveTypeCode": ["110"]
}Vorhandene Chargen: GET /api/stockHead/batchnumStocks. Details: POST /api/stockHead/batchnumDetails. Verfügbare Chargen: POST /api/stockHead/availableBatchNumbers.
5.4 Variante
Jede Variante ist ein eigener Index. variantCode ist die Kennung aus dem Artikelstamm.
json
{
"bookingSource": "manual",
"stockHead.docDate": "13.10.2026",
"stockHead.invDocType.id": 8802,
"items.number": [10, 20],
"items.matCode": ["VAR-4000", "VAR-4000"],
"items.name": ["Shirt", "Shirt"],
"items.quantity": ["20", "15"],
"items.total": ["20", "15"],
"items.warehouse.id": ["7001", "7001"],
"items.unit.id": ["6001", "6001"],
"items.stockPlaceCode": ["WE-01", "WE-01"],
"items.variantCode": ["ROT-M", "BLAU-L"],
"items.stockMoveType.moveTypeCode": ["110", "110"]
}5.5 Beleg lesen, ändern, stornieren
GET /api/stockHead/220100 liest einen Beleg. Ohne Id ist es die Belegliste. Mehrere Belege der Zoom-Liste: GET /api/stockHead/listForZoom.
POST /api/stockHead/ ändert einen vorhandenen Beleg. Ohne id kommt die Meldung, dass die Ressource nicht gefunden wurde. Der Aufruf legt keinen Beleg an.
json
{
"id": 220100,
"description": "Anfangsbestand korrigiert"
}Response: die Id 220100.
Storno der Positionen: POST /api/stockHead/cancelStockHead
json
{ "stockItems": [230011] }Response: { "success": true }
Für die Rechnungsprüfung schließen: POST /api/stockHead/closeForVerification mit demselben Körper { "stockItems": [230011] }.
Lieferant der Belegliste: GET /api/stockHead/stockHeadListVendors.
Palette einem Partner zuordnen: POST /api/stockHead/palletCustomer
json
{ "nve": "00340123450000000018", "customerId": 30001 }30001 ist Kunde KD-1000. Antwort { "success": true }.
Schließtoleranz der zugehörigen Bestellung: POST /api/stockHead/checkIfClosingGapsAreUndercut mit { "stockHeadIds": [220100] }.
6. Umlagerung
POST /api/stock/transfer bucht Quelle und Ziel in einem Beleg. sourceCode und targetCode sind Bewegungsarten. Lager und Platz der Quelle werden per id und stockplaceCode gelesen, der Artikel per matCode. Das Datum ist yyyy-MM-dd.
6.1 Platzwechsel
json
{
"sourceCode": "450",
"targetCode": "451",
"docDate": "2026-10-13",
"description": "Von WE-01 nach KOMM-01",
"stockListItems": [
{
"quantity": 10,
"material": { "matCode": "ART-1000", "name": "Tasche" },
"unit": { "id": 6001 },
"sourceWarehouse": { "id": 7001 },
"sourceStockplace": { "stockplaceCode": "WE-01" },
"targetWarehouse": { "id": 7001 },
"targetStockplace": { "stockplaceCode": "KOMM-01" }
}
]
}Response: { "success": true }
Fehlt Charge oder MHD an einem chargen- oder MHD-pflichtigen Artikel, bleibt die Buchung bestehen und die Antwort enthält warnings mit message.stock.transfer.batch.missing oder message.stock.transfer.expiry.date.missing.
Dieselbe Charge auf demselben Platz und Lager setzt die Buchung auf intern (isInternTransfer).
6.2 Charge umlagern
json
{
"sourceCode": "450",
"targetCode": "451",
"docDate": "2026-10-13",
"description": "Charge auf Kommissionierung",
"stockListItems": [
{
"quantity": 12,
"material": { "matCode": "LM-2000", "name": "Haferdrink 1 l" },
"unit": { "id": 6001 },
"sourceWarehouse": { "id": 7001 },
"sourceStockplace": { "stockplaceCode": "WE-01" },
"targetWarehouse": { "id": 7001 },
"targetStockplace": { "stockplaceCode": "KOMM-01" },
"sourceBatchnum": "LOT-2026-10-A",
"targetBatchnum": "LOT-2026-10-A",
"sourceExpiryDate": "2027-04-30",
"targetExpiryDate": "2027-04-30"
}
]
}6.3 Fifo
POST /api/stock/transferFifo nimmt genau eine Zeile in stockListItems und verbraucht den Bestand von der ältesten Charge. Mehr als eine Zeile: only.select.one.stock.item. Keine Zeile: select.stock.item. Menge größer als der Bestand: quantity.is.bigger.than.total.stocks. Kein Bestand: total.stock.not.found.
json
{
"sourceCode": "120",
"description": "Fifo-Abgang",
"stockListItems": [
{
"quantity": 6,
"enteredQuantity": 6,
"docDate": "2026-10-13",
"material": { "matCode": "LM-2000" },
"sourceWarehouse": { "id": 7001 },
"sourceStockplace": { "id": 8001 },
"enteredUnit": { "id": 6001 }
}
]
}Response: { "success": true }
7. Wareneingang
Die Bestellung bucht keinen Bestand. Offene Positionen kommen aus der Einkauf-Verwaltung. Gebucht wird hier.
7.1 Aus der Bestellung
POST /api/incomingGoods/
vendor, invDoctype und material werden per id gelesen. purItemId ordnet die Einkaufsposition zu. Datum yyyy-MM-dd. Die Menge wird als Betrag gebucht.
json
{
"vendor": { "id": 31001 },
"purHeadId": 210100,
"invDoctype": { "id": 8801 },
"docDate": "2026-10-13",
"postDate": "2026-10-13",
"delNoteDocNumber": "LS-L-100",
"description": "Wareneingang BE-10001",
"isParked": false,
"incomingGoods": [
{
"material": { "id": 100200 },
"quantity": 24,
"unit": 6001,
"warehouseId": 7001,
"stockPlaceCode": "WE-01",
"batchnum": "LOT-2026-10-A",
"expiryDate": "2027-04-30",
"purItemId": 41011
}
]
}31001 ist Lieferant L-1000. 210100 ist Bestellung BE-10001. 41011 ist die Position. 8801 ist die Zugangs-Belegart.
Die Antwort ist der gesendete Körper plus message, docNumbers, stockItemIds und je Zeile stockHeadIds. Fehlt Charge oder MHD, steht der Hinweis in warnings. Die Buchung bleibt.
Ohne stockPlaceCode verwendet POST /api/incomingGoods/bookIncomingGoods den Wareneingangsplatz des Lagers. Fehlt auch der: message.stock.for.warehouse.not.exists.error. Dieser zweite Aufruf setzt die Bewegungsart fest auf 210 und verlangt material.id.
json
{
"material": { "id": 100200 },
"quantity": 24,
"warehouseId": 7001,
"stockPlaceCode": "WE-01",
"paletQuantity": 1,
"batchnum": "LOT-2026-10-A",
"expiryDate": "2027-04-30"
}paletQuantity 0 wird zu 1. Die Antwort ist die Liste der gebuchten Positionen mit matCode, Lager, Platz und NVE.
7.2 Storno und Scan
Bereits gebuchte Eingänge einer Buchungsnummer: GET /api/incomingGoods/getBookedGoodsByBookNumber/{buchungsnummer}.
Storno: POST /api/incomingGoods/cancelIncomingGoods
json
{ "ids": [24001] }24001 ist die Id eines IncomingGoodsLog. Ist die Menge nicht mehr am Platz, bleibt der Eintrag und die Antwort enthält errors mit stock.already.transferred. Sonst werden die Lagerpositionen storniert.
Scan einer offenen Fertigungs- oder Bestellnummer: POST /api/incomingGoods/scan mit { "scanCode": "BE-10001" }. Mehrere offene Fertigungsaufträge zur Nummer: incomming.scan.multiple.prodOrder.error.
POST /api/incomingGoods/process bucht den gescannten Fertigungsauftrag (prodOrder true, id, produce) oder die Bestellung.
Toleranz vor der Buchung: POST /api/incomingGoods/deliveryTolerance mit vendorId und bookings.
Belegzuordnung des Eingangs: POST /api/incomingGoodsRelation/getRelations, speichern POST /api/incomingGoodsRelation/, offene Einkaufspositionen GET /api/incomingGoodsRelation/listPurItems.
Nicht importierte Eingänge des Benutzers: GET /api/incomingGoodsLog/listNotDoneImportByUser.
8. Inventur
POST /api/stockTakingHead/ legt den Zählbeleg an. Das Lager wird per warehouse.id gelesen, ein Suchschlüssel reicht hier nicht. Die Belegart ist die erste mit isStockTaking. Fehlt sie: no.invDocType.for.stock.taking. Fehlt das Lager: warehouse.not.found.
Die Nummer kommt aus dem Nummernkreis der Belegart. Die Bewegungsarten für Zugang und Abgang setzt die Anlage aus den Inventur-Bewegungsarten.
searchType.id bestimmt die Positionen:
id | Positionen |
|---|---|
1 | Je Lagerplatz |
2 | Je Artikel |
3 | Keine. Der Kopf bleibt leer |
4 | Aktueller Bestand |
5 | Inventurzuordnung |
6 | Aktueller Positionsbestand |
Optional filtern matCode, matCodeFrom und matCodeTo. Ohne stockPlace.id gilt der Standardplatz des Lagers.
8.1 Zählbeleg anlegen
json
{
"warehouse": { "id": 7001 },
"stockPlace": { "id": 8001 },
"searchType": { "id": 4 }
}Response: { "id": 90001 }
Leerer Kopf für eine eigene Zählliste: "searchType": { "id": 3 }.
Lesen: GET /api/stockTakingHead/90001. Die Liste ohne Id enthält Belegnummer, Datum, Status, Lager und Belegart.
8.2 Position ergänzen
POST /api/stockTakingHead/findMaterial rechnet den Sollbestand. Pflicht sind materialId und stockplaceId.
json
{
"materialId": 100100,
"stockplaceId": 8001
}Die Antwort enthält actualTotal, actualAvail, actualReserved und den Artikel. Unbekannter Artikel: material.not.found.
Dieselbe Position an den Beleg schreiben, noch ohne Buchung (postedStatus false). materialId, stockPlaceId, unitId und enteredUnitId werden zu den Verknüpfungen aufgelöst.
json
{
"id": 90001,
"postedStatus": false,
"items": [
{
"materialId": 100100,
"stockPlaceId": 8001,
"enteredUnitId": 6001,
"unitId": 6001,
"enteredQuantity": 48,
"itemnum": 10
}
]
}enteredQuantity ist die gezählte Menge. Sie wird mit dem Einheitenfaktor in total umgerechnet. reloadStockValues true liest actualTotal und actualAvail neu. reloadStockDeadline ist dann das Datum yyyy-MM-dd, bis zu dem die Buchungen zählen.
Response: { "id": 90001 }
Eine Position entfernen: GET /api/stockTakingHead/removeItem?stockTakingItemId=91001. Antwort { "success": true }.
Positionen, die im Bestand sind und im Zählbeleg fehlen: GET /api/stockTakingHead/missingItems/90001. Es wird nichts gespeichert. Die Zählmenge dieser Vorschläge ist 0, der Sollbestand ist der Bestand zum Zeitpunkt des Aufrufs.
Differenzliste: GET /api/stockTakingHead/diffList?stockTakingHeadId=90001. Enthalten sind nur Zeilen, deren gezählte Menge vom Sollbestand abweicht.
8.3 Zählung buchen
postedStatus true schließt den Beleg und bucht die Differenz. Gezählt mehr als der Sollbestand wird Zugang, gezählt weniger wird Abgang. Eine Differenz 0 erzeugt keine Lagerposition.
json
{
"id": 90001,
"postedStatus": true,
"postDate": "2026-10-13",
"items": [
{
"id": 91001,
"materialId": 100100,
"stockPlaceId": 8001,
"enteredUnitId": 6001,
"unitId": 6001,
"enteredQuantity": 48,
"itemnum": 10
}
]
}Der Beleg ist danach isClosed. Ein zweites Speichern mit Positionen ersetzt die Positionsliste des Kopfes.
Löschen ist logisch: DELETE /api/stockTakingHead/
json
{ "ids": [90001] }Response: { "success": true }
8.4 CSV
POST /api/stockTakingHead/importCsv liest eine CSV in einen vorhandenen Zählbeleg. stockTakingHead.id ist Pflicht. Unbekannter Beleg: nicht gefunden.
Deutsche Spalten: Artikel-Nr., Lagerplatz, Gezählte Menge, Eingegebene Einheit, Chargen Nr., MHD, Variante, NVE, Sonderbestand, Lizenzschlüssel.
Die Antwort zählt createCounter, updateCounter, skipCounter und failCounter. Fehler stehen in errors.
9. Weitere Beispiele
9.1 Anfangsbestand mehrerer Artikel
Zwei Indizes, ein Beleg.
json
{
"bookingSource": "manual",
"stockHead.docDate": "13.10.2026",
"stockHead.postDate": "13.10.2026",
"stockHead.invDocType.id": 8802,
"stockHead.description": "Anfangsbestand",
"items.number": [10, 20],
"items.matCode": ["ART-1000", "LM-2000"],
"items.name": ["Tasche", "Haferdrink 1 l"],
"items.quantity": ["50", "24"],
"items.total": ["50", "24"],
"items.warehouse.id": ["7001", "7001"],
"items.unit.id": ["6001", "6001"],
"items.stockPlaceCode": ["WE-01", "WE-01"],
"items.batchnum": [null, "LOT-2026-10-A"],
"items.stockMoveType.moveTypeCode": ["110", "110"]
}9.2 Vom Auftrag bis zur Umlagerung
- Artikel und Lagerplatz anlegen.
- Anfangsbestand mit Abschnitt Zugang.
- Bestand prüfen:
GET /api/stock/simpleList?materialId=100100&warehouseId=7001. - Auftrag anlegen, siehe Auftragsverwaltung.
- Ware auf den Kommissionierplatz legen, Abschnitt Platzwechsel.
9.3 Von der Bestellung zum Bestand
- Lieferant und Bestellung, siehe Einkauf.
- Offene Positionen
POST /api/purHead/purHeadIncomingGoodsmit{ "ids": [210100] }. - Buchung mit Abschnitt Aus der Bestellung.
- Bestand der Charge:
GET /api/stock/simpleList?materialId=100200&warehouseId=7001&batchnum=LOT-2026-10-A.
9.4 Inventur eines Platzes
- Zählbeleg mit
searchType1oder4. - Mengen setzen,
postedStatusfalse. - Differenzliste lesen.
- Mit
postedStatustrue buchen. - Bestand erneut lesen.
10. Endpoint-Katalog
10.1 Bestand /api/stock
| Methode | Pfad | Bedeutung |
|---|---|---|
GET | /api/stock/{id} | Bestandsliste ohne Werte |
GET | /api/stock/simpleList | Kompakte Zeilen |
GET | /api/stock/stockHistory | Historie |
GET | /api/stock/listStock | Bestandsbewertung |
GET | /api/stock/currentStockAmounts | Bestand mit Vorlauf |
GET | /api/stock/stockListWithoutValue | Bestandsliste, CSV oder PDF |
POST | /api/stock/transfer | Umlagerung |
POST | /api/stock/transferFifo | Fifo-Abbuchung einer Zeile |
POST | /api/stock/getSumOfStocks | Summe total |
GET | /api/stock/assembly | Baugruppenzeitraum, Antwort { "success": true } |
GET | /api/stock/reservations | Reservierungen |
POST | /api/stock/regenerateStockReservationList | Reservierungsliste neu |
POST | /api/stock/syncStockListFromReservations | Bestand aus Reservierungen |
GET | /api/stock/licenseKeyStocksBySku | Lizenzschlüssel je SKU |
GET | /api/stock/executeStockReservationListSyncJob | Startet den Reservierungsabgleich |
10.2 Lagerbeleg /api/stockHead
| Methode | Pfad | Bedeutung |
|---|---|---|
GET | /api/stockHead/{id} | Ein Beleg oder die Liste |
POST | /api/stockHead/ | Vorhandenen Beleg ändern |
POST | /api/stockHead/book | Zugang oder Abgang buchen |
GET | /api/stockHead/stockHeadManualBooking | Lager und Bewegungsarten der Maske |
GET | /api/stockHead/stockHeadListVendors | Lieferanten |
GET | /api/stockHead/listForZoom | Zoom-Liste |
GET | /api/stockHead/stockList | Lagerplätze |
GET | /api/stockHead/availableSerialNumbers | Seriennummern |
POST | /api/stockHead/batchnumDetails | Chargendetails |
GET | /api/stockHead/batchnumStocks | Chargenbestände |
GET | /api/stockHead/licenseKeyStocks | Lizenzbestände |
POST | /api/stockHead/availableBatchNumbers | Verfügbare Chargen |
POST | /api/stockHead/asAttributeCode | Attributcode aus params |
POST | /api/stockHead/cancelStockHead | Positionen stornieren, Body stockItems |
POST | /api/stockHead/closeForVerification | Für die Prüfung schließen, Body stockItems |
POST | /api/stockHead/checkStockAvailMaterial | Druckprüfung, Body stockItems als Liste von Positions-Ids |
POST | /api/stockHead/checkStockAvailMaterialForStockList | Druckprüfung, Body stockLists als Liste von Bestands-Ids |
POST | /api/stockHead/split | Buchung teilen |
POST | /api/stockHead/palletCustomer | NVE einem Partner zuordnen |
GET | /api/stockHead/buildAllStatistics | Statistik neu rechnen |
POST | /api/stockHead/checkIfClosingGapsAreUndercut | Schließtoleranz, Body stockHeadIds |
10.3 Bestandsliste, Platz, Metadaten
| Methode | Pfad | Bedeutung |
|---|---|---|
GET | /api/stockList/{id} | Eine Bestandszeile oder die Liste |
GET | /api/domains/stockList | Bestandszeilen über Generic Domain lesen |
GET | /api/stockList/variants | Varianten |
GET | /api/stockList/dataVault/stock | Archiv |
GET | /api/stockPlace/{id} | Ein Lagerplatz |
POST | /api/stockListMetaData/ | Metadaten der Zeile, prodDate als yyyy-MM-dd'T'HH:mm:ss. Antwort { "id" } |
GET | /api/materialStock/{id} | Artikel-Lagerzeile, siehe Artikelstamm |
POST | /api/materialStock/ | Artikel-Lagerzeile speichern |
DELETE | /api/materialStock/{id} | Artikel-Lagerzeile löschen |
GET | /api/materialStock/getPickplaceList | Pickplätze |
POST | /api/materialStock/pickplace | Pickplatz setzen |
GET | /api/materialStock/getMaterialIncomeDetail | Eingangsdetail |
10.4 Wareneingang
| Methode | Pfad | Bedeutung |
|---|---|---|
GET | /api/incomingGoods/{id} | Maskendaten zum Artikel |
POST | /api/incomingGoods/ | Wareneingang buchen |
POST | /api/incomingGoods/bookIncomingGoods | Buchung mit Bewegungsart 210 |
POST | /api/incomingGoods/bookVouchers | Zugang über Belegnummer und SKU, Bewegungsart 110 |
DELETE | /api/incomingGoods/cancelVouchers | Gegenbuchung, Bewegungsart 120 |
POST | /api/incomingGoods/cancelIncomingGoods | Eingang stornieren, Body ids |
GET | /api/incomingGoods/getBookedGoodsByBookNumber/{id} | Gebuchte Zeilen einer Nummer |
POST | /api/incomingGoods/scan | Offenen Auftrag zur Nummer suchen |
POST | /api/incomingGoods/process | Gescannten Auftrag buchen |
POST | /api/incomingGoods/deliveryTolerance | Liefertoleranz |
GET | /api/incomingGoods/startImportGoods | Nächste Eingangsnummer, Lager und Platz des Benutzers |
POST | /api/incomingGoods/fetchInrayCsv | Eingangsdatei lesen |
POST | /api/incomingGoods/setInrayCsvImported | Datei als importiert markieren |
GET | /api/incomingGoodsLog/{id} | Ein Eingangsprotokoll |
GET | /api/incomingGoodsLog/listNotDoneImportByUser | Offene Importe des Benutzers |
POST | /api/incomingGoodsRelation/getRelations | Zuordnungen |
POST | /api/incomingGoodsRelation/ | Zuordnung speichern |
GET | /api/incomingGoodsRelation/listPurItems | Offene Einkaufspositionen |
bookVouchers erwartet incomingGoods[] mit warehouseId, stockplaceId, unitCode oder unit, purHeadDocNumber, materialSku oder variantSku und einer nicht leeren Liste expiryDates.licenseKeys. Fehlt die Zugangs-Belegart: no.invDocType.found. Fehlt Bewegungsart 110: stockMoveType.not.found.
10.5 Inventur
| Methode | Pfad | Bedeutung |
|---|---|---|
GET | /api/stockTakingHead/{id} | Ein Zählbeleg oder die Liste |
POST | /api/stockTakingHead/ | Anlegen oder Zählung speichern |
DELETE | /api/stockTakingHead/ | Logisch löschen, Body ids |
POST | /api/stockTakingHead/findMaterial | Sollbestand einer Position |
GET | /api/stockTakingHead/diffList | Differenzen, Query stockTakingHeadId |
GET | /api/stockTakingHead/missingItems/{id} | Fehlende Bestandszeilen, nichts wird gespeichert |
GET | /api/stockTakingHead/removeItem | Position löschen, Query stockTakingItemId |
POST | /api/stockTakingHead/importCsv | CSV in einen Zählbeleg |
POST | /api/mobileStockTaking/ | Mobile Zählung, Antwort { "success": true } |
GET | /api/mobileStockTaking/ | Daten zu matCode und warehouseId |
GET | /api/mobileStockTaking/validate | Belegnummer prüfen |
GET | /api/mobileStockTaking/stockListForStockTaking | Bestand für die mobile Zählung |
POST | /api/mobileStockTaking/saveForInventurV2 | Zählung Inventur V2 |
POST | /api/mobileStockTaking/saveEmptyStockplace | Leeren Platz zählen |
11. Häufige Fehler
| Situation | Ursache |
|---|---|
warehouse.not.found | Inventur ohne warehouse.id |
no.invDocType.for.stock.taking | Keine Belegart mit isStockTaking |
no.invDocType.found | Keine manuelle Zugangs- oder Abgangs-Belegart |
stockMoveType.not.found | Code 110 oder 120 fehlt oder ist deaktiviert |
material.not.found | Artikel-Id der Inventur oder des Wareneingangs unbekannt |
message.stock.for.warehouse.not.exists.error | Weder Platzcode noch Wareneingangsplatz am Lager |
message.no.stock.item.quantity.entered.error | Menge der manuellen Buchung fehlt oder ist keine Zahl |
message.no.stock.item.unit.selected.error | Einheit der manuellen Buchung fehlt |
message.negative.stock.item.quantity.entered.error | Negative Menge an einer Bestellposition |
message.stockItem.misses.batchnum.error | Charge pflichtig und leer. Mit areMissingBatchnumsIgnored trotzdem buchen |
no.open.positions.for.order | Bestellung hat keine offene Position zum Artikel |
quantity.not.set | Wareneingang ohne Menge |
select.stock.item | Fifo ohne Zeile |
only.select.one.stock.item | Fifo mit mehr als einer Zeile |
quantity.is.bigger.than.total.stocks | Fifo-Menge über dem Bestand |
stock.already.transferred | Storno, die Menge liegt nicht mehr auf dem Platz |
| Beleg ändern schlägt fehl | POST /api/stockHead/ ohne vorhandene id |
| Umlagerung findet den Artikel nicht | material.matCode weicht ab |
| Inventur bucht nicht | postedStatus ist false. Die Differenz entsteht erst beim Abschluss |