Seriennummern API

Abfrage und Aufteilung von Produkt-Seriennummern (Seriennummern, LOT-/Chargenpositionen)

Basis-URL

https://{tenant}.logzi.com/api/stock_serial/

Jede Anfrage liefert eine JSON-Antwort zurück. Bei Erfolg ist result.code == 1 (HTTP 200), im Fehlerfall oder wenn kein Datensatz gefunden wird result.code == 0 (HTTP 203).

Hinweis: Die Seriennummern entstehen automatisch im Rahmen des Wareneingangs-/Warenausgangsprozesses im Lager. Über die API können sie abgefragt und LOT-(Chargen-)Positionen aufgeteilt werden; das Anlegen neuer Seriennummern und das Löschen sind nicht möglich.

Funktionsweise

Die Einstellung serialnumber_required des Produkts bestimmt, wie das System die Seriennummern behandelt:

  • 1 – Seriennummernpflicht: Jedes Stück ist eine eigene Seriennummernzeile, quantity ist immer 1.
  • 2 – LOT-(Chargen-)Nummernpflicht: Eine Zeile steht für mehrere Stücke, quantity ist die Menge im LOT.
  • 3 – LOT-Nummern- und Haltbarkeitspflicht: Wie LOT, die Zeile hat jedoch zusätzlich ein date_expire (Ablaufdatum).

Die Aufteilungs-Endpunkte (save_separate, save_separate_all) teilen LOT-Zeilen auf. Beim Aufteilen erhalten die neuen Zeilen alle Daten der Quellzeile (Produkt, Lager, Lagerplatz, Palette, Seriennummer/LOT-Kennung, Ablaufdatum, Erstellungsdatum) sowie die zugehörigen Belegverknüpfungen; die Gesamtbestandsmenge ändert sich nicht.

Die Aufteilung ist nur bei einer nicht verbrauchten (used = 0) und nicht gelöschten (remove = 0) Zeile möglich.

GET /api/stock_serial/get

Abruf eines einzelnen Seriennummer-Datensatzes anhand der ID. Ein gelöschter Datensatz (remove = 1) wird nicht zurückgegeben.

Query-Parameter

Parameter Typ Pflicht Beschreibung
id int Eindeutige Kennung des Seriennummer-Datensatzes (db_stock_serial.id)

Antwortfelder (data-Objekt)

FeldTypBeschreibung
idintKennung des Seriennummer-Datensatzes
product_idintKennung des Produkts
store_idintKennung des Lagers (Standorts), in dem sich die Position befindet
company_idintKennung der Firma, zu der die Position gehört
serial_numberstringDie Seriennummer oder LOT-(Chargen-)Kennung, maximal 30 Zeichen
quantityfloatMenge: bei seriennummernpflichtigen Produkten 1, bei LOT-Produkten die Stückzahl im LOT
usedint0 = verfügbar (nicht verbraucht), 1 = verbraucht
removeintLöschkennzeichen, die Abfrage liefert nur Datensätze mit dem Wert 0
store_locality_idint | nullKennung des Lagerplatzes, wenn die Position einem Lagerplatz zugeordnet ist
pallet_idint | nullKennung der Palette, wenn die Position einer Palette zugeordnet ist
date_createdatetimeErstellungszeitpunkt der Seriennummer (JJJJ-MM-TT HH:MM:SS)
date_expiredatetime | nullHaltbarkeits-(Ablauf-)Datum, nur bei LOT-Produkten mit Haltbarkeitspflicht befüllt
chkstringInterne Prüfkennung (32 Zeichen), in Integrationen nicht zu verwenden

Beispielanfrage

GET /api/stock_serial/get?id=42
X-API-KEY: {ihr_api_schluessel}

Beispielantwort

{
  "result": { "code": 1, "message": null },
  "data": {
    "id": 42,
    "product_id": 5,
    "store_id": 1,
    "date_create": "2024-03-15 10:22:00",
    "company_id": 1,
    "serial_number": "LOT-2024-00042",
    "remove": 0,
    "used": 0,
    "chk": "5f4dcc3b5aa765d61d8327deb882cf99",
    "store_locality_id": 7,
    "pallet_id": null,
    "quantity": 50,
    "date_expire": "2026-03-15 00:00:00"
  }
}

Datensatz nicht gefunden

HTTP 203
{
  "result": { "code": 0, "message": "Not found" },
  "data": null
}
GET /api/stock_serial/list

Abruf einer paginierten Liste der Seriennummern mit Filtermöglichkeiten. Es werden nur nicht gelöschte (remove = 0) Datensätze lagerführender Produkte in absteigender ID-Reihenfolge aufgelistet.

Query-Parameter

