API für externe Tools
Excel Power Query oder Power BI können die Daten live via API abrufen:
Aufträge JSON: /api/auftraege
Feedback JSON: /api/feedback
Filter Beispiel: /api/auftraege?from=2026-05-01&to=2026-05-31
🧮 Algorithmen-Übersicht
Alle Algorithmen die der Rechner intern nutzt — Zweck, Input, Output, kritische Parameter, Code-Zeile.
Sortiert nach Aufruf-Reihenfolge (von Upload bis Empfehlung).
1 · Excel-Parser (Upload)
parseKopfExcel(rows) · Auftragskopf
- Zweck
- Extrahiert Auftrags-Metadaten aus dem Advanter-Kopf-Excel: Auftragsnummer, Kunde, Adressen, Liefereinteilungen, Versandart, Verpackungsanweisung-Freitext, Sachbearbeiter, Objekt.
- Input
- Excel-Rows als 2D-Array
- Output
{auftragNr, kunde, adressen, liefereinteilungen, versandart, verpackungsanweisung, sachbearbeiter, ...}
- Code
- Zeile 4704
parseVerteilerExcel(rows) · Lieferverteiler
- Zweck
- Parst Lieferverteiler-Excel (Deichmann-Long-Format). Erkennt unique Adressen, Zentrallager-Kennzeichen, Motive pro Adresse, Cluster-Bildung (klein/mittel/groß/xxl/zentrallager).
- Input
- Excel-Rows
- Output
{unique_adressen, total_zeilen, pro_adresse, is_zentrallager}, Cluster-Aggregate
- Code
- Zeile 2622
parseProdExcel(rows) + parseTitelAusProduktion(rows) · Produktion
- Zweck
- Parser der Produktions-Positionsliste — extrahiert pro Titel: Motiv-ID, Format (B×H), Menge, Material-Beschreibung, Sortenart, KSt, Y-Präfix-Erkennung (Einlagerung, nicht versenden), gerillt/faltbar-Flag.
- Input
- Excel-Rows
- Output
- Array von
{titelId, format:{b,h}, menge, material_beschr, sortenart, kostenstelle, einlagerung, hat_vorverpacken}
- Code
- Zeile 2419 + 4735
2 · Sortenklassifikation & Verpackmodus
rollModusTitel(t) · Falt/Roll-Default
- Zweck
- Karton-unabhängiger Default-Verpackmodus pro Titel:
rigide · flach · kern · gerollt_verpackt. Basiert auf Sortenart, KSt-Präfix, rollbar-Flags.
- Regel
- Rigide (Alu-Dibond, PVC-Hartschaum, Wabenplatte) →
rigide. Papier/Textil/Folie → gerollt oder flach je nach Größe. Sublimation → faltbar, UV-Druck → rollen.
- Output
- Modus-String
- Code
- Zeile 1143
bestimmeVerpackModus(t, kartonVe) · Karton-abhängig
- Zweck
- Karton-abhängige Modus-Wahl (Fix Felix 2026-07-03): Wenn Motiv flach nicht in gewählten Karton passt aber gerollt schon →
gerollt_verpackt. Rigide/Kern-Modus bleibt unverändert (Regel-Muss).
- Input
- Titel + gewählte Karton-VE
- Output
- Endgültiger Modus für diesen Karton
- Code
- Zeile 1157
50 %-Rill-Regel (F4) · Faltbare Ware
- Zweck
- Gerillte/faltbare Ware belegt gefaltet nur ~50 % der Original-Grundfläche. Wird in Bin-Fit-Belegung angewendet damit A0-Karton mit Rille nicht als A0 sondern als ~A2 kalkuliert wird.
- Auslöser
- Produktionsliste enthält Rille-Sub-Position (Rill-Werk) für den Titel
- Code
- Zeile 1219 (F4-Kommentar)
3 · Bin-Fit-Belegung (Karton-Motiv-Zuordnung)
passtInKarton(t, karton) · Motiv-Karton-Fit
- Zweck
- Prüft ob Einzel-Motiv (flach/gerollt) in Karton-Innenmaße passt. Differenziert nach Modus.
- Regel
- Rigide →
platteFitInKarton() (Diagonal-Prüfung). Rollbar (kern/gerollt_verpackt) → bMin ≤ l (kürzeste Seite muss in Karton-Länge). Flach → bMax ≤ l ∧ bMin ≤ b.
- Code
- Zeile 1407
platteFitInKarton(maxCm, minCm, l, b, h) · 3D-Diagonal-Fit
- Zweck
- Rigide Platte kann in 4 Modi in Karton passen — nicht nur flach am Boden.
- Modi
- flach (max ≤ l ∧ min ≤ max(b,h)) · boden-diag (max ≤ √(l²+b²) ∧ min ≤ h) · seiten-diag (max ≤ √(l²+h²) ∧ min ≤ b) · quer-diag (max ≤ √(b²+h²) ∧ min ≤ l)
- Output
- Modus-Name oder
null
- Code
- Zeile 1682
motivPasstInKarton(analyse, kartonVE) · Auftragsweit
- Zweck
- Prüft ob alle Motive eines Auftrags in einen Karton-Typ passen. Semantik-Differenz Mixed-Aufträge (v6.8.4): Rollbar-Übergrößen bekommen extra Karton, Rigide-Übergrößen kommen auf Palette.
- Output
{flach, gerollt, rigide_ok, rollbar_ok, insgesamt_ok, warnung, hat_rigide, hat_rollbar, hat_kern}
- Code
- Zeile 1712
gruppiereFuerSammelrollen(titel) · Multi-Motiv-Rollen
- Zweck
- Fasst mehrere „gerollt_verpackt"-Motive zusammen in eine Sammelrolle, wenn sie den gleichen Karton-Slot bedienen. Reduziert Karton-Anzahl.
- Code
- Zeile 1441
4 · Karton-Empfehlung (Bin-Fit + Optimum-Score)
empfehleKartonMixNachBinFit(analyse, titel, adressen) · Kern-Bin-Fit
- Zweck
- Empfiehlt Karton-Set pro Filial-Adresse via Multi-Kriterien-Score. Kern-Rollen bekommen separaten CP-Karton, Rest-Motive kleinsten passenden Karton (min. 30 % Auslastung Ziel).
- Ansatz
- Ruft
findeOptimaleKartonKombi() — probiert alle sinnvollen Karton-Kombinationen durch, wählt niedrigsten Total-Score.
- Output
- Array
[{ve, menge_pro_adr}]
- Code
- Zeile 3392
bewerteKartonKombi(motiveProAdr, kombi_ves, anz_filial) · Multi-Kriterien-Score
- Zweck
- Bewertet eine Karton-Kombi für einen Auftrag mit Total-Score. Kombi = ∞ wenn Motive nicht abgedeckt.
- Score-Komponenten
- Fracht (Paletten × 55 €) + Handling-Zeit (Kartons × min × 0,50 €/min) + Karton-Material (1 €/Karton) + EU-PPWR-Leerraum-Strafe (20 €/Karton bei >50 % Leerraum)
- Konstanten
SCORE_KOSTEN.palette_eur=55 · arbeitsminute_eur=0.5 · karton_eur=1 · leerraum_strafe_eur_ppwr=20 · ppwr_leerraum_grenze=0.50
- Code
- Zeile 3250 (Konstanten Zeile 3239)
waehleOptimalenKarton(rolle_cm, artikel_pro_adr, gewicht_kg) · Fallback
- Zweck
- Regel-basierter Fallback wenn Multi-Kriterien-Score keinen Kandidaten findet. Kleinster Karton dessen Innenmaß die Rolle aufnimmt + genug Volumen für Artikel-Menge.
- Schwellen
- ≥160 cm → VE-0204.004 · ≥140 → VE-0204.003 · ≥120 → VE-0204.002 · ≥90 → dicht/schwer? Groß-Karton, sonst CP · ≥60 → Standard Größen · ≥40 → A3 · sonst A4
- Code
- Zeile 3210
empfehleStrategie(analyse) · Karton-Auswahl UI
- Zweck
- Baut initiale Karton-Auswahl-Map
{ve: menge_pro_adresse} für UI-Darstellung. Aggregiert Bin-Fit-Empfehlung + Sondergrößen-Wellpappe + Polybeutel (bei Sublimation) + Palette-Trigger.
- Palette-Trigger (Felix 2026-07-06)
- > 30 kg/Adr ODER > 175 cm Karton-Länge ODER > 10 Kartons/Adr
- Code
- Zeile 3432
5 · Strategien-Engine (Kosten-optimierter Versand)
findeVerpackungsstrategien(analyse, anz_filial, anz_zl, artikel_gesamt)
- Zweck
- Vergleicht bis zu 4 Strategien und liefert sortierte Liste (günstigste passende zuerst).
- Strategien
-
1) 1-Karton — alles in 1 Paket pro Adresse
2) 2-Karton-Split — schmaler CP-Karton für Kern-Rolle + kompakter Rest-Karton (2 Standard-Pakete statt 1 Sperrgut)
3) Palette-unterverpackt — Kartons auf Europalette an Zentrallager
4) Palette-direkt — ohne Karton auf Palette (nur bei Kundenanweisung oder rigide > 78 cm)
- Sortier-Rank
- ZL-only → alle Palette-* zuerst · palette_pflicht (30 kg/10 K/175 cm) → Palette-* zuerst · anz_zl > 0 → palette-unterverpackt · sonst → nach Kosten aufsteigend
- Code
- Zeile 2962
paketKosten(kartonLenCm) · Fracht-Approximation
- Zweck
- Grobe Fracht-Kosten-Schätzung pro Paket basierend auf Karton-Länge. Nicht auftragskonditions-genau — Richtwerte 2026.
- Staffel
-
> 175 cm → 45–95 € (DHL Sperrgut+ / Spedition)
> 120 cm → 15–30 € (DPD/GLS Sperrgut)
> 60 cm → 8–12 € (DHL/DPD Paket)
sonst → 5–8 € (DHL Paket)
- Code
- Zeile 2979
VERSENDER + PALETTE_CARRIER · Dienstleister-Stammdaten
- Zweck
- Statische Referenz-Tabelle für Versender-Empfehlung nach Auftragsprofil.
- Paket-Versender
- DHL Paket (31.5 kg / 120 cm / 300 cm-Gurt / 7 €) · DPD (31.5/175/300/7) · GLS (40/200/300/7) · DHL Sperrgut (50/175/360/25) · UPS (70/274/400/12) · DACHSER Palette (1000/220/999/60)
- Paletten-Speditionen
- DACHSER 60–120 € · DB Schenker/DSV 55–110 · DHL Freight 35–75 · Kühne+Nagel 40–80 · GLS FreightParcel 35–80 · DPD/UPS = kein Palette-DE
- Code
- Zeile 1636 (VERSENDER), 1649 (PALETTE_CARRIER)
kunde_will_palette_direkt · Freitext-Regex
- Zweck
- Erkennt Kundenwunsch „direkte Palette" aus Verpackungsanweisung- + Versandart-Freitext des Auftragskopfs/Verteilers.
- Regex
/palette.direkt|direkt.palette|ohne.karton|nur.palette|palette.ohne.karton|palettenversand|palette.per.spedition|spedition|stueckgut|stückgut/i
- Code
- Zeile 2971
6 · D1-Stammdaten (Ziel-Architektur)
verpackung_pool · 160 körperliche Verpackungsartikel
- Zweck
- Master-Stammdaten aller körperlichen Verpackungen aus Navision-300er. Ersetzt hardcoded
PALETTE_KAPAZITAET nach Schritt 3.
- Kategorien
- KARTONAGEN 29 · HÜLSEN 20 · VERSANDTASCHEN 11 · WELLPAPPE 8 · LADEMITTEL 47 · POLYBEUTEL 16 · SCHLAUCHFOLIE 10 · POLSTER 9 · STRETCH_UMREIFUNG 8 · STANZVERPACKUNG 2
- Advanter-Bridge
- 322/490 (66 %) matchen über
Info Artikelnummer Alt, 90 %+ bei physischen Kartons
- Migration
- 0008_verpackungspool.sql · 0009_verpackungspool_data.sql
sorten_klassifikation · Advanter-WG → Material-Klasse
- Zweck
- Map von 20 Advanter-Warengruppen auf Material-Klasse + Pack-Strategie. Für Auftragspositionen-Parser (Ziel 2 Zeit-Modul).
- Regeln (Felix 2026-07-06)
- Keder + UV → tube_only (Kern rollen) · Keder + Sublimation → karton_falt (faltbar) · SK-Folie → tube_only · Hartschaum/Alu → karton_rigide
Nearest-Neighbor · Handling-Zeit-Vererbung (kommt in Schritt 3)
- Zweck
- Für die 149 noch nicht kalibrierten Pool-Artikel: Handling-Zeit vom nächsten kalibrierten Anker erben (max Innenmaß-Differenz ≤ 10 cm pro Achse, nur innerhalb selber Kategorie).
- Anker
- 11 heute kalibrierte Kartons in
PALETTE_KAPAZITAET. Später überschreibbar bei BDE-Ist-Kalibrierung.
- Regel
- Felix 2026-07-06: „5–10 cm Unterschied → gleiche Zeit"
⚠️ Bekannte Regel-Lücken (Stand 2026-07-06)
Bug 1 — Versender-Widerspruch: Strategie „1-Karton Paketversand" zeigt DACHSER-Palette als Versender bei > 175 cm Länge. Ursache: paketKosten() gibt Sperrgut/Spedition-Preis zurück, Strategie-Titel bleibt „1-karton". Fix: bei Karton-Länge > 175 cm Strategie umbenennen in „Sperrgut / Spedition-Paket" oder auf Palette-Strategie umschwenken.
Bug 2 — Container mit 0 % Auslastung als „günstigste" gewählt: Bei sehr großen rollbaren Motiven (3000×2700 mm) matcht nur der 118 cm Container → wird zwangsläufig als Sieger gewählt trotz 0 % Volumen-Auslastung. Fix: PPWR-Leerraum-Strafe (20 €/Karton) im Score zu schwach — Faktor auf 60–80 € erhöhen oder Palette bevorzugen wenn Container mit < 5 % Auslastung „gewinnt".
Bug 3 — gerollt-verpackt-Rolle nicht abgedeckt: Motive T-3/T-4/T-5/T-6 im 666-Adressen-Test fallen mit „kein Karton für gerollt-verpackt-Rolle" durch. Ursache: bewerteKartonKombi filtert Kombi wenn kein Karton lang genug ist. Fix: Auto-Ergänzung eines CP-Kartons (VE-0204.*) als zweiter Karton in Kombi wenn Roll-Länge > Standardkarton.
Bug 4 — Palette-Trigger greift nicht bei großen Container-Kartons: Neue Regel kartonsProAdrSumme > 10 prüft Karton-Anzahl, nicht Karton-Größe. Wenn 1 Container-Karton pro Adresse, aber Karton = 118 cm lang: Regel triggert nicht. Fix: Zusatz-Trigger „Karton-Innenlänge > 100 cm → Palette empfohlen" oder „Karton-Volumen > 500 l → Palette".