{
  "info": {
    "name": "HEGA API – Aufschalt-Kit (Dropshipping)",
    "_postman_id": "hega-api-aufschalt-kit-2026",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Klickbares Test-Kit fuer die HEGA Dropshipping-API.\n\nERSTE SCHRITTE\n1. Beide Environment-Dateien importieren, oben rechts 'HEGA API – Test' auswaehlen und dort apimail, password, kdnnr eintragen.\n2. Beliebigen Request senden – ein AUTO-LOGIN holt bei Bedarf automatisch ein Token (oder '1 · Auth > Login' manuell senden).\n3. 'Run Collection' fuehrt alles der Reihe nach aus: Login -> Artikeldaten (VE) -> Bestellung -> Status -> Belege -> Bestand -> Logout. Die Test-Ergebnisse zeigen gruen/rot.\n\nVE-HINWEIS: Mengen IMMER in Verpackungseinheit (VE), nicht in Stueck. Artikel 9110378 = 6er-VE -> menge 1 ergibt 6 Dosen.\n\nUMGEBUNG: Basis-URL kommt aus dem Environment: 'HEGA API – Test' = https://test.api.hega.net, 'HEGA API – Live' = https://api.hega.net. Zum Go-Live nur das Environment wechseln.\nVERSIONIERUNG: Nur DeliveryNote und Invoice mit /api/v1/ – alle uebrigen Endpunkte OHNE v1.",
    "_postman_exported_using": "HEGA Aufschalt-Kit"
  },
  "auth": {
    "type": "bearer",
    "bearer": [ { "key": "token", "value": "{{accessToken}}", "type": "string" } ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Zugangsdaten pruefen + Auto-Login, falls noch kein Token vorhanden ist.",
          "const apimail = pm.variables.get('apimail');",
          "const password = pm.variables.get('password');",
          "const kdnnr = pm.variables.get('kdnnr');",
          "const baseUrl = pm.variables.get('baseUrl');",
          "if (!apimail || !password || !kdnnr) {",
          "  console.warn('HINWEIS: Bitte im Environment (HEGA API – Test/Live) apimail, password und kdnnr eintragen.');",
          "}",
          "const name = pm.info.requestName || '';",
          "const noAuth = ['Login', 'Token erneuern', 'Logout'];",
          "const token = pm.collectionVariables.get('accessToken');",
          "if (!token && apimail && password && kdnnr && noAuth.indexOf(name) === -1) {",
          "  pm.sendRequest({",
          "    url: baseUrl + '/api/Account/login',",
          "    method: 'POST',",
          "    header: { 'Content-Type': 'application/json' },",
          "    body: { mode: 'raw', raw: JSON.stringify({ apimail: apimail, password: password, kdnnr: kdnnr }) }",
          "  }, function (err, res) {",
          "    if (!err && res && res.code === 200) {",
          "      const j = res.json();",
          "      if (j.accessToken) pm.collectionVariables.set('accessToken', j.accessToken);",
          "      if (j.refreshToken) pm.collectionVariables.set('refreshToken', j.refreshToken);",
          "      console.log('Auto-Login OK.');",
          "    } else {",
          "      console.warn('Auto-Login fehlgeschlagen (' + ((res && res.code) || err) + ').');",
          "    }",
          "  });",
          "}"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Globale Fehler-Sichtbarkeit fuer alle Requests.",
          "if (pm.response.code >= 400) {",
          "  let b; try { b = pm.response.json(); } catch (e) { b = pm.response.text(); }",
          "  const msg = (b && b.errorCode) ? ('errorCode: ' + b.errorCode + ' | ' + (b.message || '')) : (typeof b === 'string' ? b.substring(0, 200) : JSON.stringify(b).substring(0, 200));",
          "  console.error('Fehler HTTP ' + pm.response.code + ' | ' + msg);",
          "}",
          "if (pm.response.code === 401) {",
          "  console.warn('401 – Token fehlt/abgelaufen. Beim naechsten Request greift der Auto-Login, oder senden Sie 1 · Auth > Login.');",
          "}"
        ]
      }
    }
  ],
  "variable": [
    { "key": "baseUrl", "value": "https://test.api.hega.net" },
    { "key": "apimail", "value": "" },
    { "key": "password", "value": "" },
    { "key": "kdnnr", "value": "" },
    { "key": "accessToken", "value": "" },
    { "key": "refreshToken", "value": "" },
    { "key": "kundenNummer", "value": "" },
    { "key": "bestellnummer", "value": "" },
    { "key": "lsnr", "value": "" },
    { "key": "renr", "value": "" }
  ],
  "item": [
    {
      "name": "1 · Auth",
      "item": [
        {
          "name": "Login",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const j = pm.response.json();",
                  "if (j.accessToken)  pm.collectionVariables.set('accessToken', j.accessToken);",
                  "if (j.refreshToken) pm.collectionVariables.set('refreshToken', j.refreshToken);",
                  "if (j.kundenNummer) pm.collectionVariables.set('kundenNummer', j.kundenNummer);",
                  "pm.test('Login OK + Token gespeichert', () => {",
                  "  pm.response.to.have.status(200);",
                  "  pm.expect(j.accessToken, 'accessToken im Response').to.be.ok;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "auth": { "type": "noauth" },
            "method": "POST",
            "header": [ { "key": "Content-Type", "value": "application/json" } ],
            "body": { "mode": "raw", "raw": "{\n  \"apimail\": \"{{apimail}}\",\n  \"password\": \"{{password}}\",\n  \"kdnnr\": \"{{kdnnr}}\"\n}" },
            "url": { "raw": "{{baseUrl}}/api/Account/login", "host": [ "{{baseUrl}}" ], "path": [ "api", "Account", "login" ] },
            "description": "Anmeldung. Liefert accessToken (JWT, 30 Min.), refreshToken, expiresAt, kundenNummer. Der Token wird automatisch gespeichert."
          },
          "response": [
            {
              "name": "Beispiel (illustrativ)",
              "originalRequest": {
                "method": "POST",
                "header": [ { "key": "Content-Type", "value": "application/json" } ],
                "body": { "mode": "raw", "raw": "{ \"apimail\": \"...\", \"password\": \"...\", \"kdnnr\": \"12345\" }" },
                "url": { "raw": "{{baseUrl}}/api/Account/login", "host": [ "{{baseUrl}}" ], "path": [ "api", "Account", "login" ] }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [ { "key": "Content-Type", "value": "application/json" } ],
              "body": "{\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"refreshToken\": \"f1c2...\",\n  \"expiresAt\": \"2026-06-02T12:30:00\",\n  \"kundenNummer\": 12345\n}"
            }
          ]
        },
        {
          "name": "Token erneuern",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const j = pm.response.json();",
                  "if (j.accessToken)  pm.collectionVariables.set('accessToken', j.accessToken);",
                  "if (j.refreshToken) pm.collectionVariables.set('refreshToken', j.refreshToken);",
                  "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));"
                ]
              }
            }
          ],
          "request": {
            "auth": { "type": "noauth" },
            "method": "POST",
            "header": [ { "key": "Content-Type", "value": "application/json" } ],
            "body": { "mode": "raw", "raw": "{\n  \"refreshToken\": \"{{refreshToken}}\",\n  \"accessToken\": \"{{accessToken}}\"\n}" },
            "url": { "raw": "{{baseUrl}}/api/Account/refresh-token", "host": [ "{{baseUrl}}" ], "path": [ "api", "Account", "refresh-token" ] },
            "description": "Token erneuern, bevor er nach 30 Min. ablaeuft (proaktiv ~1-2 Min. vorher). Keine Kulanzzeit – danach Neu-Login."
          }
        }
      ]
    },
    {
      "name": "2 · Artikeldaten (VE pruefen)",
      "item": [
        {
          "name": "Artikel 25000 (Stueck-Artikel)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));",
                  "const j = pm.response.json();",
                  "pm.test('25000: Stueck-Artikel (anzahlartve = 1)', () => pm.expect(j.anzahlartve).to.eql(1));"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelDaten/25000", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelDaten", "25000" ] },
            "description": "Erwartung: anzahlartve = 1 (1 Stueck je VE). Felder: internetvbe (VE-Bezeichnung), anzahlartve (Stueck je VE = Umrechnungsfaktor), VE-Masse, VE je Palettenlage/Palette."
          }
        },
        {
          "name": "Artikel 9110378 (VE-Artikel, 6 Dosen)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));",
                  "const j = pm.response.json();",
                  "pm.test('9110378: VE-Artikel (anzahlartve = 6)', () => pm.expect(j.anzahlartve).to.eql(6));",
                  "console.log('9110378: menge 1 = ' + j.anzahlartve + ' Dosen (1 VE).');"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelDaten/9110378", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelDaten", "9110378" ] },
            "description": "Erwartung: anzahlartve = 6. Schluessel zur VE-Thematik: menge=1 liefert 6 Dosen. Genau diesen Umrechnungsfaktor nutzt Ihr Wareneingang."
          },
          "response": [
            {
              "name": "Beispiel (illustrativ)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": { "raw": "{{baseUrl}}/api/DSArtikelDaten/9110378", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelDaten", "9110378" ] }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [ { "key": "Content-Type", "value": "application/json" } ],
              "body": "{\n  \"artikelnr\": \"9110378\",\n  \"ean\": \"40xxxxxxxxxxx\",\n  \"bezeichnung1\": \"Beispielartikel\",\n  \"internetvbe\": \"Karton\",\n  \"anzahlartve\": 6\n}"
            }
          ]
        },
        {
          "name": "Artikeldaten (kompakt, light)",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelDaten/light", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelDaten", "light" ] },
            "description": "Kompakte Artikelliste. Benoetigt Freischaltung 'Ftphegaart' (sonst HTTP 403)."
          }
        },
        {
          "name": "Artikeldaten-Aenderungen ab Datum",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelDaten/lastchange/2026-06-01", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelDaten", "lastchange", "2026-06-01" ] },
            "description": "Nur geaenderte Artikel seit Datum (yyyy-MM-dd) – effizient fuer den taeglichen Abgleich."
          }
        }
      ]
    },
    {
      "name": "3 · Bestellung",
      "item": [
        {
          "name": "Bestellung anlegen (OrderAdd)",
          "event": [
            { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "pm.collectionVariables.set('bestellnummer', 'TEST-' + Date.now());" ] } },
            { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Bestellung akzeptiert (HTTP 200)', () => pm.response.to.have.status(200));", "console.log('Angelegte Bestellnummer: ' + pm.collectionVariables.get('bestellnummer'));" ] } }
          ],
          "request": {
            "method": "POST",
            "header": [ { "key": "Content-Type", "value": "application/json" } ],
            "body": { "mode": "raw", "raw": "{\n  \"bestellnummer\": \"{{bestellnummer}}\",\n  \"firma\": \"Muster Filiale 1234\",\n  \"vorname\": \"Max\",\n  \"nachname\": \"Mustermann\",\n  \"zusatz\": \"\",\n  \"straße\": \"Musterstraße\",\n  \"hausnummer\": \"12\",\n  \"postleitzahl\": \"30519\",\n  \"ort\": \"Hannover\",\n  \"emailadresse\": \"test@example.de\",\n  \"laenderkennzeichen\": \"DE\",\n  \"versender\": \"DPD\",\n  \"dsorderzeiledto\": [\n    { \"artnr\": \"25000\", \"menge\": 1, \"mengeneinheit\": \"VE\" },\n    { \"artnr\": \"9110378\", \"menge\": 6, \"mengeneinheit\": \"Stueck\" }\n  ]\n}" },
            "url": { "raw": "{{baseUrl}}/api/DSOrder/OrderAdd/", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSOrder", "OrderAdd", "" ] },
            "description": "Legt eine Testbestellung mit beiden Artikeln an. Demonstriert das optionale Feld mengeneinheit: 25000 menge 1 in VE = 1 Stueck (anzahlartve 1); 9110378 menge 6 in 'Stueck' wird von HEGA auf 1 VE (6 Dosen) umgerechnet (anzahlartve 6). Ohne mengeneinheit gilt 'VE'. Bei 'Stueck' muss die Menge ein Vielfaches von anzahlartve sein, sonst INVALID_QUANTITY. laenderkennzeichen/versender sind case-sensitive (DE / DPD). bestellnummer wird automatisch als TEST-<zeit> gesetzt."
          }
        },
        {
          "name": "Status (nach Bestellnummer)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status abrufbar (2xx)', () => pm.expect(pm.response.code).to.be.within(200, 299));",
                  "let arr; try { arr = pm.response.json(); } catch (e) { arr = null; }",
                  "if (Array.isArray(arr) && arr.length) {",
                  "  if (arr[0].lsnr) pm.collectionVariables.set('lsnr', arr[0].lsnr);",
                  "  if (arr[0].renr) pm.collectionVariables.set('renr', arr[0].renr);",
                  "  console.log('Status: ' + arr[0].ordersStatus + ' | lsnr: ' + arr[0].lsnr + ' | renr: ' + arr[0].renr);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSOrder/Customer/{{bestellnummer}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSOrder", "Customer", "{{bestellnummer}}" ] },
            "description": "Status der Bestellung (Liste; bei Teillieferung mehrere). ordersStatus: Arrived(1) InTheOrderPool(2) InProgress(3) Packed(4) Dispatched(5) Invoiced(6). lsnr/renr werden – sobald vorhanden – automatisch gespeichert."
          },
          "response": [
            {
              "name": "Beispiel (illustrativ)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": { "raw": "{{baseUrl}}/api/DSOrder/Customer/{{bestellnummer}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSOrder", "Customer", "{{bestellnummer}}" ] }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [ { "key": "Content-Type", "value": "application/json" } ],
              "body": "[\n  {\n    \"bestellnummer\": \"TEST-0000000000000\",\n    \"ordersStatus\": \"InProgress\",\n    \"lsnr\": 4600001,\n    \"renr\": 0,\n    \"dsorderzeileresults\": [\n      { \"artnr\": \"9110378\", \"menge\": 1, \"orderMenge\": 1 }\n    ]\n  }\n]"
            }
          ]
        },
        {
          "name": "Status-Sammelabfrage (versendete)",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/DSOrder/Status/?OrdersStatus=Dispatched&BestelldatumVon=2026-06-01&BestelldatumBis=2026-06-05",
              "host": [ "{{baseUrl}}" ],
              "path": [ "api", "DSOrder", "Status", "" ],
              "query": [
                { "key": "OrdersStatus", "value": "Dispatched" },
                { "key": "BestelldatumVon", "value": "2026-06-01" },
                { "key": "BestelldatumBis", "value": "2026-06-05" }
              ]
            },
            "description": "Empfohlenes Tages-Polling: alle versendeten Bestellungen eines Zeitraums (max. 5 Tage) inkl. Trackingnummern. Datum yyyy-MM-dd."
          }
        }
      ]
    },
    {
      "name": "4 · Belege & Tracking (Rueckkanal)",
      "item": [
        {
          "name": "Lieferschein-Liste (nach Bestellnummer)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));",
                  "let j; try { j = pm.response.json(); } catch (e) { j = null; }",
                  "const items = j && (j.items || j);",
                  "if (Array.isArray(items) && items.length && items[0].lsnr) pm.collectionVariables.set('lsnr', items[0].lsnr);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/DeliveryNote?bestellnummer={{bestellnummer}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "DeliveryNote" ], "query": [ { "key": "bestellnummer", "value": "{{bestellnummer}}" } ] },
            "description": "Lieferscheine zur Bestellnummer (paginiert: pageIndex/pageSize). ACHTUNG /api/v1/ ! Nur Belege der letzten 12 Monate. Setzt lsnr automatisch."
          }
        },
        {
          "name": "Lieferschein-Detail",
          "event": [
            { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('lsnr')) { console.log('uebersprungen: noch keine lsnr (Bestellung noch nicht versendet).'); if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } },
            { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/DeliveryNote/{{lsnr}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "DeliveryNote", "{{lsnr}}" ] },
            "description": "Lieferschein-Detail inkl. Positionen (anzahlartve/Stueckmenge), POD und Paketinhalt/Tracking. Wird uebersprungen, solange keine lsnr vorliegt."
          }
        },
        {
          "name": "Lieferschein PDF",
          "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('lsnr')) { if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } } ],
          "request": {
            "method": "GET",
            "header": [ { "key": "Accept", "value": "application/pdf" } ],
            "url": { "raw": "{{baseUrl}}/api/v1/DeliveryNote/{{lsnr}}/pdf", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "DeliveryNote", "{{lsnr}}", "pdf" ], "query": [ { "key": "type", "value": "delivery", "disabled": true } ] },
            "description": "Lieferschein als PDF (type=freight = Frachtschein). In Postman 'Send and Download' zum Speichern."
          }
        },
        {
          "name": "Lieferschein CSV",
          "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('lsnr')) { if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } } ],
          "request": {
            "method": "GET",
            "header": [ { "key": "Accept", "value": "text/csv" } ],
            "url": { "raw": "{{baseUrl}}/api/v1/DeliveryNote/{{lsnr}}/csv", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "DeliveryNote", "{{lsnr}}", "csv" ] },
            "description": "Lieferschein als CSV (ISO-8859-1, Semikolon) – enthaelt ANZAHLARTVE und STUECK_MENGE, Vorlage fuer den Wareneingang."
          }
        },
        {
          "name": "Lieferschein MDE (EAN + Stueck)",
          "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('lsnr')) { if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/DeliveryNote/{{lsnr}}/mde", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "DeliveryNote", "{{lsnr}}", "mde" ] },
            "description": "Schlanke Datei nur EAN + Stueckzahl – zur Einbuchung in die Warenwirtschaft."
          }
        },
        {
          "name": "Zustellnachweis (POD)",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/POD/Customer/{{bestellnummer}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "POD", "Customer", "{{bestellnummer}}" ] },
            "description": "Proof of Delivery (ob/wann/an wen zugestellt). OHNE /v1/."
          }
        },
        {
          "name": "Rechnung-Liste (nach Bestellnummer)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));",
                  "let j; try { j = pm.response.json(); } catch (e) { j = null; }",
                  "const items = j && (j.items || j);",
                  "if (Array.isArray(items) && items.length && items[0].renr) pm.collectionVariables.set('renr', items[0].renr);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/Invoice?bestellnummer={{bestellnummer}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "Invoice" ], "query": [ { "key": "bestellnummer", "value": "{{bestellnummer}}" } ] },
            "description": "Rechnungen zur Bestellnummer (paginiert, letzte 12 Monate). Setzt renr automatisch."
          }
        },
        {
          "name": "Rechnung-Detail",
          "event": [
            { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('renr')) { console.log('uebersprungen: noch keine renr (Bestellung noch nicht fakturiert).'); if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } },
            { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/Invoice/{{renr}}", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "Invoice", "{{renr}}" ] },
            "description": "Rechnungs-Detail inkl. Positionen (mit Tracking-IDs und Retouren). Wird uebersprungen, solange keine renr vorliegt."
          }
        },
        {
          "name": "Rechnung PDF",
          "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.collectionVariables.get('renr')) { if (pm.execution && pm.execution.skipRequest) pm.execution.skipRequest(); }" ] } } ],
          "request": {
            "method": "GET",
            "header": [ { "key": "Accept", "value": "application/pdf" } ],
            "url": { "raw": "{{baseUrl}}/api/v1/Invoice/{{renr}}/pdf", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "Invoice", "{{renr}}", "pdf" ] },
            "description": "Rechnung als PDF (Original aus dem Archiv)."
          }
        },
        {
          "name": "Offene Posten",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/v1/Invoice/overdue", "host": [ "{{baseUrl}}" ], "path": [ "api", "v1", "Invoice", "overdue" ] },
            "description": "Rechnungen mit Mahnstatus (offener Betrag)."
          }
        }
      ]
    },
    {
      "name": "5 · Bestand & Rueckstaende",
      "item": [
        {
          "name": "Warenbestand 9110378",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelBestand/9110378", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelBestand", "9110378" ] },
            "description": "Verfuegbarkeits-Status (0=nicht, 1=verfuegbar, 2=begrenzt). Benoetigt Freischaltung 'Warenbestand' – sonst HTTP 403."
          }
        },
        {
          "name": "Bestandsaenderungen ab Datum",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSArtikelBestand/lastchange/2026-06-01", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSArtikelBestand", "lastchange", "2026-06-01" ] },
            "description": "Nur geaenderte Bestaende seit Datum (yyyy-MM-dd) – effizient fuer den taeglichen Abgleich."
          }
        },
        {
          "name": "Rueckstaende ab Datum",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));" ] } } ],
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/DSReservierungen/fromdate/2026-06-01", "host": [ "{{baseUrl}}" ], "path": [ "api", "DSReservierungen", "fromdate", "2026-06-01" ] },
            "description": "Offene Rueckstaende ab Datum (noch nicht gelieferte Mengen)."
          }
        }
      ]
    },
    {
      "name": "6 · Abmelden",
      "item": [
        {
          "name": "Logout",
          "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status 2xx', () => pm.expect(pm.response.code).to.be.within(200, 299));", "pm.collectionVariables.set('accessToken', '');", "pm.collectionVariables.set('refreshToken', '');" ] } } ],
          "request": {
            "method": "POST",
            "header": [],
            "url": { "raw": "{{baseUrl}}/api/Account/logout", "host": [ "{{baseUrl}}" ], "path": [ "api", "Account", "logout" ] },
            "description": "Abmelden (invalidiert den Refresh-Token). Steht bewusst am Ende, damit 'Run Collection' vorher alles ausfuehrt. Loescht danach das gespeicherte Token."
          }
        }
      ]
    }
  ]
}