Parameter Typ Pflicht Beschreibung
list_offset int Paginierungs-Offset, wie viele Datensätze am Anfang übersprungen werden (Standard: 0). Eine Anfrage liefert höchstens 10.000 Datensätze.
list_condition[product_id] int Filter nach Produktkennung (exakte Übereinstimmung)
list_condition[used] int Verbrauchsstatus: 0 = verfügbar, 1 = verbraucht
list_condition[serial_number] string Filter nach Seriennummer / LOT-Kennung (exakte Übereinstimmung)
list_condition[partnumber] string Filter nach Artikelnummer des Produkts (exakte Übereinstimmung)
list_condition[item_id_used_0] int Für eine Belegposition verfügbare Seriennummern: nicht verbrauchte Zeilen (used = 0) und Zeilen, die bereits mit dieser Position (item_id) verknüpft sind
list_condition[receipt_id] int Mit dem angegebenen Beleg verknüpfte Seriennummern. Nur zusammen mit dem Feld receipt_type_id gültig.
list_condition[receipt_type_id] int Kennung des Belegtyps. Nur zusammen mit dem Feld receipt_id gültig.
list_condition[store_locality_id] int Filter nach Lagerplatz-Kennung
list_condition[product_name_partnumber] string Filter nach Produktname oder Artikelnummer (LIKE, Platzhalter: %)
list_condition[product_name] string Filter nach einem Teil des Produktnamens
list_condition[product_partnumber_barcode] string Filter nach einem Teil der Artikelnummer oder nach dem Barcode des Produkts
list_condition[date_create_from] date Erstellungsdatum ab (einschließlich), Format: JJJJ-MM-TT
list_condition[date_create_to] date Erstellungsdatum bis (einschließlich), Format: JJJJ-MM-TT
list_condition[date_expire_from] date Ablaufdatum ab (einschließlich), Format: JJJJ-MM-TT
list_condition[date_expire_to] date Ablaufdatum bis (einschließlich), Format: JJJJ-MM-TT

Antwortfelder (Elemente des data-Arrays)

Die Elemente enthalten alle Felder des Endpunkts get mit den folgenden Abweichungen und Ergänzungen:

FeldTypBeschreibung
stock_serial_idintKennung des Seriennummer-Datensatzes (identisch mit dem Feld id)
date_createstringErstellungszeitpunkt, Format: JJJJ.MM.TT HH:MM:SS
date_expirestring | nullAblaufdatum, Format: JJJJ.MM.TT
product_unit_namestringBezeichnung des Produkts
partnumberstringArtikelnummer des Produkts
store_locality_barcodestring | nullBarcode des Lagerplatzes
pallet_barcodestring | nullBarcode der Palette
store_namestringName des Lagers (Standorts)

Antwortfelder (params-Objekt)

FeldTypBeschreibung
list_countintMaximale Anzahl der in einer Anfrage zurückgegebenen Datensätze (10.000)
list_offsetintDer in der Anfrage angegebene Offset
list_allintGesamtzahl der Datensätze, die dem Filter entsprechen

Beispielanfrage

GET /api/stock_serial/list?list_offset=0&list_condition[product_id]=5&list_condition[used]=0
X-API-KEY: {ihr_api_schluessel}

Beispielantwort

{
  "result": { "code": 1, "message": null },
  "data": [
    {
      "id": 42,
      "stock_serial_id": 42,
      "product_id": 5,
      "store_id": 1,
      "company_id": 1,
      "serial_number": "LOT-2024-00042",
      "quantity": 50,
      "used": 0,
      "remove": 0,
      "chk": "5f4dcc3b5aa765d61d8327deb882cf99",
      "store_locality_id": 7,
      "pallet_id": null,
      "date_create": "2024.03.15 10:22:00",
      "date_expire": "2026.03.15",
      "product_unit_name": "Laptop XYZ",
      "partnumber": "LTP-XYZ-001",
      "store_locality_barcode": "A-01-02",
      "pallet_barcode": null,
      "store_name": "Zentrallager"
    }
  ],
  "params": {
    "list_count": 10000,
    "list_offset": 0,
    "list_all": 1
  }
}
POST /api/stock_serial/save_separate

Trennt aus einer LOT-(Chargen-)Seriennummernzeile die angegebene Menge in eine neue Zeile ab. Die Menge der Quellzeile verringert sich, die neue Zeile wird mit denselben Daten (Produkt, Lager, Lagerplatz, Palette, Seriennummer/LOT-Kennung, Ablaufdatum) und der abgetrennten Menge angelegt.

POST-Felder - data-Objekt

FeldTypPflichtBeschreibung
stock_serial_idintKennung der aufzuteilenden Seriennummernzeile. Die Zeile darf weder gelöscht noch verbraucht sein (used = 0).
quantityfloatDie abzutrennende Menge. Sie muss größer als null und kleiner als die Gesamtmenge der Zeile sein.

Antwortfelder (data-Objekt)

FeldTypBeschreibung
stock_serial_idintKennung der Quellzeile
new_stock_serial_idintKennung der neu angelegten Zeile
quantity_separatedfloatDie in die neue Zeile abgetrennte Menge
quantity_leftfloatDie in der Quellzeile verbliebene Menge

Fehlermeldungen (result.message)

MeldungWann
Not foundDas Feld data fehlt oder ist leer
ex_stock_serial_separate_itemDie stock_serial_id fehlt, ist ungültig, existiert nicht oder ist gelöscht
ex_stock_serial_separate_usedDie Zeile ist bereits verbraucht (used = 1)
ex_stock_serial_separate_qtyDie quantity ist keine Zahl, nicht größer als null oder nicht kleiner als die Gesamtmenge
ex_unknown_msgUnbekannter Fehler beim Speichern. Im Fehlerfall wird der gesamte Vorgang zurückgesetzt.

Beispielanfrage

POST /api/stock_serial/save_separate
X-API-KEY: {ihr_api_schluessel}
Content-Type: application/json

{
  "data": {
    "stock_serial_id": 42,
    "quantity": 20
  }
}

Beispielantwort

{
  "result": { "code": 1, "message": "success_msg" },
  "data": {
    "stock_serial_id": 42,
    "new_stock_serial_id": 57,
    "quantity_separated": 20,
    "quantity_left": 30
  }
}
POST /api/stock_serial/save_separate_all

Teilt eine LOT-(Chargen-)Seriennummernzeile vollständig in Einzelstücke auf: Es entstehen so viele Zeilen mit je 1 Stück, wie die Menge der Zeile betrug (z. B. wird aus einer Zeile mit 50 Stück 50 Zeilen mit je 1 Stück). Die ursprüngliche Zeile bleibt erhalten, ihre Menge wird auf 1 reduziert, die übrigen (Menge - 1) Zeilen werden mit denselben Daten neu angelegt.

POST-Felder - data-Objekt

FeldTypPflichtBeschreibung
stock_serial_idintKennung der aufzuteilenden Seriennummernzeile. Die Zeile darf weder gelöscht noch verbraucht sein (used = 0), ihre Menge muss eine positive ganze Zahl sein, mindestens 2 und höchstens 25.000.

Antwortfelder (data-Objekt)

FeldTypBeschreibung
stock_serial_idintKennung der ursprünglichen Zeile (auch sie wird zu einer Zeile mit 1 Stück)
quantity_beforefloatMenge der ursprünglichen Zeile vor der Aufteilung
countintAnzahl der Zeilen nach der Aufteilung (einschließlich der ursprünglichen Zeile, entspricht quantity_before)
stock_serial_idsint[]Kennungen aller Zeilen: zuerst die ursprüngliche Zeile, danach die neu angelegten Zeilen in aufsteigender Reihenfolge

Fehlermeldungen (result.message)

MeldungWann
Not foundDas Feld data fehlt oder ist leer
ex_stock_serial_separate_itemDie stock_serial_id fehlt, ist ungültig, existiert nicht oder ist gelöscht
ex_stock_serial_separate_usedDie Zeile ist bereits verbraucht (used = 1)
ex_stock_serial_separate_qty_integerDie Menge der Zeile ist keine positive ganze Zahl
ex_stock_serial_separate_singleDie Menge der Zeile beträgt 1, es gibt nichts aufzuteilen
ex_stock_serial_separate_max_rowsDie Menge der Zeile überschreitet die auf einmal aufteilbaren 25.000 Stück (am Ende der Meldung steht das zulässige Maximum)
ex_unknown_msgUnbekannter Fehler beim Speichern. Im Fehlerfall wird der gesamte Vorgang zurückgesetzt.
Achtung: Der Vorgang kann über die API nicht rückgängig gemacht werden (es gibt keinen Endpunkt zum Zusammenführen der Zeilen). Die Aufteilung einer großen Menge kann länger dauern.

Beispielanfrage

POST /api/stock_serial/save_separate_all
X-API-KEY: {ihr_api_schluessel}
Content-Type: application/json

{
  "data": {
    "stock_serial_id": 42
  }
}

Beispielantwort (Aufteilung einer Zeile mit 3 Stück)

{
  "result": { "code": 1, "message": "success_msg" },
  "data": {
    "stock_serial_id": 42,
    "quantity_before": 3,
    "count": 3,
    "stock_serial_ids": [42, 58, 59]
  }
}

Nimm Kontakt mit uns auf

Interessierst du dich für unsere Software? Schreib uns einfach!

Brauchst du Hilfe?

Wenn du keine Antwort findest und Unterstützung brauchst

Jetzt registrieren,
später bezahlen!

Teste es 3 Tage kostenlos, ohne Risiko und Verpflichtungen!