4
Ideen
0
In Arbeit
608
Features
Ideen
4
Flowkom Print Agent für Mac
Nativer Print Agent für macOS mit CUPS-Integration, gleiche Supabase-API wie der Windows-Agent.
Kanal-Dashboard & Statistiken
Bestellvolumen, Umsatz und Performance pro Verkaufskanal (Otto, Temu, eBay, Kaufland, Webshop etc.) als Dashboard-Widgets und Reports.
Boxen-Picking (PROJ-297)
Wagen-Stammdaten (Box-Anzahl, optionale Sammelbox), neuer Picklisten-Profil-Modus box_picking. Picker bekommt beim Greifen direkte Box-Anweisung ("→ Box 5"), Multi-Order-Aufträge stehen am Pack-Tisch vorsortiert in Boxen, Versand-Flow unverändert. Optionale Sammelbox für Single-Item-qty-1-Aufträge.
Drucker-Zuweisung für Etiketten-Typen pro Workstation
Strukturelle Lücke im Etikettendruck-Modul: Print-Label-Dialog schreibt print_jobs ohne printer_id. Neue Tabelle label_type_printer_assignments analog zur Versand-Mapping-Tabelle, mit eigener Sektion „Etiketten" im Workstation-Drawer. Blockt den gesamten „An Drucker senden"-Pfad bis zum Fix.
In Arbeit
0
Aktuell nichts in Arbeit
Implementiert
608
PROJ-305 (intern PROJ-304 wegen ID-Race): Pickliste am Scanner-Gerät erstellen. Plus-Button '+ Neue Pickliste erstellen' über der Picklisten-Liste im Picking-Modul. Tap öffnet ein Bottom-Sheet mit aktiven Picklisten-Profilen + 'X pickbare Aufträge'-Counter pro Profil. Tap auf Profil mit Aufträgen → POST /api/picklists → 'PICKLISTE ERSTELLT'-Vollbild-Overlay → Modal schließt → Liste refreshed. Profile mit 0 Aufträgen ausgegraut. Keine Auto-Navigation — User entscheidet selbst was als nächstes. Kein Backend-Change, alle Endpoints existierten schon. Pattern 1:1 vom Replenishment-Modul (inline NewOrderModal).
Prominentes Buchungs-Bestätigungs-Overlay 'GEBUCHT' nach jeder erfolgreichen Buchung in allen 5 Buchungs-Modulen (LB-WE, Frei-WE, Umlagern, Plus, Minus). Bisheriges ScanFeedback war mit opacity 0.4 / 400ms / ohne Text viel zu subtil — User-Feedback 'wenn ich etwas buche bekomme ich keinerlei bestätigung angezeigt'. ScanFeedback erweitert um optionales text-Prop: mit Text → big mode (opacity 0.92, 1200ms, fontSize 48 fett mit Schatten, klar als Buchungs-Bestätigung lesbar), ohne Text → small mode wie bisher (für reine Scan-Events).
PROJ-295: Universal-Post-Scan-Card jetzt auch in Umlagern, Plusbuchung und Minusbuchung. Im by_article-Modus zeigt die App nach Artikel-Scan die ProductLocationsList aus PROJ-291 — jetzt mit Tap-to-select für Quell-Lagerplatz, FBA gefiltert, Sperr-Pill bei Sperrlager (ersetzt die bestehende inline-stockLocations-Implementierung, die FBA nicht filterte). Im by_location-Modus zeigt nach Lagerplatz-Scan eine neue LocationContentsList die Artikel mit Bild (32×32) + Tap-to-select. Tap setzt Menge=1 + Step=ready (einheitlich über alle Module per Memory-Regel). Max-Button neben QuantityInput füllt vollen Lagerplatz-Bestand (besonders nützlich bei Minusbuchung 'Lagerplatz leerräumen'). FBA-Lagerplatz-Scan bekommt 403 mit klarer Fehlermeldung. Wareneingang/Inventur/Picking/Replenishment unangetastet.
PROJ-291: Im Wareneingang (LB + Frei) zeigt die App nach dem Artikel-Scan eine Bestandsliste pro Lagerplatz (Top 3 + '+ N weitere'-Chip, sortiert nach Menge desc). FBA-Pool gefiltert via warehouses.is_read_only, Sperrlager bleibt drin mit '[Sperr]'-Pill in Amber. Bei Multi-Warehouse-Workspace kommt ein Lager-Präfix vor den Lagerplatznamen. Freier WE bekommt zusätzlich einen Artikel-Lookup-Step über /api/products/by-barcode — bei bekanntem Artikel volle Card mit Bild + Bestandsliste, bei unbekanntem Barcode bleibt der bisherige Flow als Fallback. Branch + Commit-Tag tragen historisch PROJ-290 wegen ID-Race mit der Cost-Breakdown-PR im Web-Repo.
Responsive Scaling für alle Android-Geräte (26 Dateien)
Auto-Logout nach konfigurierbarer Zeit
ConnectionContext — ein einziger Netzwerk-Listener statt pro Screen
Nachschub-Modul im Drawer-Menü ergänzt
ModuleCard mit optionaler Beschreibung
Nachfüllung / Replenishment Workflow (PROJ-94)
Auto-Confirm Picking ohne Mengenbestätigung
Text-to-Speech für Lagerplatz-Ansage
Kompakter Homescreen mit 2-Spalten Grid
Picking-Einstellungen (Mengenbestätigung, TTS)
Android-Navigationsleiste im Dark Theme
Wareneingang gegen Lieferantenbestellung (LB)
Picking komplett neu geschrieben (Scanner-optimiert)
Custom NumPad für Mengeneingabe
Produktbild-Anzeige
Lagerplatz-Vorschläge bei Einlagerung
Rescan für Menge +1, Lagerplatz-Scan bucht automatisch
Dual-Mode Flows (nach Lagerplatz / nach Artikel)
Burger-Menü Navigation
Scan-Validierung in allen Workflows
Konfigurierbarer Server-URL bei Aktivierung
Versionsbadge auf allen Screens
OTA-Update Check beim App-Start
Geräte-Aktivierung mit Pairing-Code
Worker-Login mit PIN
HID-Scanner-Integration (Timing-basiert)
Sammelkommissionierung / Picking
Umlagern zwischen Lagerplätzen
Plusbuchung (Bestandserhöhung)
Minusbuchung (Bestandsreduzierung)
Freier Wareneingang
Offline-Queue mit Auto-Sync bei Reconnect
Sound- und Vibrations-Feedback beim Scannen
Einstellungen (Sound, Vibration, Lautstärke, Tastatur)
Rebranding zu Flowkom Print Agent
Alle Abhängigkeiten in EXE eingebettet (pdfium.dll)
Automatische Versionierung bei jedem Build
Cross-Compilation von macOS ermöglicht
Silent ZPL Label Printing auf lokale Drucker
Silent PDF Label Printing via PdfiumViewer
Supabase Edge Function Integration (Polling)
Device Pairing mit 6-stelligem Code
Heartbeat und automatische Printer-Discovery
Windows Installer mit Inno Setup (Autostart, Voraussetzungsprüfung)
Self-contained EXE ohne .NET-Installation
GitHub Actions CI/CD Pipeline
PROJ-319: Picklisten-Tag-Filter Schema-Split — `tag_filters` JSONB aufgeteilt in zwei semantisch klare Konzepte: `must_have` (Einschluss, AND/OR-Toggle) und `must_not_have` (Ausschluss, immer AND). Behebt einen Live-Bug bei Pixkom, wo alle drei Standard-Profile (One-Scan, Multi, DHL Paket) `logic="OR"` mit reinen `HAS_NOT`-Regeln kombiniert hatten — strukturell wirkungslos (`HAS_NOT(A) ∨ HAS_NOT(B)` ist nur false wenn beide Tags). PL-2026-0240/0237/0236 hatten dadurch je 1-2 Aufträge mit Personalisierte-Artikel-Tag obwohl ausgeschlossen. Root Cause war nicht der Helper-Code (boole'sch korrekt), sondern dass das Schema HAS und HAS_NOT als gleichwertige Operatoren mit globalem Logic-Toggle modellierte — die Kombination HAS_NOT+OR ist damit strukturell unmöglich geworden. Migration backfillt deterministisch (4 Profile, kein Mixed-Fall im Bestand), Helper hat Read-Fallback für eine Release-Phase. UI: zwei klar getrennte Sektionen 'Aufträge müssen diese Tags haben' und 'Aufträge dürfen diese Tags NICHT haben'. Sofort-Daten-Hotfix der 3 betroffenen Pixkom-Profile von OR auf AND auf Production am 2026-05-15 vor Implementierung deployed. PR #267, Production-Migration verifiziert (alle 4 Profile sauber im neuen Schema), 23 Vitest-Specs grün, Independent-Code-Review clean.
PROJ-317 Kostenlose Ersatzlieferung sofort als bezahlt anlegen — Neuer Switch „Sofort als bezahlt markieren“ (Default an) im Replacement-Modus des OrderFormDialog; POST /api/orders/[id]/replacement akzeptiert mark_as_paid: boolean und setzt financial_status beim Insert auf 'paid' oder 'pending'. Spart einen manuellen Klick pro Ersatzanlage, Order erscheint direkt auf der Standard-Pickliste (PROJ-210-Filter status='open' AND financial_status='paid'). Nur im Replacement-Modus sichtbar, Edit/Normal-Anlage unverändert. Keine Migration. Deployed via PR #259.
PROJ-315: Drucker-Zuweisung für Etiketten-Typen pro Workstation. Neue Tabelle label_type_printer_assignments (Workstation × label_type → Primär+Fallback-Drucker) symmetrisch zur bestehenden shipping_method_printer_assignments. Workstation-Detail-Drawer bekommt zwei Sektionen 'Versandarten' + 'Etiketten' — der bestehende Form-Component wurde via entityKind-Pattern generalisiert. Print-Label-Dialog macht jetzt einen Lookup auf die neue Tabelle vor print_jobs.insert und schreibt printer_id mit; ohne Zuweisung erscheint ein Toast mit Hinweis auf Settings statt eines hängenden Print-Jobs. Behebt strukturelle Lücke aus PROJ-99/304/306/312/314 (der gesamte 'An Drucker senden'-Pfad im Etikettendruck-Modul hatte zuvor keinen Drucker).
PROJ-306: Etikettenvorlagen — Multi-Field, Marke, Default-Vorlage. Vorlagen können jetzt mehrere Text-Felder gleichzeitig anzeigen (z.B. Name + SKU + Marke), die Marke ist als neue Feld-Option dazugekommen (Lookup gegen `manufacturers.brand_name`), und Vorlagen können als "Standard" für ihre Kategorie markiert werden — im Druck-Dialog automatisch vorausgewählt (Workspace-Default vor System-Default). Plus Bug-Fix: Toast bei Anlege-Fehler reicht jetzt die DB-Fehlermeldung durch (vorher anonym „Fehler beim Erstellen:"). DB-CHECK-Constraints für Whitelist-Werte hinzu, damit ungültige Enum-Werte nicht mehr silent in der DB landen. Migration backfilled bestehende Single-Field-Vorlagen verlustfrei ins neue Multi-Field-Format.
PROJ-303: Amazon Carrier + Versandart Mapping. Behebt strukturell den Live-Bug 2026-05-07 (17+ FBM-Orders dauerhaft mit Amazon-Fehler 25 weil Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` einen ungültigen CarrierCode-Enum-Wert produzierte — der Hotfix #240 mit Commit-Tag PROJ-301 hatte das Symptom bereits behoben). Neues Mapping-Feld `amazon_method_overrides` parallel zum legacy `carrier_overrides` (Backward-Compat 1 Release), 3-Spalten-Settings-UI: Flowkom Versandart | Amazon Transportdienst (Combobox aus AMAZON_CARRIER_CODES-Whitelist mit ~63 SP-API-XSD-Enum-Werten, ungültige Werte rot mit Save-Block) | Amazon Versandart (Freitext, leer = Element weglassen). Resolver `resolveCarrierAndMethodForOrder` nutzt neue Map zuerst, fällt auf Legacy-Pfad zurück (PROJ-293-Manual-Tracking-Verhalten unverändert). Idempotente Backfill-Migration kopiert bestehende `carrier_overrides`-Daten als `{carrier: <wert>, method: ""}` ins neue Schema, skippt Workspaces ohne Daten. KEIN DEFAULT_SHIPPING_METHOD_MAP (vermeidet stillen Behavior-Change bei live-only-Testing). 13 Vitest-Specs grün (10 resolveCarrierAndMethodForOrder + 3 buildShipmentConfirmationXml), TS+Lint clean, Staging+Production-Migration ohne Fehler durchgelaufen. SP-API-Doku-Recherche bestätigt: CarrierCode = strikter XSD-Enum, ShippingMethod = Freitext. INDEX wurde von PROJ-301 auf PROJ-303 retagged nach Race mit PROJ-301 (LB Flexible Kostenstruktur, #233) und PROJ-302 (LB-Kanban Cost-Pills, #237) — Hotfix-Commit-Tag bleibt PROJ-301 per Memory-Regel.
PROJ-302: LB-Kanban Cost-Presence-Pills. Drei kleine Pills auf den LB-Kanban-Karten (Truck/Landmark/Package für Fracht/Zoll/Sonstige) zeigen auf einen Blick, ob für eine Lieferantenbestellung Kostenpositionen erfasst wurden. Pills nur sichtbar wenn `purchase_order_costs`-Zeilen vom jeweiligen Typ existieren — bei leeren LBs bleibt die Card unverändert kompakt. Tooltip beim Hover zeigt den EUR-aggregierten Betrag pro Typ (FX-konvertiert via `convertCostLineToEur`, de-DE-Format mit Komma-Dezimaltrennung und Euro-Symbol). Visueller Stil parallel zu IncotermBadge/TransportModeBadge (shadcn `Badge variant=outline`, kompaktes 3x3-Icon). Approach: separater Endpoint `GET /api/purchase-orders/cost-summary?ids=...` (cap 200, RLS-isoliert über bestehende Policy auf `purchase_order_costs`) plus dedicated TanStack-Query-Hook, der nur im Kanban-Modus aktiv ist — der bestehende `/api/purchase-orders`-Listen-Endpoint (mit der PROJ-294-Search-RPC) bleibt unangetastet, kein Migrations-/Schema-Risiko. 12 neue Vitest-Specs (7 Endpoint-Boundary inkl. ID-Cap, malformed-UUIDs, FX-Konvertierung + 5 Component-Render mit Umlaute-Check), Lint+Build clean.
PROJ-301: Lieferantenbestellung — Flexible Kostenstruktur mit Multi-Currency. Ablöse der vier festen Kosten-Slots (`freight_cost`/`customs_cost`/`other_costs_eur`/`other_costs_foreign`) auf `purchase_orders` durch zwei neue Tabellen `purchase_order_costs` (N Zeilen pro LB mit Typ Frachtkosten/Zollkosten/Sonstige + Beschreibung + Betrag + Währung + Verteilung) und `purchase_order_fx_rates` (ein Kurs pro genutzter Fremdwährung pro LB, 'Kurs abrufen' gegen EZB/Frankfurter API). Frachtkosten in Fremdwährung sind jetzt erfassbar (vorher nur EUR), jede Position hat eigene Verteilung (Volumen/Warenwert/Menge), Beschreibung Pflicht bei Typ=Sonstige. RPC `calculate_landed_costs` komplett neu geschrieben — iteriert Cost-Lines, FX-konvertiert in EUR, aggregiert pro Allocation-Method UND pro Typ → `goods_receipt_items.{freight,customs,other}_allocation_eur` bleiben für Profitbutler-Reporting befüllt. Auto-Recalc-Trigger auf beiden neuen Tabellen + Advisory-Lock gegen Doppelberechnung sichern rückwirkende Einstandspreis-Synchronität bei jeder Korrektur (auch für Wareneingänge die Wochen zurückliegen). Migration backfillt Bestand atomar inkl. Parity-Check (Toleranz 0,01 €) gegen vorherige `landed_cost_eur` — Drift bricht Migration ab. UI-Tab-Rewrite: shadcn-Table mit Inline-Edit, Empty-State, Live-EUR-Summe + per-Typ-Aufschlüsselung mit FX-Konvertierungs-Hinweis. Deutsche Decimal-Eingabe (Komma) korrekt geparst via defaultValue+onBlur. Details-Sidebar 'Summen' synchronisiert via geteiltem TanStack-Query-Cache — Edits propagieren sofort in beide Views. Branch + Migration tragen Tag PROJ-299 (initial-Race), INDEX wurde nach zweiter Race retagged auf PROJ-301. Alte Spalten erst per Folge-Migration nach 1 Woche stabilem Rollout gedroppt (PROJ-302 geplant).
PROJ-295: Neuer Mobile-Endpoint /api/mobile/storage-locations/[id]/contents — liefert Artikel + Bestand pro Lagerplatz, sortiert nach Menge desc, gefiltert auf nicht-archivierte Artikel im Mapper. FBA-Lagerplätze (warehouses.is_read_only) geben 403 mit klarer deutscher Fehlermeldung. Pure mapper + Route mit Zod-UUID-Validation + workspace-scoped Queries. 5 Vitest-Tests grün. Companion zu PROJ-291. Wird in Mobile-Komponenten ProductLocationsList (jetzt mit onSelect-Erweiterung) und neuer LocationContentsList genutzt — siehe Mobile-Eintrag 1.8.4.
PROJ-291: Neuer Mobile-Endpoint /api/mobile/products/[id]/locations für die Wareneingang-Erweiterung der Mobile-App. Liefert Bestände pro Lagerplatz (Menge desc), filtert FBA-Pool serverseitig via warehouses.is_read_only, Sperrlager bleiben drin (UI-Markierung downstream). Standard authenticateRequest()-Auth, Zod-UUID-Validation, defensiver Null-Join-Filter im Mapper, 5 Vitest-Tests. Branch + Commit-Tag historisch PROJ-290 (ID-Race mit Cost-Breakdown-PR #219), INDEX-Eintrag retagged auf PROJ-291.
PROJ-289: Bestellvorschlag rechnet ab sofort mit Total-Inventory. current_stock umfasst Hauptlager + FBA-Pool, Sperrlager bleibt raus (Discriminator warehouses.is_read_only aus PROJ-177). Behebt drei stille Bugs aus PROJ-251/PROJ-287: reine FBA-Artikel mit leerem Hauptlager bekamen mit Toggle 'Nur Tage mit Bestand' Vorschlag 0 obwohl sie sich verkauften, Backwards-Rekonstruktion startete bei Hauptlager-Stand und zog FBA-Movements mit ab (Drift), und FBA-Demand wurde zwar gezaehlt aber FBA-Bestand nicht abgezogen. Response erweitert um fba_stock fuers UI-Breakdown. Keine DB-Migration. PR #218.
PROJ-288: LB-PDF Produkt-Cell. Produkttitel wrappt zweizeilig statt hartem Ellipsis-Cut bei 28/35 Zeichen, Lieferantenbeschreibung (supplier_products.supplier_product_description) erscheint klein/grau als optionale 3. Zeile unter SKU/EAN. Bestehende Spalte 'Lief.-Art.-Nr.' bleibt rechts. Live-Lookup zur PDF-Zeit, keine DB-Migration. Dynamische rowHeight pro Item, alternierender Hintergrund und Page-Break-Check ziehen die echte Hoehe. PR #217.
PROJ-287: Bestellvorschlag auftragsbasiert. Tagesverbrauch wird aus order_line_items + orders berechnet statt aus stock_movements (PROJ-274 wird abgelöst). Behebt Live-Vorfall SKU 100147 — eine einzelne PROJ-177-Drift-Reset-Zeile (-442 Einheiten am 09.04.) hatte den Vorschlag auf 20,17 Einheiten/Tag aufgeblasen, obwohl real nur 45 Bestellungen in 30 Tagen liefen (~1,5/Tag). Stornos und Voll-Refunds zählen nicht, Bundle-Verkäufe schlagen via Komponenten-Expansion durch, Datum über created_at. Neue SECURITY-INVOKER RPC calculate_supplier_order_consumption mit UNION ALL über direkte und Bundle-Komponenten-Sales. Frontend, Schema und Toggles unverändert. PR #216.
PROJ-283: Einkaufsliste 'Alle löschen'-Button. Toolbar-Button neben 'Produkt hinzufuegen' mit Trash-Icon, leert die komplette Einkaufsliste workspace-weit nach Confirm-Dialog. Neuer DELETE-Endpoint /api/shopping-list/items (rate-limited 10/min, optional ?supplier_id=<uuid> für lieferantenscharfes Leeren) gibt deleted-Count zurück, damit der Toast die exakte Anzahl entfernter Artikel zeigt. Confirm-Dialog ist destructive-styled (rot) und nennt Anzahl Artikel und Lieferanten beim Namen. Button erscheint nur wenn die Liste nicht leer ist.
PROJ-282: Bestellvorschlag berücksichtigt Einkaufslisten-Mengen. Analog zum bestehenden 'Im-Zulauf-Bestand einbeziehen'-Toggle gibt es jetzt einen zweiten Toggle 'Mengen auf Einkaufsliste einbeziehen' (Default an). Mengen, die für diesen Lieferanten bereits auf shopping_list_items stehen, werden aus der Vorgeschl. Menge abgezogen — verhindert doppelten Einkauf wenn man den Vorschlag mehrfach durchläuft oder zwischendurch manuell Artikel auf die Liste setzt. Lieferantenscharf: gleiche SKU für anderen Lieferanten auf der Einkaufsliste zählt NICHT mit. Schema-Erweiterung consider_shopping_list, neue Map onShoppingListByProduct, Subtraktion in der MOQ-Formel: max(forecastedNeed - alreadyOrdered - currentStock - onShoppingList, 0). Response-Item bekommt on_shopping_list-Feld, Tabelle bekommt sortierbare Spalte 'Auf Einkaufsliste' zwischen 'Im Zulauf' und 'Vorgeschl. Menge', Mobile-Card-Detail-Grid bekommt eine Zeile mehr.
PROJ-279: Bestellvorschlag — Lieferanten-Produkt aus Vorschlag ausschließen. Neues Flag supplier_products.exclude_from_purchase_suggestion (BOOLEAN DEFAULT false) ermöglicht es, einzelne Lieferanten-Produkt-Mappings dauerhaft aus dem Bestellvorschlag zu entfernen — z.B. für Auslaufprodukte, manuell bewirtschaftete Artikel, oder einzelne zu teure Lieferanten einer SKU ohne andere Lieferanten der gleichen SKU zu blockieren. Default false = bestehendes Verhalten für alle Live-Daten, kein Bestandsdaten-Eingriff. UI: per-Row EyeOff-Icon im Vorschlag (Desktop) bzw. Aus-Vorschlag-ausschliessen-Button (Mobile) mit optimistic remove und Success-Toast inkl. Reaktivierungs-Hinweis. Reaktivierung via zweiter Checkbox im Lieferanten-Zuordnungs-Dialog (analog is_preferred). API: neuer rate-limited PATCH-Endpoint /api/supplier-products/[id]/exclude-from-suggestion mit Workspace-Ownership-Check. Calculate-Route filtert markierte Mappings raus und gibt supplier_product_id mit zurück. Partial-Index auf (supplier_id) WHERE exclude=false hält den Suggestion-Pfad schnell. Branch trägt Tag PROJ-278 wegen ID-Race mit dem parallel gemergten Allokations-UI-Refactor.
PROJ-278: Allokations-Dropdowns inline in den Kosten-Cards des LB-Detail-Overlays. UX-Folge zu PROJ-271 — statt einer separaten 'Verteilmethode pro Kostenart'-Card mit drei Zeilen ist die Allokations-Auswahl jetzt direkt in den Frachtkosten-, Zollkosten- und Sonstige-Kosten (EUR)-Cards integriert (jeweils als 'Verteilung'-Zeile unter dem Betrag-Input). Hinweis in der Sonstige-Card markiert, dass die Methode für EUR und Fremdwährung gemeinsam gilt (es ist ein einziges Bucket im RPC). Reine UI-Restrukturierung, RPC und Datenmodell unverändert. Branch trägt Tag PROJ-277 wegen ID-Race mit dem Bulk-Add-Final-Fix; INDEX und commit nutzen PROJ-278.
PROJ-276 (TARIC): LB-Detail-Overlay zeigt jetzt den TARIC-Code des Produkts inline neben der SKU in der Positionsliste (Format '<sku> · TARIC <code>'), damit Einkauf und Lager den Zolltarifcode sehen, ohne den Artikel öffnen zu müssen. Wird nur gerendert, wenn das Produkt einen Code hat (PROJ-126), sonst bleibt die Anzeige bei der bisherigen reinen SKU. Technisch: taric_code wurde durch den PO_DETAIL_SELECT-Join, den POLineItem.product-Type und PositionRowData gezogen; itemToRow mappt aus dem Join in das Row-Modell. Reine UI-Erweiterung im Detail-Overlay, keine DB-Migration. Branch + Commit-Tag bleiben auf PROJ-275 wegen ID-Race mit dem Mixed-Allocation-Hotfix in v1.84.017 (PR #201 wurde gemerged während dieses Feature im Review war).
PROJ-274: Bestellvorschlag — FBA-Bedarf einbeziehen + Tabellen-Polish. Bisher zählten nur pick/transfer_out-Movements als Verbrauch; FBA-Verkäufe (gebucht als amazon_fba_sync, siehe PROJ-177) wurden ignoriert, sodass für rein FBA-vertriebene SKUs Bestellvorschlag stets 0 herauskam. Fix: amazon_fba_sync ist jetzt Teil der Consumption-Movement-Types, aber nur negative Quantity-Changes zählen — positive Werte sind Inbound-Versand zu Amazon oder Drift-up-Korrekturen und dürfen nicht als Verkauf gezählt werden. Production-Verifikation: 1000 letzte amazon_fba_sync-Movements zeigten 874 negativ vs 126 positiv. Plus UI-Polish in der Bestellvorschlags-Tabelle: Sticky-Header bleibt beim Scrollen sichtbar (max-h-Container mit overflow-auto), alle Spalten sind klickbar sortierbar mit ArrowUp/ArrowDown-Icon-Indikator, neues Suchfeld filtert live nach Produktname und SKU, Footer zeigt bei aktiver Suche 'X von Y (gefiltert)'. Default-Sort bleibt 'Vorgeschl. Menge' absteigend (heutiges visuelles Verhalten, jetzt explizit). Mobile-Cards respektieren die Suche ebenfalls. Bewusst NICHT in Scope: Lager-Auswahl-Filter — erstmal beobachten, ob FBA-Einbeziehung allein reicht.
PROJ-271: Hybrid-Allokation für Nachlaufkosten (Fracht / Zoll / Sonstige). Bisher wurde eine einzige cost_allocation_method (volume / value / quantity) für Fracht UND Zoll UND Sonstige zugleich genutzt — konzeptuell falsch, weil Zoll im EU-Recht stets ein Prozentsatz auf den Warenwert ist und Fracht physisch nach Volumen abgerechnet wird. Drei neue Spalten auf purchase_orders (freight/customs/other_allocation_method), Default für neue LBs: freight=volume, customs=value, other=value. Bestehende LBs erben rückwärtskompatibel ihre alte Methode in alle drei Felder, kein Verhaltenswandel auf historischen FIFO-Werten. RPC calculate_landed_costs() berechnet drei separate Shares pro Kostenart mit Mixed-Mode-Normalisierung (Items ohne Maße im Volume-Modus → qty-Anteil, Σ shares = 1 garantiert). Neue UI im LB-Detail mit drei Dropdowns. landed-cost-preview.ts spiegelt die DB-Logik exakt. 9 Vitest-Tests, 84 von 84 Tests im purchase-order-Bereich grün. Konkret betraf das LB-10056/SKU 200155: Differenz zwischen volume- und value-allokiertem Zoll war ~0,07 €/Stk (102,75 € vs. 82,77 € auf 300 Einheiten).
PROJ-265: BEFORE-DELETE-Trigger auf orders fängt Order-Hard-Delete atomar in der Transaktion ab — App-Hook-Snapshot ist jetzt redundante Defense-in-Depth statt einzige Verteidigung.
PROJ-265: DB-Trigger auf order_line_items + orders.status UPSERTen Reservierungsänderungen automatisch in inventory_sync_queue — Shopify-Bestandssync ist jetzt resilient gegen App-Layer-Hook-Failures (verhindert Drift wie zuletzt SKU 200266: Shopify zeigte 998 statt 997).
PROJ-262 Produkt-SKU Auto-Vergabe & Nummernkreis: Konfigurierbarer Nummernkreis für Produkt-SKUs analog PROJ-65/120 — vierte Card im Nummernkreise-Tab unter Einstellungen → Allgemein. Auto-Vergabe greift NUR bei manueller Produkt-Anlage und im Variantengenerator; Importe (Shopify, Amazon, CSV) behalten ihre Original-SKU bewusst, weil deren SKU der Lookup-Key fürs Re-Import-Dedupe ist. Atomarer `generate_product_sku()` RPC mit Retry-Loop gegen den bestehenden Unique-Constraint `products_unique_sku_per_workspace` zählt automatisch über Kollisionen mit existierenden SKUs hinweg (z.B. wenn jemand parallel manuell `200270` setzt). POST `/api/products` neu (war vorher nur GET), Frontend-Anlage geht über den neuen Endpoint statt direktem `supabase.from().insert()`. Variantengenerator fällt auf RPC zurück wenn Kind-SKU leer bleibt. PUT `/api/settings/workspace/product-sku-sequence` mit monotonic-guard `>= current` für den Startwert-Setter (anders als die anderen drei Nummernkreise immer verfügbar, weil Bestandskunden mit existierenden SKUs den Counter initial setzen müssen — User-Initial: 200270). QA-Härtung: POST-Schema mit `.strict()` + expliziter Allowlist (~30 Felder) gegen Mass-Assignment, Retry-Loop on 23505 (max 3) für Race gegen parallel manuell vergebene SKU, kein `parentSku || "PROD"`-Fallback mehr im Variantengenerator (sonst inkonsistente Eltern/Kind-SKUs wenn Eltern auto-vergeben wird). 24 neue Vitest-Tests (Helper, POST-Route, Variantengenerator). Doku in flowkom-docs unter einstellungen/allgemein.mdx ergänzt.
PROJ-260: Produkt-Notizen + Dateien-Tab-Restrukturierung. Neuer Main-Tab 'Notizen' im Produktdetail analog Aufträge/LBs (product_notes-Tabelle mit RLS, eigene Notizen editier-/löschbar). Die Main-Tabs 'Dateien' und 'Dokumente' sind zu einem Main-Tab 'Dateien' mit Subtabs Cloud/Dokumente zusammengefasst — Tab-Count im Strip bleibt gleich. Zusätzlich: Shared NoteContent-Renderer macht URLs in Produkt-, Auftrags- und LB-Notizen klickbar (öffnet in neuem Tab, erkennt trailing Punctuation).
Amazon FBM Bearbeitungszeit (lead_time_to_ship_max_days) pro SKU pflegbar — im Produktdetail-Plattformen-Tab und im Integrations-Listings-Manager inkl. Bulk-Action (PROJ-255).
PROJ-254 FBA Bulk-Backfill UI-Modal: Der in v1.81.000 als CLI-only gedachte Admin-Endpoint bekommt doch eine UI — neuer Button „Bulk-Backfill…" im FBA-Bereich der Amazon-Settings-Seite öffnet einen Dialog mit Days/Concurrency-Inputs und Start-Button. Der Dialog verbindet sich direkt per `fetch` + `ReadableStream`-Reader mit dem SSE-Endpoint, rendert Live-Progress mit Badges (processed/total, ok/skipped/failed), Progress-Bar und gescrolltem Log (max 500 Zeilen). Abort-Button bricht den Stream sauber via AbortController ab. Dialog ist nicht schließbar während aktiv (Toast-Hint). Nur bei FBA sichtbar, FBM sieht den Button nicht. Bash-Script Default-Host mit korrigiert (`flowkom.app` → `app.flowkom.de`).
PROJ-254 Amazon FBA Bulk-Backfill (One-Shot Admin): Admin-SSE-Endpoint `POST /api/admin/amazon/backfill-fba` für einmalige großvolumige FBA-Imports (10k+ Orders in einem Rutsch). Zieht **einen einzigen** Shipments-Invoicing-Report statt 40× via Auto-Cron, paginiert `getOrders` mit NextToken und ruft processOne concurrent mit Limit 3 auf (bleibt unter Amazon's 30-getOrder-Burst). Live-Progress als Server-Sent-Events, Bash-Looper `scripts/run-fba-backfill.sh` streamt pro Order eine Terminal-Zeile. Idempotent (bestehender `amazon_order_id`-Upsert überspringt schon importierte Orders — erscheint als `order_skipped`-Event). Admin-only, Workspace-scoped, keine UI — bewusst CLI-only damit keiner den Bulk-Import versehentlich klickt. Realistische Dauer: 1–2 h für 10 000 EU-Orders statt 20h+ via Auto-Cron. Keine DB-Migration.
PROJ-253 Versandfehler-Aufträge im Pickliste-Versand-Scan werden ans Queue-Ende gestellt: Wenn ein Auftrag einen DHL- oder Deutsche-Post-Internetmarken-Fehler geworfen hat (offener `dhl_error_log`-Eintrag), sortiert der Picklist-Orders-Endpoint ihn ans Ende der Liste — der Quick-Scan-Flow überspringt ihn automatisch und greift sich zuerst fehlerfreie Aufträge für den gescannten Artikel. Fehlerhafte Aufträge bleiben in der Tabelle sichtbar mit einem roten „Versandfehler"-Badge, damit klar ist warum der Auftrag nicht drankommt. Korrektur läuft wie gehabt über den Versandfehler-Tab; nach erfolgreichem Retry setzt der Auto-Resolve-Pfad den Auftrag automatisch zurück in die reguläre Chronologie.
PROJ-250 FBA-Tracking sichtbar im Auftragsdetail: Neuer Card-Block „Versand durch Amazon" unter der Versandart zeigt Tracking-Nummer + Carrier-Badge + Copy-Button pro FBA-Sendung. Greift auf `shipping_labels`-Rows mit `shipping_task_id IS NULL` (Amazon versendet selbst, keine Flowkom-Packtask). Multi-Paket-FBA rendert mehrere Cards.
PROJ-251 Bestellvorschlag OOS-Korrektur: Neue Option „Nur Tage mit Bestand berücksichtigen" teilt den Verbrauch durch die Tage, an denen tatsächlich Bestand vorhanden war (rückwärts aus `stock_movements` rekonstruiert), statt stur durch den kompletten Analysezeitraum. Verhindert systematische Unterschätzung des Bedarfs bei Artikeln mit OOS-Phasen. Default aus — bestehendes Verhalten bleibt unverändert.
PROJ-250 Amazon FBA-Tracking-Import & Billing-Konsistenz: Der bestehende Shipments-Invoicing-Report (EU) bzw. -Tax-Report (NA) wird nun zusätzlich auf `carrier`, `tracking-number` und `shipment-date` pro Shipment-Zeile geparst. Für jede FBA-Order landet pro versendetem Paket eine eigene Row in `shipping_labels` (idempotent via `(order_id, tracking_number)`-Precheck und neuem Composite-Index). `orders.shipped_at` wird beim ersten Import auf die früheste Shipment-Date gesetzt — NULL-guarded via PostgREST `.is("shipped_at", null)`, damit manuell eingetragene Werte nie überschrieben werden. Billing-Snapshot wurde empirisch auf Production verifiziert: der bestehende Mapper `buildAmazonOrderAddressFields` füllt bereits alle 14 `billing_*`-Felder korrekt aus Shipping-Daten (Amazon liefert strukturell keine separate Rechnungsadresse — Bill=Ship ist Branchenstandard wie bei JTL/Sellerboard/Linnworks). Migration: `shipping_labels.label_pdf_url` auf nullable (FBA-Rows haben kein eigenes Label-PDF). Helper `upsertFbaShipments` ist try/catch-hardened — Netzwerk-Blips dürfen den Import nicht aufreißen. Multi-Paket-Orders zeigen alle Tracking-Nummern automatisch im bestehenden Versandhistorie-Sheet (PROJ-218). FBM-Pfad komplett unberührt durch `channel === "FBA"`-Guard. Kein neuer SP-API-Call, kein neuer RDT-Scope — nutzt denselben Report wie PROJ-175.
PROJ-249 Amazon Feed-Historie (Audit-Trail): Neue Tabelle amazon_feed_history + privater Storage-Bucket amazon-feeds. Jeder SP-API-Feed-Submit (inventory, zero_out, dry_run) persistiert Metadaten + JSON-Payload. RLS workspace-scoped, signed-URL-Downloads, Retention 90 Tage analog PROJ-47.
PROJ-249 Feed-Vorschau (Dry-Run) unter /dashboard/settings/integrations/[id]/amazon/feed-preview: Zeigt pro Marketplace den nächsten Inventory-Feed, Item-Count, SKU-Liste mit qty, Raw-JSON-Accordion, JSON-Download. Durchläuft denselben Code-Pfad wie der echte Push ohne submitFeed. Jeder Dry-Run wird in der Feed-Historie protokolliert.
PROJ-249 FBA Zero-Out-Admin-Button: Einmalige gelbe Warning-Card auf der Amazon-Integration-Seite, die für alle Listings mit amazon_fba_inventory-Eintrag einen JSON_LISTINGS_FEED mit qty=0 über den FBM-Kanal sendet. Admin-only, AlertDialog-Confirm, idempotent. Neutralisiert historisch fälschlich übertragenen FBM-Bestand für FBA-SKUs bei Amazon, ohne den FBA-Bestand anzufassen.
PROJ-249 FBA-Badge mit Tooltip in der Listings-Management-Tabelle: `FBA • Sync aus` macht explizit, dass für FBA-Listings kein Flowkom-Bestand an Amazon übertragen wird (Amazon verwaltet FBA-Bestand selbst).
PROJ-248 PR-g2: DB-Drop der Legacy-Shipping-Spalten. 7 Spalten auf `orders` (shipping_company, shipping_first_name, shipping_last_name, shipping_recipient_name, shipping_address_line_2, shipping_address_line_3, shipping_address_category) + 3 auf `customers` gedroppt. `customer_addresses` unberührt (Billing nutzt Canonical-Felder weiter). `orders_with_totals`-View wird mit-dropped und neu erstellt (PostgreSQL-Constraint). 16 Dateien Code-Cleanup. Finale Abschluss der PROJ-248-Serie nach 10 PRs.
PROJ-248 Shipping Address DHL-Flat Schema — Lieferadressen folgen jetzt 1:1 dem DHL-Geschäftskundenportal-Schema (name1/name2/name3 + street + post_number + PLZ/Ort/Bundesland/Land/Telefon). UIs in Customer-Dialog, Order-Edit-Dialog, Manual-Create-Dialog und Versandfehler-Cockpit nutzen einheitliches DHL-Portal-Layout mit 4-Adresstyp-Radio (Straße/Packstation/Filiale/Postfach), NAME 1/2/3-Block mit Tauschen-Button für Amazon-B2B-Vertauschungs-Fälle und mode-aware Straße-Block. Shopify- und Amazon-Importer schreiben direkt in die flat-Felder. DHL- und DP-Internetmarke-Ship-Routes lesen flat. Strukturelle Bug-Behebung: Amazon-BuyerName kann nicht mehr ins DHL-/DP-Label als Empfängerzeile rutschen (z.B. „Amazon Business EU SARL"-Fall). Billing-Adressen bleiben bewusst auf Canonical-Schema für Anrede + USt-IdNr. + ZUGFeRD-Export. Shared Helper canonicalNamesToFlat + canonicalRowToShippingAddress fasst vorher 4× duplizierte Mapping-Logik zusammen und fixt nebenbei latenten Whitespace-Bug.
PROJ-246 Profitbutler Bestandsbewertung zeigt jetzt den Zulauf aus bezahlten und genehmigten/verschickten Lieferantenbestellungen als Pseudo-Lager „Im Zulauf" (plus „Gesamt inkl. Zulauf"-Zeile und Sublabel am Lagerwert-Tile). Bewertungsbasis: offene Menge × Stückpreis / Wechselkurs — Nachlaufkosten sind bewusst nicht enthalten, weil sie erst beim Wareneingang final allokiert werden. Teilweise oder vollständig erhaltene LBs fallen automatisch raus, damit nichts doppelt zählt; die erhaltenen Stücke laufen weiter durch FIFO.
PROJ-245 Auftragspositionen im Versandhistorie-Sheet: Im Side-Sheet der Versandhistorie werden jetzt die Auftragspositionen mit Produktbild, Titel, SKU und Menge angezeigt. Badges für Freipositionen, Service-Artikel und archivierte Produkte. Bild-Fallback auf deleted_product_image_url für gelöschte Produkte (PROJ-119). Reine UI-Erweiterung — Daten kommen bereits über useOrder().
PROJ-244 Picklisten-Profile-Badge mit Bestandsprüfung: Die Auftragszahl auf den Profile-Karten zeigt jetzt die tatsächlich picklistbare Anzahl — vorher nur Filter-Match, weichte beim Klick auf 'Pickliste erstellen' häufig ab. Neuer Shared-Helper `computeFulfillableOrders` wird von Badge, Preview-Count und Create gemeinsam genutzt (Drift-Prevention per Konstruktion): Bundle-Expansion (PROJ-184), Service-Artikel-Ausschluss (PROJ-98), Stock-Query mit Lager-/Lagerplatz-Filter, Reservierungs-Abzug (PROJ-195), Greedy-Fulfillment. Info-Icon + Tooltip neben Badge wenn Aufträge wegen fehlendem Bestand rausfallen. Unmatched-Banner bleibt filter-basiert (Konfigurationslücke ≠ Bestandslücke).
Produktfilter: Neue Option 'Ohne Lieferant' im Lieferanten-Filter (analog zu 'Ohne Marke' und 'Keine Versandart'). Findet alle Produkte ohne supplier_products-Zuordnung — ideal, um Artikel zu identifizieren, bei denen der Einkauf noch nachpflegen muss.
PROJ-241 PR-a — Foundation: CanonicalAddress TypeScript-Type + 5 Mapper (orders, customers, customer_addresses, billkom JSONB, workspaces) + 7 UI-Primitives (AddressFields, AddressFormSkeleton, AddressCompanyBlock, AddressPersonBlock, AddressStreetBlock mit Packstation-Detection, AddressLocationBlock mit CountryCombobox, AddressContactBlock) + Zod-Validation-Schemata (shipping/billing/sender) + 64 Tests mit realen Fixture-Daten (Auftrag 02041 Amazon, 02042 Shopify Packstation, synthetisches B2B, US-International, Legacy-Billkom-Snapshot). Rein additiv — keine bestehende Form geändert.
PROJ-240 — Label-Aktionen für abgeschlossene und stornierte Aufträge freigegeben: Die Buttons "Nachdrucken" (Reprint), "Retoure" und "+ Etikett" in der Versand-Sektion des Auftragsdetails sind jetzt auch bei Status completed/cancelled sichtbar. Vorher hat die PROJ-200-Auftragssperre die gesamte Versand-Section auf readonly gesetzt und damit Label-Aktionen versteckt — obwohl die dahinterliegenden APIs (reprint, return-label, additional-label) den Order-Status ohnehin nicht prüfen. Adress- und Tracking-Edits bleiben weiterhin gesperrt (ManualTrackingSection behält readonly).
PROJ-239 Teil 2/4 — Versandfehler-Cockpit: In der Versandfehler-Queue blendet sich bei jedem Fehler-Row eine Collapsible "Original-Daten vom Shop" ein, die alle Import-Notizen (Shopify/Amazon-Rohdaten) als Monospace-Block anzeigt. Mitarbeiter sieht sofort was der Kunde wirklich eingetragen hat. Korrektur-Formular um Adresszeile 2, Adresszeile 3, DHL-Postnummer erweitert; Postnummer wird bei erkanntem Packstation/Postfiliale-Pattern als Pflicht mit rotem Rand markiert. /api/shipping/errors/[id]/correct speichert die neuen Felder, Retry nutzt sie automatisch.
PROJ-239 Teil 1/4 — Adress-Mapping Foundation: Schema-Migration mit neuen Spalten orders.shipping_post_number/billing_post_number, customers.shipping_post_number/billing_post_number + shipping_address_line_2/3 + billing_address_line_2/3, customer_addresses.post_number. Neuer shipping-address-parser mit parsePackstationStreet (matchet Packstation + 3-stellige ID, lockerID 100-999), parsePostfilialeStreet (retailID 401-999), isDhlPostNumber (6-10 Ziffern), routeAddressLine2 (entscheidet ob address2 in address_line_2 oder post_number gehört). Shopify-Importer routet address2 jetzt strukturiert: bei Packstation-Pattern in post_number, sonst in address_line_2. 22 Unit-Tests inkl. Edge Cases wie 'Packstationstraße 5' (matcht nicht). Grundlage für DHL- und DP-Versand-Mapping.
Profitbutler Bestandsbewertung UI-Rework: Volltext-Suche, Filter-Drawer mit Lager/Quelle/Schätzungs-Typ/Bestand-Spanne/Lagerwert-Spanne, aktive Filter-Chips, klickbare Coverage-Badges als Quickfilter + Progress-Bar, Lager-Card mit aufklappbaren Drill-Down-Zeilen (Top-10 Artikel pro Lager) und klickbaren Lager-Namen als Quickfilter, CSV-Export mit pro-Lager-Spalten, Produktdetail-Direktlinks in jeder Zeile, Live-Summen unter aktiven Filtern
PROJ-237: LB Nachlaufkosten UI — Fracht/Zoll/Sonstige EUR/Sonstige Fremdwährung mit Kurs-Abruf-Button (EZB), drei Verteilmethoden (Volumen/Warenwert/Menge), retroaktive FIFO-Korrektur für bereits gebuchte Wareneingänge, Einstandspreis-Preview pro Position. HelpLink zur neuen Nachlaufkosten-Doku im Kosten-Tab.
Profitbutler Bestandsbewertung — Hybrid-Bewertung: FIFO-abgedeckte Stücke aus echten LB-Schichten + Rest-Stücke via manual_landed_cost_eur → supplier_products.purchase_price (preferred) → 0. Neue Response-Felder fifo_qty/fallback_qty/unvalued_qty pro Produkt. UI zeigt Coverage-Badges (FIFO/Lieferanten-EK/Unbewertet) und bei Mischbestand per-Zeile Aufteilung (z.B. '500 FIFO · 1048 LE')
PROJ-236: Kanban Parent/Child-Gruppierung — Eltern-Karten kollabieren zu einer Karte mit Kinder-Zähler, Expand/Collapse pro User persistiert. Cascade-Drag beim Parent-Move bewegt Eltern + alle Kinder mit gleichem Board-Status atomar (neue Supabase-RPC + API-Route). Stray-Kinder in abweichender Spalte erscheinen eigenständig mit ↳-Parent-Hinweis und amber Akzent-Rand. Undo-Toast (6 Sek) nach Cascade-Move. Bundles bleiben Einzelkarten.
PROJ-234: Profitbutler-Auswertung pro Artikel — im Profitbutler-Tab der Produktdetailansicht gibt es jetzt einen neuen Untertab „Auswertung" zwischen „Kalkulation" und „Retouren". Der Tab zeigt genau die Auswertungen der Profitbutler-Hauptseite (Umsatz-/Gewinn-Chart über 7/14/30/90 Tage, Multi-Perioden-Sellerboard mit Umsatz, Stornos, Warenkosten-Gruppen, Gewinn, Marge, Bestellungen, Ø Bestellwert und Erstattungen, sowie aufklappbarer Kanal-Breakdown) — aber eingeschränkt auf den aktuell geöffneten Artikel. Ohne Bestellungen im Zeitraum erscheint ein Empty State. Perioden-Konfiguration bleibt workspace-weit auf der Hauptseite.
PROJ-233: Zahlungen-Tab an Lieferantenbestellungen — jede LB hat jetzt einen eigenen Reiter, in dem Anzahlungen und Teilzahlungen mit Datum, Betrag und optionaler Notiz erfasst werden. Der Zahlungsstatus der Bestellung (Unbezahlt / Anbezahlt / Vollständig bezahlt) wird automatisch aus der Summe aller Zahlungen und dem PO-Total abgeleitet — sowohl beim Erfassen als auch beim Löschen. Die Sidebar-Card „Zahlung" zeigt den gezahlten Betrag und den offenen Restbetrag live in LB-Währung. Beträge werden intern in Cents gespeichert, UI akzeptiert deutsche Dezimalformate (1,23 oder 1.23). Zahlungen sind immutable (nur anlegen + löschen, kein Edit).
PROJ-232: LB-Übersichts-Redesign — analog zur Kundenaufträge-Seite. Neuer View-Toggle zwischen Kanban und konfigurierbarer Listen-Ansicht (14 Spalten, 6 als Default sichtbar, Auswahl pro User persistiert). Pipeline-Tabs zeigen Live-Counts pro Status. Neue Unified Search mit sechs Scopes (Überall / LB-Nummer / Lieferant / Lieferanten-Artikelnummer / Produkt SKU+Name / Notizen) — „Überall" macht eine OR-Union über alle Scopes. Neuer Filter-Drawer rechts mit Multi-Select für Zahlungsstatus, Lieferant, Lager, Incoterm, Transportart plus Datum-Ranges. Aktive Filter erscheinen als Chips mit einzeln-entfernbaren X-Icons plus einem roten „Alle zurücksetzen"-Button. Listenspalten für Incoterm, Transportart, Lager, Positionen, Erhalten %, Erstellt-von und Genehmigt-von neu verfügbar.
PROJ-232: Notizen-Tab an Lieferantenbestellungen — jeder Workspace-Member kann chronologisch Kommentare hinzufügen (Autor + Zeitstempel werden automatisch gesetzt, „bearbeitet"-Hinweis wenn nachträglich geändert). Eigene Notizen lassen sich editieren oder löschen, fremde sind schreibgeschützt (API gibt 403 zurück). Tab-Label zeigt Count-Badge. Cmd+Enter speichert eine neue Notiz direkt.
PROJ-232: Versandinfo-Tags und Notizen sind jetzt volltext-durchsuchbar — die Übersicht findet LBs auch wenn der Suchbegriff nur in einer Notiz oder der Lieferanten-Artikelnummer steht.
PROJ-232: Versandinfo-Tags (Incoterm & Transportart) sind jetzt im LB-Detail-Overlay und auf den Kanban-Karten sichtbar. Im Detail gibt es eine neue Sidebar-Card zwischen Lieferant und Summen — im Bearbeiten-Modus per Dropdown änderbar, im Ansichtsmodus mit Badges. Der Header des Overlays zeigt die gesetzten Tags neben dem Status-Badge, die Kanban-Karte zeigt sie unter dem Gesamtbetrag (nur wenn gesetzt). Jeder Tag lässt sich einzeln auf „Nicht gesetzt" zurücksetzen und verschwindet dann wieder aus allen Ansichten.
PROJ-232: Lieferantenbestellungen können jetzt mit Versandinfo-Tags (Incoterm & Transportart) angereichert werden. Incoterms gemäß ICC 2020 (EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, DDP), Transportarten Schiff/Luft/Zug/LKW. Backend-Endpoint akzeptiert die neuen Felder, null entfernt einen gesetzten Tag wieder. UI folgt in einem Folgecommit.
PROJ-231: Google Drive als zweiter Cloud-Provider neben OneDrive. Admins können beide Clouds parallel verbinden und pro Use-Case (Produkte / Lieferantenbestellungen) einzeln aktivieren — pro Workspace und Use-Case darf nur eine Cloud aktiv sein (DB-Level-Exklusivität via Partial-Unique-Indexes, UI zeigt bei Kollision disabled-Checkbox mit Hinweis auf den aktuellen Blocker-Provider).
PROJ-231: Neuer „Dokumente"-Tab im LB-Detail-Overlay zeigt Cloud-Ordner-Inhalte direkt in Flowkom. Auto-Match sucht Drive-weit nach der LB-Nummer mit Token-Boundary-Erkennung (LB-10058 matcht nicht LB-10008), Shared-Ordner wie „LB-10058 / LB-10061 / LB-10067" erscheinen als Kandidaten-Picker, leere Treffer bieten „Ordner anlegen" oder manuelle Auswahl. Lazy Mount via Radix Tabs — Drive-API-Quota wird nur belastet wenn der Tab tatsächlich geöffnet wird.
PROJ-231: Tabelle product_cloud_folders wurde zu polymorphem cloud_folder_links (entity_type: product | purchase_order) generalisiert. Bestehende OneDrive-Produkt-Verknüpfungen bleiben unverändert, die alte Tabelle wird für die Rolling-Deploy-Phase als Compat-View weiter bereitgestellt.
PROJ-229: Neuer Import-Typ „JTL Historische Aufträge" im Daten-Hub. Upload-Step lädt den CSV-Export direkt in Supabase Storage; Preview-Step analysiert die ersten 512 KB und zeigt Anzahl der Aufträge, erkannte Verkaufskanäle, Duplikate gegen bestehende Aufträge sowie ggf. Mojibake. Klick auf „Import starten" legt einen Background-Job an — der Worker läuft asynchron (1–3 h bei 150k Aufträgen).
PROJ-230: Lieferantenbestellungen können gelöscht werden (via 3-Punkte-Menü in der Liste und im Detail-Overlay). Guard verhindert das Löschen, wenn bereits Wareneingänge gebucht wurden — der Server antwortet dann mit einer klaren Fehlermeldung.
PROJ-230: LB-Status sind jetzt in beide Richtungen bewegbar — draft ↔ pending_approval ↔ approved ↔ shipped, sowie cancelled → draft und rejected → pending_approval. Partially_received und completed bleiben WE-gesteuerte Einbahnstraßen (werden nur beim Buchen eines Wareneingangs gesetzt). Jede Status-Änderung wird in der History protokolliert.
PROJ-228: Versandart-Filter in der Kundenaufträge-Übersicht. Neuer Multi-Select-Abschnitt im Filter-Drawer mit allen aktiven Versandarten als lila Toggles. Aktive Auswahl erscheint als Chip in der Aktive-Filter-Leiste.
PROJ-228: Copy-Buttons neben der Auftragsnummer und der externen Bestellnummer in der Auftragsliste. Hover-Icon + Klick kopieren den Wert in die Zwischenablage.
PROJ-223: Kundenaufträge-Übersicht aufgeräumt — kompakte Status-Tabs ersetzen die großen Pipeline-Kacheln. Eine Unified Search mit Scope-Dropdown (Überall/Auftrag+Kunde/Artikel/Notizen/Externe Nr.) findet Amazon-Bestellnummern in der externen Bestellnr., eBay-Nummern in Notizen und Artikel per SKU/EAN/ASIN/FNSKU. Neuer Filter-Drawer rechts bündelt Verkaufskanal, Zahlstatus, Kanal-Quelle, Tags, Zeitraum und Freipositionen. Aktive Filter erscheinen als Chipleiste mit auffälligem rotem 'Alle zurücksetzen'-Button.
PROJ-223 Backend: Neuer search_scope-Parameter an GET /api/orders mit OR-Union über orders.order_number, orders.external_order_number, customers.*, order_notes.content und order_line_items (via products.sku/sku2/barcode/fnsku + amazon_listings.seller_sku/asin). Trigram-GIN-Indizes auf allen neuen Suchfeldern für Full-Table-Scan-Vermeidung. notes_search bleibt als Legacy-Alias funktional.
Shopify Bestellstatus-Sync granular pro Integration steuerbar: Master-Toggle plus vier Sub-Toggles (Stornierungen, Versandstatus, Zahlstatus & Erstattungen, Sendungsnummern). Master aus → Cron überspringt die Integration komplett; einzelne Sub-Toggles aus → nur die abgeschalteten Bereiche werden übersprungen. Tracking-Import bleibt an den Versandstatus-Sync gekoppelt. Bestandsintegrationen behalten Standardverhalten (alle Toggles an).
Amazon Bestellstatus-Sync granular steuerbar: Drei neue Sub-Toggles (Stornierungen, Versandstatus, Sendungsnummern). Abgeschaltete Teile werden vom Cron übersprungen, Tracking-Import bleibt vom Versandstatus-Sync abhängig. Bestandsintegrationen behalten Standardverhalten (alle Sub-Toggles an).
Versand-Dialog: Vollständige Lieferadresse (inkl. Land als Klartext) und Versandverpackung mit Preis dezent angezeigt
PROJ-215: Picklisten-Versand-Entkopplung — Versand aus laufenden/pending Picklisten, Bestandsabbuchung beim Versand, Auto-Complete
Volle Mitarbeiter-Rechte: Alle 192 API-Routen + alle RLS-Policies + alle RPCs für Mitarbeiter geöffnet. Nur Einstellungen, Profitbutler und Team-Verwaltung bleiben Admin-exklusiv.
Wareneingang LB-basiert: Lagerplatz-Feld ist jetzt eine durchsuchbare Combobox (Barcode-Scanner + Tastatursuche)
PROJ-209: Manuelle Trackingnummer & Fulfillment-Trigger — Tracking + Carrier im Auftrag hinterlegen, Status auf versendet setzen, Fulfillment an Shopify/Amazon übertragen
PROJ-207: Report-Worker upserted Listing-Daten aus GET_MERCHANT_LISTINGS_ALL_DATA direkt in DB (Status, ASIN, Titel, Preis, Menge, Fulfillment-Channel)
PROJ-207: Auto-Mapping (remapUnmappedListings + propagateCrossMpMapping) läuft nach jedem Report-Cleanup-Lauf
PROJ-207: Vereinfachte Diff-Logik — Reaktivierungs-Block entfernt, da Upsert bereits korrekten Status setzt
PROJ-64: Auftragsreservierungen vom Bestandssync abgezogen (Amazon + Shopify) — verhindert Überverkauf am Wochenende, Safety-Sync pusht jetzt physisch − offene Aufträge
Audit-Logging in alle Admin API Routes eingebaut (user_management, integration, workflow, settings, tags, print, picklist, customers, orders, products)
PROJ-203: Pipeline-Navigation und Alert Strip in Auftragsübersicht integriert (Status-Filter per Klick, Tages-KPIs mit Umsatz/unbezahlt/Adressfehler)
PROJ-203: OrderStatusIndicator circle component — 32x32px Statuskreis pro Auftragszeile mit 7 Prioritätsstufen (Problem, NEU, Wartend, In Bearbeitung, Gepickt, Versendet/Abgeschlossen, Storniert)
PROJ-203: /api/orders/stats Endpoint (Status-Counts + Tages-KPIs: Aufträge, Umsatz, unbezahlt, Adressfehler) + useOrderStats Hook für Pipeline-Navigation und Alert Strip
OrderPipeline Navigation-Komponente: Klickbare Status-Segmente mit farbigen Fortschrittsbalken für Auftragsübersicht (PROJ-203)
Produkt-Plattformen-Tab: Zentrale Übersicht aller Integrations-Verknüpfungen pro Artikel (Multi-SKU, FBA/FBM, Bestandssync-Toggle)
PROJ-203: inventory_sync_enabled auf integration_product_mappings, amazon_sync_inventory migriert und entfernt
PROJ-202: Amazon Listing Stale-Detection & Cleanup — Wöchentlicher Report-basierter Vollabgleich (GET_MERCHANT_LISTINGS_ALL_DATA + CANCELLED), Status deleted mit Löschdatum/Grund, 90-Tage-Archivierung, Order-Mapping Archiv-Fallback, Cron-Endpoint mit Toggle
Bundle-Badge auch bei ausgeklappten Kindartikel in Produktübersicht
Child-Badge in Produktübersicht bei Kindartikel
Bundle-Badge in Varianten-Tabelle bei Elternartikel (is_bundle im API ergänzt)
Bundle-Badge in Varianten-Tabelle bei Elternartikel (neben SKU)
Per-Product Amazon Sync — Checkbox pro Artikel steuert ob FBM-Bestandsabgleich den Lagerbestand an Amazon überträgt (Default: aus)
PROJ-201: Shopify Product Push — Produkte (Einzelartikel + Varianten) per GraphQL Admin API als Draft auf Shopify anlegen, automatische Verknüpfung via integration_product_mappings, Bestandssync greift sofort
PROJ-200: Frontend-Bearbeitungssperre — Action-Buttons gesperrt bei abgeschlossenen/stornierten Aufträgen, Lock-Banner mit Statushinweis, Adressbearbeitung readonly, Versand-Aktionen (Etikett/Retoure/Nachdrucken) ausgeblendet
PROJ-200: Auftrags-Bearbeitungssperre — Abgeschlossene/stornierte Aufträge: PUT/Adressen/Versandart/Status gesperrt, Erstattungen bei stornierten Aufträgen blockiert, Status-Änderungen bei abgeschlossenen Aufträgen nur noch Stornierung erlaubt
Einzelner Versandfehler löschbar per Trash-Button in der Fehler-Zeile
Alle Versandfehler auf einmal löschen mit Bestätigungs-Dialog (AlertDialog)
Versandfehler-Queue & Adresskorrektur — Fehlerliste mit Badge, Inline-Adresskorrektur, Blocking/Non-Blocking pro Picklisten-Profil, zweistufiges Error-Mapping für DHL & Deutsche Post (PROJ-199)
PROJ-199: Ship-API gibt error_log_id zurück (DHL + DP Fehler-Insert mit .select('id').single())
PROJ-199: ShippingErrorCorrectionModal — Blocking-Dialog mit Fehlermapping, editierbaren Adressfeldern (nur bei address-Fehlern) und Retry via PATCH /api/shipping/errors/:id/correct
PROJ-199: ShippingScanningDialog Non-Blocking-Modus — bei shippingErrorBehavior='non_blocking' Toast + Fehlerliste statt Modal
PROJ-199: ShippingPicklist-Typ um shipping_error_behavior erweitert, Prop an ShippingScanningDialog weitergegeben
PROJ-199: Shipping Errors Table — aufklappbare Fehlerliste mit Schweregrad-Farbkodierung, Adresskorrektur-Formular (nur bei address-Fehlern), technischen Details und Carrier-Filter
PROJ-199: Shipping Errors Page unter /dashboard/outbound/shipping/errors mit Carrier-Dropdown und Gesamtanzahl-Anzeige
PROJ-199: TanStack Query hooks useShippingErrors und useShippingErrorCount (30s Auto-Refetch)
PROJ-199: ShippingNav-Badge zeigt offene Versandfehler mit rotem Counter-Badge
PROJ-199: GET /api/shipping/errors — Versandfehler-Liste mit Auftrags-Adress-Join, Count-Only-Modus für Badge, Carrier-Filter und Pagination
PROJ-199: PATCH /api/shipping/errors/[id]/correct — Adresskorrektur mit optionalem Versand-Retry, Auto-Resolve bei bereits versendeten Aufträgen, Retry-Count-Tracking
PROJ-199: Zwei-Stufen Versandfehler-Mapping-Modul — Tier 1 feste Codes (AUTH_FAILED, DP_BALANCE_INSUFFICIENT etc.), Tier 2 Keyword-Parsing von Fehlermeldungen (PLZ, Hausnummer, Straße, Stadt, Land, Gewicht, EKP, Produktcode) mit Schweregrad-Farbgebung für Versandfehler-Queue
Amazon-Import triggert jetzt Workflows (FBM + FBA), neue ignore_fba Checkbox in Workflow-Einstellungen
PROJ-197: Bundle-Scan im Versand — Komponenten einzeln oder Bundle-Barcode scannen, visuelles Bundle-Badge, Server-Validierung für Komponenten-IDs
PROJ-166: Versandbestätigung Vorschau (Trockenlauf) — Preview-Dialog zeigt ausstehende FBM-Bestellungen mit Carrier, Tracking, Versanddatum
PROJ-196: Pickliste Löschen statt Stornieren — delete_picklist() RPC mit Rebook-Option, Smart Delete Dialog, cancelled Status komplett entfernt
Neuer Auftrag direkt aus Kundendetailseite erstellen (Kunde vorausgewählt)
PROJ-195: Picklisten-Bestandsreservierung — Lagerplatzbezogene Reservierung durch offene Picklisten, DB-Level Enforcement (FOR UPDATE Lock), verfügbare Menge in UI/API, Doppel-Reservierungs-Schutz bei Picklisten-Erstellung
PROJ-4: Bulk-Typ-Änderung für Lagerplätze — Checkbox-Auswahl + Dropdown zum Setzen von Pick & Versand / Nachfüll / Gesperrt für mehrere Standorte gleichzeitig
PROJ-192: Zwei-Phasen Status+Tracking Sync — Phase 1 (GENERAL Report) für Status, Phase 2 (restricted SHIPPING Report mit RDT) für Tracking-Nummern und Carrier
PROJ-194: show_alternative_currency Toggles (Amazon, Billkom Kanäle) + Währungs-Info-Banner im Belegdialog
PROJ-194: BMF-Kursverwaltung UI (Billkom Settings Tab "Währungen", Pending-Banner, Bulk-Apply)
PROJ-194: PDF-Generator rendert Alternativwährung pro Position + Kurs-Footer (§16 Abs. 6 UStG)
PROJ-194: Invoice-Creation speichert Währungsfelder aus Order (BMF > ECB Kurs-Priorität)
PROJ-194: BMF-Monatskurs API (GET/PUT/POST apply) für manuelle Kursverwaltung
PROJ-194: Währungs-Formatierung (formatCentsCurrency) und currency-helpers für Kurs-Logik
PROJ-194: DB-Migration — Währungs-Spalten auf billkom_documents, document_items und channel_configs
PROJ-55: Shopify Safety-Sync — vollständiger Bestandsabgleich aller Artikel als Reconciliation-Layer, Intervall konfigurierbar (Standard: 2h)
PROJ-55: Safety-Sync Intervall-Selector in Shopify-Integrationseinstellungen (1h bis 24h)
PROJ-193: Multi-Currency Orders — Amazon-Bestellungen in Originalwährung importieren, ECB-Tageskurs beim Import konvertieren (Dual-Storage), Kurs-Cache-Tabelle, retroaktive Migration für bestehende Nicht-EUR-Bestellungen, Währungs-Badge in Bestellliste, Kurs-Info-Box im Bestelldetail
Cron-Jobs Einstellungsseite komplett redesigned — 20+ Jobs in 5 Kategorien (Shopify, Amazon, Workflows, Profitbutler, Cleanup) gruppiert, kompakte Zeilen mit Health-Dots statt voller Cards, Summary-Bar mit Gesund/Verspätet/Fehler-Zähler, Einrichtungsanleitungen auf 3 Ein-Klick-Kopier-Cards reduziert (vorher 3× die volle 20-Job-Liste)
PROJ-55: Bundle-Artikel Bestandssync — Shopify + Amazon erhalten berechneten Bundle-Bestand (MIN(Komponenten/Menge)), nicht mehr 0
PROJ-55: Dirty-Flag Cascade — Komponenten-Änderung flaggt automatisch Eltern-Bundles für Shopify- und Amazon-Sync
PROJ-193: Freie Wareneingänge aus FIFO-Bewertung ausgeschlossen — nur LB-basierte WEs fließen in den Einstandspreis ein, DB-Migration bereinigt bestehende Daten, 3 API-Routen gefiltert
PROJ-192 Amazon FBM Bestellstatus-Sync — Neuer Cron-Job holt regelmäßig den Bestellstatus und Tracking-Nummern für FBM-Bestellungen von Amazon ab (Reports API: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL). Status-Mapping (Shipped→shipped, Cancelled→cancelled, PartiallyShipped→in_progress), Tracking als shipping_task mit Duplikat-Check, Shipment-Confirmation-Skip (amazon_confirmation_sent_at), Downgrade-Schutz, Audit Trail, Advisory Lock, Cursor-basiert. Toggle 'Automatischer Bestellstatus-Sync' in den Amazon-Einstellungen (default: aus). 22 Unit Tests.
PROJ-191 Amazon JSON_LISTINGS_FEED Migration — FBM-Bestandssync migriert von deprecated POST_INVENTORY_AVAILABILITY_DATA (XML, tot seit Juli 2025) auf JSON_LISTINGS_FEED mit PATCH-Semantik. fulfillment_channel_code DEFAULT für FBM, productType PRODUCT universell, Content-Type application/json; charset=UTF-8. Per-Marketplace-Architektur bleibt bestehen.
PROJ-190: Bestandsbewertung & Einstandspreis-Konsolidierung — Manueller Einstandspreis am Produkt mit FIFO-Kaskade (Toggle → FIFO → Manuell → null), FBA-Bewertung auf Durchschnitts-Einstandspreis umgestellt, neuer Profitbutler Sub-Tab "Bestandsbewertung" mit Lagerwert pro Lager, Artikelliste und Lücken-Warnung, Lagerwert aus Bestandsübersicht entfernt, Datenhub-Import für manuellen Einstandspreis
PROJ-190: Datenhub Schema-Overlay um manual_landed_cost_eur erweitert — Feld erhält deutschen Anzeigenamen 'Manueller Einstandspreis (EUR)', Gruppe 'Einkauf' und Synonyme für CSV-Auto-Mapping
Bestandsbewertung-Link im Profitbutler-Header (navigiert zu /dashboard/profitbutler/inventory-valuation)
Gesamter-Lagerwert-Karte aus Bestandsübersicht entfernt (Lagerwert jetzt im Profitbutler-Modul)
PROJ-190 Bestandsbewertung Profitbutler Sub-Tab — Neue Unterseite /dashboard/profitbutler/inventory-valuation mit Lagerwert-Summary, Warehouse-Breakdown-Tabelle, sortierbarer Artikelbewertungs-Tabelle (FIFO/Manuell/Keine Bewertung Badges), Warnbanner für Artikel ohne Einstandspreis mit Filter-Toggle.
PROJ-189: Amazon Financial Events Pull — Automatischer Import von Erstattungen & Adjustments aus Amazon (Cron mit Cursor + 6h Overlap, Hash-basierte Idempotenz, Auto-Gutschrift bei Voll-/Teil-Refund, Dedup gegen Push-Marker, AdjustmentEvent capture-only)
PROJ-190 FBA-Kostenlookup auf Bewertungskaskade umgestellt — getAmazonFbaValuationCost() in src/lib/amazon/fba-cost-lookup.ts nutzt jetzt resolveValuation() statt supplier_products.purchase_price. Kaskade: prefer_manual_cost + manual_landed_cost_eur > FIFO-Avg aus stock_movements Receipts > manual_landed_cost_eur Fallback > null.
PROJ-190 Bewertungskaskade in cost-breakdown API — GET /api/products/[id]/cost-breakdown liefert jetzt zusaetzlich effective_cost_eur, valuation_source, manual_landed_cost_eur, prefer_manual_cost und fifo_receipt_count. Produktabfrage wurde auf manual_landed_cost_eur und prefer_manual_cost erweitert. resolveValuation() aus src/lib/inventory-valuation.ts loest die Kaskade auf (manuell > FIFO-Avg > null) und gibt die aktive Quelle zurueck.
Amazon Refund & Cancel Push (PROJ-188): Erstattungen und FBM-Stornierungen werden über SP-API Feeds an Amazon gepusht. Job-Queue mit Status-Cron, Dedup-Marker, Badge + Historie-Sheet im Auftragsdetail, Settings-Toggles, Dialog-Checkboxen.
[object Object]
PROJ-186 Verkaufskanal „Flowkom" für manuell angelegte Aufträge — Kundenaufträge, die direkt in Flowkom angelegt werden (source=manual), bekommen jetzt automatisch den Verkaufskanal `flowkom`. Neuer Eintrag in src/lib/channel-config.ts (KNOWN_CHANNELS) mit Flowkom-Blau (#2563EB) und eigenem SVG-Icon (public/channels/flowkom.svg). API-Insert in src/app/api/orders/route.ts setzt sales_channel=flowkom beim Anlegen, Backfill-Migration setzt bestehende Manual-Aufträge ohne Kanal rückwirkend. Badge „Flowkom" erscheint automatisch in Auftragsliste, Filter-Dropdown und Profitbutler-Kanalaufschlüsselung; Workflow-Bedingungen auf sales_channel greifen jetzt auch für manuelle Aufträge.
PROJ-185: Beim manuellen Anlegen einer Rechnungsadresse erscheint jetzt eine optionale Checkbox 'Auch als Lieferadresse übernehmen'. Wenn aktiv, wird die Adresse zusätzlich als Lieferadresse gespeichert — spart den doppelten Eintrag. Einmaliges Kopieren, keine Verknüpfung (spätere Änderungen an der Rechnungsadresse wirken sich nicht auf die Lieferadresse aus). Nur bei Neuanlage, nicht im Bearbeiten-Modus.
PROJ-184: Bundle-Artikel können endlich auf Picklisten landen. Bundles haben selbst keinen Bestand — nur ihre Komponenten (bundle_items). Vorher hat der Stock-Check gegen die leere Bundle-SKU geprüft und jede Bestellung mit Bundle-Artikel als 'nicht genug Bestand' stumm gedroppt. Neuer Expand-Schritt (src/lib/picklist-bundles.ts) löst Bundle-Line-Items in ihre Komponenten auf, bevor der Stock-Check läuft. picklist_item_assignments zeigt weiterhin auf den echten Bestell-Line-Item (Bundle-Parent), der Packer sieht die Bundle-SKU wie bisher, der Picker sieht die physischen Komponenten.
PROJ-184: Safety-Gate gegen Zero-Position-Picklisten — Aufträge, deren Bundle-Expansion leer ist (Bundle-Artikel ohne konfigurierte Komponenten), werden nicht mehr als erfüllbar markiert und erzeugen eine Warning beim Admin, damit die Bundle-Definition nachgezogen werden kann.
PROJ-182: Picklisten Filter-Parity — Shared picklist-filters Modul, Preview und Erstellung teilen sich jetzt eine einzige Filter-Pipeline. tag_filters, max_orders, warehouse_ids und location_filters werden jetzt konsistent von Profil-Karten, Vorschau und Erstellung angewandt (vorher drifteten die drei Implementierungen auseinander und Preview zeigte Aufträge die dann nicht auf der Pickliste landeten). Stock-Hinweis-Pill im Erstell-Dialog wenn Bestand/Lagerfilter gesetzt sind.
PROJ-182: Picklisten-Erstellung max_orders-Cap läuft jetzt NACH dem Stock-Check (nicht davor) — Stock-Drops fressen nicht mehr ins Cap-Budget. Drop-Counter pro Filter-Stage (Auftragstyp, Tag-Filter, Stock, Max-Limit) werden als Toast beim Erstellen angezeigt.
PROJ-182: Versand-Detailseite zeigt jetzt einen echten Fehler-State mit 'Erneut versuchen'-Button wenn die API fehlschlägt, statt stumm 'Alle Aufträge versendet' zu rendern. Schützt zukünftig vor Bugs der Klasse v1.44.011 (gedroppte Spalten).
PROJ-181: Neue Lieferantenbestellung — Supplier-First-Flow (kleines Dialog zur Lieferantenauswahl, dann direkt ins Fullscreen-Bestellformular im Edit-Modus, altes Popup-Formular entfernt)
PROJ-180: Auftragsdetail zeigt magnalister Otto Retoure-Bridge Status (Übertragen/Fehlgeschlagen) wenn Metadaten vorhanden
PROJ-180: Zod-Schema für Integration-PATCH erweitert — bridge_m2e_cloud_enabled und bridge_magnalister_enabled explizit als boolean optional deklariert
PROJ-180: Marktplatz-Bridges UI — M2E Cloud Modus und magnalister Modus als unabhängige Toggles in der Shopify-Integrationsdetailseite
PROJ-179 Bestands-Reiter im Artikeldetail — Neuer Tab "Bestand" in der Artikeldetailseite mit Sub-Tabs Uebersicht, Im Zulauf, Reserviert und Historie. Lazy Loading pro Sub-Tab, keine neuen Tabellen (nutzt bestehende stock/stock_movements/purchase_order_items/order_items). Fuer Bundle-Artikel wird ein Info-Banner statt der Sub-Tabs angezeigt; Service-Artikel (inventory_tracking=false) bekommen den Tab nicht. Die alte FBA-Overlap-Warnung im Header der Artikelseite wurde entfernt und lebt jetzt im Bestand-Uebersicht-Panel.
PROJ-180: pushMagnalisterReturnAttributes GraphQL helper — read-merge-write auf Shopify Order.customAttributes für magnalister Otto Retoure-Felder
PROJ-180 mergeOrderCustomAttributes — Pure Hilfsfunktion in src/lib/shopify/fulfillment.ts, die Shopify-Order customAttributes (bestehende Liste + Updates) sicher zusammenfuehrt: bestehende Keys ohne Update bleiben an ihrer Position, aktualisierte Keys werden ans Ende verschoben. TDD: 4 Tests (neue Keys anhaengen, Idempotenz, leere existing, Reihenfolge-Invarianz). Wird von pushMagnalisterReturnAttributes genutzt, um Shopifys orderUpdate-Semantik (ersetzt die gesamte customAttributes-Liste) zu erfuellen.
PROJ-180 magnalister Otto Retoure-Bridge — Migration setzt bridge_m2e_cloud_enabled = true für alle bestehenden Shopify-Integrationen, damit Bestandsinstallationen ihr bisheriges Verhalten (Retoure als zweites Tracking) behalten. bridge_magnalister_enabled bleibt false und muss manuell aktiviert werden.
PROJ-177 Amazon FBA-Bestand als echtes Flowkom-Lager — FBA-Pull schreibt jetzt stock-Rows im FBA-POOL des FBA-Warehouses (sync_amazon_fba_stock RPC + Reconciliation), Bewertung via supplier_products.purchase_price. Dadurch enthalten Lagerwert (PROJ-74) und Bestellvorschlag (PROJ-22) automatisch den FBA-Bestand. Read-only Warehouse + FBA-POOL Location via neuem create_system_locations Trigger-Branch, Backfill-Hook beim Mapping (Single + Bulk). Interim-Phase bis PROJ-178 mit Doppelzählungs-Warnung auf der Artikel-Detailseite.
PROJ-176 Profitbutler-Integration: Amazon FBA-Bestellungen werden automatisch mit 0 EUR Versand-, Verpackungs- und Pick&Pack-Kosten ausgewiesen, weil Amazon das Fulfillment uebernimmt. Order-Level Versandart hat Vorrang vor Produkt-Default.
PROJ-176 Amazon FBA Auto-Versandart — alle FBA-Bestellungen bekommen automatisch die Versandart "Versand durch Amazon" (Carrier: Amazon). Bestehende FBA-Orders werden rueckwirkend getaggt, neue Workspaces bekommen die Versandart per Seed. Workflow-Regeln und Profitbutler koennen FBA jetzt sauber filtern.
PROJ-175 Amazon FBA Kundendaten-Enrichment — volle Käufer-PII (Name, Straße, PLZ, Stadt) werden jetzt über den Shipments-Invoicing-Report (Reports-API) nachgeladen, wie es auch JTL macht. Ersetzt die von Amazon redigierten Orders-v0-Daten bei EU-FBA.
Picklist-Profil-Karten zeigen die konfigurierten Artikel-Tag-Filter jetzt direkt als Badges mit Tag-Name, Farbe und HAS_NOT-Kennzeichnung an (statt nur 'X Tag-Filter').
PROJ-174: Fehlerzeilen-CSV-Download im Lagerbestand-Initialimport Dry-Run. Neuer Button im Strict-Mode-Banner lädt bei Fehlerzeilen eine CSV mit allen Originalspalten plus zusätzlicher 'Fehler'-Spalte herunter — so kann der Nutzer die problematischen Zeilen gezielt korrigieren und neu hochladen.
PROJ-174: Lagerbestand-Initialimport (CSV) für JTL-Migration. Neuer Import-Target-Typ 'Lagerbestand — Initialbefüllung (JTL-Migration)' im Daten-Hub Import-Wizard. Akzeptiert JTL-Bestands-Export-CSVs mit Pflichtspalten Artikelnummer, Lagerplatz, Einzubuchende Menge (Header case-insensitive + Synonyme, DE-Dezimalkomma). Kein Mapping-Step — Spalten sind fix. Strict-Mode hart erzwungen: bei ≥1 Fehlerzeile (unbekannte SKU, unbekannter Lagerplatz, Bundle/Service-Artikel, ungültige Menge) wird der Import blockiert, User muss CSV korrigieren und neu hochladen. Bei grünem Dry-Run werden die Zeilen nach warehouse_id gruppiert und in Chunks à 200 Items atomar über die bestehende complete_goods_receipt-RPC (PROJ-6/PROJ-73) gebucht — Stock, Stock-Movements, Goods-Receipt-Header, FIFO-Layer und Landed-Cost-Integration bleiben automatisch konsistent. Mengen werden additiv pro Zeile verbucht. Job-Protokollierung in data_jobs, sichtbar im bestehenden Daten-Hub Job-Verlauf.
PROJ-172: Nächtlicher automatischer Amazon Listings Refresh. Neuer Cron-Endpoint /api/cron/amazon-listings-nightly-refresh iteriert seriell über alle aktiven Amazon-Integrationen (Opt-Out pro Integration via metadata.amazon.nightly_refresh_enabled) und treibt den PROJ-169-Listings-Sync-Worker komplett ohne HTTP-Loop zur Completion. Geschedulet extern wie die anderen Amazon-Crons (0 2 * * *, vor dem FBA-Inventory-Pull um 03:15). Time-Budget 20 Minuten pro Integration, per-Marketplace-Fehler-Isolation (ein fehlgeschlagener MP stoppt den Job nicht mehr). Neuer Settings-Toggle 'Nächtlicher Listings-Refresh' + 'Jetzt starten'-Testbutton pro Integration. Neuer Eintrag in der Cron-Jobs-Tab-Übersicht.
PROJ-167: Testing-Button 'Importierte löschen' pro Kanal (FBM und FBA) in den Amazon-Order-Import-Blöcken. Löscht alle importierten Bestellungen des gewählten Kanals inkl. abhängiger Tabellen und der dadurch verwaisten Amazon-Kunden dieser Integration. Nur für die Testphase gedacht, Confirm-Dialog mit 'nicht rückgängig'-Warnung, keine Safety-Checks (die saubere Version folgt über PROJ-173).
PROJ-171: Amazon FBA-Bestand wird in der Listings-Management-UI angezeigt — Spalte 'FBA-Bestand' default-sichtbar, Filter 'Bestand = 0' aktiv. DB-Trigger aggregiert amazon_fba_inventory → amazon_listings.quantity automatisch, stündlicher Cron und manueller Pull-Button bleiben unverändert.
PROJ-170: Amazon-Angebote verwalten — Neue Full-Page unter Integration → Amazon → 'Alle Angebote verwalten'. JTL-artige Multi-Select-Tabelle (shadcn/ui) mit Filterleiste (Marktplatz-Multi-Select, Fulfillment, Status, 'Nur nicht zugeordnet', Volltextsuche via Trigram-Indizes), Filter-Chips, URL-Deep-Links, serverseitiger Pagination (50/Page), sortierbaren Headers auf indizierten Spalten. Bulk-Aktionen: Zuordnen (mit Cross-Marketplace-Propagation), Zuordnung aufheben, Aus Sortiment entfernen (Soft-Delete). 'Alle N gefilterten auswählen'-Modus lädt IDs on-demand. Selektion überlebt Page-Wechsel, Confirm-Dialog bei Filter-Wechsel mit aktiver Auswahl. Konfigurierbare Spalten via ColumnPicker (localStorage pro User, Drag & Drop). CSV-Export der gefilterten Ansicht (Excel-DE, 50k Hard-Cap). Empty-States für leere Filter vs. kein Sync. HelpLink auf neue MDX-Doku. Wiederverwendbarer ProductPickerDialog aus AmazonMappingDialog extrahiert (src/components/products/product-picker-dialog.tsx). AmazonListingsBlock im Integration-Detail auf Kurz-Übersicht (5 jüngste Zeilen + Button) reduziert, alter Einzelzeilen-Dialog entfernt.
PROJ-170: Backend-Fundament für das JTL-Style Amazon Listings-Management — Trigram-Indizes für Volltextsuche (Titel, SKU, ASIN), erweiterter List-Endpoint mit Multi-Marketplace-/Fulfillment-/Status-/Unmapped-/Sort-Filtern, drei Bulk-Endpoints (Zuordnen mit Cross-MP-Vererbung, Zuordnung aufheben, Aus-Sortiment-entfernen als Soft-Delete via status='inactive') und CSV-Export (Excel-DE, BOM, Semikolon) — UI folgt in Session 2
PROJ-169: Amazon Listings-Sync als Background-Job mit Multi-Marketplace-Support, Live-Progress-Bar, JTL-Wawi-Modell (N:1 Mapping, FBA/FBM-Suffix Auto-Match, Cross-MP Mapping-Propagation), server-seitiger withStatus=BUYABLE Filter, inkrementeller Default-Sync, Abbrechen-Funktion
PROJ-168 LB-Detail-Rework — Lieferantenbestellungs-Detail als Fullscreen-Overlay (ersetzt alten Modal-Dialog). Cursor-Bug im EK-Preis-Input behoben (lokaler State + onBlur-Commit + React.memo PositionRow → keine Sibling-Re-Renders mehr). Multi-Select-Artikelpicker mit Live-Suche (Name/SKU/EAN/Lief.-Art.-Nr), Mengen-Eingabe pro Zeile und Footer-Live-Summe ersetzt den One-by-One-Flow. LB-Nummer inline editierbar mit debouncetem Live-Unique-Check (300 ms). Status-Badges klickbar mit Folge-Status-Dropdown. Kontext-Primäraktion (Einreichen / Genehmigen / Wareneingang buchen) und Mehr-Menü (Duplizieren / PDF / E-Mail / Stornieren / Löschen) im Header. 6 Tabs mit Lucide-Icons (Details, Positionen, Zahlungen, Wareneingänge, Dokumente, Verlauf). Sidebar-Cards (Lieferant, Summen, Zahlung) und Meta-Grid (Erstellt/Lieferdatum/Lager/Währung). Status-History-Timeline portiert. Neue stabile-ID API-Endpoints (POST /items, PATCH /items/[itemId], DELETE /items/[itemId], PATCH /[id] mit po_number-Rename) ersetzen den alten delete+reinsert-PUT und bewahren goods_receipt-FKs. 23 neue API-Tests, 343/343 Gesamt grün, 0 Lint-Errors.
PROJ-167 Amazon Bestellungs-Filter & Import-Vorschau — Getrennt konfigurierbare Filter pro Kanal (FBM: Bestellstatus, Zahlungsstatus, Versandstatus, Synchronisierungszeitraum; FBA: ohne Versandstatus), neuer 'Bestellungen laden'-Dialog mit Mehrfachauswahl für selektiven Import, 'Jetzt synchronisieren' respektiert die Filter. Neuer GET /amazon/orders/preview Endpoint mit 250er Cap und already_imported-Lookup. importOrders erweitert um amazonOrderIds + filters. Kaputte FBM/FBA-Import-Buttons aus AmazonManualActionsBlock entfernt (Fix nebenbei).
PROJ-166 Amazon Integration Rebuild — FBM/FBA Order-Import, Listings-Sync mit SKU-Automap und manueller Zuordnung, FBM-Bestandspush via Dirty-Queue + Safety-Sync, FBA-Bestand-Pull, Versandbestätigung mit Carrier-Mapping + Overrides, Multi-Region (EU/NA), Multi-Marketplace. Inklusive neuer Tabellen (amazon_listings, amazon_inventory_dirty_queue, amazon_fba_inventory, amazon_sync_log), LWA-Token-Refresh + RDT, Advisory Locks pro (Integration, Job-Type), komplette Cron-Suite (FBM/FBA-Import, Inventory-Flush, Safety-Sync, FBA-Pull, Shipment-Confirmation), Credentials-Verschluesselung, Problems-API, Lifecycle-Service (Enable/Disable mit Stock-Safety-Check), neue UI-Sektion im Integrationen-Hub (Connection, Marketplaces, Toggles, Listings, Problems, Carrier-Overrides, Manual-Actions) und Burst-Test fuer die Dirty-Queue-Deduplication.
PROJ-165 Amazon Nuke & Pave: Amazon v1-Reste und komplettes v2 wurden restlos entfernt. Drop-Migration entfernt alle Amazon-Tabellen (amazon_carrier_mappings, amazon_shipment_retry_queue, amazon_failed_operations, amazon_v1_failed_operations_deprecated, amazon_v2_circuit_state, fba_inventory, fba_inventory_snapshots), die Spalte orders.amazon_fulfillment_confirmed_at, alle Amazon-Integrationen, FBA-Virtual-Warehouses und Amazon sync_log-Eintraege. integrations.type und integration_sync_logs.sync_type CHECKs werden ohne Amazon-Werte neu gesetzt. BREAKING CHANGE — Produktions-Deployment erfordert Backup und Pruefung offener Eintraege in amazon_v1_failed_operations_deprecated.
PROJ-164: Amazon v2 FBA-Bestand UI & Steuerung — schliesst die UI-Luecke aus PROJ-157 (Backend lief, war aber unsichtbar/unsteuerbar). Neue Card 'FBA-Bestandssync' im Integration-Detail mit Auto-Sync-Toggle, letztem Lauf, Snapshot-Counter, Status-Badge, Jetzt-synchronisieren-Button und Link zur Detail-Seite. Neue GET/POST-Routes unter /api/integrations/[id]/amazon/fba/. Waisenseite fba-inventory/page.tsx an v2-Schema angepasst (reserved_total/unfulfillable_total) inkl. Back-Link und korrektem Empty-State.
PROJ-122: Spreadsheet-Bulk-Edit kann jetzt EK-Preis pro Lieferant und Standard-Lieferant setzen — neue Spalten 'Einkaufspreis (Lieferant)' und 'Standard-Lieferant', Validierung verlangt Lieferanten in Scope, beim Setzen von Standard-Lieferant wird der bisherige automatisch entmarkiert. Vorbefuellung der Zellen ueber neuen Endpoint /api/supplier-products/preferred-batch.
PROJ-163 Commit 2: Amazon-Setup-UI auf Self-Authorize-Card umgestellt. Neue Card mit Region-Select + Refresh-Token-Textarea + 'Speichern & testen'-Button. Inline-Ergebnis: Success-Alert mit Marketplace-Liste oder Error-Alert mit kind, http_status, message und togglable Rohdaten-Viewer des Amazon-Bodys. Gerendert bei isSetup/isInactive/isError sowie via 'Token ersetzen'-Toggle im active-State. Error-Banner 'Neu verbinden' scrollt jetzt zur Self-Authorize-Card. OAuth-Query-Param-Reader + oauthCallbackResult-State + handleConnectViaOAuth entfernt. 3-Schritte-Anleitung verweist auf self-authorize-guide.md.
PROJ-163 Commit 1: Amazon v2 Self-Authorize-Service + POST /api/integrations/amazon-v2/self-authorize. Nimmt einen manuell aus Seller Central kopierten Refresh-Token entgegen, verschluesselt ihn, legt die Integration an (oder updated eine bestehende) und macht einen Soft-Probe-Call gegen getMarketplaceParticipations. Token wird IMMER persistiert (auch bei Probe-Fehler), Probe-Ergebnis landet im probe-Feld der JSON-Response. Reauth-Pfad mit Cross-Workspace-Check. 5 Unit-Tests (Happy Path, missing_seller_role, Reauth, Cross-Workspace, Token-Laenge).
PROJ-162 Commit 2/3: Amazon-Setup-UI auf OAuth-Connect-Card umgestellt. Beim Hinzufuegen einer neuen Amazon-Integration erscheint jetzt eine Region-Auswahl (EU/NA/FE) + Button 'Mit Amazon verbinden', der per Browser-Redirect den OAuth-Flow zu Amazon Seller Central startet. Reauth-Pfade: 'Verbindung erneuern' im Action-Bar bei aktiver Integration, 'Neu verbinden' im Error-Banner bei gestoerter Verbindung. Toast-Handling beim Mount fuer ?amazon_v2_oauth=success|error&kind=...-Redirects. Dead-Code-Abbau: refresh_token-State, marketplace-Dropdown, handleSaveAndTest und die komplette Refresh-Token-Eingabe-Form (postete auf eine in PROJ-161 geloeschte v1-Route) ersatzlos entfernt. -187 / +136 LoC.
PROJ-161 Phase 8 Amazon v1 vollstaendig entfernt — Greenfield-Cutover auf v2 abgeschlossen. 18215 Zeilen v1-Code (lib/amazon, 13 Routen, 9 Cron-Routes, UI-Komponenten) geloescht. Migration: amazon_failed_operations → amazon_v1_failed_operations_deprecated (defensiv umbenannt statt gedroppt). BREAKING: kein Rollback auf v1 mehr moeglich.
PROJ-161 Phase 8 v1-UI-Bloecke hinter v2Active-Flag ausgeblendet (Settings-Tabs, OpenIssues) — v2-Connections sehen nur noch das Status-Dashboard
PROJ-161 Phase 8 Cron-Skip + v1-Routen 410: alle 13 v1-Amazon-Routen liefern 410 Gone, alle 9 v1-Cron-Routes ueberspringen v2-aktivierte Integrationen (geteilter Handler + 2 custom Crons + DLQ-Retry)
PROJ-161 Phase 8 Cutover-Tooling: Admin-Routen /amazon-v2/enable und /amazon-v2/disable plus Cutover-Button im Detail-View (Confirm-Dialog, Reload nach Erfolg)
PROJ-160 Phase 7 Deployed — Amazon v2 Status-Dashboard live (Read-only Dashboard pro v2-Connection mit Letzter Lauf, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
PROJ-160: Manueller Trigger POST /api/integrations/[id]/amazon-v2/trigger (admin-only, isV2EnabledFor-Gate, Dispatch auf runOrderImport/runInventorySync/runShipmentConfirmation, respektiert Service-Soft-Lock, 3 Wire-In-Tests)
PROJ-160: Amazon v2 Status-Dashboard UI (3 Karten pro Operation mit letztem Lauf, Circuit-Breaker-Badge, nächstem geplanten Lauf; eingehängt in AmazonIntegrationDetail, shadcn Card/Badge/Button/Tooltip/Skeleton)
PROJ-160: Status-Aggregator + GET /api/integrations/[id]/amazon-v2/status (liest sync-logs, circuit-state, schedule-JSON; DI-Storage; 3 Unit-Tests)
PROJ-160 Phase 7 Kickoff — Amazon v2 Status-Dashboard Spec (Read-only Dashboard pro v2-Connection mit Karte je Operation, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
PROJ-159 Phase 6 Deployed — Amazon v2 Circuit-Breaker & Smart-Intervals (Status auf Deployed gesetzt)
PROJ-159: Circuit-Breaker + Smart-Interval in alle drei v2-Cron-Routes (order-sync, inventory-sync, shipment-confirmation) verdrahtet, schedule-Persistenz in integrations.settings.amazon_v2.schedule, 3 Wire-In-Tests
PROJ-159: CircuitBreaker + Smart-Interval Helper unter src/lib/amazon-v2/reliability/ inkl. 11 Unit-Tests (state-transitions, half-open, isolation, smart-interval-Heuristik)
PROJ-159: Migration amazon_v2_circuit_state (Tabelle, RLS, partieller Index WHERE state=open)
PROJ-159 Phase 6 Spec — Amazon v2 Circuit-Breaker & Smart-Intervals (Planned)
PROJ-158 Phase 5 Deployed — Amazon v2 Shipment Confirmation komplett (Migration, FeedsClient, Carrier-Mapping-v2 DB-Reader, Strategy + Service, v1-Guard, Cron-Route, 5 Unit-Tests, Sandbox-Smoke)
PROJ-158 Phase 5 — Cron-Route /api/cron/amazon-v2-shipment-confirmation (Feature-Flag-Gate, Soft-Lock-respektierend, sequentielle Iteration aller v2-Integrationen)
PROJ-158 — 5 Unit-Tests fuer runShipmentConfirmation (Strategy-DI, Auth-Abort, Per-Order-Fehler-Isolation, Idempotency, Soft-Lock) + Sandbox-Smoke fuer Feeds-API getFeeds
PROJ-158 Commit 3 — ShipmentConfirmationStrategy-Interface, FeedsXmlConfirmShipmentStrategy (Default), ShipmentConfirmationService (DI-Orchestrator: Soft-Lock, Pending-Order-Selektion, Carrier-Mapping-Resolution, Strategy-Aufruf, amazon_fulfillment_confirmed_at-Update, DLQ-Insert pro Order-Fehler), Feature-Flag-Helper listV2ShipmentConfirmationEnabledIntegrations, dlq-Operationtype 'shipment_confirmation' ergänzt. 64/64 Tests grün.
PROJ-158 Commit 2 — FeedsClient (5-Schritt-Pipeline um @sp-api-sdk/feeds-api-2021-06-30), build-fulfillment-feed-xml (POST_ORDER_FULFILLMENT_DATA), parse-feed-result-report, carrier-mapping-v2 (DB-Reader auf bestehende Tabelle amazon_carrier_mappings, kein statischer Port), v1-Guard als Top-of-function-Check in triggerAmazonShipmentConfirmation (einziger Touch in src/lib/amazon/), 3 Unit-Tests (64/64 grün). Spec aktualisiert: Carrier-Mapping als DB-Reader und v1-Guard als ein File-Touch dokumentiert.
PROJ-158 Commit 1 — Migration orders.amazon_fulfillment_confirmed_at TIMESTAMPTZ + partieller Index (workspace_id, shipped_at) WHERE external_source=amazon AND shipped_at NOT NULL AND amazon_fulfillment_confirmed_at NULL. v2-isolierter Shipment-Confirmation-Marker, parallel zu v1.
PROJ-158 Phase 5 kickoff — Spec für Amazon v2 Shipment Confirmation angelegt. Feeds-API-first Architektur (POST_ORDER_FULFILLMENT_DATA via @sp-api-sdk/feeds-api-2021-06-30), weil orders-api-2026-01-01 read-only ist. Neue Spalte orders.amazon_fulfillment_confirmed_at, Carrier-Mapping-v2-Port, 5-Commit-Plan, Test-Plan (5 Unit + 1 Smoke). SDK bereits installiert.
PROJ-157 Phase 4 abgeschlossen — Amazon v2 Inventory Sync Deployed. FBM-Push via Listings PATCH + FBA-Pull via getInventorySummaries laufen kombiniert in einer Cron-Route, v2-isolierte Snapshots-Tabelle, Hybrid-Strategy mit Feeds-API-Stub (PROJ-157.5 Future Work), v1-Cron-Routes per Flag gegated. 55/55 Amazon-v2-Tests gruen, Spec synchron mit der finalen Architektur.
PROJ-157 (Commit 4): Amazon v2 InventorySyncService-Orchestrator — FBM-Push + FBA-Pull sequentiell in einem Lauf, Soft-Lock via integration_sync_logs Sentinel (15min Cutoff), kombinierter sync_type='amazon_v2_inventory_sync', DI-Pattern mit InventorySyncDeps, Strategy-Selection ueber settings.amazon_v2.inventory_push_mode. Neue Cron-Route amazon-v2-inventory-sync mit Cron-Secret-Auth. 5 Unit-Tests (Strategy-DI-Wiring, FBM-Push-Errorhandling inkl. 401-Abort, FBA-Mapper aggregiert/leer/ohne-SKU, FBA-Pagination, FBA-Idempotency) + 1 Sandbox-Smoke (read-only getListingsItem mit Skip-Verhalten).
PROJ-157 (Commit 3): Amazon v2 FBM-Push Strategien (Listings PATCH default, Feeds API stub mit PROJ-157.5 TODO), FBM-Push-Service (Queue-Read, Mapping-Lookup, Stock-Calc, Per-SKU-Push, DLQ, Queue-Cleanup), FBA-Pull-Service mit Pagination + Batch-Upsert + DLQ, fba-inventory-mapper mit aggregiertem reserved_total/unfulfillable_total, v2-Stock-Calc Port (PROJ-55-Semantik isoliert von v1), DLQ um inventory_push und fba_inventory_pull operation_types erweitert.
PROJ-157 (Commit 2): Amazon v2 InventoryClient — kombinierter Wrapper um Listings (patchListingsItem) und FBA Inventory (getInventorySummaries paginiert) SDKs, gemeinsame Auth-Instanz, 100-Pages-Hardcap, AmazonV2AuthError-Mapping. v1-Cron-Routes (amazon-inventory-sync, amazon-fba-inventory-sync) bekommen negativen Filter auf settings.amazon_v2.inventory_sync_enabled. Spec mit den finalen Design-Entscheidungen synchronisiert.
PROJ-157 (Commit 1): Migration fba_inventory_snapshots — neue v2-isolierte Tabelle mit seller_sku Unique, raw_details JSONB, snapshot_run_id Tracking, workspace-scoped RLS. v1 public.fba_inventory bleibt unveraendert.
PROJ-157 (Commit 0): Amazon v2 Inventory-Sync Spec (Phase 4) — FBM-Push via patchListingsItem, FBA-Pull via getInventorySummaries, neue v2-isolierte Tabelle fba_inventory_snapshots, InventoryPushStrategy mit FeedsStrategy-Stub (PROJ-157.5 als Future Work)
PROJ-156 Phase 3 abgeschlossen — Amazon v2 Order Sync Deployed: Spec auf Status 'Deployed' gesetzt, alle Akzeptanzkriterien abgehakt, features/INDEX.md aktualisiert (PROJ-156 Deployed, Next Available ID = PROJ-158). Phase 3 ist das Herzstueck des Greenfield-Rewrites (PROJ-152) und liefert damit den ersten produktiv lauffaehigen End-to-End-Pfad der v2-Integration (OAuth → Connection-Health → Order-Sync mit DLQ), komplett parallel zu v1 und ueber settings.amazon_v2.v2_enabled gegatet.
PROJ-156: OrderImportService + Cron-Route + 4 Unit-Tests + Sandbox-Smoke fuer Amazon v2 — runOrderImport orchestriert FBM+FBA sequentiell gegen dasselbe Rate-Limit-Budget, iteriert per Async-Iterator ueber searchOrdersPaged, holt pro Order einen frischen RDT, ruft getOrder mit BUYER/RECIPIENT/PROCEEDS/FULFILLMENT/PACKAGES-IncludedData, mapped via mapOrderToWmsRow und schreibt via batchUpsertOrders. Fehler-Klassifikation: 401/403 abort, 4xx/5xx pro Order in die DLQ mit version='v2'. Soft-Lock ueber integration_sync_logs Sentinel-Row statt Advisory-Lock (Begruendung in der Migration dokumentiert). Cron-Route /api/cron/amazon-v2-order-sync mit Cron-Secret-Auth iteriert ueber listV2EnabledIntegrations() sequentiell. 4 Unit-Tests (Strategy-Selection, Pagination, Idempotency, DLQ mit PII-Check) alle gruen, plus 1 Sandbox-Smoke der direkt den OrdersApiClient baut. Migration 20260407100001 erlaubt zusaetzlich sync_type='amazon_v2_order_import'. Gesamte Vitest-Suite gruen (15 Files, 42 Tests).
PROJ-156: Order-Mapper + Batch-Upsert + DLQ-Wrapper fuer Amazon v2 — mapOrderToWmsRow ist pure function und mapped @sp-api-sdk/orders-api-2026-01-01 Order auf V2OrderDraft (Status via mapAmazonV2StatusToWms, Betrag aus proceeds.grandTotal in Cents, metadata.amazon_v2.raw_items als sanitized Line-Item-Snapshot OHNE PII, buyer_present/recipient_present nur als Boolean-Flags). batchUpsertOrders macht manuelles Insert/Update-Split via Pre-Query auf idx_orders_unique_external_order, generiert neue order_numbers via generate_wms_order_number-RPC nur fuer echte Inserts und erhaelt bestehende ids bei Updates. DLQ-Wrapper schreibt hart version='v2' mit Exponential-Backoff (5min * 2^(attempt-1), max 4h).
PROJ-156: OrdersClient + RdtHelper fuer Amazon v2 — duenner Wrapper um @sp-api-sdk/orders-api-2026-01-01 und @sp-api-sdk/tokens-api-2021-03-01. searchOrdersPaged ist Async-Iterator mit 50-Pages-Hard-Cap, getOrder forwarded den RDT via x-amz-access-token-Header. RdtHelper baut RDTs pro Order auf Pfad /orders/2026-01-01/orders/{orderId}, mit lowercase Tokens-API dataElements und No-DataElements-Fallback bei fehlenden App-Rollen. Beide nutzen die memoized Auth-Instanz aus auth-instance-cache.ts. Keine DB-Zugriffe, keine PII in Logs.
Retoure-Badge in der Kundenaufträge-Übersicht (Status-Spalte) sobald ein Retourenlabel existiert
PROJ-156: Order-Status-Mapper fuer Amazon v2 (mapAmazonV2StatusToWms) — pure function, mapped die UPPERCASE-Enum-Werte aus @sp-api-sdk/orders-api-2026-01-01 (PENDING/UNSHIPPED/PARTIALLY_SHIPPED/SHIPPED/CANCELLED/UNFULFILLABLE/PENDING_AVAILABILITY) auf WMS-Status (open/in_progress/shipped/cancelled), fail-safe 'open' fuer unbekannte Werte mit Warn-Log ohne PII. Inkl. 4 Unit-Tests (alle gruen).
PROJ-156: DB-Migration 20260407100000_proj156_amazon_failed_operations_version.sql — neue Spalte amazon_failed_operations.version (Default 'v1', CHECK v1/v2) plus Partial-Index (version, status) WHERE status IN ('pending','retrying'). Idempotent (IF NOT EXISTS + DO-Block fuer Constraint). Bereitet die DLQ auf v1/v2-Split fuer das spaetere Cutover (PROJ-161) vor; v1-Code bleibt unangetastet.
PROJ-156: Amazon v2 Order Sync Spec (Phase 3) — OrderImportService mit FBM+FBA Strategy, Orders v2026-01-01 via @sp-api-sdk/orders-api-2026-01-01, RDT-Pipeline pro Order, Batch-Upsert ON CONFLICT, Advisory Lock, DLQ mit version='v2', Cron-Route mit Feature-Flag-Gate, strikte PII-Disziplin.
PROJ-155 Phase 2 abgeschlossen — Amazon v2 Connection & Health Deployed.
PROJ-155: Unit-Tests + Sandbox-Smoke fuer Connection & Health (9 computeOverallStatus-Cases, disconnect-Idempotenz + Revoke-Fehler-Toleranz, testConnection Success + Sellers-Rolle-403, Feature-Flag-Gate auf beiden Routes). 280/280 gruen, Sandbox-Smoke gruen.
PROJ-155: Amazon v2 Connection & Health Services — ConnectionService (testConnection + idempotenter disconnect mit LWA Token-Revoke), HealthService mit aggregiertem Status aus Sync-Logs/DLQ/Token/Connection-Test, neue API-Routes /test-connection + /health mit Feature-Flag-Gate
PROJ-155: Amazon v2 Connection & Health Spec (Phase 2) — ConnectionService (testConnection, disconnect mit LWA-Token-Revoke), HealthService mit aggregiertem Status, v2-Routes /test-connection + /health mit Feature-Flag-Gate
PROJ-154 (g): Sandbox-Smoke-Test — End-to-End-Beweis (LWA-Code-Tausch → encrypt/decrypt → SDK-Auth → getMarketplaceParticipations → Mapper). PROJ-154 Phase 1 abgeschlossen.
PROJ-154 (f): Unit-Tests für OAuth-Flow-Module — crypto-Roundtrip + Tamper, oauth-state Sign/Verify/TTL/Tamper, error-classifier (Sellers-Rolle, 401/403), single-flight auth-instance-cache, marketplace-mapper
PROJ-154 (d): SDK-Auth-Memo-Cache mit Single-Flight pro Integration (auth-instance-cache.ts), Reauth-Invalidation in Callback-Route
PROJ-154: Amazon SP-API OAuth-Callback komplett — LWA-Code-Tausch, Marketplace-Detection, verschlüsselte Refresh-Token-Persistenz und klassifizierte Error-Redirects (Sellers-Rolle, abgelaufener Code, ungültiger Token)
PROJ-154: Authorize-Route für den Amazon SP-API OAuth-Flow — Signed-State-Erzeugung, Region-Validierung und Redirect zur Seller-Central-Consent-Page
PROJ-154: AES-256-GCM Token-Crypto und signed JWT für OAuth-State-Management (CSRF-Schutz) als Foundation für den Amazon SP-API OAuth-Flow
PROJ-154: Amazon v2 OAuth-Flow Spec (Phase 1) — Authorize/Callback Routes, signed-JWT State, AES-256-GCM Token-Crypto, Single-Flight Refresh-Cache, Sellers-Rollen-Hint
PROJ-153: Sandbox-Smoke-Test fuer GET /sellers/v1/marketplaceParticipations (ueber @sp-api-sdk/sellers-api-v1, automatischer Skip ohne Sandbox-Credentials, anonymisiertes Logging ohne Marketplace-/Seller-IDs).
PROJ-153: Sandbox-Env-Plan in .env.local.example und README fuer src/lib/amazon-v2/ mit Mermaid-Architektur, SDK-Begruendung, Sandbox-Setup-Schritten und Troubleshooting.
PROJ-153: feature-flags.ts Helper (isV2EnabledFor / getV2PhasesFor) ueber zentralen Supabase-Admin-Helper, fail-safe Defaults, 6 Unit-Tests fuer alle Verhaltens-Pfade.
PROJ-153: Vitest-Setup fuer v2-Phasen — Default-Lauf excludiert Integration-Tests, separate vitest.sandbox.config.ts mit 30s Timeout und neuer test:sandbox npm-Script.
PROJ-153: Verzeichnis-Struktur src/lib/amazon-v2/ mit Stubs (sdk-client.ts, AmazonV2Error.ts) und Installation der drei Phase-0-SDK-Pakete @sp-api-sdk/auth, @sp-api-sdk/common, @sp-api-sdk/sellers-api-v1.
PROJ-153: Phase-0-Spec für das Amazon-v2-Fundament — SDK-Wahl @sp-api-sdk/* (live auf npm evaluiert, dediziertes orders-api-2026-01-01-Paket), Verzeichnis-Struktur src/lib/amazon-v2/, Vitest-Setup mit pragmatischer Test-Philosophie (4–5 Unit-Tests für kritische Logik + 1 Smoke-Test pro Phase), Sandbox-Env-Plan und Feature-Flag-Helper isV2EnabledFor.
PROJ-152: Master-Spec für den kompletten Amazon-Integration-Neubau — OAuth-only, offizielles SDK, Orders v2026-01-01, Polling-first, Parallel-Build mit Per-Integration-Cutover. Ziel: ~9.500 LoC Alt-Code durch saubere v2-Architektur ersetzen, robust für 10k+ Bestellungen/Tag. Alle DB-Tabellen bleiben erhalten, andere Subsysteme sind nicht betroffen.
Import-Notizen werden direkt in die order_notes-Tabelle geschrieben (PROJ-150): Shopify, Amazon FBA/FBM und manuelle Auftragsanlage nutzen jetzt einen einheitlichen Notiz-Helper mit Idempotenz-Schutz. Die alten orders.notes/import_notes-Spalten wurden entfernt, FreeScout eBay-Username-Lookup und die Notizsuche laufen über order_notes.
Auftragsdetailseite als Full-Page (PROJ-149 Task 7): Header mit Status/Financial-Popovers, Badges, Tags, 6 Tabs, Action-Buttons
PROJ-149: Navigation zu Auftragsdetailseite — Klick auf Auftragszeile öffnet jetzt die neue Full-Page-Ansicht statt den Dialog, Kundendetails-Links ebenfalls umgestellt
Workflow Intervall-Trigger — Workflows können jetzt in festen Intervallen ausgeführt werden (15min, 30min, 1h, 2h, 4h, 6h, 12h) zusätzlich zu täglich/wöchentlich
PROJ-149: Notizen-Tab Komponente (OrderNotesSection mit CRUD, Inline-Edit, Source-Badges)
PROJ-149: OrderNote-Typen, Adress-Update-Schema und Notiz-Validierung hinzugefügt
PROJ-145: Kundendetailseite & Multi-Adressen — Full-Page /dashboard/customers/[id] mit 5 Tabs (Stammdaten, Adressen, Aufträge, Profitbutler, Notizen), customer_addresses Tabelle mit CRUD, Adress-Snapshots auf Orders, Shopify-Import Adressen-Deduplizierung
PROJ-146: Kundensperre — Block/Unblock API (Worker sperren, Admins entsperren), roter Banner + Badge, Versand-Guard (403), Import-Flagging in Order-Metadata
PROJ-147: Erweiterte Kundensuche — Collapsible Filter für PLZ (Prefix), Stadt, Land (CountryCombobox), Erstellungsdatum, letzter Auftrag; DB-Indexes auf customer_addresses, Badge-Pills mit Dismiss
PROJ-148: Kunden-Profitbutler — KPI-Cards (Gesamtumsatz, Aufträge, Ø Bestellwert, Erster/Letzter Auftrag, Erstattungen, Retourenquote), Umsatz-pro-Jahr Balkendiagramm, Top-10-Artikel Tabelle
PROJ-136: Pending-Queue-Count Badge im Billkom Cron-Job — zeigt Anzahl ausstehender Rechnungs-Jobs direkt in der Cron-Job-Übersicht
PROJ-144: Erstattungsblock in Auftragsdetails (Erstattet / Offener Betrag)
PROJ-143: Deutsche Post Retouren — DHL Retoure + Internetmarke (umgedrehte Briefmarke) für DP-Versandarten, Popover-Auswahl, Auto-Return-Rules mit return_method
PROJ-142: Country-Code-Normalisierung in allen API-Write-Paths (Kunden, Lieferanten, Produkte, Workspace) und CSV-Import mit Warnungen
PROJ-141: Bestätigungsdialog bei manueller Änderung von Versandstatus und Zahlstatus
PROJ-142: Alle Freitext-Länderfelder durch CountryCombobox ersetzt (Lieferanten, Produkte, Zolldaten, Workflows)
PROJ-142: MultiCountryCombobox Komponente — Multi-Select mit Chips für Länderauswahl (ISO-Codes)
PROJ-141: Auftragsdetail Action-Bar Redesign — klickbare Status-Badges im Header, farbige Aktions-Buttons, Mehr-Menü mit destruktiven Aktionen
PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet
PROJ-140: Bundle-Artikel aus Bestellvorschlag, Einkaufsliste und Wareneingang ausgeschlossen
PROJ-140: Profitbutler zeigt Bundle-Komponentenkosten (FIFO/Lieferanten-EK, Aufschlüsselungstabelle)
PROJ-140: Profitbutler-Kalkulation verwendet Bundle-Komponentenkosten als Einstandspreisbasis
PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet (watchIsBundle-Konditionierung für TabsTrigger und TabsContent)
PROJ-135: Workflow-Bedingungen für Versandstatus, Zahlstatus und Versanddatum (älter als X Tage)
PROJ-135: Neue Workflow-Aktion 'Versandstatus ändern' mit Vorwärts-Validierung (z.B. shipped → completed)
PROJ-135: Status-Scope um 'Versendet' erweitert für Auto-Abschluss-Workflows
PROJ-136: Workflow-Bedingungen 'Rechnung vorhanden' und 'Lieferschein vorhanden'
PROJ-136: Neue Workflow-Aktionen 'Rechnung erstellen' und 'Lieferschein erstellen' über Billkom Job-Queue
Shopify Bestellstatus-Sync Cron Job — automatischer Abgleich von Status, Zahlungsstatus und Tracking alle 15 Minuten
PROJ-134: Financial Status auf Aufträgen (pending/paid/partially_refunded/refunded)
PROJ-134: Shopify Refund API Integration (Erstattung/Preisnachlass direkt aus Flowkom)
PROJ-134: Erstattungs-Dialog im Auftragsdetail mit Shopify-Notify + Gutschrift-Option
PROJ-134: Shopify-Refund im Storno-Flow integriert
PROJ-134: Financial-Status-Badge in Auftragsübersicht + Auftragsdetail
PROJ-134: refund_enabled Toggle in Shopify-Integrations-Einstellungen
PROJ-134: financial_status Mapping beim Shopify-Import + PROJ-131 Sync
PROJ-132: Varianten-Attribut Inline-Zuweisung — Attributwerte direkt in der Kindartikel-Tabelle per Dropdown zuweisen
PROJ-132: Kombinations-Validierung — Generierung blockiert wenn Kinder unvollständige Attributwerte haben
PROJ-132: PATCH /api/products/[id] akzeptiert jetzt variant_attribute_values (JSONB Record) für Inline-Zuweisung von Varianten-Attributwerten
PROJ-131: Temporärer Shopify Order-Sync (Tracking + Status aus Shopify auf Knopfdruck abrufen)
PROJ-100: Verkaufskanal-Logos (Otto, Kaufland, eBay, Amazon, TikTok, Zalando, Temu) in Auftragsübersicht & Detail-Dialog
PROJ-100: DB-konfigurierte Badge-Farben aus Channel-Rules werden jetzt in der Auftragsübersicht angezeigt
PROJ-130: Separates Notiz-Suchfeld in der Auftragsübersicht (notes + import_notes, Trigram-Index)
PROJ-111: eBay-Username-Lookup für FreeScout Connector (eBay-Proxy-Mails umgehen via Magnalister Import-Notizen)
PROJ-78: Versandart-Filter für Produktübersicht (Ist/Ist-nicht-Modus, Keine Versandart, Multi-Select)
PROJ-78: Hersteller-Filter mit Ist/Ist-nicht-Modus und Ohne-Marke-Option (Negierung + Artikel ohne zugewiesene Marke filtern)
PROJ-129: Dokumenten-Kategorien CRUD — Eigene Kategorien erstellen, alle Kategorien bearbeiten/löschen/kopieren, Richtlinien & Normen inline editieren, Preset-Reset (einzeln oder alle), Zusatztexte in DB persistiert, Konformitätserklärung nutzt DB-Kategorien
PROJ-128: Drag & Drop Sortierung für Varianten-Attribute — Werte-Bubbles und Attribut-Karten per DnD sortierbar, Kindartikel-Tabelle sortiert nach Werte-Reihenfolge
PROJ-2: Unsaved-Changes UX — Sticky Banner mit Speichern/Verwerfen, deaktivierter Save-Button ohne Änderungen, Browser-Leave-Guard, Zurück-Button warnt bei offenen Änderungen
PROJ-15: Parent-Child Checkbox-Kaskadierung — Elternartikel-Checkbox selektiert/deselektiert alle Kindvarianten, Indeterminate-State bei Teilauswahl, 'Alle auswählen' kaskadiert ebenfalls
PROJ-92: Profilkarten zeigen jetzt Max Aufträge, Auftragstypen, Scan-Modus, Auto-Flags, Lagerplatz- und Tag-Filter
PROJ-8: Import-Notizen für Kundenaufträge — Shopify note_attributes (z.B. Magnalister eBay-Metadaten) als eigenes Feld importieren und im Detail-Dialog anzeigen
PROJ-120: Firmenzusatz unter Firmenname in Lieferantenliste anzeigen
PROJ-122: Lieferant Quick-Assign-Button in der Massenbearbeitungs-Toolbar
PROJ-122: Inline-Validierung im Spreadsheet mit roten Fehler-Zellen
PROJ-122: Warnung bei 500+ Artikeln im Spreadsheet
PROJ-124: Eltern-Kind Zuordnung & Lösung — Kindartikel vom Elternartikel lösen und bestehende Produkte als Kind zuordnen
Versandverpackungen sortierbar via Pfeil-Buttons in Einstellungen, Sortierung wird im Produkt-Dropdown übernommen
PROJ-123: Varianten-Tab mit VariantTable, VariantToolbar, InheritanceDialog, ProductSlideOver und SpreadsheetView integriert
PROJ-123: Varianten-API gibt jetzt alle für Tabelle und Slide-Over benötigten Felder explizit zurück
PROJ-123: Vererbungs-Dialog — Felder vom Elternartikel auf ausgewählte Kindartikel übertragen (Gruppenauswahl, Vorschau)
PROJ-123: Produkt-Slide-Over — Schnellbearbeitung von Kindartikeln ohne Seitenwechsel (Sheet-Panel, Formular mit react-hook-form)
PROJ-123: VariantAttributeBuilder — onRename-Callback für editierbare Attributnamen (DB-gesicherte Attribute)
PROJ-123: VariantTable — neue read-only Tabelle mit Checkbox-Selektion, dynamischen Attribut-Spalten und Status-Badges
PROJ-123: VariantToolbar — Varianten-spezifische Toolbar mit 'Werte übertragen'-Button über dem BulkActionToolbar
PROJ-123: PATCH /api/products/[id]/variants/attributes — Umbenennung von Variantenattributen inkl. JSONB-Key-Update in allen Kindvarianten
PROJ-122: Tabellen-Editor (Spreadsheet View) mit AG Grid Community
PROJ-122: Spalten-Picker mit Gruppen, Checkboxen und localStorage-Persistierung
PROJ-122: Custom Dropdown-Zelleditor für Referenzfelder (Hersteller, Versandart, etc.)
PROJ-122: Custom Zahlen-Zelleditor mit deutschem Dezimalformat (Komma-Support)
PROJ-122: Bulk-Action Toolbar — BulkActionToolbar-Komponente mit SetFieldDialog (Feld+Wert in 2 Schritten, gruppiert nach Kategorie) und AdjustPriceDialog (5 Modi: absolut, ±%, ±€), inkl. AlertDialog-Bestätigungen für Archivieren/Löschen
PROJ-122: POST /api/products/bulk-action Endpoint für Toolbar-Aktionen (set_field, clear_field, adjust_price, archive, unarchive, delete — mit filter-basierter Auswahl via all_matching)
PROJ-122: PATCH /api/products/bulk Endpoint für Spreadsheet-Speichern (Bulk-Update einzelner Felder pro Produkt, Auth + Rate-Limit + 207 Multi-Status)
PROJ-122: Bulk-Edit Validierungen — bulkUpdateSchema, bulkActionSchema, BULK_EDITABLE_FIELDS, NON_BULK_EDITABLE_FIELDS, validateBulkFieldValue
PROJ-114: Marken direkt aus Tabellenübersicht duplizieren inkl. Logo & Unterschrift
PROJ-8.5: Shopify-Import holt jetzt Produktbeschreibung (body_html) und Gewicht (kg-Konvertierung) mit
Dev-Tools: Neues Cleanup-Target 'Produkte' — löscht alle Produkte, Bestände, Bestandsbuchungen, Wareneingänge und produktbezogene Daten
PROJ-120: Feld 'Nächster Hafen' bei Lieferanten-Stammdaten hinzugefügt
PROJ-85: Lager-Auswahl und Auto-Barcode beim Lagerplatz-Import — Dropdown für Ziel-Lager im Import-Wizard, Barcode wird automatisch aus Name generiert
PROJ-121: Nachträgliche Sendungsnummern an Shopify — Zusatzlabels und Retourenlabels aus Auftragsdetails optional an Shopify syncen, Toggle pro Integration (Default: aus, Multi-Channel-sicher), Override pro Auftrag im Label-Popover, Kundenbenachrichtigungs-Option, Multi-Channel-Warnung
PROJ-119: Produkte vollständig löschen (Hard Delete) — Admins können Produkte endgültig löschen (einzeln + Bulk), Abhängigkeitsprüfung (Bestand, Picklisten, Varianten, Bundles), Bestellpositionen werden automatisch in Freipositionen entkoppelt, 4-Phasen-Bestätigungsdialog
PROJ-2: UVP-Feld (Unverbindliche Preisempfehlung) im Basis-Tab hinzugefügt, inkl. Daten-Hub Synonym-Mapping
PROJ-2: Produktbeschreibung-Feld (HTML/Fließtext) im Sonstiges-Tab hinzugefügt
PROJ-89: Tags von Sonstiges in den Basis-Tab verschoben
Ausführliche Sync-Logs: Strukturierte Per-Item-Details für jeden Import (importiert/übersprungen/fehlgeschlagen mit Bestellnummer und Fehlergrund) (PROJ-118)
Detail-Sheet: Klickbare Sync-Log-Einträge öffnen Seitenleiste mit Admin-Übersicht und aufklappbaren technischen Details (PROJ-118)
Import-Rollback: Einzelne Imports rückgängig machen mit Bestätigungsdialog, Impact-Vorschau und verwaister-Kunden-Bereinigung (PROJ-118)
PROJ-2: ASIN-Feld (Amazon Standard Identification Number) bei Produkten hinzugefügt
PROJ-117: Amazon FBM-Import erhält jetzt automatisch Versandart via Prioritätsauflösung (war vorher NULL)
PROJ-117: Versandarten-Priorität als Deployed markiert
PROJ-117: Info-Banner in Versandarten-Einstellungen (Prioritäts-Erklärung mit Truck-Icon)
PROJ-117: onReorder-Callback in ShippingMethodTable verdrahtet (Cache-Invalidierung nach Drag-and-Drop)
PROJ-117: Neue Versandarten erhalten automatisch sort_order = MAX + 1, landen damit am Ende der Prioritätsliste
PROJ-117: Drag-and-Drop Priorität für Versandarten-Tabelle – Prio-Spalte mit Griffpunkt, optimistisches UI, persistiert via /api/shipping-methods/reorder
PROJ-117: Reorder-API für Versandarten hinzugefügt (PATCH /api/shipping-methods/reorder)
PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
Neuer Tab "Dokumente" in Produktdetailseite (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
18 vordefinierte EU-Produktkategorien mit aktuellen Richtlinien und EN-Normen (Stand 2026)
EG-Konformitätserklärung mit Kategorie-Vorauswahl, Normen-Wizard und PDF-Generierung
Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen, Symbolen und Markdown-Editor
Umkarton-Etikett im Tool-Stack-Format (A4 Querformat, Barcode, Formularfelder)
Hersteller-Stammdaten erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
Hersteller duplizieren und echtes Löschen (inkl. Storage-Cleanup)
Einstellungen: "Marken & Hersteller" → "Produkte" mit Dokumenten-Konfiguration
Varianten-Support: Ein PDF für alle Varianten (Bilder im 3er-Raster, automatischer Seitenumbruch)
Dokumentation: Ausführliche Hilfeseite unter Artikel & Lager → Produktdokumente
PROJ-116: Hard-Delete für Hersteller mit Logo/Signatur-Cleanup
PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
Neuer Tab "Dokumente" in Produktdetailseite
EG-Konformitätserklärung mit 18 EU-Produktkategorien und Normen-Wizard
Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen
Umkarton-Etikett (Ein-Klick PDF)
Hersteller erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
Einstellungen: Marken & Hersteller → Produkte mit Dokumenten-Konfiguration
PROJ-115: Rekursive SKU-Ordner-Suche beim Auto-Match (bis 3 Ebenen tief in Unterordnern)
PROJ-115: Env-Vars Dokumentation, Feature-Index und Implementation Plan
PROJ-115 Tasks 12-16: Cloud-Speicher Settings-Seite, Folder Picker, Dateien-Tab im Produktformular, File Browser mit Sidebar/Grid/List, Lightbox-Vorschau, Upload-Zone
PROJ-115: Dateien-Tab in Produktdetails + Cloud File Browser (Sidebar, Ordner-Kacheln, Thumbnail-Grid, Dateiliste)
PROJ-115: Cloud Folder Picker Dialog (Breadcrumb-Navigation, Ordner-Auswahl per Klick/Doppelklick)
PROJ-115: Cloud-Speicher Einstellungsseite (OneDrive-Verbindung, Basis-Ordner, Ordner-Vorlagen, Bulk Auto-Match)
PROJ-115: TanStack Query Hooks für Cloud Storage (Connections, Files, Folders, Templates, Product-Folder)
PROJ-115: Bulk Auto-Match API (alle Produkte automatisch per Marke + SKU mit Cloud-Ordnern verknüpfen)
PROJ-115: Ordner-Vorlagen API (CRUD + Drag & Drop Sortierung)
PROJ-115: Product-Cloud-Folder API (Verknüpfung, Auto-Match per Marke/SKU, Ordnerstruktur erstellen)
PROJ-115: Cloud File & Folder API Routes (List, Create, Upload, Download, Rename, Move, Delete, Thumbnail, Preview) + get-provider Helper mit Auto-Token-Refresh
PROJ-115: OAuth2 Flow (CSRF-State, Token-Verschlüsselung) + Connection Management API (CRUD, Root-Folder-Update)
PROJ-115: Zod-Validierungsschemas + DB-Row-Types für Cloud Storage (Folder-Templates, Connections, Product-Folder-Links)
PROJ-115: OneDrive Provider (Microsoft Graph API) + Provider Factory für Cloud-Storage-Modul
PROJ-113: LB-PDF neues Header-Layout — Logo, Absenderzeile, Liefer-/Rechnungsanschrift, Bearbeiter, zentrierter Titel
PROJ-113: Billkom PDF-Generator company_overrides & Logo-Fallback (billkom-logos → workspace-logos)
PROJ-113: Billkom Setup-Wizard — Button 'Firmendaten aus Workspace übernehmen' zum Prefill aller Felder
PROJ-113: Billkom Company-Tab Override-UI — OverridableField-Pattern mit Workspace-Werten als Read-Only, Per-Field Override mit Badges, Logo-Override
PROJ-113: Billkom Override-Logik — companyOverridesSchema, company_overrides in UpdateSettingsSchema, workspace_company im GET-Response
PROJ-113: Workspace-Einstellungen mit Tab-Struktur (Firmendaten + Nummernkreise), Logo-Upload, Firmendetails, Steuerdaten, Bankverbindung
PROJ-113 Task 1: DB-Migration — Workspace-Firmenprofil (company_name, Adresse, Bankdaten, USt-ID, Logo-URL), billkom company_overrides JSONB, Storage Bucket workspace-logos mit RLS
PROJ-24: SKU + EAN als Textzeile unter jedem Produktnamen im Bestell-PDF
PROJ-24: Ziellager-Auswahl auf Bestellungen, Firmendaten (Absender) + Lager-Lieferadresse im PDF nebeneinander
PROJ-24: Bestellungssprache pro Lieferant (DE/EN) für PDF-Export, Produktbilder in jeder Position
PROJ-112: Phase 3 complete — Profitbutler Statistik mit Dashboard, Fixkosten, Kanal-Aufschlüsselung, CSV/PDF-Export
PROJ-112: PDF-Export — Server-side PDF-Generierung mit jsPDF/autotable, API-Route /api/profitbutler/stats/export
PROJ-112: CSV-Export — Client-side CSV-Generierung mit deutschem Zahlenformat, UTF-8 BOM, Exportieren-Dropdown in Filterleiste
PROJ-112: Profitbutler Tagesstatistik Cron-Job-Eintrag in Settings-Seite
PROJ-112: Daily Stats Aggregation — Tagesstatistiken vorberechnen mit Backfill-Support, Aggregate-Shortcut in Stats API für schnellere Ladezeiten
PROJ-112: Konfigurierbare Zeiträume — User Preferences API, Period Config Dialog mit Drag-Reihenfolge, Custom-Zeitraum-Eingabe, max 10 Spalten
PROJ-112: Quartal-, Jahres- und Custom-Zeitraum-Parser mit TDD (quarter, year, custom:YYYY-MM-DD:YYYY-MM-DD)
PROJ-112: Kostenberechnungsmodul extrahiert — Pure Functions für Versand, Verpackung, Pick&Pack, Wareneinsatz, Provision, Werbung, MwSt mit 18 Unit-Tests
PROJ-112: Pick & Pack Kosten in Workspace-Standardwerten und Produkt-Overrides — neuer Standardwerte-Tab in Profitbutler-Settings, EUR-Eingabe pro Stück, produktspezifische Überschreibung mit Workspace-Default als Placeholder
PROJ-112: Revenue/Profit Chart mit Recharts — Umsatz als Balken, Gewinn als Linie, 7T/14T/30T/90T Zeitraumwahl, Orders/Invoices View, Dark-Theme-Tooltip
PROJ-112: Fixkosten Settings Tab — Summary Cards, Add/Edit Dialog mit Zod-Validierung, CRUD-Tabelle mit Pause/Resume/Löschen, Kanalzuweisung, Abschreibungsmodi
PROJ-112: Fixed Costs CRUD API — GET/POST Liste & Erstellen, PATCH/DELETE Einzeleintrag, Pause/Resume Toggle
PROJ-112: Profitbutler KPI-Widgets auf Dashboard (admin-only) — Tagesumsatz, Tagesgewinn, Marge mit Link zu /dashboard/profitbutler
PROJ-112: Artikelsuche mit Autocomplete und Multi-Select — debounced Suche gegen /api/products, Produkt-Badges mit Entfernen, Filter Bar Integration
PROJ-112: Kanal-Aufschlüsselung — Collapsible Section mit Kanal-Cards (Umsatz, Anteil, Gewinn, Marge), responsive Grid
PROJ-112: Sellerboard-Tabelle mit aufklappbaren Kostengruppen (Warenkosten, Logistik, Vertrieb, Steuern, Fixkosten), Gewinn/Marge/Bestellungen, formatCents Helper
PROJ-112: Profitbutler Filter Bar — Kanal-Dropdown (Alle Kanäle + Einzelkanäle), Aufträge/Rechnungen-Toggle mit Tabs
PROJ-112: React Query Hook für Stats API — useProfitbutlerStats mit View/Periods/Channel/ProductIds Params
PROJ-112: Profitbutler Stats Page Shell — Server Component mit Admin-Guard, Client Shell mit View/Channel/Period State
PROJ-112: Profitbutler Sidebar-Navigation — Admin-only Nav Item mit TrendingUp Icon, adminOnly-Flag im NavItem Interface
PROJ-112: Stats API Endpoint — /api/profitbutler/stats mit Revenue, Kosten, Gewinn pro Periode, Kanal-Aufschlüsselung, Orders/Invoices-View
PROJ-112: Profitbutler Stats-Berechnungslogik mit TDD (resolvePeriodToDateRange, calculatePeriodStats, calculateGroupedCosts, calculateMarginPct)
PROJ-112: Fixed-Cost-Berechnung mit TDD — calculateDailyFixedCost (distributed/due_date), calculateFixedCostsForPeriod, 12 Unit-Tests
PROJ-112: Stats-Types & Interfaces für Profitbutler Statistik-Modul (PeriodStats, FixedCost, StatsResponse etc.)
PROJ-98: Versand-/Service-Positionen werden in Auftragsdetails immer als letzte Positionen angezeigt
PROJ-98: Shopify shipping_lines als Versandpositionen importieren — Versandkosten kommen bei Shopify nicht in line_items sondern in shipping_lines, werden jetzt mit Shipping Detection verarbeitet
PROJ-53: Reverse Carrier Matching — Shopify tracking_company wird über shopify_carrier_mappings rückwärts auf WMS-Versandart gemappt, damit Retoure-Button und Carrier-Features bei importierten Bestellungen funktionieren
PROJ-53: Shopify Fulfillment-Daten beim Import übernehmen — Tracking-Nummern und shipped_at für bereits versendete Bestellungen als completed shipping_tasks importieren
PROJ-111: FreeScout-Flowkom Connector — Read-only Lookup-API, API-Key-Authentifizierung, Marketplace-URL-Builder, Integration-Registry (freescout + support-Kategorie), DB-Migration
Auftragsstornierung mit Beleg-Aktionen: Rechnung stornieren oder Gutschrift erstellen bei Auftragsstornierung (PROJ-110)
PROJ-110: Erweiterter Stornierungsdialog in Auftragsübersicht — gleiche Cancel-Preview mit Belegaktionen wie im Detaildialog (Rechnungen stornieren/gutschreiben, weitere Belege, Entwurf-Löschung)
PROJ-110: Erweiterter Stornierungsdialog — Rechnungs-Aktionen (Stornieren/Gutschrift/Nichts), Checkbox für weitere Belege, automatische Entwurf-Löschung, Cancel-Preview-API
PROJ-110: Cancel-Route mit optionalen Document Actions — Belege vor Stornierung löschen/stornieren/gutschreiben (void/credit_note/delete), Validierung aller Aktionen vor Ausführung, Audit-Trail mit document_actions
PROJ-110: createFullCreditNote-Funktion — erzeugt vollständige Gutschrift aus Rechnung ohne Stornierung (für versendete Bestellungen)
PROJ-110: Extract voidDocument function into reusable lib (Billkom Phase 3)
Gutschrift-Dialog erweitert: Dual-Modus (Positionen/Betrag) mit Brutto/Netto-Toggle
Verbleibender Rechnungsbetrag wird im Gutschrift-Dialog angezeigt
Übersteigung-Warnung mit Pflicht-Begründung statt Hard-Block
Belegübersicht in Auftrags-Details zeigt Rechnungen, Gutschriften und effektiven Umsatz
Preisnachlass-Feature komplett entfernt (ersetzt durch erweiterte Gutschrift)
PROJ-109: Belegübersicht im Auftragsdetail-Dialog — Rechnungen mit Gutschriften und effektivem Umsatz (brutto), klickbare Belegnummern öffnen DocumentDetailDialog
PROJ-109: Dual-Mode Gutschriftdialog — Umschaltung Positionen/Betrag, Restrechnungsinfo-Box mit Rechnungsbetrag/Gutschriften/Verbleibend, Betragseingabe (brutto/netto) mit Live-Berechnung, Überschreitungs-AlertDialog mit Pflicht-Begründung (min. 10 Zeichen)
PROJ-109: Amount-mode Gutschriften mit Concurrency-Lock, Betragsberechnung (gross/net), Überschreitungsvalidierung und Audit-Trail (exceeding_reason Event)
PROJ-109: Positions-mode Gutschriften mit related_document_id, Überschreitungsvalidierung und exceeding Event-Logging
PROJ-109: useRemainingInvoiceBalance-Hook hinzugefügt — leitet Restbetrag aus useBillkomDocumentsByOrder via calculateRemainingBalance ab
PROJ-109: CreditNoteAmountSchema (Betragsmodus mit gross/net-Refinement) und CreditNotePositionsSchema (Positionsmodus via CreateDocumentSchema.extend) hinzugefügt
Auftragslöschung mit Belegen: Vollständige Löschung inkl. Billkom-Dokumente & Nummern-Rückgabe (PROJ-108)
PROJ-108: Zweistufiger Lösch-Dialog in Auftragsübersicht — optionale Beleglöschung mit Checkbox, Dokumentenliste, GoBD-Warnung, Bestätigungseingabe; Umlaut-Korrekturen
PROJ-108: Zweistufiger Lösch-Dialog in Auftragsdetails — optionale Beleglöschung, Dokumentenliste mit Zahlungsstatus, Bestätigungseingabe bei Beleglöschung (GoBD-Warnung)
PROJ-108: DELETE /api/orders/:id ruft bei includeDocuments=true die RPC delete_order_with_documents auf (atomische Löschung mit Belegen & Nummernkreis-Rückgabe)
PROJ-108: RPC delete_order_with_documents — atomische Auftragslöschung mit Belegen, Nummernkreis-Rückgabe, Quotation-Reset, FOR UPDATE Locks
Shopify-Import: Rechnungsadresse + Lieferanschrift werden jetzt beide importiert (billing_address + shipping_address)
PROJ-107: Steuerprüfung ist jetzt Pflicht vor Rechnungserstellung — bei fehlgeschlagener Prüfung Toast-Fehler statt Dialog-Öffnung; 'Erstellen & Finalisieren' in DocumentFormDialog gesperrt bis Steuer-Szenario ermittelt, Hinweistext unter dem Button
PROJ-107: Billkom-Belegstatus-Badge im Auftragsdetail-Dialog (Entwurf/Rechnungsnummer/Bezahlt/Teilzahlung), ORDER_DETAIL_SELECT um billkom_documents!order_id erweitert
PROJ-107: SKU wird beim Erstellen von Billkom-Belegen aus Auftragsposition in billkom_document_items übernommen (DocumentItemSchema, document-form-dialog, documents API)
PROJ-107: Auftragsdetail-Dialog auf 8 Spalten erweitert (Art.-Nr., Bezeichnung, Menge, Einheit, E.-Preis, MwSt %, Rabatt %, Gesamt) + Summenblock mit Netto/MwSt-Aufschlüsselung pro Steuersatz
PROJ-107: Auto-MwSt im Auftragsformular basierend auf Kundenland (Tax-Preview-Banner, automatische Steuersatz-Setzung, Read-Only MwSt bei aktivem Szenario)
PROJ-107: GET /api/billkom/tax-preview Endpoint + useTaxPreview Hook (vereinfachte Steuer-Vorschau per customer_id, Standard- & Ermäßigter Satz)
PROJ-107: Länder-Freitext durch Combobox-Dropdown ersetzt (34 Länder, Suche nach Name/Code, Warnung bei unbekannten Werten)
PROJ-107: COUNTRY_LIST für Länder-Dropdown-Combobox exportiert (34 Länder mit deutschen Labels)
PROJ-103: DIN 5008 Form B Layout für PDF-Rechnungen (korrekte Abstände, Falz-/Lochmarken, Logo proportional skaliert in fester Box)
PROJ-103: ZUGFeRD-PDF auf Deutsch (locale de-DE), Logo-Einbindung aus Billkom-Settings, Artikelnummer (SKU) in Positionstabelle
PROJ-106: Billkom Positions-Integration & PDF-Overhaul — Einheitliche Positionskette Angebot→Auftrag→Rechnung
PROJ-106: Pixkom-Style PDF-Layout mit Logo, Artikelnummer, dreispaltiger Fußzeile, Zahlungsstatus
PROJ-106: Logo-Upload in Billkom-Einstellungen (Drag & Drop)
PROJ-106: Freiposition-Support in Kundenaufträgen und Angeboten
PROJ-106: Abweichungswarnungen und Teilrechnungen im Beleg-Dialog
PROJ-106: Shopify/Amazon Import mit Netto-Preisen und erweiterten Positionsfeldern
PROJ-106: Rückwärts-Tracking zwischen Angebot, Auftrag und Rechnung
PROJ-104: Produkt-Suche im Angebots-/Proforma-Formular — Artikel direkt aus Produktstamm hinzufügen mit SKU, Preis (Profitbutler VK), product_id-Verknüpfung für Auftragskonvertierung
PROJ-104: "Neuer Auftrag"-Button im Angebote-Tab ausgeblendet
Billkom Phase 3: Angebote & Proforma-Rechnungen (CRUD, Finalisieren, Auftrag erstellen)
Billkom Phase 3: Mahnwesen mit 3 Stufen (Einzel + Batch, pg_cron Überfälligkeitserkennung)
Billkom Phase 3: GoBD-konforme Korrekturbearbeitung mit Concurrent Locking
Mahnwesen-Settings-Tab (Fristen + Gebühren pro Stufe)
Angebote-Tab auf Auftragsseite (nur bei billkom_enabled)
PROJ-21: Auftragspositionen verschiebbar — Reihenfolge per Hoch/Runter-Buttons, persistiert über position-Spalte in DB
PROJ-103: Konfigurierbares Belegnummernformat — Mit/Ohne Jahreszahl, Kurzjahr, Trennzeichen und Stellenanzahl pro Dokumenttyp einstellbar
PROJ-103: Phase-2-Integration in Belege-Tab — BillkomDownloadButtons (PDF/ZUGFeRD/XRechnung) ersetzt Einzel-Download, canCreateInvoice-Guard mit Tooltip, Tax-Preview vor manueller Rechnungserstellung, Preisnachlass-Button + Discount-Dialog für aktive Rechnungen
PROJ-103: Tax-Info-Komponente (Steuer-Szenario-Badge, Warnungen), Download-Buttons (PDF/ZUGFeRD/XRechnung mit Tooltip), Preisnachlass-Dialog (Live-Berechnung, Validierung, useCreateDiscount)
PROJ-103: Kanäle-Tab in Billkom-Einstellungen mit Channel-Config-Cards (Steuerbehandlung, Absenderland, Zahlungsart, Auto-Rechnung, Auto-Bezahlt pro Kanal)
PROJ-103: Job Queue Processor (processJobQueue) mit Batch-Claim, Workspace-Advisory-Lock, paralleler Workspace-Verarbeitung, Tax-Engine-Integration, Duplikatschutz, Auto-Finalisierung, Auto-Paid-Markierung und Cron API Route (POST /api/billkom/queue/process)
PROJ-103: Discount (Preisnachlass) API-Endpoint mit Row-Locking, Teilgutschrift-Erstellung, Betragsvalidierung, Invoice-Status-Update und useCreateDiscount Hook
PROJ-103: Channel Config GET/PUT API Routes (authenticateRequest/authenticateAdmin, rateLimitAsync, Zod-Validierung) und TanStack Query Hooks (useChannelConfigs, useUpdateChannelConfig)
PROJ-103: Download-Endpoint um ZUGFeRD- und XRechnung-Formate erweitert (format Query-Parameter, Status-Prüfung auf finalisierte Belege, buyer_reference-Validierung für XRechnung, TaxResult aus Snapshot)
PROJ-103: E-Invoice Adapter (EInvoiceGenerator) mit dynamic import für factur-x-kit (ZUGFeRD Comfort PDF/A-3) und xrechnung-generator (XRechnung UBL 2.1 XML), Singleton-Export, 7 Tests
PROJ-103: XRechnung UBL 2.1 Mapper (mapToXRechnungInput) für xrechnung-generator Library, cents→decimal Konvertierung, buyer_reference Pflichtvalidierung, Supplier/Customer/Payment/LineItems Mapping, Reverse-Charge Notes, 57 Tests
PROJ-103: ZUGFeRD ComfortProfile Mapper (mapToZugferdInput) mit TotalsCalculatorInputType-Ziel, cents→decimal Konvertierung, Discount-Allowances, Reverse-Charge taxExemptionReason, SEPA-Bankdaten, 41 Tests + Shared Fixtures
E-Invoice Types, Unit Codes & Tax Category Mappings (PROJ-103): BillkomDocumentForInvoice/ItemForInvoice Interfaces, EInvoiceGenerator Interface, INVOICE_TYPE_CODES (380/381/325), UN/ECE Unit Code Map (11 WMS-Einheiten → CEFACT), Tax Category Map (7 Szenarien → ZUGFeRD-Codes S/AE/G/O)
PROJ-102 Billkom Phase 1 als Deployed markiert
Settings: Steuern-Tab (EU-Steuersätze, OSS-Status)
Settings: Nummernkreise-Tab (Präfix, Nächste-Nummer)
Corrective Edit Dialog (GoBD-Warnung)
Tax Preview (Live-Steuervorschau im Formular)
API: /tax-rates und /sequences Endpoints
Bugfixes: 4 kritische + 6 wichtige Fehler behoben (DB-Spaltennamen, Corrective Edit Beträge, Search-Injection, Tax-Kategorie)
PROJ-102: Billkom-Integrationspoints verdrahtet — konditionaler "Belege"-Tab im Auftragsdetail-Dialog (lazy-loaded, billkom_enabled-Flag), Phase-3-Kommentar in Auftragsübersicht
Billkom Document UI Components (PROJ-102): Belege-Tab für Auftragsdetails, Beleg-Detail-Dialog mit Positionen/Zahlungen/Aktionen, Beleg-Formular-Dialog mit dynamischen Positionen und Live-Summenberechnung, Zahlungsbuchungs-Dialog, Stornierungs-Dialog mit Gutschrift-Hinweis
Billkom Settings-Seiten & Setup-Wizard (PROJ-102): Settings-Navigation-Eintrag, Hauptseite mit Tab-Navigation (Unternehmen, Zahlungen, Vorlagen), 3-Schritt-Setup-Wizard mit Firmen- und Bankdaten, Skonto-Konfiguration, Accordion-Vorlagen-Editor für 6 Belegtypen
src/hooks/use-billkom.ts — TanStack Query hooks für alle Billkom-Endpunkte (Settings, Dokumente, Zahlungen, Tax/VIES)
src/components/billkom/status-badge.tsx — BillkomStatusBadge-Komponente mit 7 Status-Konfigurationen (Entwurf, Finalisiert, Teilbezahlt, Bezahlt, Überfällig, Storniert, Umgewandelt)
pdf-generator.ts — Billkom PDF-Generator mit jsPDF + jspdf-autotable; rendert aus Snapshots (customer_snapshot, sender_snapshot, tax_rate_snapshot)
GET /api/billkom/documents/[id]/download — PDF-Download-Endpoint aktiviert, gibt echtes PDF statt 501 zurück
POST /api/billkom/payments — Zahlung an Beleg buchen, DB-Trigger aktualisiert Status
DELETE /api/billkom/payments/[id] — Zahlung löschen (Admin only)
POST /api/billkom/tax/check — Steuervorschau ohne Belegerststellung
POST /api/billkom/tax/vies-validate — USt-IdNr. via EU VIES API validieren mit Caching
Billkom Document Action APIs (PROJ-102): Finalize (Tax Engine + Snapshot + RPC), Void (Admin-only + Auto-Gutschrift), Corrective Edit (GoBD SET LOCAL bypass), Download (501-Platzhalter für Task 13), billkom_apply_corrective_edit SQL-Funktion
PROJ-102: Billkom Settings API (GET/PUT) mit EU-Steuerrate-Seeding (27 Länder)
PROJ-102: Billkom Documents CRUD API (POST, GET Liste mit Cursor-Pagination)
PROJ-102: Billkom Document Detail & PATCH API (Entwurf bearbeiten)
PROJ-102: Billkom Documents by-Order API (GET nach Order-ID)
Billkom Phase 1 DB-Migration (PROJ-102): Komplettes Datenbankschema — 11 Tabellen, 3 ENUMs, 6 Funktionen (inkl. GoBD-Trigger, gap-free Nummernvergabe, atomische Finalisierung), 13 Indexes, RLS-Policies
Billkom Document Lifecycle Helpers (PROJ-102): Pure-Function-Bibliothek für Zeilenposten-Berechnung, Dokumentsummen, Aufbewahrungsfristen (§147 AO), Zahlungszieldaten, Status-Transitionen und Kunden-/Absender-Snapshots
PROJ-102: VIES-Validierungsmodul (vat-validation.ts) mit Cache-Logik, API-Isolation und Override-Validierung
PROJ-102: lookupTaxRate() in tax-engine.ts für Steuerssatz-Lookup aus billkom_tax_rates
Billkom Foundation (PROJ-102): TypeScript-Typen, EU-Länderliste und Konstanten für das Rechnungsmodul — TaxContext, TaxResult, TaxScenario, DocumentTypeAllowed, TaxEngineError, ALLOWED_TRANSITIONS, DOCUMENT_PREFIXES, RETENTION_YEARS
Profitbutler Settings-Restrukturierung (PROJ-105): USt-Sätze und Wechselkurse unter neuer Profitbutler Tab-Page in den Settings zusammengefasst
Billkom Rechnungsmodul Specs (PROJ-102/103/104): Vollständige Feature-Spezifikationen für 3-phasiges Rechnungsmodul — Tax Engine, GoBD-Compliance, E-Rechnung, Angebote, Mahnwesen
Mehrfachauswahl-Operatoren für Workflow-Bedingungen (PROJ-101): IST EINES VON / IST KEINES VON für Versandart, Verkaufskanal und Lieferland — z.B. 'WENN Kanal = Otto UND Versandart ist eines von [Brief, Kompaktbrief, Großbrief] DANN Versandart = DHL Kleinpaket'
Multi-Select UI mit Checkbox-Popover und Chip-Badges im Workflow-Builder
Verkaufskanal-Erkennung (PROJ-100): Tag-basiertes Channel-Mapping pro Shopify-Integration (Otto, Temu, eBay, Kaufland, TikTok, Zalando etc.)
Channel-Rules UI: Drag & Drop Reihenfolge, Preset-Farben, Tag-Vorschläge, Kanal-Badges in Auftragsliste
Verkaufskanal-Filter: Neue Filterleiste in der Auftragsliste nach Verkaufskanal
Workflow-Condition 'Verkaufskanal': Regeln wie 'WENN Kanal = Otto DANN Versandart DHL' möglich
Workflow-Priorität: sort_order für Workflows, Ausführungsreihenfolge steuerbar, first-match-wins bei Konflikten
Service-Artikel & Versandpositions-Erkennung (PROJ-98): inventory_tracking Flag auf Produktebene, automatische Keyword-Erkennung beim Import (Shopify/Amazon), Service-Badge in Produktliste und Aufträgen, ShippingDetectionSection pro Integration, Systemausschlüsse (Picklisten, Wareneingang, Bestandsübersicht, Bestellvorschlag)
PROJ-99: Etikettendruck-Modul (Formate, Vorlagen, Barcode-Druck für Lagerplätze & Produkte)
PROJ-99: Storage-Cleanup für Etiketten-Labels in print-job-result – temporäre Label-PDFs (storage_label, product_label) werden nach erfolgreichem Druck automatisch aus dem Supabase Storage gelöscht
PROJ-99: PDF-Renderer für Etikettendruck – renderLabelPdf() mit dynamischer Skalierung, EAN-13-Validierung, HRI-Text und optionalem Label-Text
Barcode-Adapter für Etikettendruck-Modul (PROJ-99): EAN-13-Validierung mit Prüfziffer, Code128/Code39-Rendering, dynamische Skalierung auf verfügbare Labelgröße, 300-DPI-Auflösung
PROJ-99: Etikettendruck-Modul — label_formats und label_templates Tabellen mit System-Presets (7 Templates, 2 Formate), RLS, label_type Enum-Erweiterung (storage_label, product_label, return_label)
Shopify Metafeld-Sync: Flexibler Builder zum Befüllen von Shopify-Metafeldern mit WMS-Daten (Auftragsnummer, Tracking, Retour-Tracking, Tags, etc.)
Shopify Versandrückmeldung: Trackingnummer + Carrier automatisch an Shopify senden (Fulfillment API)
Carrier-Mapping: WMS-Versandart → Shopify Carrier konfigurierbar (DHL Express, Deutsche Post, etc.)
Retour-Tracking: Auto-Return Trackingnummer als zusätzliche Trackingnummer an Shopify senden
Fulfillment-Toggle pro Integration, Retry-Queue mit Cron, Status-Badge im Auftragsdetail
Produktverwaltung mit Varianten, Bundles und Tags (PROJ-2, 15, 16, 78, 79, 88, 89)
Lagerverwaltung mit 5-stufiger Hierarchie und Standort-Wizard (PROJ-3, 4, 34-36)
Bestandsführung mit Bewegungshistorie und FIFO-Bewertung (PROJ-5, 14, 73, 74)
Wareneingang frei und gegen Bestellung (PROJ-6)
Kundenauftrags-Verwaltung mit Audit-Trail (PROJ-21, 59, 90)
Sammelkommissionierung mit Picklisten-Profilen (PROJ-9, 10, 92)
Versandprozess mit Label-Generierung und Zollinhaltserklärung (PROJ-11, 70)
Lieferanten- und Einkaufsbestellungen mit Kanban-Board (PROJ-18-24, 75, 76, 81)
Shopify-Integration mit Multi-Shop und SKU-Matching (PROJ-7, 8, 50-55)
Amazon SP-API Integration (FBM + FBA) mit Carrier-Mapping (PROJ-60-64, 67-69, 71, 72)
DHL und Deutsche Post Internetmarke Integration (PROJ-12, 27, 40)
Print Broker mit Workstation-Pairing und Job-Queue (PROJ-25, 37-39, 41)
Nachfüllung / Replenishment mit Profilen und Berichten (PROJ-94)
Daten-Hub mit CSV Import/Export und Templates (PROJ-84-87)
Workflow-Engine mit Trigger, Bedingungen und Aktionen (PROJ-56-58, 93)
Einstandspreis und Profitbutler-Integration (PROJ-73, 74, 82, 83)
Team-Verwaltung mit Rollen und PIN für Mobile (PROJ-32, 33, 80)
Sortiernummer pro Lagerplatz für Picking-Routen (PROJ-91)
Performance: Trigram-Indexe, JWT-Claims, Batch-Operationen (PROJ-40-49)
Datenbereinigung mit TTL-Policies (60d Print-Jobs, 90d Sync-Logs) (PROJ-47)
Neue Architektur-Sektion mit Seite "Bestandssynchronisation" — beschreibt Queue-Modell, DB-Trigger, App-Hook-Defense-in-Depth, Safety-Sync und Drift-Diagnose. Mermaid-Diagramm zeigt den Flow Stock-Change/Order-Lifecycle → Queue → Cron → Shopify/Amazon.
Versandarten-Hilfeseite: Vollständige Anleitung mit Priorität, Drag & Drop, Workflows, Fallback-Logik
Neue Hilfeseite: Produktdokumente (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
Dokumentation aller 18 EU-Produktkategorien mit Richtlinien und Normen
Anleitung für Hersteller-Stammdaten, Varianten-Support und FAQ
PROJ-237: Neue Hilfeseite 'Nachlaufkosten' (einkauf/nachlaufkosten) — Was sind Nachlaufkosten (Fracht/Zoll/Sonstige EUR+Fremdwährung), Karten im Kosten-Tab, Vergleichstabelle der drei Verteilmethoden (Volumen/Warenwert/Menge) mit Empfehlungen pro Szenario (Container→Volumen, Versicherung→Warenwert, Handling→Menge), Wechselkurs-Semantik (1 EUR = X Fremdwährung, Quelle api/manual), retroaktive FIFO-Korrektur mit Mermaid-Flowchart (DB-Trigger → calculate_landed_costs → goods_receipt_items + stock_movements), typischer Workflow (Container-Import aus China mit CNY+EUR-Kosten) als Mermaid-Sequenz, FAQ (Division bei Kurs, Verteilmethoden-Wechsel, LB-übergreifende Fracht, Rechnungen), aufklappbare Technik-Details (calculate_landed_costs-RPC, Trigger, purchase_orders/goods_receipt_items/stock_movements).
PROJ-232: Neue Hilfeseite 'Versandinfo-Tags' (einkauf/versandinfo-tags) — Vollständige Incoterms-2020-Referenz (alle 11 Codes EXW/FCA/FAS/FOB/CFR/CIF/CPT/CIP/DAP/DPU/DDP mit Kosten/Risikoübergang/Use-Case), Transportart-Tabelle (Schiff/Luft/Zug/LKW mit Laufzeiten aus Asien), Händler-Entscheidungsvergleich FOB vs. CIF vs. DDP, Mermaid-Flowchart für den Tag-Setzen-Workflow beim LB-Anlegen, Gantt-Diagramm für Laufzeitvergleich, aufklappbare technische Details (DB-Spalten `incoterm`/`transport_mode`, Zod-Schemas, Audit Trail), FAQ zu rechtlicher Relevanz und Incoterms-2010-Altbegriffen (DAT→DPU, DDU→DAP). Neuer Top-Level-Bereich 'Einkauf' im Sidebar-Meta.
PROJ-223: Dokuseite 'Bestellungen' überarbeitet — alte Filterleisten-Beschreibung ersetzt durch drei klar getrennte Abschnitte: Unified Search mit Scope-Dropdown-Tabelle (Überall/Auftrag+Kunde/Artikel/Notiz/Externe Nr.) inkl. konkreten Beispielen (Amazon-Nr. findet externe Bestellnr., eBay-Nr. findet Notiz, SKU/EAN/ASIN/FNSKU findet Artikel), kompakte Status-Pipeline-Tabs, Filter-Drawer mit sekundären Filtern und Aktive-Filter-Chipleiste mit prominentem 'Alle zurücksetzen'-Button.
PROJ-177: Neue Dokuseite 'Amazon FBA-Bestand' (integrationen/amazon-fba-bestand) — Mermaid-Flowchart des FBA-Stock-Sync-Pfads (SP-API → pullFbaInventory → sync_amazon_fba_stock RPC → public.stock + stock_movements), Erklärung von FBA-POOL als virtueller Sammel-Location, read-only Warehouse-Semantik, Bewertung/Bestellvorschlag-Effekte, Tabelle der bekannten Einschränkungen (Doppelzählung, Cost-Approximation, Retouren-Semantik, Unmapped SKUs) mit Verweis auf PROJ-178, technische Referenz (RPC-Signaturen, Movement-Type, Code-Pfade).
PROJ-172: Neuer Abschnitt 'Nächtlicher automatischer Refresh' auf der Amazon-Angebote-verwalten-Doku. Enthält Mermaid-Flowchart des Cron-Pfads (Scheduler → Integrations-Loop → advanceListingsJob → per-MP-Isolation → Cross-MP-Propagation → finishLog), Vergleichstabelle der Amazon-Cron-Zeiten (Listings 02:00, FBA-Inventory 03:15), Opt-Out-Erklärung, Anleitung für manuelles Testen (Cron-Jobs-Tab-Trigger + 'Jetzt starten'-Button pro Integration), aufklappbare Technik-Details zu 'Warum kein pg_cron?' und 'Warum kein wöchentlicher Force-Full?'.
Amazon-Angebote verwalten: Neuer Abschnitt 'FBA-Bestand' mit Mermaid-Flow, Ereignis-Tabelle und Technik-Details zum Trigger-basierten Sync (PROJ-171).
PROJ-170: Neue Dokuseite 'Amazon-Angebote verwalten' — Mermaid-Workflow-Flowchart (Filter → Selektion → Bulk-Aktion), FBA/FBM-Vergleichstabelle, Filter-Übersicht, Beispiel-Workflow '50 unzugeordnete FBA-DE-Angebote auf einmal mappen', Spalten-Konfiguration, CSV-Export, aufklappbare Technik-Details (API-Endpoints, Indizes, Selektions-Modell).
Amazon-Integration: Vollständige Dokumentation ersetzt den Stub — Mermaid-Flowchart, FBM/FBA-Vergleichstabelle, Filter-Übersicht, Status-Mapping Amazon → Flowkom, FAQ (PROJ-167)
Shopify-Integration: Vollständige Dokumentation (Verbindung, Import, Fulfillment, Erstattungen, Fehlerbehebung)
Bestellungen: Zahlstatus-Erklärung und Erstattungs-Anleitung ergänzt
FreeScout-Integration Doku überarbeitet: Matching-Logik mit Mermaid-Flowchart, eBay-Username-Lookup, Carrier-Erkennung, Deeplinks, marktplatzspezifische Fehlerbehebung
Cloud-Speicher Dokumentation: Übersichtsseite (Funktionen, unterstützte Anbieter, Ordnerstruktur) + ausführliche OneDrive-Einrichtungsanleitung (Azure App-Registrierung, Berechtigungen, Env-Vars, Fehlerbehebung)
FreeScout-Integration: Ausführliche Einrichtungsanleitung (Flowkom + FreeScout Modul), Sidebar-Funktionen, Fehlerbehebung, Sicherheitsübersicht
Druckvorlagen-Dokumentation (PROJ-99): Etikettenvorlagen, Etikettenformate, Druckflow, Barcode-Typen, Layout-Erklärung, FAQ
Service-Artikel-Dokumentation (PROJ-98): Versandpositions-Erkennung und inventory_tracking Flag
Automatische Versionierung mit Bump-Script
Drucker-Dokumentation (Einrichtung, Fehlerbehebung)
Nachfüllung komplett dokumentiert (5 Seiten: Übersicht, Profile, Bericht, Mobile, Prozess)
Picklisten-Dokumentation erweitert (Profile, Mobile Picking, Prozessdetails)
Tags-Dokumentation
Sortiernummer-Dokumentation
Flowkom Mobile Dokumentation (5 Seiten: Übersicht, Einrichtung, Bedienung, Einstellungen, Fehlerbehebung)
Erste Schritte Guide (Workspace einrichten, Benutzer anlegen, erste Bestellung)
Artikel und Lager Dokumentation (Produkte, Lagerplätze, Bestände, Systemlagerplätze)
Aufträge und Versand Dokumentation (Bestellungen, Picklisten, Versand, Retouren)
Daten-Hub Dokumentation (CSV Import/Export, Vorlagen, Feldreferenz)
Einstellungen Dokumentation (13 Seiten)
Integrationen Dokumentation (Shopify, Amazon)
Flowkom Webv1.86.047
v1.86.047Latest2026-05-15
  • PROJ-319 QA-Closeout — Vier Findings aus dem `/qa`-Skill nach Merge nachgereicht: (BUG-3 Critical) Backup-Tabelle `picklist_profiles_filters_backup_proj319` wurde ohne RLS angelegt, anon-key konnte SELECT/INSERT/DELETE über alle Workspaces — Sofort-`ENABLE ROW LEVEL SECURITY` auf Production direkt + idempotente Folge-Migration im Repo; (BUG-2 Medium) `overrides.tag_filters` im Picklisten-POST war `z.any()`, ungültiger Payload wäre stillschweigend zu undefined geworden — jetzt `tagFiltersInputSchema` (akzeptiert beide Formen) + striktes location-filters-Schema; (BUG-5 Medium) Form-Dialog Preview-Count ignorierte `tag_filters`/`max_orders`/`location_filters`, lieferte daher andere Zahl als die Saved-Profile-Card — Preview-Fetch sendet jetzt alle Filter-Dimensionen mit; (BUG-4 Low) gelöschte Tags hinterließen tote ID-Verweise in JSONB-`tag_filters`, UI zeigte 6-char-Substring statt Tag-Namen — neuer BEFORE-DELETE-Trigger `trg_cleanup_tag_filters_on_delete` auf `tags` filtert die gelöschte ID aus `picklist_profiles` (neue + Legacy-Form) UND `replenishment_profiles`, leere Buckets werden zusammengefaltet, end-to-end gegen Staging verifiziert. Plus Lessons-Learned-Section in der Spec für künftige Migrationen (Backup-Tabellen IMMER mit RLS anlegen, Parity-Checks als `RAISE EXCEPTION` statt `NOTICE`, `/qa`-Skill VOR dem Merge fahren).
v1.86.0452026-05-15
  • PROJ-319: Picklisten-Tag-Filter Schema-Split — `tag_filters` JSONB aufgeteilt in zwei semantisch klare Konzepte: `must_have` (Einschluss, AND/OR-Toggle) und `must_not_have` (Ausschluss, immer AND). Behebt einen Live-Bug bei Pixkom, wo alle drei Standard-Profile (One-Scan, Multi, DHL Paket) `logic="OR"` mit reinen `HAS_NOT`-Regeln kombiniert hatten — strukturell wirkungslos (`HAS_NOT(A) ∨ HAS_NOT(B)` ist nur false wenn beide Tags). PL-2026-0240/0237/0236 hatten dadurch je 1-2 Aufträge mit Personalisierte-Artikel-Tag obwohl ausgeschlossen. Root Cause war nicht der Helper-Code (boole'sch korrekt), sondern dass das Schema HAS und HAS_NOT als gleichwertige Operatoren mit globalem Logic-Toggle modellierte — die Kombination HAS_NOT+OR ist damit strukturell unmöglich geworden. Migration backfillt deterministisch (4 Profile, kein Mixed-Fall im Bestand), Helper hat Read-Fallback für eine Release-Phase. UI: zwei klar getrennte Sektionen 'Aufträge müssen diese Tags haben' und 'Aufträge dürfen diese Tags NICHT haben'. Sofort-Daten-Hotfix der 3 betroffenen Pixkom-Profile von OR auf AND auf Production am 2026-05-15 vor Implementierung deployed. PR #267, Production-Migration verifiziert (alle 4 Profile sauber im neuen Schema), 23 Vitest-Specs grün, Independent-Code-Review clean.
v1.86.0432026-05-15
  • PROJ-318 QA-Closeout: PGRST116-Guard in Auto-Match + Create-Structure — bei zwei aktiven use_for_products-Connections liefern beide Routen jetzt eine klare Fehlermeldung statt der irreführenden 'Keine Cloud-Verbindung'-Antwort. Spec + INDEX auf Deployed gesetzt. PR #265.
v1.86.0412026-05-14
  • PROJ-318: Produkt-Cloud-Folder Polish — Verknüpfung-lösen-Button im Dateien-Tab, Connection-Filter auf use_for_products in Auto-Match + Create-Structure (Multi-Provider-Setup hat zuvor nicht-deterministisch die falsche Cloud gewählt), SKU-Token-Boundary-Match statt startsWith, neuer Create-Dialog mit editierbarem Pfad + Name + Dedupe.
v1.86.0312026-05-14
  • PROJ-292/298 QA-Doku-Drift Fix: INDEX-Eintrag von PROJ-292 sagte fälschlich auto_reconcile_fba-Toggle, Code nutzt seit Anfang den auto_import_fba-Toggle (bewusst, get-active-integrations.ts:14-15). Plus probe-reports.ts + route.ts Header-Kommentare PROJ-297→PROJ-298 (ID-Race-Artefakt, INDEX-Eintrag war schon retagged). Reine Doku-Korrekturen, kein Verhaltensänderung. PR #264.
v1.86.0302026-05-14
  • Cleanup-Pass: INDEX-Status PROJ-292/293/298/299/300 auf Deployed gesetzt + Detail-Texte um Live-Befund und PR-Referenzen ergänzt. Kein Code-Change, nur Dokumentation. PR #262.
v1.86.0292026-05-14
  • PROJ-317 Kostenlose Ersatzlieferung sofort als bezahlt anlegen — Neuer Switch „Sofort als bezahlt markieren“ (Default an) im Replacement-Modus des OrderFormDialog; POST /api/orders/[id]/replacement akzeptiert mark_as_paid: boolean und setzt financial_status beim Insert auf 'paid' oder 'pending'. Spart einen manuellen Klick pro Ersatzanlage, Order erscheint direkt auf der Standard-Pickliste (PROJ-210-Filter status='open' AND financial_status='paid'). Nur im Replacement-Modus sichtbar, Edit/Normal-Anlage unverändert. Keine Migration. Deployed via PR #259.
v1.86.0252026-05-14
  • PROJ-316 QA-Polish: drei mechanische Defense-in-Depth-Fixes aus dem QA-Audit auf PROJ-315/316. (1) WorkstationAssignmentForm.handleSave löschte alle Rows der Workstation im jeweiligen entityKind-Table und konnte parallele Edits aus einer anderen Admin-Session überschreiben — Delete ist jetzt auf die im Form sichtbaren entity_ids gescoped (analog zum API-PUT-Handler). (2) /api/etiketten/print 23503-Branch differenziert via insertError.details zwischen printer_id- und workstation_id-FK-Verstoß, neuer Response-Code 'workstation_missing' mit angepasstem Toast-Text. (3) PDF-Magic-Byte-Check ('%PDF') vor dem Storage-Upload verhindert dass authentifizierte User die labels-Bucket mit Nicht-PDFs füllen, 415 bei Verstoß.
v1.86.0242026-05-12
  • PROJ-316 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0232026-05-12
  • PROJ-316: Etikettendruck — Server-side Upload + Print-Job-Endpoint (Folgefix PROJ-315). Mit PROJ-315 wurde der 'An Drucker senden'-Pfad zum ersten Mal end-to-end erreichbar und brach sofort am Browser-Upload mit 'new row violates row-level security policy': der labels-Bucket hat auf Production keine INSERT-Policy für authenticated Users, alle anderen Schreibpfade laufen serverseitig mit service_role (DHL/DP-Label-Upload, Print-Broker-Test-PDF, Cleanup-Cron). Neue Route POST /api/etiketten/print (multipart/form-data) übernimmt Auth + Rate-Limit + Workstation-Ownership-Check + Drucker-Zuweisungs-Lookup + service-role Upload + print_jobs.insert in einem Roundtrip; bei FK-23503 zwischen Lookup und Insert wird der hochgeladene Blob best-effort wieder entfernt. Frontend ersetzt drei inline supabase-Calls durch einen fetch.
v1.86.0222026-05-09
  • PROJ-315 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0212026-05-08
  • PROJ-315: Drucker-Zuweisung für Etiketten-Typen pro Workstation. Neue Tabelle label_type_printer_assignments (Workstation × label_type → Primär+Fallback-Drucker) symmetrisch zur bestehenden shipping_method_printer_assignments. Workstation-Detail-Drawer bekommt zwei Sektionen 'Versandarten' + 'Etiketten' — der bestehende Form-Component wurde via entityKind-Pattern generalisiert. Print-Label-Dialog macht jetzt einen Lookup auf die neue Tabelle vor print_jobs.insert und schreibt printer_id mit; ohne Zuweisung erscheint ein Toast mit Hinweis auf Settings statt eines hängenden Print-Jobs. Behebt strukturelle Lücke aus PROJ-99/304/306/312/314 (der gesamte 'An Drucker senden'-Pfad im Etikettendruck-Modul hatte zuvor keinen Drucker).
v1.86.0172026-05-08
  • PROJ-314 (UX-Polish PROJ-99/306): Etikettenformat-Default und Workstation-Memory im Druck-Dialog. (1) Etikettenformate können jetzt als Standard markiert werden (analog zu Vorlagen aus PROJ-306) — Print-Dialog wählt das Workspace-Default oder System-Default automatisch vor; System-Default ist jetzt 50×30mm statt 38×19mm. (2) Beim Submit werden Action (download/print) und Workstation-ID pro Workspace im localStorage gemerkt und beim nächsten Mount vorausgewählt. Stale Workstation-IDs (gelöscht/deaktiviert) fallen automatisch auf die erste verfügbare zurück. Plus: Format-Helpers reichen DB-Fehler jetzt mit Code/Details/Hint im Toast durch (analog PROJ-309).
v1.86.0162026-05-08
  • PROJ-313 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0152026-05-08
  • PROJ-313: FX-Auto-Seed Race-Condition + Server-side Dedupe (Folgefix PROJ-310). LB-10081 zeigte zwei identische USD-FX-Zeilen mit duplicate-key-violation beim Save. Auto-Create-Effect aus PROJ-310 lief beim Mount mit fxRates=[] parallel zum noch laufenden Fetch — Race produzierte Duplikat-State. Fix: Effect bailt waehrend loading, funktionale Dedupe in setState, plus server-side FX-Dedupe in der PATCH-Route als Defense-in-Depth gegen kuenftige Frontend-Bugs.
v1.86.0132026-05-08
  • PROJ-312 (UX-Polish PROJ-306): Etikett-Text-Hierarchie verbessert. Artikelname / Lagerplatzname werden jetzt als Primärzeile in voller Schriftgröße gerendert; SKU, Marke und FNSKU als Sekundärinfos in ~70 % der Größe darunter. Vor SKU steht „Art. Nr.: " und vor FNSKU „FNSKU: ", damit beim Lesen sofort klar ist was die Nummer bedeutet. Marke bleibt ohne Prefix. Auto-Fit-Algorithmus schrumpft die Basis-Schriftgröße global bis alles ins Höhenbudget passt — sekundäre Zeilen folgen proportional.
v1.86.0112026-05-08
  • PROJ-310 (Architektur-Lücke aus PROJ-301): Sidebar-Summen und Landed-Cost-Preview von LBs lasen die Lieferanten-Währung aus der Legacy-Spalte `purchase_orders.exchange_rate`, während die Cost-Lines bereits auf `purchase_order_fx_rates` umgestellt waren. Bei LBs mit Lieferant-Währung ≠ EUR aber EUR-only Cost-Lines (z.B. LB-10081 Ningbo Delin USD) gab es keinen passenden FX-Eintrag und der Default 1.0 produzierte stille 1:1-Konvertierungen (8.335 USD ≈ 8.335 €). Fix: alle Konvertierungs-Pfade lesen jetzt `purchase_order_fx_rates[supplierCurrency]` mit Legacy-Fallback, der FX-Block im Kosten-Tab erscheint sobald die Lieferanten-Währung ≠ EUR ist, der Auto-Create-Effekt seedet die FX-Row beim Mount, und ohne belastbaren Kurs zeigt die Sidebar einen „Kurs fehlt"-Chip statt einer falschen EUR-Zahl. Migration `20260508170000_proj310_backfill_supplier_fx.sql` schreibt für alle bestehenden Fremdwährungs-LBs ohne FX-Row einen Eintrag aus `po.exchange_rate` nach (idempotent, ON CONFLICT DO NOTHING).
v1.86.0082026-05-08
  • PROJ-311 (Folgefix PROJ-309): RLS-Policies für `label_templates` und `label_formats` auf das einheitliche `is_workspace_member()`-Pattern umgestellt. Beim Anlegen einer neuen Etikettenvorlage scheiterte INSERT mit `42501 new row violates row-level security policy` weil PROJ-99 (Etikettendruck-Modul) als einzige im Projekt noch das alte `(auth.jwt()->>"workspace_id")::uuid`-Pattern nutzte — bei JWTs ohne Custom-Claim (ältere Sessions, Multi-Workspace) lieferte der Check NULL und blockierte. Migration droppt idempotent alle 8 alten Policies (SELECT/INSERT/UPDATE/DELETE pro Tabelle × 2) und erstellt sie identisch zur PROJ-415-Sammelmigration neu. Kein Datenmodell-Touch, reversibel.
v1.86.0062026-05-08
  • PROJ-309 (Folgefix PROJ-306): Beim Anlegen einer neuen Etikettenvorlage erschien nur der generische Toast „Fehler beim Erstellen: Ein unerwarteter Fehler ist aufgetreten." — der echte DB-Fehler (RLS/CHECK/Unique) wurde unterdrückt. Root Cause: PostgrestError aus supabase-js v2 ist nicht instanceof Error, deshalb fiel der Catch immer in den Fallback-Text. Fix: alle drei Helper (create/update/delete) wrappen den Postgrest-Fehler in ein echtes Error-Objekt mit kombinierter Message inkl. Code/Details/Hint; Form-Dialog hat zusätzlich einen Defense-in-Depth-Branch und console.error für F12-Diagnose. Toast-Duration 8 s → 12 s.
v1.86.0052026-05-07
  • PROJ-308: Amazon Shipment-Confirmation-Cron filterte mit `status='shipped'` und schloss FBM-Orders permanent aus, die durch Workflow-Auto-Progression (PROJ-217) bereits auf `status='completed'` gewechselt hatten bevor der Cron sie confirmen konnte. Production-Audit fand 13 stuck Orders (FBM, shipped_at NOT NULL, amazon_confirmation_sent_at NULL, status=completed). Fix: `confirmShipments` und `dryRunShipments` filtern jetzt auf `status IN ('shipped','completed')`. Stuck Orders werden nach Deploy automatisch vom nächsten 5-Min-Cron-Lauf aufgepickt und confirmt — kein Daten-Backfill nötig.
v1.86.0042026-05-07
  • PROJ-306: Hermes-Carrier-Wert auf SP-API XSD-Enum "Hermes Logistik Gruppe" korrigiert — DEFAULT_CARRIER_MAP, CARRIER_FALLBACK_MAP und MANUAL_TRACKING_CARRIERS mappten bisher auf "Hermes" (kein gültiger Enum-Wert), was bei Workspaces mit Hermes-Versandart denselben Amazon-Fehler 25 wie PROJ-303 produziert hätte. label/shopify-Werte unverändert.
  • PROJ-306: Save-Button im Amazon-Versandart-Mapping-Block blockiert jetzt korrekt bei leerer Carrier-Auswahl — hasInvalidCarrier short-circuited bisher bei leerem amazonCarrier (falsy), User konnte mit incomplete-Row speichern und bekam generischen Zod-400-Toast. hasIncompleteCarrier prüft jetzt explizit auf leer wenn flowkomMethod gesetzt ist. CarrierCombobox bekommt required-Prop und markiert leere Zeilen rot.
v1.86.0032026-05-08
  • PROJ-306: Etikettenvorlagen — Multi-Field, Marke, Default-Vorlage. Vorlagen können jetzt mehrere Text-Felder gleichzeitig anzeigen (z.B. Name + SKU + Marke), die Marke ist als neue Feld-Option dazugekommen (Lookup gegen `manufacturers.brand_name`), und Vorlagen können als "Standard" für ihre Kategorie markiert werden — im Druck-Dialog automatisch vorausgewählt (Workspace-Default vor System-Default). Plus Bug-Fix: Toast bei Anlege-Fehler reicht jetzt die DB-Fehlermeldung durch (vorher anonym „Fehler beim Erstellen:"). DB-CHECK-Constraints für Whitelist-Werte hinzu, damit ungültige Enum-Werte nicht mehr silent in der DB landen. Migration backfilled bestehende Single-Field-Vorlagen verlustfrei ins neue Multi-Field-Format.
v1.86.0022026-05-08
  • PROJ-304: Etikettendruck-Layout deutlich aufgewertet — EAN-13-Barcode nutzt jetzt die volle Etikettenbreite (vorher ~⅓ der Breite wegen festem Aspect-Ratio-Lock 1.44:1, der EAN-Standard erlaubt explizit verkürzte Bars), die numerische EAN-Nummer ist immer eingebrannt direkt unter dem Barcode (alle Typen: EAN-13 / Code 128 / Code 39 via jsbarcode `displayValue:true`), und der Produktname steht klein darunter. Bei EAN-13 mit klassischer Guard-Bar-Anordnung und Lead-Digit links im Quiet Zone (Online-Generator-Look). PDF-Embedding stretcht das Bild auf volle `printableArea.width` — jsbarcode rendert intern mit Integer-Modulbreite und trifft die Ziel-mm sonst nie exakt; Modul-Verhältnisse bleiben proportional, Scanner lesen ohne Probleme.
v1.86.0002026-05-08
  • PROJ-303: Amazon Carrier + Versandart Mapping. Behebt strukturell den Live-Bug 2026-05-07 (17+ FBM-Orders dauerhaft mit Amazon-Fehler 25 weil Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` einen ungültigen CarrierCode-Enum-Wert produzierte — der Hotfix #240 mit Commit-Tag PROJ-301 hatte das Symptom bereits behoben). Neues Mapping-Feld `amazon_method_overrides` parallel zum legacy `carrier_overrides` (Backward-Compat 1 Release), 3-Spalten-Settings-UI: Flowkom Versandart | Amazon Transportdienst (Combobox aus AMAZON_CARRIER_CODES-Whitelist mit ~63 SP-API-XSD-Enum-Werten, ungültige Werte rot mit Save-Block) | Amazon Versandart (Freitext, leer = Element weglassen). Resolver `resolveCarrierAndMethodForOrder` nutzt neue Map zuerst, fällt auf Legacy-Pfad zurück (PROJ-293-Manual-Tracking-Verhalten unverändert). Idempotente Backfill-Migration kopiert bestehende `carrier_overrides`-Daten als `{carrier: <wert>, method: ""}` ins neue Schema, skippt Workspaces ohne Daten. KEIN DEFAULT_SHIPPING_METHOD_MAP (vermeidet stillen Behavior-Change bei live-only-Testing). 13 Vitest-Specs grün (10 resolveCarrierAndMethodForOrder + 3 buildShipmentConfirmationXml), TS+Lint clean, Staging+Production-Migration ohne Fehler durchgelaufen. SP-API-Doku-Recherche bestätigt: CarrierCode = strikter XSD-Enum, ShippingMethod = Freitext. INDEX wurde von PROJ-301 auf PROJ-303 retagged nach Race mit PROJ-301 (LB Flexible Kostenstruktur, #233) und PROJ-302 (LB-Kanban Cost-Pills, #237) — Hotfix-Commit-Tag bleibt PROJ-301 per Memory-Regel.
v1.85.0112026-05-08
  • PROJ-301 Hotfix: Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` aus allen Amazon-Workspaces entfernt + 17 Stuck FBM-Orders (Fehler 25, attempts >= 10) auf attempts=0 zurückgesetzt. Live-Bug 2026-05-07: Amazon lehnte jeden Shipment-Confirmation-Feed mit Error 25 ab weil 'Paket' kein gültiger XSD-Enum-Wert für CarrierCode ist. Idempotente Migration, Cron picked die freigegebenen Orders direkt nach Deploy auf und confirmed sie sauber mit `<CarrierCode>DHL</CarrierCode>` (DEFAULT_CARRIER_MAP-Fallback). Strukturelle Lösung folgt in PROJ-303.
v1.85.0102026-05-08
  • LB-Kanban Cost-Pills farbig differenziert: Fracht amber, Zoll rose, Sonstige blue (light + dark mode). Bessere Visual-Scan auf einen Blick welcher Typ Kosten erfasst ist. Reine Tailwind-Class-Erweiterung, kein API/Logik-Touch.
v1.85.0082026-05-08
  • PROJ-302: LB-Kanban Cost-Presence-Pills. Drei kleine Pills auf den LB-Kanban-Karten (Truck/Landmark/Package für Fracht/Zoll/Sonstige) zeigen auf einen Blick, ob für eine Lieferantenbestellung Kostenpositionen erfasst wurden. Pills nur sichtbar wenn `purchase_order_costs`-Zeilen vom jeweiligen Typ existieren — bei leeren LBs bleibt die Card unverändert kompakt. Tooltip beim Hover zeigt den EUR-aggregierten Betrag pro Typ (FX-konvertiert via `convertCostLineToEur`, de-DE-Format mit Komma-Dezimaltrennung und Euro-Symbol). Visueller Stil parallel zu IncotermBadge/TransportModeBadge (shadcn `Badge variant=outline`, kompaktes 3x3-Icon). Approach: separater Endpoint `GET /api/purchase-orders/cost-summary?ids=...` (cap 200, RLS-isoliert über bestehende Policy auf `purchase_order_costs`) plus dedicated TanStack-Query-Hook, der nur im Kanban-Modus aktiv ist — der bestehende `/api/purchase-orders`-Listen-Endpoint (mit der PROJ-294-Search-RPC) bleibt unangetastet, kein Migrations-/Schema-Risiko. 12 neue Vitest-Specs (7 Endpoint-Boundary inkl. ID-Cap, malformed-UUIDs, FX-Konvertierung + 5 Component-Render mit Umlaute-Check), Lint+Build clean.
v1.85.0042026-05-07
  • PROJ-301: Cursor sprang aus dem Beschreibung-Feld wenn man bei Kostenpositionen tippte. Description-Input war controlled (value+onChange), jeder Tastenanschlag feuerte ein API-Save, dessen Response State replaced und den Cursor rauswarf — selbe Wurzel wie der German-Decimal-Bug in PROJ-301. Auf uncontrolled defaultValue+onBlur umgestellt (selbes Pattern wie Amount/Rate), no-op-Guard verhindert unnötige Saves, Composite-Key rehydriert externe Updates korrekt.
v1.85.0032026-05-07
  • PROJ-301: Lieferantenbestellung — Flexible Kostenstruktur mit Multi-Currency. Ablöse der vier festen Kosten-Slots (`freight_cost`/`customs_cost`/`other_costs_eur`/`other_costs_foreign`) auf `purchase_orders` durch zwei neue Tabellen `purchase_order_costs` (N Zeilen pro LB mit Typ Frachtkosten/Zollkosten/Sonstige + Beschreibung + Betrag + Währung + Verteilung) und `purchase_order_fx_rates` (ein Kurs pro genutzter Fremdwährung pro LB, 'Kurs abrufen' gegen EZB/Frankfurter API). Frachtkosten in Fremdwährung sind jetzt erfassbar (vorher nur EUR), jede Position hat eigene Verteilung (Volumen/Warenwert/Menge), Beschreibung Pflicht bei Typ=Sonstige. RPC `calculate_landed_costs` komplett neu geschrieben — iteriert Cost-Lines, FX-konvertiert in EUR, aggregiert pro Allocation-Method UND pro Typ → `goods_receipt_items.{freight,customs,other}_allocation_eur` bleiben für Profitbutler-Reporting befüllt. Auto-Recalc-Trigger auf beiden neuen Tabellen + Advisory-Lock gegen Doppelberechnung sichern rückwirkende Einstandspreis-Synchronität bei jeder Korrektur (auch für Wareneingänge die Wochen zurückliegen). Migration backfillt Bestand atomar inkl. Parity-Check (Toleranz 0,01 €) gegen vorherige `landed_cost_eur` — Drift bricht Migration ab. UI-Tab-Rewrite: shadcn-Table mit Inline-Edit, Empty-State, Live-EUR-Summe + per-Typ-Aufschlüsselung mit FX-Konvertierungs-Hinweis. Deutsche Decimal-Eingabe (Komma) korrekt geparst via defaultValue+onBlur. Details-Sidebar 'Summen' synchronisiert via geteiltem TanStack-Query-Cache — Edits propagieren sofort in beide Views. Branch + Migration tragen Tag PROJ-299 (initial-Race), INDEX wurde nach zweiter Race retagged auf PROJ-301. Alte Spalten erst per Folge-Migration nach 1 Woche stabilem Rollout gedroppt (PROJ-302 geplant).
v1.84.0592026-05-07
  • PROJ-300 FBA Reconciler — PostgREST 10k-Cap + neuere Orders zuerst. PROJ-292-Reconciler-Query hatte kein .order() und kein explizites .limit() — bei 18.184 FBA-Orders der letzten 30 Tage wurden die 10k ältesten verarbeitet, neue Orders wie K-27444 (1.5.) wurden nie angefasst. Fix: .is('shipped_at',null) als Filter, .order('created_at', desc), .limit(10000) explizit. Plus cap_hit + oldest_processed im sync-log-Detail für Backlog-Tracking. Live-Run nach Deploy: candidate_orders 8.195 (statt vorher 10.000 Cap). PR #234.
v1.84.0582026-05-07
  • PROJ-299 FBA Enrichment Dual-Report-Pull (_INVOICING + _GENERAL). Behebt Pixkom-Live-Befund: 12.956 versandte FBA-Orders ohne shipped_at, 15.466 Customers ohne Email-Feld. fetchFbaEnrichment ruft jetzt PII-Report (_INVOICING mit RDT, ~38% Coverage) + Generic-Report (_GENERAL ohne RDT, 100% Coverage) parallel auf, mergt via mergeEnrichmentResults() mit PII-Priorität pro Feld. Trifft alle bestehenden Caller (PROJ-175 Erst-Import, PROJ-250 Tracking, PROJ-292 Reconciler) ohne Signatur-Änderung. 12 neue Vitest-Specs. Live-Run nach Deploy: 19.229 Adress-Rows, 5.100 Customers enriched (Anonymisierungs-Aliase, echte Käufer-Emails liefert Amazon für FBA seit Feb 2026 strukturell nicht mehr, GitHub Disc. #5129). PR #232.
v1.84.0572026-05-07
  • PROJ-295 Hotfix: storage-locations Workspace-Scope via warehouses!inner-Join. Initialer Endpoint /api/mobile/storage-locations/[id]/contents filterte direkt mit .eq('workspace_id', ...) auf storage_locations — die Tabelle hat aber keine workspace_id-Spalte (siehe Migration 20260316110000_proj94_system_locations.sql, Workspace-Scope läuft über das verknüpfte Warehouse). Supabase-Error landete im catch-Block → 500 → Mobile zeigte 'Lagerplatz konnte nicht geladen werden' im Plusbuchung-Modul. Fix: warehouses!inner(workspace_id) Join + .eq('warehouses.workspace_id', ...) — gleicher Pattern wie data-hub/export-builder.ts mit dokumentiertem WAREHOUSE_SCOPED_TABLES-Set.
v1.84.0562026-05-07
  • PROJ-298 CLI-Wrapper für Reports-Probe + RDT-Scopes-Option. Authentifiziert sich direkt über SUPABASE_SERVICE_ROLE_KEY + Amazon-Credentials aus .env.local. Bonus: probeReport() bekommt rdtScopes-Parameter (Default ['buyerInfo','shippingAddress']). Live-Befund 7-Tage-EU-Probe (3923 versandte FBA-Orders): _GENERAL ohne RDT = buyer-email 100%, tracking 100%, PLZ/Stadt/Land 100%; mit RDT = InvalidInput. Name/Strasse strukturell redigiert für non-EU/non-invoicing. PR #230.
v1.84.0552026-05-07
  • PROJ-298 Amazon SP-API Reports Diagnose-Probe — Admin-Endpoint /api/admin/amazon/probe-reports zur Diagnose der FBA-Coverage-Lücke (heute 38% via _INVOICING, Hypothese aus PROJ-292-Research: _GENERAL deckt NA+EU+JP statt nur EU+invoicing-eligible). Pullt einen oder mehrere Reports parallel, parsed das TSV/CSV und gibt zurück: pro Report Field-Coverage-Statistik (welche Spalten zu wieviel Prozent befüllt sind), Sample-Rows (erste N), Order-ID-Sets, paarweiser Cross-Report-Diff (inBoth, onlyInA, onlyInB). Zusätzlich ein PII-Coverage-Block der nur die für Customer-Enrichment relevanten Felder hervorhebt (buyer-email, buyer-name, recipient-name, ship-address-1, tracking-number etc.). Workspace-Admin-only via authenticateSettingsAdmin. Reines Diagnose-Werkzeug ohne Production-Code-Pfad und ohne Schema-Change. Ergebnis entscheidet ob _GENERAL in einer Folge-PR in fetchFbaEnrichment() mit aufgenommen wird. PR #229.
v1.84.0532026-05-07
  • PROJ-295: Neuer Mobile-Endpoint /api/mobile/storage-locations/[id]/contents — liefert Artikel + Bestand pro Lagerplatz, sortiert nach Menge desc, gefiltert auf nicht-archivierte Artikel im Mapper. FBA-Lagerplätze (warehouses.is_read_only) geben 403 mit klarer deutscher Fehlermeldung. Pure mapper + Route mit Zod-UUID-Validation + workspace-scoped Queries. 5 Vitest-Tests grün. Companion zu PROJ-291. Wird in Mobile-Komponenten ProductLocationsList (jetzt mit onSelect-Erweiterung) und neuer LocationContentsList genutzt — siehe Mobile-Eintrag 1.8.4.
v1.84.0522026-05-07
  • PROJ-294: INDEX und Spec-Header auf Deployed gesetzt — Code aus PR #224 ist live (Migration verifiziert via pg_proc/pg_indexes auf Production), Coolify-Deploy durch. Flag USE_ORDER_SEARCH_RPC bleibt per Default false, Code-Pfad in der API bytegleich zu vorher. Aktivierung des RPC-Pfads (Coolify-ENV-Flip + Vorher/Nachher-Vergleich via pg_stat_statements_reset) ist Phase 6 aus dem Spec und steht noch aus.
v1.84.0512026-05-07
  • PROJ-294: Kundenaufträge Search- & Stats-RPC ausgeliefert. Hinter ENV-Flag USE_ORDER_SEARCH_RPC (Default false) - Code-Pfad ist byte-identisch zu vorher solange Flag aus. Migration legt search_orders (UNION ALL über order/external/customer/notes/articles + Top-K-Push-Down via filtered_ids → top_k_ids → join) und get_order_stats (FILTER-Aggregation in einer Query) plus drei Composite-Indizes (workspace_id+status/source/-+created_at DESC). API: src/lib/orders/{search-rpc,enrich}.ts kapseln RPC-Calls + N+1-Enrichments (tags/replacements/return-label/tracking). Frontend: useOrderStats lazy nach erstem Orders-Payload (statsEnabled-State) - spart parallelen Cold-Cache-Burst beim Mount. QA-Skill identifizierte 4 Bugs vor Merge (DoS-Length-Cap, Multi-Word email-Drift, NULL-Sort-Ordering, count(*) OVER blockierte Top-K) — alle gefixt. Auf Staging smoke-getestet, EXPLAIN bestätigt. Echtes Speed-Win wird erst gemessen wenn USE_ORDER_SEARCH_RPC=true auf Coolify gesetzt wird (Sofort-Rollback per ENV-Toggle). PR #224. Erwartet: Search 2-4s → 80-300ms.
v1.84.0492026-05-07
  • PROJ-292 Hotfix: amazon_sync_log.job_type CHECK-Constraint um 'fba_reconcile' erweitern. Der TS-Type wurde in PR #221 erweitert, der DB-CHECK aber nicht — jeder startLog-INSERT warf 23514 (check_violation), wurde im Fire-and-Forget-Catch silent geloggt. Folge: keine sync_log-Row, keine cron_last_execution, manuelle UI-Trigger zeigten 'im Hintergrund gestartet' und nichts passierte. Migration droppt + recreated den Constraint inkl. 'fba_reconcile' (idempotent). PR #226.
v1.84.0472026-05-06
  • PROJ-296 Picklisten-Profil löschen — `picklists.profile_id` von `NOT NULL REFERENCES … ON DELETE RESTRICT` auf nullable + `ON DELETE SET NULL` umgestellt. Der Profil-Delete in den Einstellungen warf bisher `update or delete on table picklist_profiles violates foreign key constraint picklists_profile_id_fkey`, sobald irgendeine Pickliste (auch alte completed/cancelled) auf das Profil zeigte. Picklisten bleiben nach Profil-Delete erhalten, verlieren nur den Profil-Pointer; UI rendert bereits `profile?.name ?? '—'` / `?? 'Unbekanntes Profil'`. Auskommentierter „aktive Picklisten blocken"-Vorab-Check (TODO seit PROJ-9) entfernt — DB übernimmt das Cleanup atomar. Side-effect: Manual-Picklist-Pfad (PROJ-92) kann jetzt tatsächlich `profile_id: null` schreiben — der Code wollte das schon, der NOT-NULL-Constraint hätte die Inserts aber rejected. Ein-File-Migration, ein-Block-Code-Cleanup.
v1.84.0462026-05-06
  • PROJ-293 Amazon FBM-Versandbestätigung — manual_tracking_carrier hat Vorrang. Live-Bug bei Order 028-7305969-0416335 / Flowkom 28676: trotz manual_tracking_carrier='dhl' landete der Auftrag bei Amazon mit <CarrierCode>Other</CarrierCode> und <ShippingMethod>Dropshipping - Sascha Hörr</ShippingMethod>. Root Cause: resolveAmazonCarrierCode() returnt für unbekannte Versandarten den String 'Other' (truthy), der ||-Fallback auf den manuellen Carrier griff strukturell nie. Fix: neuer Helper resolveCarrierAndMethodForOrder() priorisiert manual_tracking_carrier über alle anderen Quellen (Pro-Order-Override schlägt Workspace-Konfig). Zusätzlich: <ShippingMethod> wird bei manueller Versendung komplett weggelassen (XSD-optional), weil ohne Pro-Carrier-Versandart-Auswahl in der UI kein gültiger Amazon-Wert vorhanden ist. Saubere Vorbereitung für PROJ-294 (UI-Auswahl). Pickliste-/DHL-Label-Pfad bleibt unverändert. 9 neue Vitest-Tests (Manual-Prio, Workspace-Override, Live-Reproduktion 28676, ShippingMethod-Drop, XML-Escape). 9/9 grün. PR #222.
v1.84.0452026-05-06
  • PROJ-292 QA-Findings - Guest- und IBA-Generic-Schutz im FBA-Reconciler. BUG-1 (DSGVO-relevant): 'Amazon Gastbestellungen'-Customer ist ein geteilter Fallback-Datensatz für FBA-Orders ohne Surrogate; eine echte Käufer-Email darauf zu schreiben kontaminierte alle anderen Orders auf dem Guest. Fix: kompletter Skip aller Customer-Updates wenn last_name='Amazon Gastbestellungen'. BUG-2: Business-Customer (PROJ-261-Dedupe via 'amazon-business:'-Surrogate) darf nicht mit IBA-Generic-Namen aus dem Report überschrieben werden ('Amazon Business EU SARL' pro Marketplace identisch). Fix: Skip wenn amazon_buyer_email mit 'amazon-business'-Präfix beginnt ODER der Report-Name dem IBA-Pattern entspricht; letzteres gilt auch defense-in-depth für Consumer-Customers, die in seltenen Multi-Item-Cases einen IBA-Namen sehen könnten. 5 neue Vitest-Tests (Guest-Skip, Business-Skip, Consumer-IBA-Filter, leerer Marketplace-Set, Multi-Run-Idempotenz). 12/12 Tests grün. Folgepatch im PR #221.
v1.84.0422026-05-06
  • PROJ-291: Neuer Mobile-Endpoint /api/mobile/products/[id]/locations für die Wareneingang-Erweiterung der Mobile-App. Liefert Bestände pro Lagerplatz (Menge desc), filtert FBA-Pool serverseitig via warehouses.is_read_only, Sperrlager bleiben drin (UI-Markierung downstream). Standard authenticateRequest()-Auth, Zod-UUID-Validation, defensiver Null-Join-Filter im Mapper, 5 Vitest-Tests. Branch + Commit-Tag historisch PROJ-290 (ID-Race mit Cost-Breakdown-PR #219), INDEX-Eintrag retagged auf PROJ-291.
v1.84.0412026-05-06
  • PROJ-290: Cost-Breakdown Route parallelisiert. /api/products/[id]/cost-breakdown bündelt die drei unabhängigen Queries (goods_receipt_items + Joins, stock-Total, stock_movements FIFO-Walk) in Promise.all statt sie sequentiell zu awaiten — der Spinner im Produktdetail-Tab 'Lieferant & Kosten' wartet jetzt nur noch auf die langsamste Einzel-Query statt auf die Summe. Kein DB-Migration: der existierende Partial-Index idx_stock_movements_fifo aus PROJ-73 deckt den Walk bereits optimal ab. PR #219.
v1.84.0402026-05-04
  • PROJ-289: Status auf Deployed. Coolify zieht v1.84.039. Bestellvorschlag rechnet ab sofort konsistent mit Total-Inventory (Hauptlager + FBA-Pool). Reine FBA-Artikel werden jetzt korrekt nachbestellt, Backwards-Rekonstruktion driftet nicht mehr durch FBA-Movements im Hauptlager-Stand.
v1.84.0392026-05-04
  • PROJ-289: Bestellvorschlag rechnet ab sofort mit Total-Inventory. current_stock umfasst Hauptlager + FBA-Pool, Sperrlager bleibt raus (Discriminator warehouses.is_read_only aus PROJ-177). Behebt drei stille Bugs aus PROJ-251/PROJ-287: reine FBA-Artikel mit leerem Hauptlager bekamen mit Toggle 'Nur Tage mit Bestand' Vorschlag 0 obwohl sie sich verkauften, Backwards-Rekonstruktion startete bei Hauptlager-Stand und zog FBA-Movements mit ab (Drift), und FBA-Demand wurde zwar gezaehlt aber FBA-Bestand nicht abgezogen. Response erweitert um fba_stock fuers UI-Breakdown. Keine DB-Migration. PR #218.
v1.84.0382026-05-02
  • PROJ-288: Status auf Deployed. Coolify zieht v1.84.037 — naechster LB-PDF-Download zeigt Titel zweizeilig statt Ellipsis-Cut, Lieferantenbeschreibung erscheint klein/grau unter SKU/EAN sofern hinterlegt.
v1.84.0372026-05-02
  • PROJ-288: LB-PDF Produkt-Cell. Produkttitel wrappt zweizeilig statt hartem Ellipsis-Cut bei 28/35 Zeichen, Lieferantenbeschreibung (supplier_products.supplier_product_description) erscheint klein/grau als optionale 3. Zeile unter SKU/EAN. Bestehende Spalte 'Lief.-Art.-Nr.' bleibt rechts. Live-Lookup zur PDF-Zeit, keine DB-Migration. Dynamische rowHeight pro Item, alternierender Hintergrund und Page-Break-Check ziehen die echte Hoehe. PR #217.
v1.84.0362026-05-02
  • PROJ-287: Status auf Deployed. Production-RPC `calculate_supplier_order_consumption` live, SKU 100147 = 44 Einheiten / 30 Tage = 1,47/Tag (statt 20,17 vor PR #216). Bestellvorschlag rechnet jetzt strukturell auftragsbasiert — Lagerbuchungen können den Vorschlag nicht mehr vergiften.
v1.84.0352026-05-02
  • PROJ-287 QA: Status auf In Review geflippt. Statische QA über Code, Schema und 17/17 Unit-Tests. 9/9 Acceptance Criteria erfüllt (1× Live-Messung SKU 100147 steht nach Deploy aus), 6 Edge Cases abgedeckt, Security-Audit pass, 0 Bugs. Implementation-Audit-Note dokumentiert die saubere Abweichung von der Spec (SQL-RPC statt JS-Bundle-Expansion). Ready to merge.
v1.84.0342026-05-02
  • PROJ-287: Bestellvorschlag auftragsbasiert. Tagesverbrauch wird aus order_line_items + orders berechnet statt aus stock_movements (PROJ-274 wird abgelöst). Behebt Live-Vorfall SKU 100147 — eine einzelne PROJ-177-Drift-Reset-Zeile (-442 Einheiten am 09.04.) hatte den Vorschlag auf 20,17 Einheiten/Tag aufgeblasen, obwohl real nur 45 Bestellungen in 30 Tagen liefen (~1,5/Tag). Stornos und Voll-Refunds zählen nicht, Bundle-Verkäufe schlagen via Komponenten-Expansion durch, Datum über created_at. Neue SECURITY-INVOKER RPC calculate_supplier_order_consumption mit UNION ALL über direkte und Bundle-Komponenten-Sales. Frontend, Schema und Toggles unverändert. PR #216.
v1.84.0322026-05-01
  • PROJ-286 Hotfix: Migration-Schema-DROP defensiv für CONSTRAINT + INDEX. uq_isq_workspace_product war auf Staging als CONSTRAINT angelegt (mit backing index), auf Production nur als plain UNIQUE INDEX. Plain `DROP INDEX` warf auf Staging SQLSTATE 2BP01 (cannot drop because constraint requires it). Fix: defensive IF-EXISTS-CONSTRAINT-DROP vor dem INDEX-DROP, sodass die Migration in beiden Environments idempotent läuft. Migrate-Job auf PR #214 nach diesem Hotfix grün, Production-Migration sauber durchgelaufen, Drift-Heal hat 85 Items enqueued, Cron 17:24:36 pushed 84 Pixkom + 1 MagFlip (0 failures) mit isolierten Spuren — Bug verifiziert behoben.
v1.84.0312026-05-01
  • PROJ-286: Inventory-Sync-Queue jetzt integration-scoped — Multi-Shop-Crosstalk-Bug behoben. `inventory_sync_queue` war workspace-scoped (`UNIQUE(workspace_id, product_id)`); bei zwei aktiven Shopify-Integrationen pro Workspace löschte jede Integration die Queue-Einträge auch für die andere Integration mit. Bei asymmetrischen Mappings (Produkt nur bei einem Shop gemappt) klaute die Integration ohne Mapping der mit Mapping den Queue-Eintrag → stiller Drift, weil der gemappte Shop den korrigierten Wert nie pushte. Live-Vorfall 2026-05-01: SKU 200266, Pixkom-Workspace mit MagFlip+Pixkom-Shop, 4 offene Amazon-FBM-Reservierungen → erwartet 940, Shopify zeigte 944. Fix: Queue bekommt `integration_id NOT NULL` (ON DELETE CASCADE), neuer Unique-Key (workspace_id, integration_id, product_id), `mark_product_dirty` macht Fan-out auf alle aktiv-gemappten Shopify-Integrationen — RPC-Vertrag bleibt, alle 6 App-Aufrufer unverändert. Drift-Heal-SQL füllt Queue mit aktuellen Reservierungen pro gemappter Integration neu auf. Branch trägt Tag PROJ-285 wegen ID-Race mit dem parallel gemergten LB-PUT-Smart-Diff-Feature; INDEX und Migration sind auf PROJ-286 retagged.
v1.84.0272026-05-01
  • PROJ-276: INDEX-Status der TARIC-Code-Anzeige in LB-Positionen von 'In Review' auf 'Deployed' gezogen. Reiner Bookkeeping-Refresh — das Feature ist seit v1.84.018 (PR #200, 2026-04-30) live, der Status-Spiegel hatte die echte Lage nur noch nicht abgebildet.
v1.84.0262026-04-30
  • PROJ-284: Einkaufsliste → LB-Erstellung Redirect-404. Nach erfolgreicher PO-Erstellung aus der Einkaufsliste landete der User auf einem weißen 404-Screen. Root Cause: shopping-list/page.tsx pushed auf /dashboard/purchase-orders/orders/<id>, aber dieser Pfad existiert nicht — kein [id]/page.tsx unter orders/, die LB-Detail-Ansicht ist ein client-state-getriebenes Fullscreen-Overlay auf der Listen-Page. Fix: Redirect umgestellt auf /dashboard/purchase-orders/orders?detail=<uuid>; orders/page.tsx liest beim Mount detail-Param (plus optional edit=1), validiert UUID, öffnet das bestehende Detail-Overlay und stripped die Query-Params via router.replace damit das Schließen des Overlays nicht sofort wieder dasselbe öffnet. Funktioniert jetzt auch als universeller Deep-Link für Bookmarks und externe Tools.
v1.84.0252026-04-30
  • PROJ-283: Einkaufsliste 'Alle löschen'-Button. Toolbar-Button neben 'Produkt hinzufuegen' mit Trash-Icon, leert die komplette Einkaufsliste workspace-weit nach Confirm-Dialog. Neuer DELETE-Endpoint /api/shopping-list/items (rate-limited 10/min, optional ?supplier_id=<uuid> für lieferantenscharfes Leeren) gibt deleted-Count zurück, damit der Toast die exakte Anzahl entfernter Artikel zeigt. Confirm-Dialog ist destructive-styled (rot) und nennt Anzahl Artikel und Lieferanten beim Namen. Button erscheint nur wenn die Liste nicht leer ist.
v1.84.0242026-04-30
  • PROJ-282: Bestellvorschlag berücksichtigt Einkaufslisten-Mengen. Analog zum bestehenden 'Im-Zulauf-Bestand einbeziehen'-Toggle gibt es jetzt einen zweiten Toggle 'Mengen auf Einkaufsliste einbeziehen' (Default an). Mengen, die für diesen Lieferanten bereits auf shopping_list_items stehen, werden aus der Vorgeschl. Menge abgezogen — verhindert doppelten Einkauf wenn man den Vorschlag mehrfach durchläuft oder zwischendurch manuell Artikel auf die Liste setzt. Lieferantenscharf: gleiche SKU für anderen Lieferanten auf der Einkaufsliste zählt NICHT mit. Schema-Erweiterung consider_shopping_list, neue Map onShoppingListByProduct, Subtraktion in der MOQ-Formel: max(forecastedNeed - alreadyOrdered - currentStock - onShoppingList, 0). Response-Item bekommt on_shopping_list-Feld, Tabelle bekommt sortierbare Spalte 'Auf Einkaufsliste' zwischen 'Im Zulauf' und 'Vorgeschl. Menge', Mobile-Card-Detail-Grid bekommt eine Zeile mehr.
v1.84.0232026-04-30
  • PROJ-281: Bulk-Add Constraint-Drift-Fix. PROJ-280 nutzte ON CONFLICT ON CONSTRAINT shopping_list_items_unique_product_per_supplier, aber auf Production heißt der Constraint historisch unique_workspace_supplier_product (Migration-Drift wie bei PROJ-277). PROJ-273-Diagnose-Toast lieferte SQLSTATE 42704 'constraint does not exist'. Fix in zwei Schritten: (1) Migration benennt den Production-Constraint auf den Git-erwarteten Namen um — idempotent, kein Effekt auf Staging wo der Name schon stimmt; (2) RPC nutzt jetzt wieder Spaltenliste ON CONFLICT (workspace_id, supplier_id, product_id), die mit jedem unique-index funktioniert egal welcher Name, plus #variable_conflict use_column-Direktive, die die product_id-Ambiguität gegen den OUT-Parameter auflöst. Production-Schema und Git sind wieder aligned, und der Runtime hängt nicht mehr an einem Constraint-Namen. Closes the toast loop: PROJ-272/273/277/280/281.
v1.84.0222026-04-30
  • PROJ-280: Bulk-Add Hotfix — product_id ambiguous in RPC. PROJ-273-Diagnose-Toast meldete SQLSTATE 42702 column reference product_id is ambiguous. Der PL/pgSQL-Rewrite hatte im INSERT ON CONFLICT (workspace_id, supplier_id, product_id) DO UPDATE einen unqualifizierten Spaltennamen, der mit dem gleichnamigen OUT-Parameter (RETURNS TABLE product_id UUID, ...) kollidierte. Fix: ON CONFLICT ON CONSTRAINT shopping_list_items_unique_product_per_supplier statt Spaltenliste, plus #variable_conflict use_column-Direktive und in_product_id/in_quantity-Aliases im FOR-Loop, damit kein unqualifiziertes product_id mehr in einer SQL-Anweisung im Funktionsbody auftaucht. Damit ist die Bulk-Add-Toast-Schleife (PROJ-272/273/277/280) endgültig durch.
v1.84.0212026-04-30
  • PROJ-279: Bestellvorschlag — Lieferanten-Produkt aus Vorschlag ausschließen. Neues Flag supplier_products.exclude_from_purchase_suggestion (BOOLEAN DEFAULT false) ermöglicht es, einzelne Lieferanten-Produkt-Mappings dauerhaft aus dem Bestellvorschlag zu entfernen — z.B. für Auslaufprodukte, manuell bewirtschaftete Artikel, oder einzelne zu teure Lieferanten einer SKU ohne andere Lieferanten der gleichen SKU zu blockieren. Default false = bestehendes Verhalten für alle Live-Daten, kein Bestandsdaten-Eingriff. UI: per-Row EyeOff-Icon im Vorschlag (Desktop) bzw. Aus-Vorschlag-ausschliessen-Button (Mobile) mit optimistic remove und Success-Toast inkl. Reaktivierungs-Hinweis. Reaktivierung via zweiter Checkbox im Lieferanten-Zuordnungs-Dialog (analog is_preferred). API: neuer rate-limited PATCH-Endpoint /api/supplier-products/[id]/exclude-from-suggestion mit Workspace-Ownership-Check. Calculate-Route filtert markierte Mappings raus und gibt supplier_product_id mit zurück. Partial-Index auf (supplier_id) WHERE exclude=false hält den Suggestion-Pfad schnell. Branch trägt Tag PROJ-278 wegen ID-Race mit dem parallel gemergten Allokations-UI-Refactor.
v1.84.0202026-04-30
  • PROJ-278: Allokations-Dropdowns inline in den Kosten-Cards des LB-Detail-Overlays. UX-Folge zu PROJ-271 — statt einer separaten 'Verteilmethode pro Kostenart'-Card mit drei Zeilen ist die Allokations-Auswahl jetzt direkt in den Frachtkosten-, Zollkosten- und Sonstige-Kosten (EUR)-Cards integriert (jeweils als 'Verteilung'-Zeile unter dem Betrag-Input). Hinweis in der Sonstige-Card markiert, dass die Methode für EUR und Fremdwährung gemeinsam gilt (es ist ein einziges Bucket im RPC). Reine UI-Restrukturierung, RPC und Datenmodell unverändert. Branch trägt Tag PROJ-277 wegen ID-Race mit dem Bulk-Add-Final-Fix; INDEX und commit nutzen PROJ-278.
v1.84.0192026-04-30
  • PROJ-277: Bulk-Add Bugfix Final — shopping_list_items.price_at_addition Spalte auf Production nachgezogen. PROJ-273-Diagnose-Toast machte den eigentlichen Fehler sichtbar: SQLSTATE 42703 column price_at_addition of relation shopping_list_items does not exist. Die Original-Migration 20260215000009_create_shopping_list_items.sql deklariert die Spalte zwar in Git, aber sie existiert auf Production nicht — der Migration-File wurde offenbar nach dem ursprünglichen Apply editiert, die Spalte wurde nie auf Prod erstellt. Idempotente Migration: ADD COLUMN IF NOT EXISTS plus DO-Block, der den CHECK-Constraint nur anlegt wenn er fehlt. Damit ist die Bulk-Add-Toast-Schleife (PROJ-272/273/277) endgültig durch.
v1.84.0182026-04-30
  • PROJ-276 (TARIC): LB-Detail-Overlay zeigt jetzt den TARIC-Code des Produkts inline neben der SKU in der Positionsliste (Format '<sku> · TARIC <code>'), damit Einkauf und Lager den Zolltarifcode sehen, ohne den Artikel öffnen zu müssen. Wird nur gerendert, wenn das Produkt einen Code hat (PROJ-126), sonst bleibt die Anzeige bei der bisherigen reinen SKU. Technisch: taric_code wurde durch den PO_DETAIL_SELECT-Join, den POLineItem.product-Type und PositionRowData gezogen; itemToRow mappt aus dem Join in das Row-Modell. Reine UI-Erweiterung im Detail-Overlay, keine DB-Migration. Branch + Commit-Tag bleiben auf PROJ-275 wegen ID-Race mit dem Mixed-Allocation-Hotfix in v1.84.017 (PR #201 wurde gemerged während dieses Feature im Review war).
v1.84.0172026-04-30
  • PROJ-275 (Mixed-Allocation Hotfix): Folgefix zu PROJ-271 — calculate_landed_costs() schreibt 'mixed' ins goods_receipt_items.cost_allocation_method-Feld, wenn die drei purchase_orders.{freight,customs,other}_allocation_method-Werte einer LB divergieren. Der alte CHECK aus PROJ-73 erlaubte aber nur volume/value/quantity → Trigger-Recompute warf 'violates check constraint goods_receipt_items_cost_allocation_method_check' beim Umschalten von Zoll auf Wert-Allokation am LB-10056-Detail-UI. Migration droppt + recreated den Constraint inklusive 'mixed'. Auf Production direkt via Management-API gepatcht (PR #201).
v1.84.0162026-04-30
  • PROJ-274: Bestellvorschlag — FBA-Bedarf einbeziehen + Tabellen-Polish. Bisher zählten nur pick/transfer_out-Movements als Verbrauch; FBA-Verkäufe (gebucht als amazon_fba_sync, siehe PROJ-177) wurden ignoriert, sodass für rein FBA-vertriebene SKUs Bestellvorschlag stets 0 herauskam. Fix: amazon_fba_sync ist jetzt Teil der Consumption-Movement-Types, aber nur negative Quantity-Changes zählen — positive Werte sind Inbound-Versand zu Amazon oder Drift-up-Korrekturen und dürfen nicht als Verkauf gezählt werden. Production-Verifikation: 1000 letzte amazon_fba_sync-Movements zeigten 874 negativ vs 126 positiv. Plus UI-Polish in der Bestellvorschlags-Tabelle: Sticky-Header bleibt beim Scrollen sichtbar (max-h-Container mit overflow-auto), alle Spalten sind klickbar sortierbar mit ArrowUp/ArrowDown-Icon-Indikator, neues Suchfeld filtert live nach Produktname und SKU, Footer zeigt bei aktiver Suche 'X von Y (gefiltert)'. Default-Sort bleibt 'Vorgeschl. Menge' absteigend (heutiges visuelles Verhalten, jetzt explizit). Mobile-Cards respektieren die Suche ebenfalls. Bewusst NICHT in Scope: Lager-Auswahl-Filter — erstmal beobachten, ob FBA-Einbeziehung allein reicht.
v1.84.0152026-04-30
  • PROJ-273: Bulk-Add RPC PL/pgSQL Rewrite + API-Diagnose. Folgefix zu PROJ-272: die neue Bulk-API schlug auf Production weiterhin mit Toast 'Artikel konnten nicht zur Einkaufsliste hinzugefuegt werden' fehl, weil die RPC einen SQLSTATE warf, der nicht in {42501, P0002, 22023} fiel. Service-Role-Probes bestätigten: RPC ist erreichbar, Admin-Check funktioniert. Der Fehler war user-context-spezifisch in der komplexen CTE-with-modifying-INSERT-Komposition. Migration 20260430080000 droppt + erstellt die RPC neu als explizite PL/pgSQL FOR-Loop mit per-Row-Klassifikation und RETURN NEXT. Gleicher externer Vertrag, gleiche Race-sichere atomare Upsert-Logik (ON CONFLICT DO UPDATE mit Quantity-Merge), aber per-Schritt-Fehlerattribution und keine fragile CTE-Komposition mehr. Plus: API 500 gibt jetzt db_error_code + db_error_message in der Response zurück, Frontend zeigt den SQLSTATE in der Toast-Description — jeder zukünftige RPC-Fehler ist aus der UI diagnostizierbar ohne Coolify-Log-Zugriff. 10 Vitest-Tests unverändert grün.
v1.84.0142026-04-29
  • PROJ-272: Bestellvorschlag → Einkaufsliste Bulk-Add. Live-Bug am 2026-04-29: 9 Items von sk@turnup.eu auf 'Alle auf Einkaufsliste' geklickt, alle POSTs liefen in 401-Burst (Session abgelaufen), shopping_list_items blieb leer — User sah trotzdem grünen toast.success('.'), weil der Frontend-Loop res.ok-Failures stumm verworfen hat. Fix ist architektonisch: neue atomare Bulk-API POST /api/shopping-list/items/bulk + RPC bulk_add_shopping_list_items() (SECURITY DEFINER, search_path explizit, INSERT … ON CONFLICT DO UPDATE mit Quantity-Merge race-safe). Ein Auth-Check, ein Rate-Limit-Hit (20/min, jeder Call deckt bis 500 Items), ein atomarer Upsert. Frontend purchase-suggestion-table feuert jetzt einen Bulk-Call statt N sequenzieller, zeigt ehrliche Toast-Variante (success / warning bei Skips / error bei Total-Failure) mit gruppierter Skip-Reason-Description, und detected 401 → toast.error('Sitzung abgelaufen — bitte neu anmelden') + Login-Redirect statt silent fail. Skip-Gründe aus DB-Pre-Check: product_not_found / product_archived / supplier_product_missing / invalid_quantity. Single-Item POST bleibt für 'Produkt hinzufuegen'-Dialog (legitimer Single-Use). 10 Vitest-Tests grün (happy / partial / 401 / 429 / empty / oversize / invalid uuid / 403 / 404 / 500).
v1.84.0132026-04-29
  • PROJ-271: Hybrid-Allokation für Nachlaufkosten (Fracht / Zoll / Sonstige). Bisher wurde eine einzige cost_allocation_method (volume / value / quantity) für Fracht UND Zoll UND Sonstige zugleich genutzt — konzeptuell falsch, weil Zoll im EU-Recht stets ein Prozentsatz auf den Warenwert ist und Fracht physisch nach Volumen abgerechnet wird. Drei neue Spalten auf purchase_orders (freight/customs/other_allocation_method), Default für neue LBs: freight=volume, customs=value, other=value. Bestehende LBs erben rückwärtskompatibel ihre alte Methode in alle drei Felder, kein Verhaltenswandel auf historischen FIFO-Werten. RPC calculate_landed_costs() berechnet drei separate Shares pro Kostenart mit Mixed-Mode-Normalisierung (Items ohne Maße im Volume-Modus → qty-Anteil, Σ shares = 1 garantiert). Neue UI im LB-Detail mit drei Dropdowns. landed-cost-preview.ts spiegelt die DB-Logik exakt. 9 Vitest-Tests, 84 von 84 Tests im purchase-order-Bereich grün. Konkret betraf das LB-10056/SKU 200155: Differenz zwischen volume- und value-allokiertem Zoll war ~0,07 €/Stk (102,75 € vs. 82,77 € auf 300 Einheiten).
v1.84.0122026-04-29
  • PROJ-269: Customer-Number Race & LPAD-Trunkierung. Zwei zusammenhängende Bugs: (1) Shopify- und Amazon-Importer benutzten weiter den nicht-atomaren get_max_customer_number_suffix-RPC; bei parallel laufenden Imports (Shopify+Amazon-Cron im selben Tick) bekam ein Insert die K-Nummer eines anderen → 23505. Der Handler in autoCreateCustomer interpretierte das pauschal als shopify_customer_id-Kollision und ließ die Bestellung als Gast — z.B. Auftrag 24751 (Marcus Köppen, eBay) blieb so unverknüpft. Beide Importer nutzen jetzt den atomaren generate_customer_number()-RPC (PROJ-266) plus Constraint-Name-Check und Retry-on-23505. (2) generate_customer_number und generate_product_sku formatierten den Kandidaten mit LPAD(seq, padding, '0'), was bei seq länger als padding von rechts trunkiert (LPAD('26101',4) → '2610'). Mit padding=4 und Bestand >9999 produzierte der Generator deterministisch bereits vergebene Kandidaten und gab nach 1000 Versuchen P0001 — Pixkom war damit produktiv kaputt für manuelle Kunden-Anlage. Fix: LPAD(seq, GREATEST(LENGTH(seq), padding), '0'). Auftrag 24751 wurde 2026-04-29 retroaktiv direkt in DB nachverknüpft (Customer K-26101).
v1.84.0102026-04-29
  • PROJ-270: Order-Snapshot autoritativ im Versand-Layer — Bugfix-Folge auf PROJ-267: nach UK-Adress-Korrektur kam das DP-Internetmarken-Label mit doppeltem Straßennamen heraus, weil /api/shipping/ship pro Feld auf customers.shipping_* zurückfiel und der Customer-Datensatz noch alte Daten hatte. Neuer Shared-Helper resolveShippingRecipient(order, customer): bei vollständigem Order-Snapshot (name1+street+city+plz+country) kein Customer-Fallback mehr; Customer-Felder nur noch als Komplett-Backup für uralt-Imports ohne Snapshot. DHL- und DP-Hauptpfad nutzen jetzt denselben Helper (vorher 2× duplizierter Code), Retoure-Pfade bewusst unverändert. 8 neue Vitest-Tests. Branch trägt Tag PROJ-268 wegen ID-Race mit Landed-Cost-Resync-Feature.
v1.84.0092026-04-29
  • PROJ-268: Landed-Cost Snapshot Resync für LB-10056 — 8 goods_receipt_items mit type='purchase_order' hatten purchase_order_item_id=NULL, dadurch filterte calculate_landed_costs() sie raus und der WE-Snapshot driftete bei späteren Änderungen von exchange_rate/Fracht/Zoll. Konkret SKU 200155: unit_cost_eur=4.7000 EUR (= 4.70 USD ohne Konvertierung) statt 4.0240 EUR (= 4.70/1.168), customs_alloc=0 statt 0.3425 EUR, freight_alloc=0.0013 statt 1.3381 EUR. Migration repariert in 3 Schritten: Backfill GRI→POI-Verknüpfung über (po_id, product_id), Rekonstruktion quantity_received aus realen GRI-Buchungen, Recompute calculate_landed_costs() für alle POs mit GRIs. Idempotent. Audit auf Production zeigte nur 1 betroffene LB. Branch trägt Tag PROJ-266 wegen ID-Race mit dem Kundennummer-Feature. Folge-Inkonsistenz bekannt: WE-Snapshot (volume-Allokation aus DB) weicht von LB-Preview (Value-Fallback wegen fehlender Maße im Frontend-PO-API) ab — separat zu fixen.
v1.84.0062026-04-29
  • PROJ-267: Amazon UK Hausnummer/Straße-Split zusammenführen — amazon.co.uk-Eingabemaske hat zwei getrennte Felder ("Building number/name" + "Street name"); Käufer produzieren AddressLine1="39" + AddressLine2="WALMER CLOSE", was unser Mapper 1:1 in shipping_street + shipping_name2 schrieb. Versand-Preflight (DHL + DP) lehnte daraufhin mit "Straße unplausibel" ab. Fix in amazonToShippingAddress() erkennt das UK-Pattern (country=GB + Line1 reine Hausnummer ± Buchstabensuffix wie "12A" + Line2 mit Buchstabe-Start) und führt zu street="39 WALMER CLOSE" zusammen. Heuristik bewusst eng — keine Bereiche "12-14", keine DE-Adressen, false-positives wie Order 026-7620982 (Line1="Prinkham BARN") bleiben unangetastet. 4 neue Vitest-Tests. Auftrag 27504 direkt in der DB korrigiert; rückwirkender Backfill auf User-Ansage nicht durchgeführt. Commits tragen Tag PROJ-266 wegen ID-Race mit dem Kundennummer-Feature.
v1.84.0052026-04-29
  • PROJ-266: Kundennummer-Auto-Vergabe per atomarem RPC — Anlegen ohne Kundennummer schlug fehl, weil der Loop-Generator wegen PostgREST db-max-rows = 10 000 nur die ersten 10 000 von 23 588 K-Customers sah und K-19263 (bereits vergeben) vorschlug. Plus Stale-Error-Fix im Anlege-Dialog. Fünfte Card im Nummernkreise-Tab analog PROJ-262.
  • QA-Hardening: Migration umbenannt zu 20260427110000 (Timestamp-Kollision mit refund_reasons-Migration), Staging-Drift 20260427130000 (phantom aus PROJ-265-Branch) per supabase_migrations.schema_migrations-Repair entfernt.
v1.84.0032026-04-29
  • Live-Volumenrechner im Produkt-Logistik-Tab: zeigt unterhalb der Maße L/B/H das berechnete Volumen in m³ + Liter, plus optionalen Mengenrechner für die Gesamtvolumen-Schätzung (z. B. Kartonplanung, LB-Mengen). Mengenwert ist nur lokal — wird nicht persistiert.
v1.84.0022026-04-28
  • PROJ-265 (QA-Härtung): Alle drei neuen Trigger-Funktionen plus mark_product_dirty (PROJ-55) bekommen SET search_path = public, pg_temp — verhindert search_path-Hijacking auf SECURITY-DEFINER-Funktionen.
  • PROJ-265: Doku-Inkonsistenz Safety-Sync-Intervall (Spec/INDEX/Code drifteten 5/15/60 Min) auf 60-Min-Code-Default angeglichen — Cursor ist funktionaler Gate, Coolify-Cron-Schedule ist optional.
v1.84.0012026-04-27
  • PROJ-265: BEFORE-DELETE-Trigger auf orders fängt Order-Hard-Delete atomar in der Transaktion ab — App-Hook-Snapshot ist jetzt redundante Defense-in-Depth statt einzige Verteidigung.
  • PROJ-265: enqueueAmazonDirtyBatch mit 1× Retry + 500ms Backoff + [PROJ-265]-Logging — Amazon-Queue hat keinen DB-Trigger als Backup, daher schliesst der Retry die letzte Silent-Failure-Lücke.
  • PROJ-265: syncInventoryForProducts und notifyInventoryQueuesAfterImport werten jetzt Promise.allSettled-Resultate aus und loggen Rejects pro Plattform-Queue separat — vorher wurden Rejects stumm geschluckt.
v1.84.0002026-04-27
  • PROJ-265: DB-Trigger auf order_line_items + orders.status UPSERTen Reservierungsänderungen automatisch in inventory_sync_queue — Shopify-Bestandssync ist jetzt resilient gegen App-Layer-Hook-Failures (verhindert Drift wie zuletzt SKU 200266: Shopify zeigte 998 statt 997).
  • PROJ-265: Safety-Sync-Cron mit last_safety_sync_at-Cursor + 60-Min-Default-Intervall — fixt Coolify-Timeout-Drift (Reconciliation-Layer war seit Stunden tot).
  • PROJ-265: markProductsDirty mit 1× Retry + strukturiertem [PROJ-265]-Logging statt Silent-Failure im Promise.allSettled.
v1.83.0232026-04-27
  • PROJ-264: Disk-IO-Reduktion. Auf Production zeigte pg_stat_statements (71 Tage Live-Daten) Supabase-Realtime-WAL-Polling als Top-Verbraucher (1,9 Mio Calls / 2,6 h Total-Exec-Time). Diese PR adressiert die niedrig-riskanten Quick-Wins: (a) `public.stock` und `public.product_locks` aus der `supabase_realtime`-Publication entfernt — Stock-Overview aktualisiert sich jetzt via TanStack `refetchInterval: 30s`, Product-Detail-Lock pollt `acquireLock()` alle 5 s solange der wartende User keinen Lock hat. (b) `print-heartbeat` Edge Function bekommt einen Server-Side-Throttle: UPDATE auf `workstations` läuft nur, wenn `last_seen_at` älter als 180 s ODER `agent_version`/`realtime_status` sich geändert haben — Print-Agent-.NET-Code bleibt unverändert. (c) `/api/cron/cleanup-sync-logs` löscht zusätzlich `amazon_sync_log` mit `finished_at` älter als 90 Tage (analog `shopify_sync_logs`). `print_jobs` bleibt bewusst in der Realtime-Publication (PROJ-41 setzt explizit darauf). Out-of-Scope für diese PR: `execute_workflow`-Batch-API, `order_notes`-Konsolidierung, `pg_timezone_names`-Frontend-Cache.
v1.83.0222026-04-27
  • Zwei neue Default-Erstattungsgründe im Storno-/Erstattungsdialog: "Adressfehler/Annahme verweigert" und "Kundenstorno". Seed für neue Workspaces aktualisiert + idempotente Backfill-Migration (`ON CONFLICT (workspace_id, slug) DO NOTHING`) für bestehende Workspaces. Sortierung: neue Gründe stehen zwischen "Doppelt bestellt" und "Sonstiges" (sort_order 6/7), "Sonstiges" rückt auf 8.
v1.83.0212026-04-25
  • Workflow-Manuel-Trigger JS-Timeout auf 290 s angehoben (passend zum frischen PG-`statement_timeout` von 300 s aus 1.83.020). Vorher schlug der JS-Promise.race in `/api/workflows/[id]/run` nach 30 s zu, sodass User trotz PG-Bump weiter "Zeitlimit überschritten (30 Sekunden)" sahen. 290 s ist knapp unter dem PG-Limit gewählt, damit bei wirklich hängenden Aufrufen der saubere PG-Fehler durchkommt statt eines harten JS-Aborts. Fehlermeldungstext entsprechend auf "5 Minuten" angepasst.
v1.83.0202026-04-25
  • Workflow `execute_workflow` Postgres statement_timeout auf 300 s angehoben: PostgREST nutzt für service_role einen Default statement_timeout von 8 s in Supabase Standard. Bei Workflows mit großem Order-Backlog (Fallback-Rechnungen-Workflow mit ~2050 Aufträgen) bricht Postgres mit `canceling statement due to statement timeout` ab — sichtbar im UI als 500-Fehler. Per `ALTER FUNCTION ... SET statement_timeout = '300s'` wird der Timeout funktionslokal angehoben (nur für die Dauer dieses einen Funktionsaufrufs), die globale Rolleneinstellung bleibt unangetastet. Greift in allen Aufrufpfaden: manueller Trigger (/api/workflows/[id]/run), Auto-Cron (/api/cron/execute-workflows), Order-Created-Trigger (Shopify-Import, Manual-Order).
v1.83.0192026-04-25
  • Revert von 1.83.017 (Workflow Fire-and-Forget): Naive Umsetzung war fehlerhaft — die `workflow_runs`-INSERT mit `status='running'` lebt innerhalb der RPC-Transaktion und ist für den UI-Refetch erst sichtbar, wenn die ganze Funktion zu Ende läuft. Resultat: Toast erschien ("läuft im Hintergrund"), UI hing aber bei "vor 1 Tag" und das Polling sprang nie an, weil kein Workflow als running gesehen wurde. Saubere Lösung erfordert RPC-Refactor (separate Run-Erstellung außerhalb der RPC-Transaktion oder COMMIT-fähige PROCEDURE) — kommt als eigener PR.
v1.83.0182026-04-25
  • PROJ-263 Dashboard "Heute versendet"-Kachel trennt FBA-Sendungen vom eigenen Versand: FBA-Aufträge bekommen via PROJ-250 (Shipments-Invoicing-Report) auch `shipped_at` gesetzt und tauchten dadurch fälschlich als selbst versendet auf. Hauptzahl zeigt jetzt nur noch eigene Versendungen (DHL/DP/...), FBA wird als kleines Sublabel "+ X via FBA" in der Description angehängt. Erkennung über `orders.amazon_fulfillment_channel = 'FBA'` (CHECK-Constraint FBM/FBA/NULL beim Import gesetzt — Source of Truth statt Umweg über die Versandart, robuster gegen Versandart-Drift).
v1.83.0142026-04-25
  • PROJ-262 Produkt-SKU Auto-Vergabe & Nummernkreis: Konfigurierbarer Nummernkreis für Produkt-SKUs analog PROJ-65/120 — vierte Card im Nummernkreise-Tab unter Einstellungen → Allgemein. Auto-Vergabe greift NUR bei manueller Produkt-Anlage und im Variantengenerator; Importe (Shopify, Amazon, CSV) behalten ihre Original-SKU bewusst, weil deren SKU der Lookup-Key fürs Re-Import-Dedupe ist. Atomarer `generate_product_sku()` RPC mit Retry-Loop gegen den bestehenden Unique-Constraint `products_unique_sku_per_workspace` zählt automatisch über Kollisionen mit existierenden SKUs hinweg (z.B. wenn jemand parallel manuell `200270` setzt). POST `/api/products` neu (war vorher nur GET), Frontend-Anlage geht über den neuen Endpoint statt direktem `supabase.from().insert()`. Variantengenerator fällt auf RPC zurück wenn Kind-SKU leer bleibt. PUT `/api/settings/workspace/product-sku-sequence` mit monotonic-guard `>= current` für den Startwert-Setter (anders als die anderen drei Nummernkreise immer verfügbar, weil Bestandskunden mit existierenden SKUs den Counter initial setzen müssen — User-Initial: 200270). QA-Härtung: POST-Schema mit `.strict()` + expliziter Allowlist (~30 Felder) gegen Mass-Assignment, Retry-Loop on 23505 (max 3) für Race gegen parallel manuell vergebene SKU, kein `parentSku || "PROD"`-Fallback mehr im Variantengenerator (sonst inkonsistente Eltern/Kind-SKUs wenn Eltern auto-vergeben wird). 24 neue Vitest-Tests (Helper, POST-Route, Variantengenerator). Doku in flowkom-docs unter einstellungen/allgemein.mdx ergänzt.
v1.83.0072026-04-25
  • Kundensuche flackert kein weißes Bild mehr beim Tippen: useCustomers hatte als einziger Listen-Hook im File kein `placeholderData: keepPreviousData`, dadurch wurde bei jedem Such-Buchstaben (Debounce) die alte Liste verworfen und `isLoading=true` getriggert. Die Customers-Page rendert bei isLoading einen Full-Page-Spinner — daher das beobachtete weiße Flackern + Fokus-Verlust im Suchinput. Fix: keepPreviousData ergänzt + Page nutzt isPending (nur bei initialem Load true) statt isLoading; isFetching erscheint als kleiner Spinner rechts im Such-Input für sichtbares Refetch-Feedback ohne die Liste zu blanken. Profitiert mit: Pagination, Status-Filter, Source-Filter und alle PROJ-147 Advanced-Filters.
v1.83.0052026-04-25
  • PROJ-261 Deploy-Nachzug: Die ursprüngliche Retro-Migration (20260424120000) ist auf Production zweimal an `customers_check_name_or_company` gescheitert — der QA-Fix-Commit hatte `last_name=NULL` gesetzt, aber 24 von 41 zu splittenden Ship-Adress-Gruppen haben keine `billing_company` (Privatperson an Business-Account) → alle drei Name-/Firma-Felder NULL → CHECK-Violation → Transaktions-Rollback. Da die Migration nie als appliziert markiert wurde, wurde sie bei jedem `supabase db push` erneut versucht und blockte den Hotfix. Zwei zusätzliche Deploys: (a) `20260425000000_proj261_constraint_hotfix.sql` mit constraint-safem Name-Resolver analog TS (Firma wenn vorhanden, sonst `shipping_name1` in `last_name`, ultimativer Fallback `'Amazon Kunde'`), (b) die Ursprungs-Migration content-mäßig auf no-op `SELECT 1` reduziert damit Production endlich an den Hotfix rankommt. Post-Deploy verifiziert auf Production: 0 vermischte Business-Kunden übrig, 4 Ursprungs-Rows auf echte Firmen (DB Energie, Kita Bendelstein, Eurofins, Nostravant S.L.L.) upgedatet, 37 neu angelegte Split-Kunden mit `amazon-business:<firma>|<land>|<plz>|<straße>`-Key.
v1.83.0032026-04-24
  • PROJ-261 QA-Findings-Fix: Retro-Migration setzte `last_name = shipping_name1` → Firmenname landete doppelt in `company_name` und `last_name`. Jetzt konsistent zum TS-Pfad `last_name = NULL` (sowohl im UPDATE des Ursprungs-Kunden als auch in den neu angelegten Split-Customers). Doppelter `shipping_name1`-Wert im INSERT-VALUES aufgeräumt. Drift bei `companyFromTaxInfo` als Kommentar dokumentiert (strukturell unvermeidbar, Praxis-Effekt 0). Neue `scripts/verify-proj-261.sql` mit 5 Pre-/Post-Verifikations-Queries (Q1 vermischte Kunden, Q2 neue Business-Keys, Q3 Ursprungs-Kunden haben shipping_groups=1, Q4 Orphan-Check customer_addresses, Q5 Billkom-Sanity).
v1.83.0022026-04-24
  • PROJ-261 Amazon Business Customer Dedupe: Bei Amazon-Business-Orders (IBA) matchte der bisherige Email-Dedupe wildfremde Firmen auf einen Kundendatensatz, weil Amazon laut Orders API v2026-01-01-Schema und Issue #5030 keine pro-Käufer-stabile `buyerEmail` liefert (seller-generische `no-reply-amazon-iba-buyer@marketplace.amazon.xx`-Sammeladresse + generischer `buyerName` 'Amazon Business EU SARL'). Production-Impact: K-1961 mit 19 realen Firmen (CWS Hygiene, DB Energie, KERMI, …), K-3915 mit 17 Firmen (Kita Bendelstein, BTT Beton, Heidelberg Materials, EKS-Tec, Spacewood, …). Fix: neuer `buildBusinessDedupeKey(address, companyFromTaxInfo)` baut den Dedupe-Key bei `isBusiness=true` aus `(company, country, postalCode, street)`, Fallback `amazon-business-order:<orderId>` bei unvollständigen Daten. Consumer-Pfad unverändert (Proxy-Email ist dort per-buyer stabil). Retro-Migration `20260424120000_proj261_amazon_business_dedupe_split.sql` splittet die 4 betroffenen Kunden pro distinct Ship-Adress-Gruppe (älteste bleibt am Ursprungs-Kunden, andere wandern in neue Kunden-Rows) — idempotent via HAVING-Filter, transaktional im DO-Block, Post-Check-Assertion verhindert Restvermischung. Billkom/DHL/DP unbetroffen, Order-Snapshots sind pro Order bereits autoritativ via `buildAmazonOrderAddressFields`.
v1.83.0002026-04-24
  • PROJ-260: Produkt-Notizen + Dateien-Tab-Restrukturierung. Neuer Main-Tab 'Notizen' im Produktdetail analog Aufträge/LBs (product_notes-Tabelle mit RLS, eigene Notizen editier-/löschbar). Die Main-Tabs 'Dateien' und 'Dokumente' sind zu einem Main-Tab 'Dateien' mit Subtabs Cloud/Dokumente zusammengefasst — Tab-Count im Strip bleibt gleich. Zusätzlich: Shared NoteContent-Renderer macht URLs in Produkt-, Auftrags- und LB-Notizen klickbar (öffnet in neuem Tab, erkennt trailing Punctuation).
v1.82.0102026-04-24
  • PROJ-231 Bugfix: OneDrive-Ordner-Picker knallte mit 'Cannot read properties of undefined (reading replace)', sobald ein Drive-Item im Root kein webUrl oder name hatte (z.B. Shared- oder Business-Account-Items). decodeHtmlEntities() und getFolderWebUrl() sind jetzt null-safe.
v1.82.0092026-04-24
  • PROJ-231 Bugfix: ProductFilesTab wählt die Cloud-Connection jetzt über use_for_products statt stumpf connections[0]. Im Produkt-Reiter 'Dateien' wurde sonst bei Multi-Provider-Setups (Google Drive + OneDrive) der falsche Provider gezeigt, selbst wenn OneDrive für Produkte aktiv war. Zusätzlich: Fehlersichtbarkeit im Ordner-Picker — API-Fehler werden jetzt statt als 'Keine Unterordner vorhanden' als Error-State gerendert.
v1.82.0082026-04-24
  • PROJ-231 Bugfix: Cloud-Ordner im Produkt- und Lieferantenbestellungs-Detail folgt jetzt dem Use-Case-Toggle. GET-Endpoints filtern via cloud_connections!inner auf use_for_products / use_for_purchase_orders = true. Zuvor wurde eine alte Google-Drive-Verknüpfung weiterhin angezeigt, obwohl OneDrive für Produkte aktiv geschaltet war. Alte Links bleiben in der DB (reversibel).
v1.82.0062026-04-24
  • Session-Housekeeping: PROJ-257 (Cron-Trigger Fire-and-Forget) und PROJ-259 (Amazon SP-API Reliability) in features/INDEX auf Deployed gesetzt. Remote-Branches der beiden PRs entfernt.
v1.82.0052026-04-24
  • PROJ-259 Amazon SP-API Reliability: Fix für wiederkehrende FBA-Import „error"-Runs. Drei zusammenhängende Bugs — (1) LWA Access-Token lebt nur 1h, aber EU-FBA-Report-Polls laufen öfter >1h, was zu 401 „access token expired" mitten im Job führte (Runs 11:30/12:00 heute Vormittag). Neuer optionaler `refreshAccessToken`-Callback im `AmazonClient`: bei 401 wird einmal pro Request ein frischer Token über `forceRefreshAccessToken()` gemintet und der gleiche Request retried — RDT-Requests bleiben bewusst außen vor. Alle 5 langlaufenden Crons (fba-import, fbm-import, order-status-sync, finance-events-pull, shipment-confirmation) nutzen jetzt die neue `buildAmazonClientFromRow()`-Factory, die den Callback automatisch einbaut. (2) 429-Retry-Budget zu knapp (5 Retries × max 30s), sodass der 12:30-Run nach 6:49 Min aufgab → hochgesetzt auf 8 Retries × max 60s. `retry-after`-Header wird weiterhin respektiert. (3) Altlasten-Cleanup: `amazon_sync_log`-Rows mit `status=running` + `finished_at=null`, die aus Pod-Restarts/502-Kills stammen und die UI dauerhaft als „läuft seit 3h" angezeigt hat, werden einmalig per Migration auf `status=error` geflippt (>2h Schwelle, Zombie-Kennzeichnung im error_message).
  • INDEX-Housekeeping: PROJ-256 Status auf Deployed gesetzt (PR #164 ist seit gestern auf main und läuft über den Coolify-Auto-Deploy live).
v1.82.0042026-04-24
  • Produktdetail-Plattformen-Tab: Amazon-SKU wird jetzt als eine Zeile statt einer pro Marketplace angezeigt; Bearbeitungszeit-Input bleibt nach Refetch sichtbar korrekt (Stale-DOM-Fix, PROJ-258).
v1.82.0032026-04-24
  • PROJ-257 Manueller Cron-Trigger liefert für Amazon-Report-Crons keinen 502 Bad Gateway mehr: `amazon-fba-import`, `amazon-fbm-import`, `amazon-order-status-sync`, `amazon-finance-events-pull` und `amazon-shipment-confirmation` pollen Amazon-Reports bis zu 30 Min synchron, der Coolify-Reverse-Proxy killt die Verbindung aber nach 60–120 s. Die Trigger-Route returnt für diese Whitelist jetzt sofort `{async:true}`, der Handler läuft im Node-Eventloop weiter und schreibt das Ergebnis wie gehabt via `logCronExecution()` in `cron_last_execution`. UI pollt nach Start 3× (10s/30s/60s) `loadLastExecutions`, damit Success/Error automatisch unter „Letzte Ausführung" erscheint. Toast-Text angepasst: „Job gestartet — Ergebnis erscheint in Kürze". Alle anderen Crons (order-import, cleanup, billkom-queue-process usw.) bleiben synchron mit dem alten Toast-Feedback-Pfad. Kein DB-Change, keine Änderung an den Handlern selbst.
v1.82.0022026-04-24
  • PROJ-256 Amazon Cancel/Refund Feed Corrections: Zwei PROJ-188-Bugs behoben, die jeden „An Amazon übertragen"-Storno seit Deploy scheitern lassen. (1) `CancelReason=CouldNotShip` ist kein gültiger XSD-Enum-Wert in `OrderAcknowledgement.xsd` — Amazon lehnt konsistent mit `MessageCode 25` ab. Neuer Mapper: vor dem Feed-Build wird `/orders/v0/orderItems` abgefragt; bei `IsBuyerRequestedCancel=true` (Käufer hat bei Amazon Storno angefragt) wird `BuyerCanceled` gesetzt, sonst `NoInventory` als Default. Entspricht Seller-Central-Button „Cancel order → Buyer Canceled". (2) SP-API v2021-06-30 `getFeedDocument` liefert `{feedDocumentId, url, compressionAlgorithm?}` auf Top-Level, unser Code las `docRes.payload.url` (MWS-Legacy). `fetch(undefined)` crashte in jedem Retry → nach 8 Crash-Retries `status=failed`, Amazons echter Fehler nie gelesen. Neuer shared Helper `feed-documents.ts` mit `downloadFeedResultDocument()` für alle 5 Call-Sites (cancel/refund/cron/shipment-confirmation/shipment-verifier), inkl. GZIP-Dekompression. Drei Copies des fehlerhaften `fetchResultDocument`-Helpers gelöscht. Shipment-Feeds gewinnen kostenlos GZIP-Support. 7 neue Unit-Tests. Verifiziert gegen Live-SP-API (Feed `1849323020566`, Order 04176).
v1.82.0002026-04-24
  • Amazon FBM Bearbeitungszeit (lead_time_to_ship_max_days) pro SKU pflegbar — im Produktdetail-Plattformen-Tab und im Integrations-Listings-Manager inkl. Bulk-Action (PROJ-255).
v1.81.0042026-04-24
  • INDEX-Housekeeping: Status auf Deployed gesetzt für gemergte Features PROJ-210, PROJ-220, PROJ-234, PROJ-238, PROJ-249, PROJ-251, PROJ-254. Dazu 30 stale merged Remote-Branches und einen alten Worktree weggeräumt — keine Code-Änderung, nur Doku/Aufräumen.
v1.81.0012026-04-23
  • PROJ-254 FBA Bulk-Backfill UI-Modal: Der in v1.81.000 als CLI-only gedachte Admin-Endpoint bekommt doch eine UI — neuer Button „Bulk-Backfill…" im FBA-Bereich der Amazon-Settings-Seite öffnet einen Dialog mit Days/Concurrency-Inputs und Start-Button. Der Dialog verbindet sich direkt per `fetch` + `ReadableStream`-Reader mit dem SSE-Endpoint, rendert Live-Progress mit Badges (processed/total, ok/skipped/failed), Progress-Bar und gescrolltem Log (max 500 Zeilen). Abort-Button bricht den Stream sauber via AbortController ab. Dialog ist nicht schließbar während aktiv (Toast-Hint). Nur bei FBA sichtbar, FBM sieht den Button nicht. Bash-Script Default-Host mit korrigiert (`flowkom.app` → `app.flowkom.de`).
v1.81.0002026-04-23
  • PROJ-254 Amazon FBA Bulk-Backfill (One-Shot Admin): Admin-SSE-Endpoint `POST /api/admin/amazon/backfill-fba` für einmalige großvolumige FBA-Imports (10k+ Orders in einem Rutsch). Zieht **einen einzigen** Shipments-Invoicing-Report statt 40× via Auto-Cron, paginiert `getOrders` mit NextToken und ruft processOne concurrent mit Limit 3 auf (bleibt unter Amazon's 30-getOrder-Burst). Live-Progress als Server-Sent-Events, Bash-Looper `scripts/run-fba-backfill.sh` streamt pro Order eine Terminal-Zeile. Idempotent (bestehender `amazon_order_id`-Upsert überspringt schon importierte Orders — erscheint als `order_skipped`-Event). Admin-only, Workspace-scoped, keine UI — bewusst CLI-only damit keiner den Bulk-Import versehentlich klickt. Realistische Dauer: 1–2 h für 10 000 EU-Orders statt 20h+ via Auto-Cron. Keine DB-Migration.
v1.80.0302026-04-23
  • PROJ-253 Versandfehler-Aufträge im Pickliste-Versand-Scan werden ans Queue-Ende gestellt: Wenn ein Auftrag einen DHL- oder Deutsche-Post-Internetmarken-Fehler geworfen hat (offener `dhl_error_log`-Eintrag), sortiert der Picklist-Orders-Endpoint ihn ans Ende der Liste — der Quick-Scan-Flow überspringt ihn automatisch und greift sich zuerst fehlerfreie Aufträge für den gescannten Artikel. Fehlerhafte Aufträge bleiben in der Tabelle sichtbar mit einem roten „Versandfehler"-Badge, damit klar ist warum der Auftrag nicht drankommt. Korrektur läuft wie gehabt über den Versandfehler-Tab; nach erfolgreichem Retry setzt der Auto-Resolve-Pfad den Auftrag automatisch zurück in die reguläre Chronologie.
v1.80.0292026-04-23
  • PROJ-252 Workflow-Tags auf abgeschlossenen Auftraegen: `execute_workflow()` filterte Auftraege mit Status `shipped/completed/cancelled` komplett aus dem Order-Loop, wenn keine `change_status`/`create_invoice`/`create_delivery_note`-Aktion dabei war — und hatte in den `add_tag`/`remove_tag`-Action-Bloecken nochmal ein `CONTINUE`-Gate. Folge: Der Workflow „Bei FBA-Import Tag FBA zuweisen" lief nie, weil Amazon FBA-Bestellungen direkt als `completed` importiert werden. Inkonsistent zum manuellen `POST /api/orders/[id]/tags`-Endpoint, der keinen solchen Check hat. `add_tag`/`remove_tag` sind jetzt auch auf geschuetzten Status erlaubt; `change_shipping_method`/`change_priority` bleiben bewusst geschuetzt (Fulfillment-relevante Felder, PROJ-200 Lock bleibt intakt).
v1.80.0262026-04-22
  • PROJ-250 FBA-Tracking sichtbar im Auftragsdetail: Neuer Card-Block „Versand durch Amazon" unter der Versandart zeigt Tracking-Nummer + Carrier-Badge + Copy-Button pro FBA-Sendung. Greift auf `shipping_labels`-Rows mit `shipping_task_id IS NULL` (Amazon versendet selbst, keine Flowkom-Packtask). Multi-Paket-FBA rendert mehrere Cards.
  • PROJ-250 FBA-PII vollständig auf Production: Parent-API liefert für EU-FBA Name+Straße direkt, `_INVOICING`-Report ergänzt Email (Relay-Alias) und Tracking (Carrier + Tracking-Nr). Für US-FBA bleiben Name/Straße Amazon-seitig redigiert (dokumentierte US/JP/SG-Policy), aber Email und Tracking funktionieren. Session-Zwischenfixes: Parser merge-across-rows (fixt NA-Mehrzeilen-Fälle), Report-Timeout 10→30 Min (Amazon-Queue-Resilienz), region-spezifischer Report-Type (EU `_INVOICING`, NA `_TAX`) — vorübergehender `_TAX`-Switch für EU wurde verworfen, weil die App dort keine `Tax Remittance (Restricted)`-Rolle hat.
  • PROJ-59 Audit-Trail-Bug behoben: `order_events.event_type_check` hatte nur 15 Werte, der TypeScript-Typ 23 — 8 Event-Types wurden dadurch seit Einführung (PROJ-134 Refund, PROJ-139 Replacement, PROJ-149 Address-Update, PROJ-209 Manual-Tracking) stumm mit Constraint-Violation verworfen. Constraint erweitert, COMMENT dokumentiert 1:1-Sync-Pflicht mit dem TS-Typ.
v1.80.0162026-04-22
  • PROJ-251 Bestellvorschlag OOS-Korrektur: Neue Option „Nur Tage mit Bestand berücksichtigen" teilt den Verbrauch durch die Tage, an denen tatsächlich Bestand vorhanden war (rückwärts aus `stock_movements` rekonstruiert), statt stur durch den kompletten Analysezeitraum. Verhindert systematische Unterschätzung des Bedarfs bei Artikeln mit OOS-Phasen. Default aus — bestehendes Verhalten bleibt unverändert.
  • PROJ-251 Zulauf-Whitelist korrigiert: Zulauf zählt jetzt ab Status „Genehmigt" (approved, shipped, partially_received). Vorher fehlte der seit PROJ-76 vorhandene shipped-Status, und gleichzeitig wurden draft/pending_approval fälschlich mitgezählt — beides hat den Vorschlag verzerrt.
  • PROJ-251 „Im Zulauf"-Spalte folgt der Checkbox jetzt live. Vorher war die Spalten-Anzeige nur an den letzten Berechnungs-Snapshot gekoppelt — wer die Checkbox nachträglich aktiviert hatte, sah die Spalte nicht.
v1.80.0142026-04-22
  • PROJ-250 Amazon FBA-Tracking-Import & Billing-Konsistenz: Der bestehende Shipments-Invoicing-Report (EU) bzw. -Tax-Report (NA) wird nun zusätzlich auf `carrier`, `tracking-number` und `shipment-date` pro Shipment-Zeile geparst. Für jede FBA-Order landet pro versendetem Paket eine eigene Row in `shipping_labels` (idempotent via `(order_id, tracking_number)`-Precheck und neuem Composite-Index). `orders.shipped_at` wird beim ersten Import auf die früheste Shipment-Date gesetzt — NULL-guarded via PostgREST `.is("shipped_at", null)`, damit manuell eingetragene Werte nie überschrieben werden. Billing-Snapshot wurde empirisch auf Production verifiziert: der bestehende Mapper `buildAmazonOrderAddressFields` füllt bereits alle 14 `billing_*`-Felder korrekt aus Shipping-Daten (Amazon liefert strukturell keine separate Rechnungsadresse — Bill=Ship ist Branchenstandard wie bei JTL/Sellerboard/Linnworks). Migration: `shipping_labels.label_pdf_url` auf nullable (FBA-Rows haben kein eigenes Label-PDF). Helper `upsertFbaShipments` ist try/catch-hardened — Netzwerk-Blips dürfen den Import nicht aufreißen. Multi-Paket-Orders zeigen alle Tracking-Nummern automatisch im bestehenden Versandhistorie-Sheet (PROJ-218). FBM-Pfad komplett unberührt durch `channel === "FBA"`-Guard. Kein neuer SP-API-Call, kein neuer RDT-Scope — nutzt denselben Report wie PROJ-175.
v1.80.0052026-04-22
  • PROJ-249 Amazon Feed-Historie (Audit-Trail): Neue Tabelle amazon_feed_history + privater Storage-Bucket amazon-feeds. Jeder SP-API-Feed-Submit (inventory, zero_out, dry_run) persistiert Metadaten + JSON-Payload. RLS workspace-scoped, signed-URL-Downloads, Retention 90 Tage analog PROJ-47.
  • PROJ-249 Feed-Vorschau (Dry-Run) unter /dashboard/settings/integrations/[id]/amazon/feed-preview: Zeigt pro Marketplace den nächsten Inventory-Feed, Item-Count, SKU-Liste mit qty, Raw-JSON-Accordion, JSON-Download. Durchläuft denselben Code-Pfad wie der echte Push ohne submitFeed. Jeder Dry-Run wird in der Feed-Historie protokolliert.
  • PROJ-249 FBA Zero-Out-Admin-Button: Einmalige gelbe Warning-Card auf der Amazon-Integration-Seite, die für alle Listings mit amazon_fba_inventory-Eintrag einen JSON_LISTINGS_FEED mit qty=0 über den FBM-Kanal sendet. Admin-only, AlertDialog-Confirm, idempotent. Neutralisiert historisch fälschlich übertragenen FBM-Bestand für FBA-SKUs bei Amazon, ohne den FBA-Bestand anzufassen.
  • PROJ-249 FBA-Badge mit Tooltip in der Listings-Management-Tabelle: `FBA • Sync aus` macht explizit, dass für FBA-Listings kein Flowkom-Bestand an Amazon übertragen wird (Amazon verwaltet FBA-Bestand selbst).
  • PROJ-249 FBA Fulfillment-Channel Mapping & Defense-in-Depth: 289 FBA-Listings (ein Kunde, 27.277 FBA-Einheiten) waren fälschlich als FBM klassifiziert und bekamen FBM-Bestand an Amazon gepusht — bei FBA-Ausverkauf reactivierte Amazon das Angebot als Versand-durch-Verkäufer. Root Cause: mapFulfillmentChannel in listings-report-worker matchte `AMAZON_EU`/`AMAZON_NA`/`AMAZON_DE` nicht (Exact-Match statt startsWith). Fix: Whitelist erweitert + Defense-in-Depth über amazon_fba_inventory als Ground Truth in allen drei Push-Stellen (enqueueAmazonDirtyBatch, safetyFullSync, buildFeedItemsByMarketplace). Emergency-SQL-Hotfix auf Production (289 Rows geflippt), Listings-Report-Cleanup-Cron manuell getriggert für sauberen Report-basierten Re-Sync.
v1.80.0012026-04-22
  • PROJ-248 PR-g2: DB-Drop der Legacy-Shipping-Spalten. 7 Spalten auf `orders` (shipping_company, shipping_first_name, shipping_last_name, shipping_recipient_name, shipping_address_line_2, shipping_address_line_3, shipping_address_category) + 3 auf `customers` gedroppt. `customer_addresses` unberührt (Billing nutzt Canonical-Felder weiter). `orders_with_totals`-View wird mit-dropped und neu erstellt (PostgreSQL-Constraint). 16 Dateien Code-Cleanup. Finale Abschluss der PROJ-248-Serie nach 10 PRs.
  • PROJ-248 Correction-Modal-Hotfix: Das Versandfehler-Cockpit-Inline-Korrektur-Modal war seit PR-f (2026-04-22 nachmittags) still-broken — es schickte Canonical-Felder (first_name/last_name/company) an eine API, die strict gegen das flat DHL-Shipping-Schema validiert. Vom Subagent bei PR-g2 gefixt (Modal-Interface + UI-Felder auf NAME 1/2/3 + post_number + state_region).
v1.79.0102026-04-22
  • Dashboard-KPI „Heute versendet" zeigte fälschlich 1.688 statt der realistischen Tageszahl — Filter lief über updated_at, das jeder Status-Sync (Amazon, Shopify) bumpt und damit historische Aufträge mitzählte. Jetzt über shipped_at (wird nur einmalig beim Versand gesetzt).
v1.79.0092026-04-22
  • PROJ-248 Shipping Address DHL-Flat Schema — Lieferadressen folgen jetzt 1:1 dem DHL-Geschäftskundenportal-Schema (name1/name2/name3 + street + post_number + PLZ/Ort/Bundesland/Land/Telefon). UIs in Customer-Dialog, Order-Edit-Dialog, Manual-Create-Dialog und Versandfehler-Cockpit nutzen einheitliches DHL-Portal-Layout mit 4-Adresstyp-Radio (Straße/Packstation/Filiale/Postfach), NAME 1/2/3-Block mit Tauschen-Button für Amazon-B2B-Vertauschungs-Fälle und mode-aware Straße-Block. Shopify- und Amazon-Importer schreiben direkt in die flat-Felder. DHL- und DP-Internetmarke-Ship-Routes lesen flat. Strukturelle Bug-Behebung: Amazon-BuyerName kann nicht mehr ins DHL-/DP-Label als Empfängerzeile rutschen (z.B. „Amazon Business EU SARL"-Fall). Billing-Adressen bleiben bewusst auf Canonical-Schema für Anrede + USt-IdNr. + ZUGFeRD-Export. Shared Helper canonicalNamesToFlat + canonicalRowToShippingAddress fasst vorher 4× duplizierte Mapping-Logik zusammen und fixt nebenbei latenten Whitespace-Bug.
  • PROJ-248 Hotfix: "Auch als Lieferadresse übernehmen"-Checkbox beim Billing-Create hat Canonical-Payload an den flat-only Shipping-Endpoint gepostet — Duplicate-Flow ließ sich nicht mehr speichern. Neuer Helper mappt Billing-Canonical → flat-Shipping (Firma→name1, Person→name2, Recipient→name3).
v1.78.0042026-04-22
  • PROJ-247 Bestandsverwaltung: Spalten „Ø Einstandspreis" und „Bestandswert" aus Flat- und Grouped-View raus, gleicher Fokus im CSV-Export. Die Bewertung läuft ausschließlich im Profitbutler-Sub-Tab „Bestandsbewertung" (FIFO/Manual/Fallbacks). Nebenher: useStockValuation-Hook auf der Stock-Seite entfernt — ein API-Roundtrip weniger pro Seitenaufruf.
v1.78.0032026-04-22
  • PROJ-246 Profitbutler Bestandsbewertung zeigt jetzt den Zulauf aus bezahlten und genehmigten/verschickten Lieferantenbestellungen als Pseudo-Lager „Im Zulauf" (plus „Gesamt inkl. Zulauf"-Zeile und Sublabel am Lagerwert-Tile). Bewertungsbasis: offene Menge × Stückpreis / Wechselkurs — Nachlaufkosten sind bewusst nicht enthalten, weil sie erst beim Wareneingang final allokiert werden. Teilweise oder vollständig erhaltene LBs fallen automatisch raus, damit nichts doppelt zählt; die erhaltenen Stücke laufen weiter durch FIFO.
  • PROJ-245 Versandhistorie-Sheet Reihenfolge: Positionen-Liste jetzt unter den Sendungsnummern statt darüber — Versandart, Tracking-Nummern und Etikett-Aktionen bleiben oben, Positionen als ergänzende Info unten.
v1.78.0022026-04-22
  • PROJ-245 Auftragspositionen im Versandhistorie-Sheet: Im Side-Sheet der Versandhistorie werden jetzt die Auftragspositionen mit Produktbild, Titel, SKU und Menge angezeigt. Badges für Freipositionen, Service-Artikel und archivierte Produkte. Bild-Fallback auf deleted_product_image_url für gelöschte Produkte (PROJ-119). Reine UI-Erweiterung — Daten kommen bereits über useOrder().
v1.78.0012026-04-22
  • PROJ-244 Picklisten-Profile-Badge mit Bestandsprüfung: Die Auftragszahl auf den Profile-Karten zeigt jetzt die tatsächlich picklistbare Anzahl — vorher nur Filter-Match, weichte beim Klick auf 'Pickliste erstellen' häufig ab. Neuer Shared-Helper `computeFulfillableOrders` wird von Badge, Preview-Count und Create gemeinsam genutzt (Drift-Prevention per Konstruktion): Bundle-Expansion (PROJ-184), Service-Artikel-Ausschluss (PROJ-98), Stock-Query mit Lager-/Lagerplatz-Filter, Reservierungs-Abzug (PROJ-195), Greedy-Fulfillment. Info-Icon + Tooltip neben Badge wenn Aufträge wegen fehlendem Bestand rausfallen. Unmatched-Banner bleibt filter-basiert (Konfigurationslücke ≠ Bestandslücke).
v1.77.0132026-04-21
  • PROJ-243 Profitbutler Bestandsbewertung: Bundle-Artikel tauchten mit Restbestand (53 Produkte, 1.094 Stk) als unbewertet auf, obwohl sie definitionsgemäß keinen eigenen Bestandswert haben (PROJ-190 FIFO bewertet die Komponenten). Beide Stock-Routes (/api/profitbutler/inventory-valuation und /api/stock/valuation) filtern jetzt zusätzlich auf is_bundle=false.
v1.77.0122026-04-21
  • PROJ-242 Lieferantenbestellung Summen-Card: Bei Fremdwährungs-LBs mischte die 'Gesamt'-Zeile numerisch die USD-Waren mit den EUR-Nachlaufkosten und zeigte das Ergebnis mit $-Suffix (z.B. 1.594 USD + 386,67 EUR → fälschlich '1.980,67 $'). Jetzt zwei saubere Gesamt-Zeilen: 'Gesamt (Waren)' in PO-Währung und 'Gesamt (EUR, inkl. Nachlauf)' über po.exchange_rate. Zwischensumme zusätzlich mit EUR-Referenz. EUR-LBs bleiben unverändert. Ohne hinterlegten Kurs Fallback auf Single-Currency-Anzeige.
  • PROJ-242 Cloud-Ordner-Verknüpfung: Im LB-Dokumente-Tab fehlte im State 'Ordner verknüpft' der Weg zurück — ein falsch verknüpfter Google-Drive-Ordner ließ sich nicht tauschen. 'Verknüpfung lösen'-Button mit AlertDialog über dem Cloud-File-Browser; Hook und DELETE-Endpoint existierten bereits ungenutzt.
v1.77.0112026-04-21
  • Produktfilter: Neue Option 'Ohne Lieferant' im Lieferanten-Filter (analog zu 'Ohne Marke' und 'Keine Versandart'). Findet alle Produkte ohne supplier_products-Zuordnung — ideal, um Artikel zu identifizieren, bei denen der Einkauf noch nachpflegen muss.
  • Produkt-Lieferantenfilter war komplett kaputt: die Produkte-API las aus der nicht existierenden Tabelle 'supplier_assignments' (richtig: 'supplier_products', PROJ-19). Der Fehler wurde nach Promise.all nicht geprüft und lief still in einen leeren supplier_map → Filter-Dropdown zeigte immer 'Keine Ergebnisse' trotz vorhandener Lieferanten-Zuordnungen. Query auf supplier_products umgestellt, Workspace-Scope via suppliers!inner Join (Tabelle hat kein eigenes workspace_id), Error-Log für die Supplier-Query ergänzt, damit solche stillen Schema-Fehler nicht wieder durchrutschen.
v1.77.0102026-04-21
  • PROJ-241 Post-Deploy-Härtung. Automatisches Resolved-Markieren von dhl_error_log nach erfolgreichem Label in ship/route.ts (nach Entkopplung durch Client-side Retry). DE-Label-Workaround: addressLine2/3 werden bei country=DE in name2/name3 gepackt (DHL druckt additionalAddressInformation1/2 bei Inlandssendungen laut parcel-de-shipping-v2.3 Zeile 926/932 nicht — nur international + AUT/CHN/DNK/GBR/HRV/LTU/PRT/ROU/RUS). Client-side Retry ersetzt fragile Server-Internal-Fetch. Cockpit-Postnummer-Validation mit Inline-Hint und Pre-Submit-Check.
v1.77.0082026-04-22
  • Profitbutler Warenkosten: NULL product_ids (unvollständig gemappte Shop-Positionen) crashten die resolveProductCosts-Query mit 'invalid input syntax for type uuid: null' — Promise.all rejected, costMap leer, Warenkosten 0 € für 7-Tage/30-Tage/Monat (HEUTE/GESTERN funktionierten nur, weil deren Order-Set zufällig keine NULL-Items enthielt). Filter in resolveProductCosts eingebaut.
  • Profitbutler resolveProductCosts: supplier_products-Query hatte einen .eq('workspace_id', ...) auf einer Spalte, die die Tabelle nicht besitzt — PostgREST-Fehler hat Promise.all rejected und damit denselben Effekt (Warenkosten 0 € für Fallback-Pfade). Workspace-Filter entfernt; Workspace-Zugehörigkeit kommt über die product_ids aus diesem Workspace.
  • Lieferantenbestellung: Sidebar-Summen zeigten Fracht/Zoll/Sonstige-EUR in PO-Währung statt in EUR. formatPOPrice für diese drei Zeilen jetzt hart auf 'EUR' gesetzt; Zwischensumme/Gesamt bleiben in Lieferantenwährung.
  • Lieferantenbestellung Einstandspreis-Regression: PROJ-237 Migration 20260419300000 hatte den v1.72.000-Fix für unit_price überschrieben (Temp-Table wieder INTEGER, Formeln wieder /100). Neue Migration 20260421000000 fixt Typ auf NUMERIC(10,4) + entfernt /100, rechnet alle bestehenden POs neu. LB-10074: 15 GRIs mit purchase_order_item_id=NULL (Kollateral aus PROJ-168) per product_id neu verknüpft; EK jetzt 2,99 € statt 0,03 €.
v1.77.0052026-04-21
  • PROJ-241 Phase 1 deployed: Canonical-Address-Foundation + Migration von Customer/Order/Cockpit/Billkom auf gemeinsame UI-Primitives. Supplier-Form + Workspace-Firmenprofil als Future-Polish deferred.
v1.77.0042026-04-21
  • PROJ-241 PR-e — Billkom Canonical Snapshot + PDF additive rendering. buildCustomerSnapshot erweitert um recipient_name/address_line_2_3/post_number/state_region/address_category/vat_id. PDF-Generator rendert neue Zeilen conditional (nur wenn Snapshot-Felder gesetzt), alte finalisierte Belege byte-identisch. Bonus: company_name-Alias schließt ZUGFeRD-Drift bei B2B-Rechnungen (buyerName jetzt korrekt = Firmenname statt Fallback auf Personenname). GoBD-Immutability gewahrt, keine JSONB-Migration, 5 Caller (documents/quotations/dunning/batch/queue) durchgereicht.
v1.77.0032026-04-21
  • PROJ-241 PR-d — Shipping Error Cockpit auf Canonical-Primitives. ~200 Zeilen Form-Code durch <AddressFields context=shipping mode=compact> ersetzt. Land jetzt CountryCombobox statt ISO-Text. correctionSchema erweitert um recipient_name/state_region/address_category/country (backwards-compat mit country_code). Packstation-Hint + Postnummer-Pflicht weiter interaktiv.
v1.77.0022026-04-21
  • PROJ-241 PR-c — Order Address Edit Dialog auf Canonical-Primitives. 13 individuelle Input-Felder durch <AddressFields> ersetzt. DHL-Postnummer jetzt via Dialog editierbar (bisher war Feld in DB seit PROJ-239, nicht aber im Dialog). Order-Type + orderAddressUpdateSchema + fieldMap in API um shipping_post_number/billing_post_number erweitert.
v1.77.0012026-04-21
  • PROJ-241 PR-b — Customer Address Dialog auf Canonical-Primitives. Von react-hook-form auf simple useState. customerAddressFormSchema erweitert um recipient_name/post_number/state_region/address_category (DB-Drift seit PROJ-145/219/239 geschlossen). POST + PUT in /api/customers/[id]/addresses schreiben die neuen Felder.
v1.76.0002026-04-21
  • PROJ-241 PR-a — Foundation: CanonicalAddress TypeScript-Type + 5 Mapper (orders, customers, customer_addresses, billkom JSONB, workspaces) + 7 UI-Primitives (AddressFields, AddressFormSkeleton, AddressCompanyBlock, AddressPersonBlock, AddressStreetBlock mit Packstation-Detection, AddressLocationBlock mit CountryCombobox, AddressContactBlock) + Zod-Validation-Schemata (shipping/billing/sender) + 64 Tests mit realen Fixture-Daten (Auftrag 02041 Amazon, 02042 Shopify Packstation, synthetisches B2B, US-International, Legacy-Billkom-Snapshot). Rein additiv — keine bestehende Form geändert.
v1.75.0082026-04-21
  • PROJ-241 Spec angelegt: Canonical Address — systemweite Adress-Daten-Unifikation. 8-PR-Rollout geordnet nach aufsteigendem Live-Risiko (Foundation → Customer → Order → Cockpit → Billkom → LB → Workspace → optional DHL/DP-Adapter). Fixture-basierte Regression-Tests, Live-Smoke-Test-Rezepte, DHL/DP/Shopify/Amazon-Integrationen bleiben unangetastet.
v1.75.0062026-04-21
  • PROJ-240 — Label-Aktionen für abgeschlossene und stornierte Aufträge freigegeben: Die Buttons "Nachdrucken" (Reprint), "Retoure" und "+ Etikett" in der Versand-Sektion des Auftragsdetails sind jetzt auch bei Status completed/cancelled sichtbar. Vorher hat die PROJ-200-Auftragssperre die gesamte Versand-Section auf readonly gesetzt und damit Label-Aktionen versteckt — obwohl die dahinterliegenden APIs (reprint, return-label, additional-label) den Order-Status ohnehin nicht prüfen. Adress- und Tracking-Edits bleiben weiterhin gesperrt (ManualTrackingSection behält readonly).
v1.75.0052026-04-21
  • PROJ-139 — Ersatzlieferung übernimmt jetzt Liefer- und Rechnungsadresse vom Ursprungsauftrag: Die Replacement-API kopierte bisher nur Kunde, Versandart und Positionen, wodurch der Ersatzauftrag adresslos angelegt wurde. Alle 28 Adress-Snapshot-Felder (PROJ-145/PROJ-219/PROJ-239) werden jetzt 1:1 aus dem Parent-Order übernommen (inkl. Firma, Adresszeile 2/3, DHL-Postnummer, state_region und address_category).
v1.75.0032026-04-21
  • PROJ-239 Teil 4/4 — DP Internetmarke Packstation-Parity: shipOrderDeutschePost nutzt jetzt Firma (name) + Person (additionalName) parallel statt name zu überschreiben. Packstation/Postfiliale-Erkennung über parsePackstationStreet (PR #1) routet Postnummer als addressLine2 gemäß offizieller DP-Konvention (1C4A API hat kein eigenes Locker-Schema, verifiziert gegen DP Quick-Guide Internetmarke v2.0). Preflight-Validierung identisch zum DHL-Pfad.
v1.75.0022026-04-21
  • PROJ-239 Teil 3/4 — DHL Locker/PostOffice + name1/2/3 Mapping: DhlRecipientAddress komplett erweitert auf DHL v2.3 Consignee-Schema. Neuer buildConsigneePayload() branch-switched zwischen ContactAddress (name1/2/3 + addressStreet + additionalAddressInformation1/2), Locker (lockerID+postNumber) und PostOffice (retailID+postNumber/email). Ship-Route: Firma UND Person parallel (name1=Firma, name2=Person), Packstation-Pattern auto-switch auf Locker-Payload, Preflight gegen nur-Ziffern-Straßen. Auftrag 02041-Klasse ("21891674" als Straße) scheitert jetzt mit sprechendem Hint statt DHL "Please enter a house number".
v1.75.0012026-04-21
  • PROJ-239 Teil 2/4 — Versandfehler-Cockpit: In der Versandfehler-Queue blendet sich bei jedem Fehler-Row eine Collapsible "Original-Daten vom Shop" ein, die alle Import-Notizen (Shopify/Amazon-Rohdaten) als Monospace-Block anzeigt. Mitarbeiter sieht sofort was der Kunde wirklich eingetragen hat. Korrektur-Formular um Adresszeile 2, Adresszeile 3, DHL-Postnummer erweitert; Postnummer wird bei erkanntem Packstation/Postfiliale-Pattern als Pflicht mit rotem Rand markiert. /api/shipping/errors/[id]/correct speichert die neuen Felder, Retry nutzt sie automatisch.
v1.75.0002026-04-21
  • PROJ-239 Teil 1/4 — Adress-Mapping Foundation: Schema-Migration mit neuen Spalten orders.shipping_post_number/billing_post_number, customers.shipping_post_number/billing_post_number + shipping_address_line_2/3 + billing_address_line_2/3, customer_addresses.post_number. Neuer shipping-address-parser mit parsePackstationStreet (matchet Packstation + 3-stellige ID, lockerID 100-999), parsePostfilialeStreet (retailID 401-999), isDhlPostNumber (6-10 Ziffern), routeAddressLine2 (entscheidet ob address2 in address_line_2 oder post_number gehört). Shopify-Importer routet address2 jetzt strukturiert: bei Packstation-Pattern in post_number, sonst in address_line_2. 22 Unit-Tests inkl. Edge Cases wie 'Packstationstraße 5' (matcht nicht). Grundlage für DHL- und DP-Versand-Mapping.
v1.74.0052026-04-21
  • PROJ-239 Spec angelegt: Adress-Mapping Härtung & Versandfehler-Cockpit. Aufschlüsselung der beiden Live-Vorfälle (Amazon Postnummer in AddressLine1, Shopify/eBay Packstation mit verlorener address2) in vier Sub-PRs: Shopify-address2-Persistierung + neue Postnummer-Spalten, DHL Locker/PostOffice-Schema + name1/2/3-Mapping, Versandfehler-Queue mit inline Shop-Notizen, DP-Parität. API-Verifikation gegen Hersteller-Doku als Merge-Gate.
v1.74.0042026-04-21
  • Profitbutler Stats: 7-Tage/30-Tage/Monat zeigten Warenkosten/Versand/Verpackung/Pick&Pack 0 € (Heute/Gestern korrekt). Root cause: .in("order_id", orderIds) sprengte mit 300+ UUIDs die 16-KB-PostgREST-URL-Grenze und lieferte stillschweigend data: null. Neuer Helper src/lib/query-batch.ts mit fetchInBatches() (Default 200 IDs/Batch, parallel). Eingesetzt in stats/route (Orders+Invoice), stats/chart, daily-stats. Selbes Muster wie v1.73.006.
v1.74.0032026-04-20
  • Amazon-Import speichert jetzt die rohen SP-API-Adressdaten (ShippingAddress + BuyerInfo, alle AddressLine-Felder unverändert) als Import-Notiz am Auftrag. Hintergrund: Käufer tragen auf Amazon manchmal DHL-Postnummern, Firmen oder Abteilungen in die falsche Adresszeile ein — unser 1:1-Mapping AddressLine1 → shipping_street führt dann zu DHL-Validierungsfehlern (Auftrag 02041: AddressLine1="21891674" statt "Buchenweg 17"). Nach manuellen Korrekturen bleibt so die Original-Käufereingabe für Support/Audit sichtbar.
v1.74.0022026-04-20
  • Profitbutler Versand- und Verpackungskosten waren um Faktor 100 zu niedrig — selbe Bug-Klasse wie v1.73.005: shipping_method_country_costs.shipping_cost, weight_surcharge und shipping_packagings.price liegen als NUMERIC(10,2) in EUR, die Cost-Pipeline rechnet aber in Cent. Neuer Helper eurNumericToCents() in costs-calculate.ts, alle 3 Load-Sites (daily-stats, stats/orders, stats/chart) umgestellt. profitbutler_daily_stats muss per Aggregate-Endpoint neu berechnet werden.
v1.73.0082026-04-20
  • Dashboard 'Heute versendet' zählte nur Orders mit status='shipped'. Seit PROJ-217 gehen erfolgreiche Versendungen aber direkt auf 'completed', shipped wird nur noch bei manueller Tracking-Eingabe (PROJ-209) gesetzt. Filter auf ['shipped', 'completed'] erweitert — Zähler zeigt jetzt die echte Tagesmenge.
v1.73.0072026-04-20
  • Dashboard-KPI 'Heute versendet' (und Profitbutler-Tageskarten Tagesumsatz/-gewinn/Marge) zählte Orders in UTC-Tagen statt in Europe/Berlin. Auf dem UTC-Server fielen dadurch Versendungen zwischen Berlin-Mitternacht und 01/02 Uhr aus dem 'Heute'-Fenster. Neuer Helper src/lib/timezone-helpers.ts (DST-korrekt via Intl), auch für Orders-Stats-API verwendet.
v1.73.0062026-04-20
  • [object Object]
v1.73.0052026-04-19
  • Profitbutler Warenkosten waren um Faktor 100 zu niedrig — die Cost-Pipeline rechnet intern in Cent, supplier_products.purchase_price liegt seit PROJ-138 aber als NUMERIC(10,4) in Euro vor. resolveProductCosts liefert jetzt cost_cents (EUR × 100) statt cost_eur. Alle 4 Aufrufer (daily-stats, stats/orders, stats/invoice, stats/chart) umgestellt. Bestehende daily-stats müssen per POST /api/profitbutler/stats/aggregate neu aggregiert werden.
v1.73.0042026-04-19
  • Profitbutler-Auswertungen (Sellerboard, Chart, Tagesstatistik) nutzten für die Warenkosten-Berechnung ausschließlich supplier_products.purchase_price (preferred) — FIFO-Daten und manuelle Einstandspreise wurden ignoriert. Jetzt identische Kaskade zur Bestandsbewertung: manual (bevorzugt) → FIFO → Lieferanten-EK. Zentraler Helper src/lib/profitbutler/resolve-cost.ts
v1.73.0032026-04-19
  • Breadcrumbs im Header zeigten für Profitbutler, Bestandsbewertung, Retourenauswertung, Kunden, Kundenaufträge, Daten-Hub und Nachfüllung nur 'Dashboard' statt des vollen Pfads — breadcrumbMap in dashboard-shell ergänzt
v1.73.0022026-04-19
  • Profitbutler Bestandsbewertung: Header 'Bestandsbewertung' + Untertitel entfernt (redundant mit Sidebar + ProfitbutlerNav), CSV-Export-Button an das rechte Ende der Filter-Toolbar verschoben — mehr Platz für die Daten
v1.73.0012026-04-19
  • Profitbutler Bestandsbewertung visueller Polish: Hero-Summary mit 4 KPI-Tiles (Wallet/Package/Boxes/TrendingUp), Coverage-Progressbar in Ampelfarben, Source-Badges farbig (FIFO emerald, Manuell sky, Keine Bewertung red), farbige Lager-Status-Dots (Amazon orange, Westheim indigo), Sparkles-Header-Icon, CSV-Export in Emerald-Akzent
v1.73.0002026-04-19
  • Profitbutler Bestandsbewertung UI-Rework: Volltext-Suche, Filter-Drawer mit Lager/Quelle/Schätzungs-Typ/Bestand-Spanne/Lagerwert-Spanne, aktive Filter-Chips, klickbare Coverage-Badges als Quickfilter + Progress-Bar, Lager-Card mit aufklappbaren Drill-Down-Zeilen (Top-10 Artikel pro Lager) und klickbaren Lager-Namen als Quickfilter, CSV-Export mit pro-Lager-Spalten, Produktdetail-Direktlinks in jeder Zeile, Live-Summen unter aktiven Filtern
  • Bewertungs-Kaskade: Manueller Einstandspreis wird jetzt nur noch verwendet wenn 'Manuellen EK bevorzugen' aktiv ist. Ohne Toggle wird der Wert ignoriert (früher fiel er als manual_fallback trotzdem ein, wenn keine FIFO-Daten existierten). User kann den EK so als Referenz hinterlegen ohne Auto-Nutzung. Hybrid-Fallback-Kaskade entsprechend entschlackt (bleibt supplier → FIFO-Schnitt → 0).
v1.72.0062026-04-19
  • PROJ-237: LB Nachlaufkosten UI — Fracht/Zoll/Sonstige EUR/Sonstige Fremdwährung mit Kurs-Abruf-Button (EZB), drei Verteilmethoden (Volumen/Warenwert/Menge), retroaktive FIFO-Korrektur für bereits gebuchte Wareneingänge, Einstandspreis-Preview pro Position. HelpLink zur neuen Nachlaufkosten-Doku im Kosten-Tab.
v1.72.0032026-04-19
  • Profitbutler Bestandsbewertung: Stücke ohne FIFO-Deckung und ohne manuellen/Lieferanten-EK blieben unbewertet (Wert 0). Erweiterte Fallback-Kaskade — wenn FIFO existiert, wird für die Rest-Stücke der FIFO-Durchschnitt als Schätzwert verwendet. UI zeigt Fallback-Typ pro Zeile (+ Manueller EK / + Lieferanten-EK / + FIFO-Schnitt).
v1.72.0022026-04-19
  • Produkt-Kanban Cleanup: tote Props members und onAssigneeChange aus ProductKanban entfernt, unbenutzte handleAssigneeChange auf Produkt-Liste entfernt (Zuweisung bleibt auf Produkt-Detailseite editierbar). PROJ-236 auf Deployed gesetzt
v1.72.0002026-04-19
  • Profitbutler Bestandsbewertung — Hybrid-Bewertung: FIFO-abgedeckte Stücke aus echten LB-Schichten + Rest-Stücke via manual_landed_cost_eur → supplier_products.purchase_price (preferred) → 0. Neue Response-Felder fifo_qty/fallback_qty/unvalued_qty pro Produkt. UI zeigt Coverage-Badges (FIFO/Lieferanten-EK/Unbewertet) und bei Mischbestand per-Zeile Aufteilung (z.B. '500 FIFO · 1048 LE')
  • calculate_landed_costs() RPC war nach Migration 20260415 (unit_price INTEGER → NUMERIC(10,4)) nicht nachgezogen. Temp-Table unit_price blieb INTEGER → Cast rundete 0.14 → 0, 0.52 → 1 (banker's rounding); zusätzlich Division /100 aus Cent-Modell. Resultat: landed_cost_eur wurde auf 0 oder 0,01 € gebucht obwohl echte LB-Preise hinterlegt waren. Neue Migration fixt RPC und kalkuliert alle bestehenden POs neu.
  • Profitbutler Ø Einstandspreis teilte FIFO-Summe durch Gesamtbestand (inkl. Stücke aus freier WE ohne Kosten). Bei Mischbestand wurde der Schnitt dadurch künstlich niedrig gezogen. Fix: Division durch FIFO-allokierte Menge (allocatedQty).
v1.71.0022026-04-19
  • Produkt-Tabelle Titel-Spalte war nach line-clamp-Fix auf Wort-Minimalbreite geschrumpft (schmaeler als Marke-Spalte). Fix: div-Wrapper mit fixer w-[250px] um den clamp-span — Breite bleibt stabil
v1.71.0012026-04-19
  • Produkt-Tabelle Titel-Spalte: line-clamp-2 hatte nicht gegriffen (block-Class hatte display:-webkit-box ueberschrieben), Titel wuchsen auf beliebig viele Zeilen. Fix: block-Class entfernt, Titel werden jetzt wieder auf 2 Zeilen geklammert, Spaltenbreite unveraendert
v1.71.0002026-04-19
  • PROJ-236: Kanban Parent/Child-Gruppierung — Eltern-Karten kollabieren zu einer Karte mit Kinder-Zähler, Expand/Collapse pro User persistiert. Cascade-Drag beim Parent-Move bewegt Eltern + alle Kinder mit gleichem Board-Status atomar (neue Supabase-RPC + API-Route). Stray-Kinder in abweichender Spalte erscheinen eigenständig mit ↳-Parent-Hinweis und amber Akzent-Rand. Undo-Toast (6 Sek) nach Cascade-Move. Bundles bleiben Einzelkarten.
v1.70.0062026-04-19
  • PROJ-235 Follow-up: Initial-Bestand nach Shopify-Product-Push automatisch enqueuen (Push-Button → Bestand landet in Queue)
v1.70.0052026-04-19
  • Profitbutler Bestandsbewertung: Ø Einstandspreis zeigte für Kleinteile überall 0,01 € — jetzt mit 4 Nachkommastellen (landed_cost_eur wird als NUMERIC(10,4) gespeichert, wurde im Frontend aber auf 2 Dezimal gerundet). Lagerwert bei FIFO-Quelle aus echter Schichten-Summe statt aus gerundetem Ø-Preis × Menge.
v1.70.0042026-04-19
  • Produkte-Tabelle: Spaltenkonfiguration (z.B. Gesamtbestand) blieb nach Reload nicht erhalten — PROJ-203 Orders-Migration lief unscoped und wipte die Products-localStorage-Config bei jedem Laden, jetzt auf tableKey === "orders" beschränkt
  • Produkt-Kanban-Karte: Zugewiesen-Select und Drag-Overlay-Footer entfernt (Datenmodell bleibt, nur UI)
  • Produkt-Kanban & -Tabelle: Titel zweizeilig (line-clamp-2) statt abgeschnitten
  • Produkt-Kanban-Karte: EAN als neue Zeile, Copy-Buttons für SKU und EAN
  • Produkt-Tabelle: Copy-Buttons für SKU, EAN und FNSKU (auf Row-Hover) — auch in Varianten-Zeilen
v1.70.0032026-04-19
  • PROJ-235 Status auf Deployed gesetzt
v1.70.0022026-04-19
  • PROJ-235: Bestandssync auf Shopify/Amazon nach Buchungen zuverlässig (fire-and-forget in 13 Routen auf await umgestellt, 5 fehlende Enqueues bei Order Cancel/Delete/PUT/Status + Shopify-Status-Sync ergänzt)
v1.70.0002026-04-19
  • PROJ-234: Profitbutler-Auswertung pro Artikel — im Profitbutler-Tab der Produktdetailansicht gibt es jetzt einen neuen Untertab „Auswertung" zwischen „Kalkulation" und „Retouren". Der Tab zeigt genau die Auswertungen der Profitbutler-Hauptseite (Umsatz-/Gewinn-Chart über 7/14/30/90 Tage, Multi-Perioden-Sellerboard mit Umsatz, Stornos, Warenkosten-Gruppen, Gewinn, Marge, Bestellungen, Ø Bestellwert und Erstattungen, sowie aufklappbarer Kanal-Breakdown) — aber eingeschränkt auf den aktuell geöffneten Artikel. Ohne Bestellungen im Zeitraum erscheint ein Empty State. Perioden-Konfiguration bleibt workspace-weit auf der Hauptseite.
v1.69.0002026-04-18
  • PROJ-233: Zahlungen-Tab an Lieferantenbestellungen — jede LB hat jetzt einen eigenen Reiter, in dem Anzahlungen und Teilzahlungen mit Datum, Betrag und optionaler Notiz erfasst werden. Der Zahlungsstatus der Bestellung (Unbezahlt / Anbezahlt / Vollständig bezahlt) wird automatisch aus der Summe aller Zahlungen und dem PO-Total abgeleitet — sowohl beim Erfassen als auch beim Löschen. Die Sidebar-Card „Zahlung" zeigt den gezahlten Betrag und den offenen Restbetrag live in LB-Währung. Beträge werden intern in Cents gespeichert, UI akzeptiert deutsche Dezimalformate (1,23 oder 1.23). Zahlungen sind immutable (nur anlegen + löschen, kein Edit).
v1.68.0002026-04-19
  • PROJ-232: LB-Übersichts-Redesign — analog zur Kundenaufträge-Seite. Neuer View-Toggle zwischen Kanban und konfigurierbarer Listen-Ansicht (14 Spalten, 6 als Default sichtbar, Auswahl pro User persistiert). Pipeline-Tabs zeigen Live-Counts pro Status. Neue Unified Search mit sechs Scopes (Überall / LB-Nummer / Lieferant / Lieferanten-Artikelnummer / Produkt SKU+Name / Notizen) — „Überall" macht eine OR-Union über alle Scopes. Neuer Filter-Drawer rechts mit Multi-Select für Zahlungsstatus, Lieferant, Lager, Incoterm, Transportart plus Datum-Ranges. Aktive Filter erscheinen als Chips mit einzeln-entfernbaren X-Icons plus einem roten „Alle zurücksetzen"-Button. Listenspalten für Incoterm, Transportart, Lager, Positionen, Erhalten %, Erstellt-von und Genehmigt-von neu verfügbar.
  • PROJ-232: Notizen-Tab an Lieferantenbestellungen — jeder Workspace-Member kann chronologisch Kommentare hinzufügen (Autor + Zeitstempel werden automatisch gesetzt, „bearbeitet"-Hinweis wenn nachträglich geändert). Eigene Notizen lassen sich editieren oder löschen, fremde sind schreibgeschützt (API gibt 403 zurück). Tab-Label zeigt Count-Badge. Cmd+Enter speichert eine neue Notiz direkt.
  • PROJ-232: Versandinfo-Tags und Notizen sind jetzt volltext-durchsuchbar — die Übersicht findet LBs auch wenn der Suchbegriff nur in einer Notiz oder der Lieferanten-Artikelnummer steht.
v1.67.0182026-04-18
  • PROJ-232: Versandinfo-Tags (Incoterm & Transportart) sind jetzt im LB-Detail-Overlay und auf den Kanban-Karten sichtbar. Im Detail gibt es eine neue Sidebar-Card zwischen Lieferant und Summen — im Bearbeiten-Modus per Dropdown änderbar, im Ansichtsmodus mit Badges. Der Header des Overlays zeigt die gesetzten Tags neben dem Status-Badge, die Kanban-Karte zeigt sie unter dem Gesamtbetrag (nur wenn gesetzt). Jeder Tag lässt sich einzeln auf „Nicht gesetzt" zurücksetzen und verschwindet dann wieder aus allen Ansichten.
v1.67.0152026-04-18
  • PROJ-232: Lieferantenbestellungen können jetzt mit Versandinfo-Tags (Incoterm & Transportart) angereichert werden. Incoterms gemäß ICC 2020 (EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, DDP), Transportarten Schiff/Luft/Zug/LKW. Backend-Endpoint akzeptiert die neuen Felder, null entfernt einen gesetzten Tag wieder. UI folgt in einem Folgecommit.
v1.67.0052026-04-19
  • Abgeschlossene Kundenaufträge können jetzt wieder kostenlose Ersatzlieferungen erzeugen — UI-Guard hatte den Button versehentlich ausgeblendet, obwohl die API das schon lange erlaubt.
v1.67.0002026-04-19
  • PROJ-231: Google Drive als zweiter Cloud-Provider neben OneDrive. Admins können beide Clouds parallel verbinden und pro Use-Case (Produkte / Lieferantenbestellungen) einzeln aktivieren — pro Workspace und Use-Case darf nur eine Cloud aktiv sein (DB-Level-Exklusivität via Partial-Unique-Indexes, UI zeigt bei Kollision disabled-Checkbox mit Hinweis auf den aktuellen Blocker-Provider).
  • PROJ-231: Neuer „Dokumente"-Tab im LB-Detail-Overlay zeigt Cloud-Ordner-Inhalte direkt in Flowkom. Auto-Match sucht Drive-weit nach der LB-Nummer mit Token-Boundary-Erkennung (LB-10058 matcht nicht LB-10008), Shared-Ordner wie „LB-10058 / LB-10061 / LB-10067" erscheinen als Kandidaten-Picker, leere Treffer bieten „Ordner anlegen" oder manuelle Auswahl. Lazy Mount via Radix Tabs — Drive-API-Quota wird nur belastet wenn der Tab tatsächlich geöffnet wird.
  • PROJ-231: Tabelle product_cloud_folders wurde zu polymorphem cloud_folder_links (entity_type: product | purchase_order) generalisiert. Bestehende OneDrive-Produkt-Verknüpfungen bleiben unverändert, die alte Tabelle wird für die Rolling-Deploy-Phase als Compat-View weiter bereitgestellt.
v1.66.0122026-04-18
  • PROJ-229: Neuer Import-Typ „JTL Historische Aufträge" im Daten-Hub. Upload-Step lädt den CSV-Export direkt in Supabase Storage; Preview-Step analysiert die ersten 512 KB und zeigt Anzahl der Aufträge, erkannte Verkaufskanäle, Duplikate gegen bestehende Aufträge sowie ggf. Mojibake. Klick auf „Import starten" legt einen Background-Job an — der Worker läuft asynchron (1–3 h bei 150k Aufträgen).
v1.65.0152026-04-18
  • PROJ-230: Lieferantenbestellungen können gelöscht werden (via 3-Punkte-Menü in der Liste und im Detail-Overlay). Guard verhindert das Löschen, wenn bereits Wareneingänge gebucht wurden — der Server antwortet dann mit einer klaren Fehlermeldung.
  • PROJ-230: LB-Status sind jetzt in beide Richtungen bewegbar — draft ↔ pending_approval ↔ approved ↔ shipped, sowie cancelled → draft und rejected → pending_approval. Partially_received und completed bleiben WE-gesteuerte Einbahnstraßen (werden nur beim Buchen eines Wareneingangs gesetzt). Jede Status-Änderung wird in der History protokolliert.
  • Button-Label „Wareneingang buchen" im LB-Detail-Header zu „Als verschickt markieren" geändert — der Button setzt tatsächlich nur den Status auf „Verschickt", der eigentliche Wareneingang wird im eigenen Tab gebucht.
v1.65.0062026-04-18
  • Versandart-Filter in der Kundenaufträge-Übersicht zeigte immer „Keine Versandarten vorhanden" — Response-Property wurde falsch gelesen (`shipping_methods` statt `data`). Filter funktioniert jetzt wieder.
v1.65.0032026-04-18
  • PROJ-228: Versandart-Filter in der Kundenaufträge-Übersicht. Neuer Multi-Select-Abschnitt im Filter-Drawer mit allen aktiven Versandarten als lila Toggles. Aktive Auswahl erscheint als Chip in der Aktive-Filter-Leiste.
  • PROJ-228: Copy-Buttons neben der Auftragsnummer und der externen Bestellnummer in der Auftragsliste. Hover-Icon + Klick kopieren den Wert in die Zwischenablage.
  • PROJ-228: Sortierung nach Auftragsnummer sortiert jetzt tatsächlich nach der Nummer. Bisheriger Proxy auf created_at (PROJ-40) brach bei parallelen Importen auseinander. Da alle WMS-Nummern zero-padded sind, ist lexikographische Sortierung == numerische. Zusätzlich columnKey des Smart-Column-Headers korrigiert.
v1.65.0002026-04-18
  • PROJ-223: Kundenaufträge-Übersicht aufgeräumt — kompakte Status-Tabs ersetzen die großen Pipeline-Kacheln. Eine Unified Search mit Scope-Dropdown (Überall/Auftrag+Kunde/Artikel/Notizen/Externe Nr.) findet Amazon-Bestellnummern in der externen Bestellnr., eBay-Nummern in Notizen und Artikel per SKU/EAN/ASIN/FNSKU. Neuer Filter-Drawer rechts bündelt Verkaufskanal, Zahlstatus, Kanal-Quelle, Tags, Zeitraum und Freipositionen. Aktive Filter erscheinen als Chipleiste mit auffälligem rotem 'Alle zurücksetzen'-Button.
v1.64.0762026-04-18
  • PROJ-223 Backend: Neuer search_scope-Parameter an GET /api/orders mit OR-Union über orders.order_number, orders.external_order_number, customers.*, order_notes.content und order_line_items (via products.sku/sku2/barcode/fnsku + amazon_listings.seller_sku/asin). Trigram-GIN-Indizes auf allen neuen Suchfeldern für Full-Table-Scan-Vermeidung. notes_search bleibt als Legacy-Alias funktional.
v1.64.0742026-04-17
  • Shopify Bestellstatus-Sync granular pro Integration steuerbar: Master-Toggle plus vier Sub-Toggles (Stornierungen, Versandstatus, Zahlstatus & Erstattungen, Sendungsnummern). Master aus → Cron überspringt die Integration komplett; einzelne Sub-Toggles aus → nur die abgeschalteten Bereiche werden übersprungen. Tracking-Import bleibt an den Versandstatus-Sync gekoppelt. Bestandsintegrationen behalten Standardverhalten (alle Toggles an).
v1.64.0722026-04-17
  • Amazon Bestellstatus-Sync granular steuerbar: Drei neue Sub-Toggles (Stornierungen, Versandstatus, Sendungsnummern). Abgeschaltete Teile werden vom Cron übersprungen, Tracking-Import bleibt vom Versandstatus-Sync abhängig. Bestandsintegrationen behalten Standardverhalten (alle Sub-Toggles an).
v1.64.0712026-04-17
  • Amazon-Importe nutzen jetzt den echten Empfängernamen aus ShippingAddress.Name statt des Amazon-Account-Handles aus BuyerInfo — verhindert dass z.B. Usernamen wie "wergen" fälschlich als Nachname in der Lieferadresse landen (PROJ-219 Hotfix).
v1.64.0692026-04-17
  • Kunden-Adressen-Dialog zeigt und speichert Adresszeile 2 und 3 analog zu Auftrag-Adressen (PROJ-219 Hotfix).
v1.64.0682026-04-17
  • Amazon-Adressen mit c/o-Zusatz werden jetzt korrekt getrennt gespeichert — AddressLine1/2/3 landen in separaten Feldern, keine Konkatenation mehr im Straßenfeld (PROJ-219 Hotfix).
v1.64.0572026-04-16
  • Amazon Business Lieferadressen werden jetzt vollständig übernommen — Empfänger, Firma, Kaufauftragsnummer, Adresstyp und Bundesland/Region erscheinen im Auftragsdetail (PROJ-219).
v1.64.0562026-04-16
  • Produktübersicht-Spalte 'Im Zulauf' zeigt jetzt auch LBs, die als verschickt markiert wurden — hardcoded Status-Filter übersah seit PROJ-76 den 'shipped'-Zustand. Zusätzlich Single Source of Truth für In-Flight-LB-Stati (Entwürfe zählen nicht).
v1.64.0552026-04-16
  • Versand & Mobile-Picking: Picklisten-Liste filtert seit PROJ-217 nicht mehr nach Status — fertige Picklisten blieben in Mobile-App, Web-Mobile und Versand sichtbar. Neuer include_completed-Filter blendet erledigte Picklisten aus. Web-Mobile-Picking lud zusätzlich jede Pickliste doppelt (zwei Status-Fetches mit identischem Ergebnis), jetzt nur noch ein Fetch.
  • Versand-Übersicht: Kartenfußzeile 'X/X Aufträge gepickt' war seit PROJ-217 irreführend (Aufträge sind ab Picklisten-Erstellung in_progress, Zähler war immer X/X). Zeigt jetzt 'X/Y versendet'.
v1.64.0362026-04-15
  • PROJ-55: Stale-Sync Guard — Hängende Inventory-Sync-Logs (in_progress >10min) werden automatisch als failed markiert, damit nachfolgende Syncs nicht permanent blockiert werden
v1.64.0352026-04-15
  • Bundle-Gewicht aus Komponenten berechnen statt Bundle-Produkt-Gewicht (Versand, Customs, Retoure)
v1.64.0342026-04-15
  • Customs-Dialog Gewichtseinheit von Gramm auf kg korrigiert (WEIGHT_EXCEEDED Bug bei Non-EU-Sendungen)
v1.64.0292026-04-15
  • Versand-Dialog: Vollständige Lieferadresse (inkl. Land als Klartext) und Versandverpackung mit Preis dezent angezeigt
v1.64.0282026-04-15
  • PROJ-215: Picklisten-Versand-Entkopplung — Versand aus laufenden/pending Picklisten, Bestandsabbuchung beim Versand, Auto-Complete
  • Bundle-Komponenten-Reservierung in Bestandsanzeige + Plattform-Sync (Shopify/Amazon)
  • Bundle-Tab: Reserviert/Verfügbar-Spalten + SKU-Links zu Stammartikeln
v1.64.0222026-04-15
  • Volle Mitarbeiter-Rechte: Alle 192 API-Routen + alle RLS-Policies + alle RPCs für Mitarbeiter geöffnet. Nur Einstellungen, Profitbutler und Team-Verwaltung bleiben Admin-exklusiv.
  • Wareneingang LB-basiert: Lagerplatz-Feld ist jetzt eine durchsuchbare Combobox (Barcode-Scanner + Tastatursuche)
  • Wareneingang (Web + Mobile): 'cannot get array length of a scalar' behoben — p_items als Array statt JSON-String an RPC übergeben
  • Wareneingang LB-basiert: Status 'shipped' als gültiger Empfangsstatus hinzugefügt
  • Picklisten: populate_picklist, complete_picklist, delete_picklist — Admin-Check durch Member-Check ersetzt
  • Mobile App: Endpoint-Typo /api/goods-receipt → /api/goods-receipts korrigiert
  • Sidebar: Daten-Hub und Profitbutler für Nicht-Admins ausgeblendet
v1.64.0112026-04-15
  • isDhlShipment ReferenceError bei Warenpost International behoben — Customs Declaration in attemptDhlLabelGeneration nutzte undefinierte Variable
v1.64.0102026-04-15
  • PROJ-2: Dezimaleingabe mit Komma in Produktdaten (Gewicht, Maße, UVP) — type=number blockierte Komma, umgestellt auf type=text inputMode=decimal
v1.64.0082026-04-15
  • RLS-Policies: Alle Workspace-Mitglieder haben jetzt vollen Zugriff (SELECT/INSERT/UPDATE/DELETE) auf Picklisten, Aufträge und Versand — identisch mit Admins
  • Picklisten-UI: Picker zuweisen, Abschließen und Löschen jetzt für alle Mitglieder sichtbar
v1.62.0002026-04-14
  • PROJ-209: Manuelle Trackingnummer & Fulfillment-Trigger — Tracking + Carrier im Auftrag hinterlegen, Status auf versendet setzen, Fulfillment an Shopify/Amazon übertragen
v1.61.0242026-04-14
  • PROJ-208: CSV-Bestands-Import prüft jetzt is_read_only — verhindert versehentliches Einbuchen in FBA-Lager
  • PROJ-208: Cleanup-Migration entfernt alte System-Lagerplätze aus FBA-Lagern und bucht Restbestand auf Westheim um
v1.61.0232026-04-14
  • PROJ-16: Amazon FBA-Bestand wird nicht mehr in Bundle-Verfügbarkeit mitgezählt (Frontend + Backend)
v1.61.0202026-04-14
  • Double-Submit-Schutz für Plusbuchung, Minusbuchung und Umlagerung (Web + Mobile Web) — synchroner useRef-Guard verhindert Mehrfachbuchungen bei schnellem Enter-Spam
v1.61.0002026-04-14
  • PROJ-207: API-basierten Nightly Listings Refresh vollständig entfernt — 4 Route-Files, listings-worker.ts, Test-File und alle Referenzen (cron/trigger, AmazonTogglesBlock, Cron-Jobs-UI) gelöscht. Report-basierter Sync (listings-report-worker.ts) ist jetzt der einzige Sync-Pfad.
v1.60.004
  • PROJ-207: Report-Worker upserted Listing-Daten aus GET_MERCHANT_LISTINGS_ALL_DATA direkt in DB (Status, ASIN, Titel, Preis, Menge, Fulfillment-Channel)
  • PROJ-207: Auto-Mapping (remapUnmappedListings + propagateCrossMpMapping) läuft nach jedem Report-Cleanup-Lauf
  • PROJ-207: Vereinfachte Diff-Logik — Reaktivierungs-Block entfernt, da Upsert bereits korrekten Status setzt
v1.58.0522026-04-14
  • PROJ-64: enqueueAmazonDirtyBatch — 1 DB-Roundtrip statt N bei Picklist/Versand/WE/CSV-Import
v1.58.0512026-04-14
  • PROJ-64: .limit(10000) auf alle Supabase-Queries im Bestandssync (inventory-push, stock-change-hook, inventory-sync) gegen Silent-Truncation bei Skalierung
v1.58.0502026-04-14
  • PROJ-64: QA — .limit(10000) auf Reservierungs-Queries gegen PostgREST-Trunkierung
  • PROJ-64: QA — Shopify Sync-Toggle löst jetzt markProductsDirty aus (fehlte bisher)
v1.58.0492026-04-14
  • PROJ-64: Shopify Multi-Warehouse Reservierungs-Verteilung — Rundungsfehler + Bundle-Reservierungen proportional verteilt
v1.58.0482026-04-14
  • PROJ-64: Auftragsreservierungen vom Bestandssync abgezogen (Amazon + Shopify) — verhindert Überverkauf am Wochenende, Safety-Sync pusht jetzt physisch − offene Aufträge
v1.58.0472026-04-14
  • PROJ-64: Picklist-Complete löst Bestandssync aus (gepickte Produkte → Amazon/Shopify)
  • PROJ-64: Picklist-Delete mit Rebook löst Bestandssync aus (zurückgebuchte Produkte)
  • PROJ-64: Stock-Initialimport (CSV) löst Bestandssync aus (importierte Produkte)
v1.58.0452026-04-14
  • SKU, SKU2 und Barcode (EAN) nur noch von Admins bearbeitbar — Mitarbeiter sehen Felder read-only, Payload-Stripping verhindert Manipulation
  • PROJ-64: Bundle-Bearbeitung (Komponente add/remove/qty) löst jetzt Bestandssync aus (Amazon + Shopify)
v1.58.0422026-04-14
  • PROJ-64: Amazon Bestandssync fehlte für Bundles — PostgREST max_rows=1000 schnitt Listings ab, safetyFullSync filtert jetzt direkt auf sync-enabled
  • PROJ-64: Toggle-Trigger — Aktivierung von inventory_sync_enabled trägt Produkt sofort in Dirty Queue ein
  • PROJ-55: Shopify markAllMappedProductsDirty mit .limit(10000) gegen gleiches PostgREST-Limit abgesichert
v1.58.040
  • Audit-Logging in alle Admin API Routes eingebaut (user_management, integration, workflow, settings, tags, print, picklist, customers, orders, products)
v1.58.0152026-04-13
  • Einstellungen für alle Rollen sichtbar, Mitarbeiter landen auf Konto-Seite
v1.58.0142026-04-13
  • Product-Lock: Verwaiste Locks lösen sich nach 2 Min automatisch auf (Heartbeat + TTL)
v1.58.0122026-04-13
  • PROJ-203: Pipeline-Navigation und Alert Strip in Auftragsübersicht integriert (Status-Filter per Klick, Tages-KPIs mit Umsatz/unbezahlt/Adressfehler)
v1.58.010
  • PROJ-203: Stats-Endpoint auf Supabase RPC umgestellt (get_order_stats), JS-seitiges Row-Counting entfernt, automatischer Fallback auf Inline-Queries wenn SQL-Funktion noch nicht deployed
v1.58.008
  • PROJ-203: OrderStatusIndicator circle component — 32x32px Statuskreis pro Auftragszeile mit 7 Prioritätsstufen (Problem, NEU, Wartend, In Bearbeitung, Gepickt, Versendet/Abgeschlossen, Storniert)
v1.58.0062026-04-13
  • PROJ-203: /api/orders/stats Endpoint (Status-Counts + Tages-KPIs: Aufträge, Umsatz, unbezahlt, Adressfehler) + useOrderStats Hook für Pipeline-Navigation und Alert Strip
  • order_total als sortierbare Spalte in /api/orders ergänzt
v1.58.0052026-04-13
  • OrderPipeline Navigation-Komponente: Klickbare Status-Segmente mit farbigen Fortschrittsbalken für Auftragsübersicht (PROJ-203)
v1.58.0032026-04-13
  • Daten-Hub nur noch für Admins zugänglich (Sidebar + Layout-Redirect)
  • Picklisten erstellen/verwalten für alle Rollen geöffnet
  • Produkt-Import/Export-Buttons nur noch für Admins sichtbar
v1.58.0002026-04-13
  • Produkt-Plattformen-Tab: Zentrale Übersicht aller Integrations-Verknüpfungen pro Artikel (Multi-SKU, FBA/FBM, Bestandssync-Toggle)
v1.57.0382026-04-13
  • PROJ-203: inventory_sync_enabled auf integration_product_mappings, amazon_sync_inventory migriert und entfernt
  • Varianten-Tab: Neue Kombinationen werden jetzt als ungespeicherte Änderungen erkannt (Speichern-Button aktiviert sich sofort)
v1.57.0362026-04-13
  • Code-Cleanup: JSDoc-Kommentar korrigiert, JSON-Fehlerbehandlung in Varianten-Pagination
v1.57.0352026-04-13
  • Shopify Varianten-Attribute (Farbe, Größe etc.) werden jetzt beim Import korrekt übernommen
  • Integration-Sync befüllt fehlende Varianten-Attribute automatisch aus Shopify-Optionen bei gemappten Produkten
v1.57.0342026-04-13
  • Shopify Varianten-Pagination: Produkte mit >100 Varianten werden jetzt vollständig abgerufen (vorher bei 100 abgeschnitten)
v1.57.0332026-04-13
  • PROJ-6: Wareneingang zeigt jetzt auch verschickte LBs (approved + shipped + partially_received)
v1.57.0322026-04-13
  • PROJ-168: Bestelldatum (Erstellt) im LB-Detail editierbar
v1.57.0312026-04-13
  • PROJ-168: LB-Detail — Lieferdatum, Ziellager und Zahlungsstatus jetzt editierbar
  • PROJ-168: PDF-Lieferadresse nutzt Warehouse-Adresse statt immer Firmenadresse
  • PROJ-168: Elternartikel können nicht mehr auf LB gepackt werden
  • PROJ-168: Produkttitel/SKU nach Artikel-Hinzufügen sofort sichtbar (kein Reload nötig)
v1.57.0302026-04-13
  • PROJ-202: Amazon Listing Stale-Detection & Cleanup — Wöchentlicher Report-basierter Vollabgleich (GET_MERCHANT_LISTINGS_ALL_DATA + CANCELLED), Status deleted mit Löschdatum/Grund, 90-Tage-Archivierung, Order-Mapping Archiv-Fallback, Cron-Endpoint mit Toggle
v1.57.0192026-04-13
  • PROJ-134: Preisnachlass-Gutschrift wurde für vollen Rechnungsbetrag statt Erstattungsbetrag erstellt — Teilbeträge nutzen jetzt createAmountCreditNote() mit exaktem Bruttobetrag
v1.57.0182026-04-13
  • Bundle-Badge auch bei ausgeklappten Kindartikel in Produktübersicht
v1.57.0172026-04-13
  • Produkt-Badges (Bundle, Child, Eltern, Service) kompakter unter SKU statt als große Badges nebeneinander
v1.57.0162026-04-13
  • Child-Badge in Produktübersicht bei Kindartikel
  • Bundle-Badge in Varianten-Tabelle bei Elternartikel (is_bundle im API ergänzt)
v1.57.0152026-04-13
  • Bundle-Badge in Varianten-Tabelle bei Elternartikel (neben SKU)
v1.57.0142026-04-13
  • Bundle-Komponenten Titel vollständig anzeigen statt abschneiden (kein Truncate mehr)
v1.57.0122026-04-13
  • Amazon Nightly Refresh immer als Full-Refresh — erkennt gelöschte Listings zuverlässig, deaktiviert Geister-Einträge automatisch
  • Stale-Listings-Cleanup — nach Full-Refresh werden Listings die Amazon nicht mehr als BUYABLE zurückgibt auf inactive gesetzt
v1.57.0112026-04-13
  • Web-Bestandskorrekturen (Plus/Minus/Dialog) laufen jetzt über /api/stock/adjust — Amazon Dirty-Queue wird bei jeder Bestandsänderung befüllt
  • Amazon Listings-Refresh re-mappt unmapped Listings automatisch — Produkte die nach dem Listing-Import angelegt wurden werden jetzt gefunden
v1.57.0102026-04-13
  • PROJ-189: Amazon Financial Events Pull — PostedBefore Clock-Drift-Fix, 3min Puffer gegen SP-API "Date is not valid" Rejection
v1.57.0092026-04-12
  • Amazon Listings-Sync überschreibt manuelle Zuordnungen nicht mehr mit null — bestehende Mappings bleiben erhalten, Auto-Mapping wird bei jedem Sync erneut versucht
  • Amazon FBM Bestandssync Feed IN_PROGRESS wird nicht mehr als Fehler gewertet — nur FATAL/CANCELLED sind echte Fehler
v1.57.0052026-04-12
  • Per-Product Amazon Sync — Checkbox pro Artikel steuert ob FBM-Bestandsabgleich den Lagerbestand an Amazon überträgt (Default: aus)
v1.57.0002026-04-12
  • PROJ-201: Shopify Product Push — Produkte (Einzelartikel + Varianten) per GraphQL Admin API als Draft auf Shopify anlegen, automatische Verknüpfung via integration_product_mappings, Bestandssync greift sofort
v1.56.024
  • PROJ-200: Status-, Zahlstatus- und Versandart-Dropdowns bei abgeschlossenen/stornierten Aufträgen als nicht-interaktive Badges dargestellt
v1.56.023
  • PROJ-170: Picker-API HTTP 500 behoben — selling_price Spalte existiert nicht in products-Tabelle, Preis aus Picker-Query entfernt (nur id/sku/title nötig für Zuordnung)
v1.56.022
  • PROJ-200: Ersatzlieferungen und Zahlstatus-Änderungen bei stornierten Aufträgen blockiert, leeres Dropdown-Menü bei gesperrten Adresskarten versteckt
v1.56.021
  • PROJ-170: Amazon-Artikelzuordnung Suche kaputt — ProductPickerDialog sendete falschen Query-Parameter (?q= statt ?search=), Suchergebnisse waren zufällig statt gefiltert. Neuer leichtgewichtiger /api/products/picker Endpoint (1 DB-Query statt 7) für deutlich schnellere Picker-Suche
v1.56.019
  • PROJ-200: Frontend-Bearbeitungssperre — Action-Buttons gesperrt bei abgeschlossenen/stornierten Aufträgen, Lock-Banner mit Statushinweis, Adressbearbeitung readonly, Versand-Aktionen (Etikett/Retoure/Nachdrucken) ausgeblendet
v1.56.016
  • PROJ-200: Auftrags-Bearbeitungssperre — Abgeschlossene/stornierte Aufträge: PUT/Adressen/Versandart/Status gesperrt, Erstattungen bei stornierten Aufträgen blockiert, Status-Änderungen bei abgeschlossenen Aufträgen nur noch Stornierung erlaubt
v1.56.009
  • PROJ-198: Alle 130 TypeScript-Kompilierungsfehler in 27 Dateien behoben — null/undefined-Signaturen, RHF/Zod v4 Generics, fehlende Typ-Properties (Profitbutler Bundle, Workspace supplier_number_*), doppelte Country-Codes, Zod v4 refine()-Signatur, shopify_sync Enum-Korrektur, Buffer→Uint8Array für OneDrive
v1.56.0082026-04-12
  • Lagerplatz-Dropdown in Picklisten-Profilen war nicht scrollbar
v1.56.0072026-04-12
  • Lagerplatz-Auswahl in Picklisten-Profilen zeigte keine Lagerplätze (API filterte nach nicht-existierender workspace_id Spalte)
v1.56.005
  • PROJ-98: Service-Artikel (inventory_tracking=false) systemweit aus Picking/Packing/Shipping gefiltert — betrifft Picklist-Klassifizierung, Stock-Fulfillment, Pickpositionen, Versand-Dialog, Scan-Validierung, DHL/DP-Gewicht, Customs-Check, Zusatzlabel, Versandhistorie und DB-Trigger item_count
  • Deutsche Post Internetmarke: Vollständige ISO 3166-1 Ländercodes — Schweden, Norwegen, Finnland und 200+ weitere Länder fehlten in der Alpha-2→Alpha-3 Map
v1.56.004
  • Einzelner Versandfehler löschbar per Trash-Button in der Fehler-Zeile
  • Alle Versandfehler auf einmal löschen mit Bestätigungs-Dialog (AlertDialog)
v1.56.000
  • Versandfehler-Queue & Adresskorrektur — Fehlerliste mit Badge, Inline-Adresskorrektur, Blocking/Non-Blocking pro Picklisten-Profil, zweistufiges Error-Mapping für DHL & Deutsche Post (PROJ-199)
v1.55.066
  • PROJ-199: Ship-API gibt error_log_id zurück (DHL + DP Fehler-Insert mit .select('id').single())
  • PROJ-199: ShippingErrorCorrectionModal — Blocking-Dialog mit Fehlermapping, editierbaren Adressfeldern (nur bei address-Fehlern) und Retry via PATCH /api/shipping/errors/:id/correct
  • PROJ-199: ShippingScanningDialog Non-Blocking-Modus — bei shippingErrorBehavior='non_blocking' Toast + Fehlerliste statt Modal
  • PROJ-199: ShippingPicklist-Typ um shipping_error_behavior erweitert, Prop an ShippingScanningDialog weitergegeben
v1.55.064
  • PROJ-199: Shipping Errors Table — aufklappbare Fehlerliste mit Schweregrad-Farbkodierung, Adresskorrektur-Formular (nur bei address-Fehlern), technischen Details und Carrier-Filter
  • PROJ-199: Shipping Errors Page unter /dashboard/outbound/shipping/errors mit Carrier-Dropdown und Gesamtanzahl-Anzeige
v1.55.063
  • Auftragsübersicht und Versand-Scanning-Dialog zeigten Kunden-Stammdaten statt Auftrags-Snapshot-Adresse — Adressänderungen im Adressen-Tab wurden nicht in Übersicht/Versand reflektiert
v1.55.062
  • PROJ-199: TanStack Query hooks useShippingErrors und useShippingErrorCount (30s Auto-Refetch)
  • PROJ-199: ShippingNav-Badge zeigt offene Versandfehler mit rotem Counter-Badge
v1.55.061
  • PROJ-199: GET /api/shipping/errors — Versandfehler-Liste mit Auftrags-Adress-Join, Count-Only-Modus für Badge, Carrier-Filter und Pagination
  • PROJ-199: PATCH /api/shipping/errors/[id]/correct — Adresskorrektur mit optionalem Versand-Retry, Auto-Resolve bei bereits versendeten Aufträgen, Retry-Count-Tracking
v1.55.060
  • PROJ-98: Service-Artikel aus Stock-Fulfillment-Check und Pickpositionen ausschließen — Aufträge mit Versandkosten konnten nur erfüllt werden wenn fälschlich Bestand gebucht war
  • PROJ-182: Service-Artikel (inventory_tracking=false) aus Pick-Unit-Zählung ausschließen — Versandkosten mit zugeordnetem Produkt wurden fälschlich als pickbare Einheit gezählt
  • PROJ-182: DB-Trigger item_count zählt product_id=NULL nicht mehr mit — Backfill aller bestehenden Aufträge
  • PROJ-182: Versandkosten-Position verfälschte one_scan/multi Klassifizierung — Aufträge mit 1 Produkt + 1 Versandkosten-Zeile wurden fälschlich als Multi eingestuft
v1.55.058
  • PROJ-199: Zwei-Stufen Versandfehler-Mapping-Modul — Tier 1 feste Codes (AUTH_FAILED, DP_BALANCE_INSUFFICIENT etc.), Tier 2 Keyword-Parsing von Fehlermeldungen (PLZ, Hausnummer, Straße, Stadt, Land, Gewicht, EKP, Produktcode) mit Schweregrad-Farbgebung für Versandfehler-Queue
v1.55.049
  • Amazon-Import triggert jetzt Workflows (FBM + FBA), neue ignore_fba Checkbox in Workflow-Einstellungen
  • Tax-Preview: Kundenland-Fallback auf customer_addresses bei Kunden mit neuem Adress-System (PROJ-145)
  • Auftragsanlage: Versandart-Zuweisung Race Condition bei Produkt-Hinzufügen behoben
v1.55.047
  • Profitbutler Aggregate Cron-Endpoint: GET-Route hinzugefügt — externe Cron-Services (all-inkl KAS, Uptime Kuma) konnten den Endpoint nicht aufrufen, da nur POST existierte
v1.55.046
  • PROJ-197: Bundle-Scan im Versand — Komponenten einzeln oder Bundle-Barcode scannen, visuelles Bundle-Badge, Server-Validierung für Komponenten-IDs
v1.55.045
  • PROJ-166: IN_PROGRESS Feed-Status als Erfolg werten — Feed wurde eingereicht, nur FATAL/CANCELLED = Fehler
v1.55.044
  • PROJ-166: Carrier-Mapping nutzt shipping_methods.carrier als Fallback — Kompaktbrief/Großbrief etc. korrekt als Deutsche Post statt Other
v1.55.043
  • PROJ-166: shipping_tasks.carrier entfernt (Feld existiert nicht, carrier nur auf shipping_labels)
v1.55.042
  • PROJ-166: tracking_number/tracking_carrier aus orders-Query entfernt (existieren nur auf shipping_tasks/shipping_labels)
v1.55.041
  • PROJ-166: Versandbestätigung Vorschau (Trockenlauf) — Preview-Dialog zeigt ausstehende FBM-Bestellungen mit Carrier, Tracking, Versanddatum
  • PROJ-166: Amazon Versandbestätigung — shipping_method→shipping_methods Join Fix (Column existierte nicht)
v1.55.039
  • PROJ-196: Pickliste Löschen statt Stornieren — delete_picklist() RPC mit Rebook-Option, Smart Delete Dialog, cancelled Status komplett entfernt
v1.55.038
  • PROJ-195: 'picked' Status in manueller Auftrags-Status-API (PATCH /api/orders/[id]/status) ergänzt
v1.55.037
  • PROJ-195: Regression behoben — complete_picklist() setzte Aufträge auf 'shipped' statt 'picked', Backfill für betroffene Aufträge
v1.55.035
  • Neuer Auftrag direkt aus Kundendetailseite erstellen (Kunde vorausgewählt)
  • Cleanup ungenutzter Imports und toter Code in CustomerFormDialog und Kundenliste
v1.55.034
  • CustomerFormDialog auf Create-Only vereinfacht
v1.55.033
  • PROJ-166: Amazon Cron Error-Logging verbessert (JSON.stringify statt [object Object]), Feed-Upload Fehlerprüfung hinzugefügt
v1.55.032
  • Rundungsfehler bei Brutto-Gesamt in Auftragsdetails behoben (gross_price_per_unit direkt verwenden)
v1.55.031
  • PROJ-Kommentar-Prefixe aus deployed Code entfernt
v1.55.030
  • Debug-Logs entfernt, migrate-currency Route gelöscht, PROJ-193 Plan aufgeräumt
v1.55.029
  • formatAmount-Helper zentralisiert, Frankfurter API URL aktualisiert
v1.55.028
  • Multi-Wort-Suche für Kundenname bei Aufträgen und Kunden (Vorname + Nachname zusammen suchbar)
v1.55.027
  • PROJ-195: Picklisten-Bestandsreservierung — Lagerplatzbezogene Reservierung durch offene Picklisten, DB-Level Enforcement (FOR UPDATE Lock), verfügbare Menge in UI/API, Doppel-Reservierungs-Schutz bei Picklisten-Erstellung
v1.55.026
  • PROJ-4: Hierarchy-Felder beim Bearbeiten nicht mehr alle Pflicht (nur erstes Level), Sortiernummer 0 erlaubt, fehlende Keys werden mit leerem String aufgefüllt
v1.55.025
  • PROJ-4: Bulk-Typ-Änderung für Lagerplätze — Checkbox-Auswahl + Dropdown zum Setzen von Pick & Versand / Nachfüll / Gesperrt für mehrere Standorte gleichzeitig
v1.55.024
  • PROJ-85: Datenhub-Import von Lagerplätzen generiert jetzt automatisch hierarchy_values (Halle, Gang, Regal, Ebene, Fach) aus dem Namen — Backfill-Migration für bestehende Daten
v1.55.023
  • PROJ-192: Zwei-Phasen Status+Tracking Sync — Phase 1 (GENERAL Report) für Status, Phase 2 (restricted SHIPPING Report mit RDT) für Tracking-Nummern und Carrier
v1.55.021
  • PROJ-192: Fehlende Toggles im Amazon-Settings Zod-Schema ergänzt (auto_sync_order_status, amazon_sync_pull_enabled, show_alternative_currency wurden beim Speichern verworfen)
v1.55.020
  • PROJ-192: Amazon Cron-Routes geben jetzt success statt ok zurück — Cron-Jobs-UI zeigt Ergebnis korrekt an (betrifft alle 9 Amazon-Crons)
v1.55.016
  • PROJ-194: Cleanup — ungenutzten Helper entfernt, Pending-Query mit Limit abgesichert, Status Deployed
v1.55.015
  • PROJ-194: Bulk-Apply Date-Boundary Fix (lt next month statt lte last second)
v1.55.0142026-04-11
  • PROJ-117: Amazon FBM-Bestellungen erhalten jetzt automatisch die Versandart aus Produkt-Priorität (analog zu Shopify-Import)
v1.55.013
  • PROJ-194: show_alternative_currency in channel-config Test-Fixture ergänzt
v1.55.012
  • PROJ-194: show_alternative_currency Toggles (Amazon, Billkom Kanäle) + Währungs-Info-Banner im Belegdialog
v1.55.011
  • PROJ-194: BMF-Kursverwaltung UI (Billkom Settings Tab "Währungen", Pending-Banner, Bulk-Apply)
v1.55.010
  • PROJ-194: PDF-Generator rendert Alternativwährung pro Position + Kurs-Footer (§16 Abs. 6 UStG)
v1.55.009
  • PROJ-194: Invoice-Creation speichert Währungsfelder aus Order (BMF > ECB Kurs-Priorität)
v1.55.008
  • PROJ-194: BMF-Monatskurs API (GET/PUT/POST apply) für manuelle Kursverwaltung
v1.55.007
  • PROJ-194: Währungs-Formatierung (formatCentsCurrency) und currency-helpers für Kurs-Logik
v1.55.006
  • PROJ-194: DB-Migration — Währungs-Spalten auf billkom_documents, document_items und channel_configs
v1.55.0032026-04-11
  • PROJ-55: Shopify Safety-Sync — vollständiger Bestandsabgleich aller Artikel als Reconciliation-Layer, Intervall konfigurierbar (Standard: 2h)
  • PROJ-55: Safety-Sync Intervall-Selector in Shopify-Integrationseinstellungen (1h bis 24h)
v1.55.0022026-04-11
  • PROJ-193: Migration COALESCE für NULL gross_price_per_unit bei manuell angelegten Aufträgen
v1.55.0012026-04-11
  • PROJ-193: original_* Felder in Manual Order + Shopify Import, atomare Migration, Rate-Plausibilitätsprüfung, Cache-Error-Logging, Explicit ROUND_HALF_UP
v1.55.0002026-04-10
  • PROJ-193: Multi-Currency Orders — Amazon-Bestellungen in Originalwährung importieren, ECB-Tageskurs beim Import konvertieren (Dual-Storage), Kurs-Cache-Tabelle, retroaktive Migration für bestehende Nicht-EUR-Bestellungen, Währungs-Badge in Bestellliste, Kurs-Info-Box im Bestelldetail
v1.54.0032026-04-10
  • PROJ-131: Shopify Bestellstatus-Sync nur noch für offene Bestellungen (open/in_progress/picked) — shipped/completed rausgenommen, verhindert Timeouts bei vielen historischen Bestellungen
v1.54.0022026-04-10
  • PROJ-192/PROJ-189: amazon-order-status-sync und amazon-finance-events-pull im manuellen Cron-Trigger-Handler registriert — fehlten in der Endpoint-Whitelist
v1.54.0002026-04-10
  • Cron-Jobs Einstellungsseite komplett redesigned — 20+ Jobs in 5 Kategorien (Shopify, Amazon, Workflows, Profitbutler, Cleanup) gruppiert, kompakte Zeilen mit Health-Dots statt voller Cards, Summary-Bar mit Gesund/Verspätet/Fehler-Zähler, Einrichtungsanleitungen auf 3 Ein-Klick-Kopier-Cards reduziert (vorher 3× die volle 20-Job-Liste)
v1.53.0242026-04-10
  • PROJ-192/PROJ-189: Fehlende Cronjob-UI-Einträge für Amazon Bestellstatus-Sync und Amazon Finanzereignisse-Pull in der Einstellungsseite ergänzt
v1.53.023
  • Manueller Einstandspreis unterstützt jetzt 4 Dezimalstellen (Input, Anzeige, Bestandswert)
v1.53.0222026-04-10
  • PROJ-55: Bundle-Artikel Bestandssync — Shopify + Amazon erhalten berechneten Bundle-Bestand (MIN(Komponenten/Menge)), nicht mehr 0
  • PROJ-55: Dirty-Flag Cascade — Komponenten-Änderung flaggt automatisch Eltern-Bundles für Shopify- und Amazon-Sync
v1.53.0212026-04-10
  • PROJ-55: Stock-Query warehouse_id Filter wiederhergestellt (Performance-Regression aus Chunking-Refactor)
  • PROJ-55: Shared ShopifyRateLimiter zwischen fetchAndCacheInventoryItemIds und Main Loop
  • PROJ-55: Frontend Edge Case — totalExpected > 0 bei 0/0 zeigt Warning statt falsches Success
v1.53.0202026-04-10
  • PROJ-55: Shopify Bestandssync Fehlerbehandlung — finalizeSyncLog markiert 0/0+Error korrekt als failed statt success, Frontend-Toast unterscheidet zwischen keine Änderungen und Sync-Fehler
  • PROJ-55: Chunked .in()-Queries gegen PostgREST URL-Length-Limits bei 400+ Produkten
  • PROJ-55: Shopify Leaky-Bucket Rate Limiter (40 Burst, 2/s) statt starrem 500ms Delay — deutlich schnellere Syncs
  • PROJ-55: Strukturiertes Logging an jedem Early-Return-Pfad mit deutschem errorReason
v1.53.0192026-04-10
  • PROJ-193: Freie Wareneingänge aus FIFO-Bewertung ausgeschlossen — nur LB-basierte WEs fließen in den Einstandspreis ein, DB-Migration bereinigt bestehende Daten, 3 API-Routen gefiltert
v1.53.0172026-04-10
  • Amazon-Import nutzt jetzt die Versandpositions-Erkennung — Versandpositionen werden dem konfigurierten Ziel-Artikel zugeordnet statt immer als Freiposition angelegt
v1.53.0162026-04-10
  • FBM/FBA-Filtereinstellungen (Bestellstatus, Zahlungsstatus, Sync-Zeitraum, Import-Defaults) bleiben jetzt nach Seitenaktualisierung erhalten — fehlender useEffect-Sync zwischen Props und lokalem State behoben
v1.53.0152026-04-10
  • Kanban-Karten zeigen jetzt Herstellernamen statt UUID (PROJ-77)
v1.53.0142026-04-10
  • Amazon-Import berücksichtigt jetzt den Toggle 'USt-Satz von Amazon übernehmen' — bei amazon_native wird der Steuersatz aus ItemTax berechnet und auf gängige EU-Sätze gerundet, bei flowkom_recompute greift OSS-Lookup nach Lieferland
v1.53.0132026-04-10
  • OSS-konforme MwSt im Shopify-Import — Steuersatz wird jetzt anhand des Lieferlandes aus billkom_tax_rates aufgelöst (z.B. AT=20%, FR=20%, DE=19%) statt pauschal 19%
v1.53.0122026-04-10
  • PROJ-187 Redundanten Versandstatus-Filter aus FBM-Bestellimport entfernt (war Duplikat zum Bestellstatus-Filter), Ziel-Artikel in Versandpositions-Erkennung wird jetzt korrekt gespeichert
  • OSS-konforme MwSt im Amazon-Import — Steuersatz wird jetzt anhand des Lieferlandes aus billkom_tax_rates aufgelöst statt pauschal 19%
v1.53.0112026-04-10
  • Amazon-Source überall ergänzt: Kunden-API Filter, SourceBadge, Kundendetail, Dropdown, TypeScript-Typen, Event-Typen
v1.53.0102026-04-10
  • PROJ-192 Amazon FBM Bestellstatus-Sync — Neuer Cron-Job holt regelmäßig den Bestellstatus und Tracking-Nummern für FBM-Bestellungen von Amazon ab (Reports API: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL). Status-Mapping (Shipped→shipped, Cancelled→cancelled, PartiallyShipped→in_progress), Tracking als shipping_task mit Duplikat-Check, Shipment-Confirmation-Skip (amazon_confirmation_sent_at), Downgrade-Schutz, Audit Trail, Advisory Lock, Cursor-basiert. Toggle 'Automatischer Bestellstatus-Sync' in den Amazon-Einstellungen (default: aus). 22 Unit Tests.
  • PROJ-189/PROJ-192: Fehlende job_type-Werte (finance_events_pull, order_status_sync) im amazon_sync_log CHECK Constraint nachgetragen
v1.53.0042026-04-10
  • Amazon-Quellenfilter in Auftragsübersicht funktioniert jetzt (source-Validierung fehlte)
v1.53.0022026-04-10
  • Unused Loader2 Import aus Bestandsbewertungs-Seite entfernt (Cleanup Profitbutler-Nav)
v1.53.0012026-04-10
  • PROJ-166 amazon-rebuild-reference/v1-snapshot entfernt — 60 Dateien, 17.554 Zeilen Altlast aus dem v1/v2-Rewrite gelöscht. Die v3 Amazon-Integration ist stabil und produktionsbereit.
v1.53.0002026-04-10
  • PROJ-191 Amazon JSON_LISTINGS_FEED Migration — FBM-Bestandssync migriert von deprecated POST_INVENTORY_AVAILABILITY_DATA (XML, tot seit Juli 2025) auf JSON_LISTINGS_FEED mit PATCH-Semantik. fulfillment_channel_code DEFAULT für FBM, productType PRODUCT universell, Content-Type application/json; charset=UTF-8. Per-Marketplace-Architektur bleibt bestehen.
v1.52.0162026-04-10
  • Profitbutler Subtab-Navigation als saubere shared Nav-Komponente (SettingsNav-Pattern statt lose Buttons)
v1.52.0152026-04-10
  • PROJ-64 Per-Marketplace Inventory Feeds — FBM-Bestandssync sendet jetzt einen Feed pro Marktplatz statt alle SKUs an alle active_marketplace_ids. Jede SKU wird genau einem Marktplatz zugeordnet (Primary-MP bevorzugt, z.B. DE für EU). Verhindert Phantom-Listing-Risiko (SP-API #2784) und nutzt Amazons globale Bestandspropagation bei EU Unified Accounts.
v1.52.0122026-04-10
  • PROJ-190: Bestandsbewertung & Einstandspreis-Konsolidierung — Manueller Einstandspreis am Produkt mit FIFO-Kaskade (Toggle → FIFO → Manuell → null), FBA-Bewertung auf Durchschnitts-Einstandspreis umgestellt, neuer Profitbutler Sub-Tab "Bestandsbewertung" mit Lagerwert pro Lager, Artikelliste und Lücken-Warnung, Lagerwert aus Bestandsübersicht entfernt, Datenhub-Import für manuellen Einstandspreis
  • PROJ-190: FIFO-Allokation im Profitbutler API korrigiert (echte FIFO statt einfacher Durchschnitt), workspace_id Filter im FBA Cost Lookup, Rate-Limiting auf Manual Cost PATCH, Toggle-UX Verbesserung, Paginierung der Produktliste
  • PROJ-189: UNIQUE Constraint mit COALESCE auf Unique Index umgestellt (PostgreSQL-Kompatibilität)
v1.52.0062026-04-10
  • PROJ-189: QA-Fixes — Idempotenz-Refactor (SELECT-then-INSERT, Credit-Note-Fehler retried), RPC für Adjustment-Upsert, 3 neue Test-Szenarien
v1.52.0052026-04-10
  • PROJ-64 SKU-Deduplizierung im FBM Inventory Feed — buildFeedItems() dedupliziert jetzt nach seller_sku via Map, damit identische SKUs bei Multi-Marketplace-Listings (DE+FR+IT etc.) nur noch einmal im XML-Feed auftauchen statt pro Marktplatz-Zeile.
v1.52.002
  • PROJ-190: Datenhub Schema-Overlay um manual_landed_cost_eur erweitert — Feld erhält deutschen Anzeigenamen 'Manueller Einstandspreis (EUR)', Gruppe 'Einkauf' und Synonyme für CSV-Auto-Mapping
v1.52.001
  • Bestandsbewertung-Link im Profitbutler-Header (navigiert zu /dashboard/profitbutler/inventory-valuation)
  • Gesamter-Lagerwert-Karte aus Bestandsübersicht entfernt (Lagerwert jetzt im Profitbutler-Modul)
v1.52.0002026-04-10
  • PROJ-190 Bestandsbewertung Profitbutler Sub-Tab — Neue Unterseite /dashboard/profitbutler/inventory-valuation mit Lagerwert-Summary, Warehouse-Breakdown-Tabelle, sortierbarer Artikelbewertungs-Tabelle (FIFO/Manuell/Keine Bewertung Badges), Warnbanner für Artikel ohne Einstandspreis mit Filter-Toggle.
v1.51.0002026-04-10
  • PROJ-189: Amazon Financial Events Pull — Automatischer Import von Erstattungen & Adjustments aus Amazon (Cron mit Cursor + 6h Overlap, Hash-basierte Idempotenz, Auto-Gutschrift bei Voll-/Teil-Refund, Dedup gegen Push-Marker, AdjustmentEvent capture-only)
v1.50.015
  • PROJ-189: Integration-Tests für Financial Events Pull (8 Szenarien: Happy Path, Idempotenz, Dedup, Orphan, kein Beleg, AdjustmentEvent, leere Response, API-Fehler)
v1.50.0132026-04-10
  • PROJ-190 FBA-Kostenlookup auf Bewertungskaskade umgestellt — getAmazonFbaValuationCost() in src/lib/amazon/fba-cost-lookup.ts nutzt jetzt resolveValuation() statt supplier_products.purchase_price. Kaskade: prefer_manual_cost + manual_landed_cost_eur > FIFO-Avg aus stock_movements Receipts > manual_landed_cost_eur Fallback > null.
v1.50.0082026-04-10
  • PROJ-190 Bewertungskaskade in cost-breakdown API — GET /api/products/[id]/cost-breakdown liefert jetzt zusaetzlich effective_cost_eur, valuation_source, manual_landed_cost_eur, prefer_manual_cost und fifo_receipt_count. Produktabfrage wurde auf manual_landed_cost_eur und prefer_manual_cost erweitert. resolveValuation() aus src/lib/inventory-valuation.ts loest die Kaskade auf (manuell > FIFO-Avg > null) und gibt die aktive Quelle zurueck.
v1.50.000
  • Amazon Refund & Cancel Push (PROJ-188): Erstattungen und FBM-Stornierungen werden über SP-API Feeds an Amazon gepusht. Job-Queue mit Status-Cron, Dedup-Marker, Badge + Historie-Sheet im Auftragsdetail, Settings-Toggles, Dialog-Checkboxen.
v1.49.012
  • Shopify Erstattung (PROJ-134): 422-Fehler 'transactions require a gateway' behoben. Gateway-Feld fehlte in der Refund-Transaction wenn eine parent_id vorhanden war. Gateway wird jetzt aus der Calculate-Response übernommen und immer mitgesendet.
v1.49.011
  • Amazon Purge Kunden-Cleanup: FBA-Kunden (PROJ-175 Reports-Enrichment) mit source='manual' ohne amazon_integration_id wurden nicht mitgelöscht. Filter entfernt — jetzt wird nur geprüft, ob der Kunde nach dem Order-Delete noch Orders hat. Kunden mit anderen Orders bleiben.
v1.49.010
  • delete_order_with_documents (PROJ-108): FK-Fehler billkom_job_queue_result_document_id_fkey beim Löschen von Orders mit Workflow-generierten Belegen behoben. RPC räumt jetzt vor dem Document-Delete alle Queue-Einträge der Order weg (über order_id und result_document_id). Entfernt gleichzeitig stuck "running"-Jobs zu gelöschten Orders.
v1.49.009
  • Amazon "Importierte löschen" (Testing-Purge): Scheiterte an finalisierten Rechnungen mit GoBD-Fehler ("Feld order_id darf nach Finalisierung nicht geändert werden"). Nutzt jetzt pro Order den PROJ-108-RPC delete_order_with_documents, der corrective-edit-Mode aktiviert und Belege + Nummernkreise sauber mit abräumt. Kunden-Cleanup unverändert.
v1.49.008
  • Amazon-Settings: Redundante "Pending-Bestellungen importieren"-Checkbox entfernt — Pending wird jetzt rein über den Bestellstatus-Filter ("Ausstehend") gesteuert
v1.49.007
  • Cron-Health-UI: Trigger-Whitelist um alle sechs fehlenden Amazon-Cronjobs ergänzt (FBA/FBM Import, Inventory Flush + Safety Sync, Listings Nightly Refresh, Shipment Confirmation). Der "Jetzt ausführen"-Button funktioniert jetzt für alle Amazon-Jobs.
  • Amazon FBA Inventory Pull Schedule in der Cron-UI von stündlich auf täglich 03:00 (0 3 * * *) geändert. Beschreibung aktualisiert: FBA ist seit PROJ-177 ein echtes Lager mit stock-Rows im FBA-POOL, nicht mehr virtuell. Der externe Cron in all-inkl muss manuell auf den neuen Takt umgestellt werden.
v1.49.006
  • Cron-Health-UI: "Jetzt ausführen"-Button für Amazon FBA Inventory Pull lieferte "Invalid endpoint" — Trigger-Whitelist um die Route ergänzt.
v1.49.005
  • PROJ-178 (Amazon FBA Umlagerung & echter FIFO-Pass-through) als Problem-Dump für Brainstorming-Session angelegt.
v1.49.004
  • PROJ-177 (Amazon FBA-Bestand als echtes Flowkom-Lager) als Deployed markiert nach drei Bugfix-Iterationen.
v1.49.003
  • FBA-Bestands-Pull Pan-EU/NA: Statt eines Loops über alle aktiven Marktplätze (der den FBA-Pool 17-fach summiert hätte) jetzt ein einziger Pull pro Region mit dem primären Consumer-Marktplatz (Amazon.de für EU, Amazon.com für NA). Amazon liefert für Pan-EU pro MP denselben Pool zurück — Summation wäre falsch gewesen.
v1.49.002
  • FBA-Bestands-Pull: Fetch-Timeout (60s/Request via AbortSignal), strukturiertes Progress-Logging pro Marktplatz/Page/Phase, maxDuration=900s in Cron- und Manual-Endpoint — vorher konnte ein hängender SP-API-Call den Job unbegrenzt blockieren ohne Log-Output.
v1.49.001
  • [object Object]
v1.49.000
  • [object Object]
v1.48.010
  • FBA-Bestands-Pull: Multi-Marketplace-Loop (war auf marketplaceIds[0] begrenzt, spec-widrig), Absolute-Sync-Fix (pro Produkt statt pro Listing, verhindert Überschreiben bei Produkten auf mehreren Marktplätzen), Kosten-Fallback auf 0 € statt hartem Skip wenn Lieferantenkosten fehlen (konsistent zu manuellem Wareneingang).
v1.48.0082026-04-09
  • PROJ-186 Verkaufskanal „Flowkom" für manuell angelegte Aufträge — Kundenaufträge, die direkt in Flowkom angelegt werden (source=manual), bekommen jetzt automatisch den Verkaufskanal `flowkom`. Neuer Eintrag in src/lib/channel-config.ts (KNOWN_CHANNELS) mit Flowkom-Blau (#2563EB) und eigenem SVG-Icon (public/channels/flowkom.svg). API-Insert in src/app/api/orders/route.ts setzt sales_channel=flowkom beim Anlegen, Backfill-Migration setzt bestehende Manual-Aufträge ohne Kanal rückwirkend. Badge „Flowkom" erscheint automatisch in Auftragsliste, Filter-Dropdown und Profitbutler-Kanalaufschlüsselung; Workflow-Bedingungen auf sales_channel greifen jetzt auch für manuelle Aufträge.
v1.48.005
  • PROJ-184: Bundle-Bestellung mit einer einzigen Zeile (1× Bundle-SKU, Menge 1) wurde von Multi-Scan-Profilen fälschlich als 'one_scan' klassifiziert und ausgeschlossen, weil orders_with_totals.item_count rohe Zeilen zählt (=1). Fix: der order_type-Filter expandiert jetzt Bundles in ihre Komponenten und klassifiziert auf Basis der effektiven Pick-Einheiten. Bundle-Order mit zwei Komponenten zählt jetzt korrekt als 'multi'. Gilt sowohl für den Preview als auch die Profil-Kachel-Zähler.
v1.48.004
  • PROJ-185: Beim manuellen Anlegen einer Rechnungsadresse erscheint jetzt eine optionale Checkbox 'Auch als Lieferadresse übernehmen'. Wenn aktiv, wird die Adresse zusätzlich als Lieferadresse gespeichert — spart den doppelten Eintrag. Einmaliges Kopieren, keine Verknüpfung (spätere Änderungen an der Rechnungsadresse wirken sich nicht auf die Lieferadresse aus). Nur bei Neuanlage, nicht im Bearbeiten-Modus.
v1.48.003
  • PROJ-184: Bundle-Artikel können endlich auf Picklisten landen. Bundles haben selbst keinen Bestand — nur ihre Komponenten (bundle_items). Vorher hat der Stock-Check gegen die leere Bundle-SKU geprüft und jede Bestellung mit Bundle-Artikel als 'nicht genug Bestand' stumm gedroppt. Neuer Expand-Schritt (src/lib/picklist-bundles.ts) löst Bundle-Line-Items in ihre Komponenten auf, bevor der Stock-Check läuft. picklist_item_assignments zeigt weiterhin auf den echten Bestell-Line-Item (Bundle-Parent), der Packer sieht die Bundle-SKU wie bisher, der Picker sieht die physischen Komponenten.
  • PROJ-184: Safety-Gate gegen Zero-Position-Picklisten — Aufträge, deren Bundle-Expansion leer ist (Bundle-Artikel ohne konfigurierte Komponenten), werden nicht mehr als erfüllbar markiert und erzeugen eine Warning beim Admin, damit die Bundle-Definition nachgezogen werden kann.
v1.48.001
  • PROJ-70: Veralteter Kommentar in dhl.ts (behauptete 'try base64 first from includeDocs=include') an den neuen URL-Modus angepasst. Die b64/zpl2-Zweige bleiben als defensive Fallbacks, da die DHL-Spec erlaubt, dass url+b64 gleichzeitig befüllt werden.
v1.47.001
  • PROJ-70: Exportdokumente (CN23 / Handelsrechnung) landeten beim Auslandsversand immer am DHL-Label-Drucker, auch wenn in den Workstation-Einstellungen ein separater Drucker für Exportdokumente zugewiesen war. Ursache: DHL-Shipment-Creation rief die API mit includeDocs=include auf, wodurch DHL die Export-Dokumente direkt in die Label-PDF einbettete. Fix: includeDocs=URL — Label und customsDoc kommen jetzt als getrennte URLs zurück, der bereits vorhandene separate Print-Job für export_document_printer_id in /api/shipping/ship wird endlich wirksam und routet die CN23-PDF korrekt auf den zugewiesenen Drucker.
v1.47.000
  • PROJ-182: Picklisten Filter-Parity — Shared picklist-filters Modul, Preview und Erstellung teilen sich jetzt eine einzige Filter-Pipeline. tag_filters, max_orders, warehouse_ids und location_filters werden jetzt konsistent von Profil-Karten, Vorschau und Erstellung angewandt (vorher drifteten die drei Implementierungen auseinander und Preview zeigte Aufträge die dann nicht auf der Pickliste landeten). Stock-Hinweis-Pill im Erstell-Dialog wenn Bestand/Lagerfilter gesetzt sind.
  • PROJ-182: Picklisten-Erstellung max_orders-Cap läuft jetzt NACH dem Stock-Check (nicht davor) — Stock-Drops fressen nicht mehr ins Cap-Budget. Drop-Counter pro Filter-Stage (Auftragstyp, Tag-Filter, Stock, Max-Limit) werden als Toast beim Erstellen angezeigt.
  • PROJ-182: Versand-Detailseite zeigt jetzt einen echten Fehler-State mit 'Erneut versuchen'-Button wenn die API fehlschlägt, statt stumm 'Alle Aufträge versendet' zu rendern. Schützt zukünftig vor Bugs der Klasse v1.44.011 (gedroppte Spalten).
v1.44.011
  • Versand: Picklisten-Detailseite zeigte fälschlich 'Alle Aufträge versendet', obwohl die Aufträge noch im Status 'Gepickt' waren. Ursache: SHIPPING_ORDER_SELECT referenzierte die durch PROJ-150 gedroppte orders.notes-Spalte, PostgREST warf 42703, Frontend rendert Fehler als leeren Zustand.
v1.44.010
  • PROJ-181: Neue Lieferantenbestellung — Supplier-First-Flow (kleines Dialog zur Lieferantenauswahl, dann direkt ins Fullscreen-Bestellformular im Edit-Modus, altes Popup-Formular entfernt)
v1.44.005
  • PROJ-180: Auftragsdetail zeigt magnalister Otto Retoure-Bridge Status (Übertragen/Fehlgeschlagen) wenn Metadaten vorhanden
v1.44.004
  • PROJ-180: Zod-Schema für Integration-PATCH erweitert — bridge_m2e_cloud_enabled und bridge_magnalister_enabled explizit als boolean optional deklariert
v1.44.003
  • PROJ-180: Marktplatz-Bridges UI — M2E Cloud Modus und magnalister Modus als unabhängige Toggles in der Shopify-Integrationsdetailseite
v1.44.0002026-04-09
  • PROJ-179 Bestands-Reiter im Artikeldetail — Neuer Tab "Bestand" in der Artikeldetailseite mit Sub-Tabs Uebersicht, Im Zulauf, Reserviert und Historie. Lazy Loading pro Sub-Tab, keine neuen Tabellen (nutzt bestehende stock/stock_movements/purchase_order_items/order_items). Fuer Bundle-Artikel wird ein Info-Banner statt der Sub-Tabs angezeigt; Service-Artikel (inventory_tracking=false) bekommen den Tab nicht. Die alte FBA-Overlap-Warnung im Header der Artikelseite wurde entfernt und lebt jetzt im Bestand-Uebersicht-Panel.
v1.43.001
  • PROJ-180: pushMagnalisterReturnAttributes GraphQL helper — read-merge-write auf Shopify Order.customAttributes für magnalister Otto Retoure-Felder
v1.42.0032026-04-09
  • PROJ-180 mergeOrderCustomAttributes — Pure Hilfsfunktion in src/lib/shopify/fulfillment.ts, die Shopify-Order customAttributes (bestehende Liste + Updates) sicher zusammenfuehrt: bestehende Keys ohne Update bleiben an ihrer Position, aktualisierte Keys werden ans Ende verschoben. TDD: 4 Tests (neue Keys anhaengen, Idempotenz, leere existing, Reihenfolge-Invarianz). Wird von pushMagnalisterReturnAttributes genutzt, um Shopifys orderUpdate-Semantik (ersetzt die gesamte customAttributes-Liste) zu erfuellen.
v1.42.0022026-04-09
  • PROJ-180 magnalister Otto Retoure-Bridge — Migration setzt bridge_m2e_cloud_enabled = true für alle bestehenden Shopify-Integrationen, damit Bestandsinstallationen ihr bisheriges Verhalten (Retoure als zweites Tracking) behalten. bridge_magnalister_enabled bleibt false und muss manuell aktiviert werden.
v1.41.003
  • Produktsuche: Bei Treffer auf Kindartikel (SKU/Barcode/EAN) wird der Kindartikel direkt angezeigt statt dem Parent zum Aufklappen
v1.41.0022026-04-09
  • PROJ-97 Shopify Metafeld-Mapping: „Metafelder von Shopify laden" lief auf 404, weil der nicht existierende REST-Endpoint metafield_definitions.json aufgerufen wurde. Umgestellt auf die GraphQL Admin API (metafieldDefinitions, ownerType: ORDER) — Definitionen werden jetzt wieder sauber geladen.
v1.41.0002026-04-09
  • PROJ-177 Amazon FBA-Bestand als echtes Flowkom-Lager — FBA-Pull schreibt jetzt stock-Rows im FBA-POOL des FBA-Warehouses (sync_amazon_fba_stock RPC + Reconciliation), Bewertung via supplier_products.purchase_price. Dadurch enthalten Lagerwert (PROJ-74) und Bestellvorschlag (PROJ-22) automatisch den FBA-Bestand. Read-only Warehouse + FBA-POOL Location via neuem create_system_locations Trigger-Branch, Backfill-Hook beim Mapping (Single + Bulk). Interim-Phase bis PROJ-178 mit Doppelzählungs-Warnung auf der Artikel-Detailseite.
v1.40.0022026-04-08
  • Profitbutler FBA-Kostennullung zurueckgerollt — kommt wieder wenn echte Amazon-Gebuehren (FBA-Fulfillment, Storage, Referral) ueber die Reports-/Finances-API abgeholt werden, damit der Gewinn sauber statt nur halb abgebildet wird
v1.40.0012026-04-08
  • PROJ-176 Profitbutler-Integration: Amazon FBA-Bestellungen werden automatisch mit 0 EUR Versand-, Verpackungs- und Pick&Pack-Kosten ausgewiesen, weil Amazon das Fulfillment uebernimmt. Order-Level Versandart hat Vorrang vor Produkt-Default.
v1.40.0002026-04-08
  • PROJ-176 Amazon FBA Auto-Versandart — alle FBA-Bestellungen bekommen automatisch die Versandart "Versand durch Amazon" (Carrier: Amazon). Bestehende FBA-Orders werden rueckwirkend getaggt, neue Workspaces bekommen die Versandart per Seed. Workflow-Regeln und Profitbutler koennen FBA jetzt sauber filtern.
v1.39.0012026-04-08
  • Amazon FBA: partielle Lieferadresse (PLZ+Stadt+Land ohne Strasse) wird jetzt trotzdem als customer_addresses-Eintrag gespeichert, damit der Kunde nicht leer wirkt wenn Amazon die Daten redigiert
  • Amazon Reports-API: 403 Unauthorized vom Shipments-Invoicing-Report wird jetzt als klare Handlungsanweisung geloggt (Tax Invoicing Role noch nicht approved)
v1.39.0002026-04-08
  • PROJ-175 Amazon FBA Kundendaten-Enrichment — volle Käufer-PII (Name, Straße, PLZ, Stadt) werden jetzt über den Shipments-Invoicing-Report (Reports-API) nachgeladen, wie es auch JTL macht. Ersetzt die von Amazon redigierten Orders-v0-Daten bei EU-FBA.
v1.38.0102026-04-09
  • Bundle-Artikel: Save-Button aktiviert sich jetzt direkt bei Änderungen im Bundle-Tab (Komponenten hinzufügen/entfernen/Menge ändern). Zuvor musste erst ein Feld in einem anderen Tab (z.B. Basis) geändert werden, damit der Artikel überhaupt speicherbar wurde, weil der Bundle-State außerhalb von react-hook-form lief und die Dirty-Erkennung ihn nicht berücksichtigt hat.
v1.38.0092026-04-08
  • Amazon FBA-Import: ausführliche Diagnose-Logs am Parent-PII-Call und beim Kunden-Upsert, damit klar wird welche Adressfelder Amazon bei EU-FBA tatsächlich freigibt
  • Amazon FBA-Kunden: degradierter Surrogate-Dedupe — wenn Amazon keine Straße rausgibt, wird pro Bestellung ein eigener Kunde mit Land+PLZ+Stadt angelegt statt alle im Gast-Bucket zu sammeln
v1.38.0082026-04-09
  • Picklist-Erstellung: One-Scan/Multi-Filter wird jetzt auch beim Anlegen der Pickliste angewendet. Zuvor filterte nur die Vorschau korrekt — die tatsächlich erstellte Pickliste enthielt alle Aufträge des Profils ohne Berücksichtigung des Bestelltyps.
v1.38.0072026-04-09
  • Picklist-Profil-Karten zeigen die konfigurierten Artikel-Tag-Filter jetzt direkt als Badges mit Tag-Name, Farbe und HAS_NOT-Kennzeichnung an (statt nur 'X Tag-Filter').
v1.38.0062026-04-08
  • Amazon FBA-Import: /address und /buyerInfo werden jetzt mit eigenem Sub-Path-RDT (ohne dataElements) und dem Pflicht-Parameter MarketplaceIds aufgerufen — vorher schlug der Fallback still fehl und FBA-Kunden landeten weiter im Gast-Fallback (verifiziert gegen offizielle SP-API Doku)
v1.38.0052026-04-08
  • Amazon FBA-Kunden: Lieferadresse und Käufername werden jetzt via dedizierte /address- und /buyerInfo-Sub-Endpoints nachgeladen, wenn das Order-Objekt sie nicht inline liefert — dadurch werden FBA-Kunden wie gewünscht mit voller Adresse angelegt statt im Gast-Fallback zu landen
v1.38.0042026-04-09
  • Picklisten-Profile: Artikel-Tag-Filter wird jetzt korrekt gespeichert und beim Bearbeiten wieder angezeigt. Zuvor strippte das Zod-Schema der POST/PUT-Routen das Feld `tag_filters` stillschweigend, sodass es nie in der DB landete und auch bei der Picklist-Erstellung nicht greifen konnte.
v1.38.0032026-04-08
  • Amazon Order-Import: Zahlstatus wird jetzt korrekt gesetzt (paid außer Pending/Canceled) statt generisch Unbezahlt
  • Amazon Order-Import: Verkaufskanal pro Marketplace erkannt (amazon_de/fr/it/es/nl/pl/se/be/uk/com/ca/mx)
  • Amazon Order-Import: Quelle zeigt Amazon-Badge mit Integrationsnamen statt Manuell
  • Amazon FBA-Bestellungen werden direkt als abgeschlossen importiert (FBM: shipped/open je OrderStatus)
  • Amazon FBA-Kunden: echter Kunde mit vollständiger Adresse wird angelegt (Surrogate-Dedupe über Name+PLZ+Straße) statt Fallback auf Amazon-Gastbestellungen
v1.38.0022026-04-09
  • PROJ-174: Fehlerzeilen-CSV-Download im Lagerbestand-Initialimport Dry-Run. Neuer Button im Strict-Mode-Banner lädt bei Fehlerzeilen eine CSV mit allen Originalspalten plus zusätzlicher 'Fehler'-Spalte herunter — so kann der Nutzer die problematischen Zeilen gezielt korrigieren und neu hochladen.
v1.38.0002026-04-08
  • PROJ-174: Lagerbestand-Initialimport (CSV) für JTL-Migration. Neuer Import-Target-Typ 'Lagerbestand — Initialbefüllung (JTL-Migration)' im Daten-Hub Import-Wizard. Akzeptiert JTL-Bestands-Export-CSVs mit Pflichtspalten Artikelnummer, Lagerplatz, Einzubuchende Menge (Header case-insensitive + Synonyme, DE-Dezimalkomma). Kein Mapping-Step — Spalten sind fix. Strict-Mode hart erzwungen: bei ≥1 Fehlerzeile (unbekannte SKU, unbekannter Lagerplatz, Bundle/Service-Artikel, ungültige Menge) wird der Import blockiert, User muss CSV korrigieren und neu hochladen. Bei grünem Dry-Run werden die Zeilen nach warehouse_id gruppiert und in Chunks à 200 Items atomar über die bestehende complete_goods_receipt-RPC (PROJ-6/PROJ-73) gebucht — Stock, Stock-Movements, Goods-Receipt-Header, FIFO-Layer und Landed-Cost-Integration bleiben automatisch konsistent. Mengen werden additiv pro Zeile verbucht. Job-Protokollierung in data_jobs, sichtbar im bestehenden Daten-Hub Job-Verlauf.
v1.37.0022026-04-08
  • Horizontales Seiten-Scrolling auf breiten Tabellen (v.a. Amazon-Angebote verwalten) behoben. SidebarInset bekam min-w-0, damit das Main-Panel unter seine Content-Breite schrumpfen darf und die interne overflow-auto-Wrapper-Div der shadcn-Table das horizontale Scrolling übernimmt, statt dass die ganze Seite mitscrollt.
v1.37.0002026-04-08
  • PROJ-172: Nächtlicher automatischer Amazon Listings Refresh. Neuer Cron-Endpoint /api/cron/amazon-listings-nightly-refresh iteriert seriell über alle aktiven Amazon-Integrationen (Opt-Out pro Integration via metadata.amazon.nightly_refresh_enabled) und treibt den PROJ-169-Listings-Sync-Worker komplett ohne HTTP-Loop zur Completion. Geschedulet extern wie die anderen Amazon-Crons (0 2 * * *, vor dem FBA-Inventory-Pull um 03:15). Time-Budget 20 Minuten pro Integration, per-Marketplace-Fehler-Isolation (ein fehlgeschlagener MP stoppt den Job nicht mehr). Neuer Settings-Toggle 'Nächtlicher Listings-Refresh' + 'Jetzt starten'-Testbutton pro Integration. Neuer Eintrag in der Cron-Jobs-Tab-Übersicht.
  • Der Listings-Sync-Worker aus PROJ-169 wurde nach src/lib/amazon/listings-worker.ts extrahiert (advanceListingsJob, buildInitialListingsDetails, runListingsRefreshLoop). Die bestehenden /refresh- und /process-Routen sind jetzt dünne Wrapper um diese Helpers — der Frontend-Poller funktioniert unverändert weiter. Zusätzlich Per-Marketplace-Fehler-Isolation: Fehler auf einem Marktplatz werden in details.per_marketplace[mp].error protokolliert, der nächste MP läuft trotzdem; Final-Status ist success (alle ok), partial (gemischt) oder error (alle failed).
v1.36.0042026-04-08
  • PROJ-167: Testing-Button 'Importierte löschen' pro Kanal (FBM und FBA) in den Amazon-Order-Import-Blöcken. Löscht alle importierten Bestellungen des gewählten Kanals inkl. abhängiger Tabellen und der dadurch verwaisten Amazon-Kunden dieser Integration. Nur für die Testphase gedacht, Confirm-Dialog mit 'nicht rückgängig'-Warnung, keine Safety-Checks (die saubere Version folgt über PROJ-173).
v1.36.0032026-04-08
  • PROJ-167: Amazon-Customer-Upsert schreibt Adressen jetzt in die separate customer_addresses-Tabelle (PROJ-145 Multi-Adressen-Modell), analog zum Shopify-Importer. Bisher lagen die Adressen nur in den Legacy-Discrete-Columns auf customers, wodurch der Adressen-Tab auf der Kundendetailseite leer blieb obwohl der Auftrag die Adresse enthielt. Bei Dedupe-Treffern wird die Adresse bei Bedarf ergänzt. Phone wird aus der Amazon-ShippingAddress mitübernommen.
v1.36.0022026-04-08
  • PROJ-171: Amazon FBA-Bestand wird in der Listings-Management-UI angezeigt — Spalte 'FBA-Bestand' default-sichtbar, Filter 'Bestand = 0' aktiv. DB-Trigger aggregiert amazon_fba_inventory → amazon_listings.quantity automatisch, stündlicher Cron und manueller Pull-Button bleiben unverändert.
v1.36.0012026-04-08
  • PROJ-167: Amazon-Import Sanity-Check behandelt jetzt beide VAT-Modi (VCS und Non-VCS). In Orders v0 ist ItemPrice beim Standard-Seller brutto (VAT-inclusive) und ItemTax informativ, beim VCS-enrolled Seller ist ItemPrice netto und ItemTax wird hinzuaddiert. Alter Code rechnete fest nach VCS-Formel und verursachte bei Non-VCS-Sellern 'sanity check failed'-Differenzen in Höhe des Tax-Anteils. Neuer Ansatz berechnet beide Modelle und akzeptiert das, das zu OrderTotal passt; Positionen werden entsprechend als Brutto-Einzelpreis gespeichert.
v1.36.0002026-04-08
  • PROJ-170: Amazon-Angebote verwalten — Neue Full-Page unter Integration → Amazon → 'Alle Angebote verwalten'. JTL-artige Multi-Select-Tabelle (shadcn/ui) mit Filterleiste (Marktplatz-Multi-Select, Fulfillment, Status, 'Nur nicht zugeordnet', Volltextsuche via Trigram-Indizes), Filter-Chips, URL-Deep-Links, serverseitiger Pagination (50/Page), sortierbaren Headers auf indizierten Spalten. Bulk-Aktionen: Zuordnen (mit Cross-Marketplace-Propagation), Zuordnung aufheben, Aus Sortiment entfernen (Soft-Delete). 'Alle N gefilterten auswählen'-Modus lädt IDs on-demand. Selektion überlebt Page-Wechsel, Confirm-Dialog bei Filter-Wechsel mit aktiver Auswahl. Konfigurierbare Spalten via ColumnPicker (localStorage pro User, Drag & Drop). CSV-Export der gefilterten Ansicht (Excel-DE, 50k Hard-Cap). Empty-States für leere Filter vs. kein Sync. HelpLink auf neue MDX-Doku. Wiederverwendbarer ProductPickerDialog aus AmazonMappingDialog extrahiert (src/components/products/product-picker-dialog.tsx). AmazonListingsBlock im Integration-Detail auf Kurz-Übersicht (5 jüngste Zeilen + Button) reduziert, alter Einzelzeilen-Dialog entfernt.
v1.35.009
  • PROJ-89: Produkt-Tags werden in der Produktübersicht wieder angezeigt und der Tag-Filter funktioniert. Die API filterte product_tags über eine nicht existierende workspace_id-Spalte, wodurch die Query leer zurückkam. Jetzt wird workspace-scoping über die geJOINte tags-Relation (tag.workspace_id) erzwungen.
v1.35.008
  • PROJ-167: PII-Daten (ShippingAddress + BuyerInfo) werden jetzt direkt über GET /orders/v0/orders/{id} mit RDT geladen statt über die Sub-Endpunkte /address und /buyerInfo. Der RDT ist strikt auf die in restrictedResources registrierten Pfade gescoped, der Parent-Pfad deckt die Sub-Endpunkte nicht automatisch ab — daher kam 'Access to requested resource is denied'. Die getOrder-Response enthält buyerInfo inklusive shippingAddress inline wenn der RDT mit entsprechenden dataElements erzeugt wurde (kanonischer SP-API-Workflow), spart zusätzlich zwei API-Calls pro Import.
v1.35.007
  • API orders-Endpoint: picked als gültigen Status-Filter zugelassen
v1.35.006
  • Kundenaufträge: Gepickt-Status im Filter ergänzt, Filter in Versandstatus umbenannt
v1.35.005
  • PROJ-167: Restricted Data Token wird jetzt dokumentations-konform nur auf dem Parent-Pfad /orders/v0/orders/{id} mit dataElements=['buyerInfo','shippingAddress'] angefragt. Das vorherige Muster registrierte dataElements auch auf /address und /buyerInfo — diese Sub-Endpunkte sind laut SP-API-Docs selbst PII-Endpunkte und akzeptieren keine dataElements. Amazon hat daraufhin die gesamte RDT-Anfrage mit 'Application does not have access to one or more requested data elements' abgelehnt.
v1.35.003
  • PROJ-167: Restricted Data Token wird jetzt mit Fallback ohne dataElements angefragt (wie v1-Snapshot PROJ-69); fixt 'Application does not have access to one or more requested data elements' beim selektiven Amazon-Import trotz aktiver Direktversand-Rolle — zusätzlich Parent-Path /orders/v0/orders/{id} in die Resources aufgenommen
v1.35.002
  • PROJ-167: Selektiver Amazon-Import zeigt jetzt den echten Skip-/Error-Grund im Toast (erster details.errors-Eintrag) statt 'erfolgreich importiert' zu melden, wenn tatsächlich 0 Orders durchgekommen sind — plus Server-Logging der SP-API Request/Response-Meta für Coolify-Diagnose
  • PROJ-173: Spec angelegt — Amazon-Order Import rückgängig machen (Delete-Endpoint + UI-Button in Auftragsdetail & Preview-Dialog, Safety-Checks gegen Pickliste/Versand/Belege, Hard-Delete via RPC)
v1.35.001
  • PROJ-170: Feature-Index auf 'In Progress' gesetzt
v1.35.000
  • PROJ-170: Backend-Fundament für das JTL-Style Amazon Listings-Management — Trigram-Indizes für Volltextsuche (Titel, SKU, ASIN), erweiterter List-Endpoint mit Multi-Marketplace-/Fulfillment-/Status-/Unmapped-/Sort-Filtern, drei Bulk-Endpoints (Zuordnen mit Cross-MP-Vererbung, Zuordnung aufheben, Aus-Sortiment-entfernen als Soft-Delete via status='inactive') und CSV-Export (Excel-DE, BOM, Semikolon) — UI folgt in Session 2
v1.34.005
  • PROJ-167: Selektiver Amazon-Import nutzt jetzt die korrekte SP-API-Syntax für AmazonOrderIds (komma-separiert statt MWS-Legacy AmazonOrderIds.Id.N); Amazon hatte den Parameter zuvor ignoriert und 'CreatedAfter or LastUpdatedAfter must be specified' zurückgegeben
v1.34.003
  • PROJ-170/171/172: Specs angelegt — Amazon Listings-Management-UI (JTL-Style Multi-Select Tabelle), FBA Inventory Pull (SP-API getInventorySummaries + pg_cron), Nightly Listings Full-Refresh via pg_cron (Job-Driver ohne HTTP-Loop)
v1.34.002
  • PROJ-169: Amazon-Artikel-Liste zeigt jetzt die gesynten Angebote (GET-Endpoint liefert { listings, total } statt { data, count }, Produkt-Join eingebaut)
v1.34.001
  • PROJ-167: Amazon-Import-Vorschau zeigt jetzt den echten Fehler aus results[].error an statt der generischen Meldung 'Import fehlgeschlagen.'
v1.34.000
  • PROJ-169: Amazon Listings-Sync als Background-Job mit Multi-Marketplace-Support, Live-Progress-Bar, JTL-Wawi-Modell (N:1 Mapping, FBA/FBM-Suffix Auto-Match, Cross-MP Mapping-Propagation), server-seitiger withStatus=BUYABLE Filter, inkrementeller Default-Sync, Abbrechen-Funktion
v1.33.0022026-04-08
  • PROJ-167: Status auf Deployed gesetzt (INDEX.md + Spec-Header).
v1.33.0012026-04-08
  • PROJ-168 LB-Detail-Rework — Lieferantenbestellungs-Detail als Fullscreen-Overlay (ersetzt alten Modal-Dialog). Cursor-Bug im EK-Preis-Input behoben (lokaler State + onBlur-Commit + React.memo PositionRow → keine Sibling-Re-Renders mehr). Multi-Select-Artikelpicker mit Live-Suche (Name/SKU/EAN/Lief.-Art.-Nr), Mengen-Eingabe pro Zeile und Footer-Live-Summe ersetzt den One-by-One-Flow. LB-Nummer inline editierbar mit debouncetem Live-Unique-Check (300 ms). Status-Badges klickbar mit Folge-Status-Dropdown. Kontext-Primäraktion (Einreichen / Genehmigen / Wareneingang buchen) und Mehr-Menü (Duplizieren / PDF / E-Mail / Stornieren / Löschen) im Header. 6 Tabs mit Lucide-Icons (Details, Positionen, Zahlungen, Wareneingänge, Dokumente, Verlauf). Sidebar-Cards (Lieferant, Summen, Zahlung) und Meta-Grid (Erstellt/Lieferdatum/Lager/Währung). Status-History-Timeline portiert. Neue stabile-ID API-Endpoints (POST /items, PATCH /items/[itemId], DELETE /items/[itemId], PATCH /[id] mit po_number-Rename) ersetzen den alten delete+reinsert-PUT und bewahren goods_receipt-FKs. 23 neue API-Tests, 343/343 Gesamt grün, 0 Lint-Errors.
v1.33.0002026-04-08
  • PROJ-167 Amazon Bestellungs-Filter & Import-Vorschau — Getrennt konfigurierbare Filter pro Kanal (FBM: Bestellstatus, Zahlungsstatus, Versandstatus, Synchronisierungszeitraum; FBA: ohne Versandstatus), neuer 'Bestellungen laden'-Dialog mit Mehrfachauswahl für selektiven Import, 'Jetzt synchronisieren' respektiert die Filter. Neuer GET /amazon/orders/preview Endpoint mit 250er Cap und already_imported-Lookup. importOrders erweitert um amazonOrderIds + filters. Kaputte FBM/FBA-Import-Buttons aus AmazonManualActionsBlock entfernt (Fix nebenbei).
v1.32.013
  • PROJ-166: Amazon Listing-Status (BUYABLE/INCOMPLETE/...) korrekt auf DB-Enum active|inactive|incomplete gemappt; echte DB-Fehler landen jetzt im Sync-Log statt [object Object]
v1.32.012
  • PROJ-166: Fehlende order-filters.ts committed — Deploy-Build (Turbopack Module not found) repariert
v1.32.010
  • PROJ-166: Amazon Listings-Aktualisierung — Marketplace-ID als seller_id wird abgelehnt, irreführender InvalidInput-Workaround entfernt
v1.32.0002026-04-08
  • PROJ-166 Amazon Integration Rebuild — FBM/FBA Order-Import, Listings-Sync mit SKU-Automap und manueller Zuordnung, FBM-Bestandspush via Dirty-Queue + Safety-Sync, FBA-Bestand-Pull, Versandbestätigung mit Carrier-Mapping + Overrides, Multi-Region (EU/NA), Multi-Marketplace. Inklusive neuer Tabellen (amazon_listings, amazon_inventory_dirty_queue, amazon_fba_inventory, amazon_sync_log), LWA-Token-Refresh + RDT, Advisory Locks pro (Integration, Job-Type), komplette Cron-Suite (FBM/FBA-Import, Inventory-Flush, Safety-Sync, FBA-Pull, Shipment-Confirmation), Credentials-Verschluesselung, Problems-API, Lifecycle-Service (Enable/Disable mit Stock-Safety-Check), neue UI-Sektion im Integrationen-Hub (Connection, Marketplaces, Toggles, Listings, Problems, Carrier-Overrides, Manual-Actions) und Burst-Test fuer die Dirty-Queue-Deduplication.
v1.30.0032026-04-08
  • PROJ-165: Orphan public/channels/amazon.svg und lokales docs/amazon-SDK-Dump (115MB) entfernt.
v1.30.0012026-04-08
  • PROJ-165: Status auf In Review.
v1.30.0002026-04-08
  • PROJ-165 Amazon Nuke & Pave: Amazon v1-Reste und komplettes v2 wurden restlos entfernt. Drop-Migration entfernt alle Amazon-Tabellen (amazon_carrier_mappings, amazon_shipment_retry_queue, amazon_failed_operations, amazon_v1_failed_operations_deprecated, amazon_v2_circuit_state, fba_inventory, fba_inventory_snapshots), die Spalte orders.amazon_fulfillment_confirmed_at, alle Amazon-Integrationen, FBA-Virtual-Warehouses und Amazon sync_log-Eintraege. integrations.type und integration_sync_logs.sync_type CHECKs werden ohne Amazon-Werte neu gesetzt. BREAKING CHANGE — Produktions-Deployment erfordert Backup und Pruefung offener Eintraege in amazon_v1_failed_operations_deprecated.
v1.29.0272026-04-08
  • PROJ-165: Amazon-Env-Variablen (AMAZON_SP_*, AMAZON_V2_*), vitest.sandbox.config.ts, test:sandbox Script und @sp-api-sdk/*-Dependencies entfernt. Letzte Amazon-Referenzen aus channel-config, workflow-form-dialog, warehouse-table (FBA-Virtual-Logik) und freescout-marketplace-urls geloescht.
v1.29.0262026-04-08
  • PROJ-165: Subagent-getriebener Cleanup von 29 shared Modulen — Amazon-Zweige aus Integration-Registry, Order-/Shipping-Table, Cron-Trigger, Disconnect, Sync-Routes, Validations, Cron-Jobs-Seite und weiteren Dateien entfernt. Drei komplett amazon-spezifische Dateien geloescht (amazon-order-preview-dialog, products/fba-inventory/route, products/fbm-inventory-sync/route).
v1.29.0252026-04-08
  • PROJ-165: src/lib/amazon-v2/ komplett geloescht (Services, Auth, Reliability, Status, Mappers, Tests). Alle Amazon-API-Routes, Cron-Jobs (amazon-v2-order-sync, amazon-v2-inventory-sync, amazon-v2-shipment-confirmation), FBA-Inventory-Page, AmazonIntegrationDetail- und amazon-v2-status-card-Komponenten entfernt — 106 Dateien insgesamt.
v1.29.0242026-04-08
  • PROJ-165: v1 Amazon-Snapshot (57 Dateien) aus Git-Commit 7e128e0 nach features/amazon-rebuild-reference/v1-snapshot/ gesichert als Read-only-Referenz fuer den spaeteren Rebuild. PROJ-151..164 Feature-Specs entfernt.
v1.29.0232026-04-08
  • PROJ-165: Amazon Nuke & Pave spec angelegt — v1-Reste + v2 werden komplett entfernt, v1-Code wird als Read-only-Referenz aus Git-Commit 7e128e0 gesichert, Rebuild folgt in separatem Ticket.
v1.29.0222026-04-08
  • PROJ-164: Amazon v2 FBA-Bestand UI & Steuerung — schliesst die UI-Luecke aus PROJ-157 (Backend lief, war aber unsichtbar/unsteuerbar). Neue Card 'FBA-Bestandssync' im Integration-Detail mit Auto-Sync-Toggle, letztem Lauf, Snapshot-Counter, Status-Badge, Jetzt-synchronisieren-Button und Link zur Detail-Seite. Neue GET/POST-Routes unter /api/integrations/[id]/amazon/fba/. Waisenseite fba-inventory/page.tsx an v2-Schema angepasst (reserved_total/unfulfillable_total) inkl. Back-Link und korrektem Empty-State.
v1.29.0212026-04-08
  • PROJ-164: Spec fuer Amazon v2 FBA-Bestand UI — beschreibt die Schliessung der UI-Luecke aus PROJ-157 (Backend lief, UI halbfertig: Waisenseite, fehlende Read-API, keine Section im Detail-View). Reine Frontend/API-Arbeit, null Backend-Aenderungen.
v1.29.0202026-04-08
  • PROJ-163: temporaeres LWA-Diagnostic-Logging aus v1.29.019 wieder entfernt. Root-Cause des 403 war ein Region-Mismatch (NA-Seller, EU-Endpoint) — Amazon antwortet bei falscher Region mit demselben generischen Body wie bei fehlender Sellers-Rolle, was die Diagnose in die Irre fuehrte.
v1.29.0192026-04-08
  • PROJ-163: temporaeres LWA-Diagnostic-Logging in self-authorize-service.ts, das den LWA-Token-Exchange mitloggt (Status, scope-Feld, token_type, expires_in, error) plus erste/letzte Zeichen von client_id/refresh_token — PII-sicher, keine vollstaendigen Tokens. In v1.29.020 wieder entfernt.
v1.29.0182026-04-08
  • PROJ-163: Expliziten Flowkom-User-Agent in allen v2-SDK-Client-Factories setzen (sdk-client, connection-service, orders-client, inventory-client, feeds-client, rdt-helper). sdk-client.ts war der einzige Pfad ohne userAgent und wird vom Self-Authorize-Flow genutzt — Amazon SP-API lehnte diese Requests mit 403 + generischem 'Access to requested resource is denied' ab (identisch zum PROJ-151-Befund im alten v1-Stack). Gemeinsame Konstante AMAZON_V2_USER_AGENT im v1-Format.
v1.29.016
  • PROJ-122: Spreadsheet-Bulk-Edit kann jetzt EK-Preis pro Lieferant und Standard-Lieferant setzen — neue Spalten 'Einkaufspreis (Lieferant)' und 'Standard-Lieferant', Validierung verlangt Lieferanten in Scope, beim Setzen von Standard-Lieferant wird der bisherige automatisch entmarkiert. Vorbefuellung der Zellen ueber neuen Endpoint /api/supplier-products/preferred-batch.
v1.29.013
  • PROJ-163 Commit 4: docs/amazon-v2/self-authorize-guide.md angelegt — vollstaendiger Setup-Guide mit Voraussetzungen (Developer-Console-Rollen), Token-Erzeugung in Seller Central, Token-Eingabe in Flowkom, Fehler-Diagnose fuer missing_seller_role/invalid_refresh_token, Reauth-Pfad, Sicherheits-Hinweise. production-app-setup.md mit PROJ-163-Banner versehen.
v1.29.012
  • PROJ-163 Commit 3: OAuth-Routen /api/integrations/amazon-v2/oauth/authorize und /callback liefern jetzt 410 Gone und verweisen auf den Self-Authorize-Endpoint. Code lebt in der Git-History; bei zukuenftigem Multi-Tenant-Bedarf ist ein Revert auf v1.29.009 der schnellste Weg zurueck. -449 LoC dead OAuth code. PROJ-163 in features/INDEX.md eingetragen.
v1.29.011
  • PROJ-163 Commit 2: Amazon-Setup-UI auf Self-Authorize-Card umgestellt. Neue Card mit Region-Select + Refresh-Token-Textarea + 'Speichern & testen'-Button. Inline-Ergebnis: Success-Alert mit Marketplace-Liste oder Error-Alert mit kind, http_status, message und togglable Rohdaten-Viewer des Amazon-Bodys. Gerendert bei isSetup/isInactive/isError sowie via 'Token ersetzen'-Toggle im active-State. Error-Banner 'Neu verbinden' scrollt jetzt zur Self-Authorize-Card. OAuth-Query-Param-Reader + oauthCallbackResult-State + handleConnectViaOAuth entfernt. 3-Schritte-Anleitung verweist auf self-authorize-guide.md.
v1.29.010
  • PROJ-163 Commit 1: Amazon v2 Self-Authorize-Service + POST /api/integrations/amazon-v2/self-authorize. Nimmt einen manuell aus Seller Central kopierten Refresh-Token entgegen, verschluesselt ihn, legt die Integration an (oder updated eine bestehende) und macht einen Soft-Probe-Call gegen getMarketplaceParticipations. Token wird IMMER persistiert (auch bei Probe-Fehler), Probe-Ergebnis landet im probe-Feld der JSON-Response. Reauth-Pfad mit Cross-Workspace-Check. 5 Unit-Tests (Happy Path, missing_seller_role, Reauth, Cross-Workspace, Token-Laenge).
v1.29.009
  • PROJ-162 Diagnostik: Roher Amazon-Response-Body wird jetzt im last_error-Feld und im Server-Log erfasst, sodass Probe-Fehler (z.B. missing_seller_role) ohne erneuten OAuth-Flow analysiert werden koennen.
v1.29.008
  • PROJ-162 Architektur-Fix: Phantom-Authorization beheben. Wenn der Marketplace-Probe-Call nach erfolgreichem Token-Tausch fehlschlug, wurde der Token bisher weggeworfen — Amazon Seller Central markierte die App aber als autorisiert. Flowkom-UI blieb im Setup-Status ohne Erklaerung. Neuer Flow: Token wird IMMER persistiert, Probe ist Soft-Operation, Status wird je nach Probe-Result auf active oder error gesetzt, last_error traegt die konkrete Amazon-Fehlermeldung. App-Rollen koennen jetzt gefixt werden, ohne OAuth-Flow erneut zu durchlaufen — der naechste Verbindung-testen-Klick reicht.
v1.29.007
  • PROJ-162 Diagnostik: persistente Diagnose-Box in der Amazon-Connect-Card zeigt das Result des letzten OAuth-Callback-Versuchs (success/error + kind) dauerhaft an, sodass Fehlermeldungen nicht mehr durch verschwindende Toasts verloren gehen. Bei Erfolg zusaetzlich Hinweis auf manuellen Reload, falls die clientseitige Aktualisierung haengt.
v1.29.006
  • PROJ-162 Hotfix: Setup-Karteileiche wurde nach erfolgreichem OAuth-Consent nicht in eine aktive Integration umgewandelt — stattdessen legte der Callback jedes Mal eine neue Integration an. Ursache: handleConnectViaOAuth setzte integration_id nur bei reauth=true, was bei isSetup nie der Fall war. Fix: integration_id wird grundsaetzlich mitgegeben, da die Komponente ohnehin nur im Kontext einer existierenden Integration gerendert wird. Setup-/Reauth-/Error-Pfade greifen jetzt alle auf den existing_integration_id-Merge-Pfad im Callback zu.
v1.29.005
  • PROJ-162 Hotfix: Zwei Probleme nach erstem erfolgreichen OAuth-Consent: (1) Reverse-Proxy-Origin — nach Amazon-Consent landete der User auf 0.0.0.0:3000/dashboard/... statt app.flowkom.de. callback/route.ts las den Origin aus request.url, was hinter Coolifys Reverse-Proxy die interne URL ist. Neuer Helper getPublicOrigin() extrahiert die Origin jetzt aus AMAZON_SP_V2_OAUTH_REDIRECT_URL. (2) Force-Delete fuer Setup-Karteileichen: AmazonIntegrationDetail.tsx Komplett-Loeschen-Button rendert jetzt auch bei isSetup, sodass leere Setup-Integrationen aus fehlgeschlagenen OAuth-Versuchen entfernt werden koennen.
v1.29.004
  • PROJ-162 Hotfix: Amazon-Consent warf Fehlercode MD1000 'Application not found', weil der Production-OAuth-Flow Draft-Apps ohne version=beta-Parameter nicht findet. Ursache: PROJ-154/162 hatten version=beta faelschlich an useSandbox gekoppelt. Korrektur entkoppelt App-Lifecycle-State vom Sandbox-/Production-Endpoint-Flag — neue Env AMAZON_SP_APP_DRAFT_MODE (Default true) steuert version=beta unabhaengig. Eine Draft-App kann jetzt sauber gegen Production-Endpoints OAuth-en. Setup-Guide-Troubleshooting fuer MD1000 ergaenzt. 5 neue Unit-Tests, 352 Tests gruen.
v1.29.003
  • PROJ-162 Commit 2/3: Amazon-Setup-UI auf OAuth-Connect-Card umgestellt. Beim Hinzufuegen einer neuen Amazon-Integration erscheint jetzt eine Region-Auswahl (EU/NA/FE) + Button 'Mit Amazon verbinden', der per Browser-Redirect den OAuth-Flow zu Amazon Seller Central startet. Reauth-Pfade: 'Verbindung erneuern' im Action-Bar bei aktiver Integration, 'Neu verbinden' im Error-Banner bei gestoerter Verbindung. Toast-Handling beim Mount fuer ?amazon_v2_oauth=success|error&kind=...-Redirects. Dead-Code-Abbau: refresh_token-State, marketplace-Dropdown, handleSaveAndTest und die komplette Refresh-Token-Eingabe-Form (postete auf eine in PROJ-161 geloeschte v1-Route) ersatzlos entfernt. -187 / +136 LoC.
v1.29.002
  • PROJ-162 Commit 1: Amazon v2 Config-Helper (src/lib/amazon-v2/config.ts) zentralisiert die in PROJ-161 ausgesparte Sandbox-zu-Production-Umstellung. Alle 9 USE_SANDBOX=true-Hardcodes (5 Service-Clients + lwa-client + 2 OAuth-Routes) lesen jetzt das AMAZON_SP_SANDBOX-Flag, je nach Wert AMAZON_SP_*- oder AMAZON_SP_SANDBOX_*-Variablen. Neue Env AMAZON_SP_APPLICATION_ID. vitest.sandbox.config.ts erzwingt Sandbox-Mode. Setup-Guide unter docs/amazon-v2/production-app-setup.md. 8 neue Unit-Tests, alle 347 bestehenden Tests gruen.
v1.29.001
  • PROJ-161 Phase 8 Deployed marker — PROJ-152 Amazon Greenfield-Rewrite vollstaendig abgeschlossen
v1.29.000
  • PROJ-161 Phase 8 Amazon v1 vollstaendig entfernt — Greenfield-Cutover auf v2 abgeschlossen. 18215 Zeilen v1-Code (lib/amazon, 13 Routen, 9 Cron-Routes, UI-Komponenten) geloescht. Migration: amazon_failed_operations → amazon_v1_failed_operations_deprecated (defensiv umbenannt statt gedroppt). BREAKING: kein Rollback auf v1 mehr moeglich.
v1.28.065
  • PROJ-161 Phase 8 v1-UI-Bloecke hinter v2Active-Flag ausgeblendet (Settings-Tabs, OpenIssues) — v2-Connections sehen nur noch das Status-Dashboard
v1.28.064
  • PROJ-161 Phase 8 Cron-Skip + v1-Routen 410: alle 13 v1-Amazon-Routen liefern 410 Gone, alle 9 v1-Cron-Routes ueberspringen v2-aktivierte Integrationen (geteilter Handler + 2 custom Crons + DLQ-Retry)
v1.28.063
  • PROJ-161 Phase 8 Cutover-Tooling: Admin-Routen /amazon-v2/enable und /amazon-v2/disable plus Cutover-Button im Detail-View (Confirm-Dialog, Reload nach Erfolg)
v1.28.062
  • PROJ-161 isV2EnabledFor liest jetzt korrekt settings.amazon_v2.v2_enabled (nested) — vorheriger flacher Pfad hat alle v2-Route-Gates faktisch deaktiviert
v1.28.061
  • PROJ-161 Phase 8 Spec — Amazon v1 Cutover & Delete (Plan: Per-Integration-Cutover, 410-Gone, Cron-Skip, UI-Flag, finaler v1-Delete mit Hard-Gate)
v1.28.060
  • PROJ-160 Phase 7 Deployed — Amazon v2 Status-Dashboard live (Read-only Dashboard pro v2-Connection mit Letzter Lauf, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
v1.28.059
  • PROJ-160: Manueller Trigger POST /api/integrations/[id]/amazon-v2/trigger (admin-only, isV2EnabledFor-Gate, Dispatch auf runOrderImport/runInventorySync/runShipmentConfirmation, respektiert Service-Soft-Lock, 3 Wire-In-Tests)
v1.28.058
  • PROJ-160: Amazon v2 Status-Dashboard UI (3 Karten pro Operation mit letztem Lauf, Circuit-Breaker-Badge, nächstem geplanten Lauf; eingehängt in AmazonIntegrationDetail, shadcn Card/Badge/Button/Tooltip/Skeleton)
v1.28.057
  • PROJ-160: Status-Aggregator + GET /api/integrations/[id]/amazon-v2/status (liest sync-logs, circuit-state, schedule-JSON; DI-Storage; 3 Unit-Tests)
v1.28.056
  • PROJ-160 Phase 7 Kickoff — Amazon v2 Status-Dashboard Spec (Read-only Dashboard pro v2-Connection mit Karte je Operation, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
v1.28.055
  • PROJ-159 Phase 6 Deployed — Amazon v2 Circuit-Breaker & Smart-Intervals (Status auf Deployed gesetzt)
v1.28.054
  • PROJ-159: Circuit-Breaker + Smart-Interval in alle drei v2-Cron-Routes (order-sync, inventory-sync, shipment-confirmation) verdrahtet, schedule-Persistenz in integrations.settings.amazon_v2.schedule, 3 Wire-In-Tests
v1.28.053
  • PROJ-159: CircuitBreaker + Smart-Interval Helper unter src/lib/amazon-v2/reliability/ inkl. 11 Unit-Tests (state-transitions, half-open, isolation, smart-interval-Heuristik)
v1.28.052
  • PROJ-159: Migration amazon_v2_circuit_state (Tabelle, RLS, partieller Index WHERE state=open)
v1.28.051
  • PROJ-159 Phase 6 Spec — Amazon v2 Circuit-Breaker & Smart-Intervals (Planned)
v1.28.050
  • FreeScout-Widget: Konversationsnummer wird nicht mehr fälschlich als Bestellnummer interpretiert (Subject-Quellen eingegrenzt, order_notes-Fallback mit Wortgrenzen + Mindestlänge gehärtet)
v1.28.049
  • PROJ-158 Phase 5 Deployed — Amazon v2 Shipment Confirmation komplett (Migration, FeedsClient, Carrier-Mapping-v2 DB-Reader, Strategy + Service, v1-Guard, Cron-Route, 5 Unit-Tests, Sandbox-Smoke)
v1.28.048
  • PROJ-158 Phase 5 — Cron-Route /api/cron/amazon-v2-shipment-confirmation (Feature-Flag-Gate, Soft-Lock-respektierend, sequentielle Iteration aller v2-Integrationen)
  • PROJ-158 — 5 Unit-Tests fuer runShipmentConfirmation (Strategy-DI, Auth-Abort, Per-Order-Fehler-Isolation, Idempotency, Soft-Lock) + Sandbox-Smoke fuer Feeds-API getFeeds
v1.28.047
  • Billkom: Rechnungsadresse erscheint wieder auf PDF-Rechnungen und ZUGFeRD-Export liefert wieder PLZ/Ländercode (Auflösung über Order-Snapshot > customer_addresses > Legacy, inkl. Auto-Repair bereits finalisierter Belege beim Download)
v1.28.046
  • PROJ-158 Commit 3 — ShipmentConfirmationStrategy-Interface, FeedsXmlConfirmShipmentStrategy (Default), ShipmentConfirmationService (DI-Orchestrator: Soft-Lock, Pending-Order-Selektion, Carrier-Mapping-Resolution, Strategy-Aufruf, amazon_fulfillment_confirmed_at-Update, DLQ-Insert pro Order-Fehler), Feature-Flag-Helper listV2ShipmentConfirmationEnabledIntegrations, dlq-Operationtype 'shipment_confirmation' ergänzt. 64/64 Tests grün.
v1.28.045
  • FreeScout-Widget: Flowkom-Button öffnet jetzt die Auftragsdetailseite statt der Kundenaufträge-Übersicht
v1.28.043
  • PROJ-158 Commit 2 — FeedsClient (5-Schritt-Pipeline um @sp-api-sdk/feeds-api-2021-06-30), build-fulfillment-feed-xml (POST_ORDER_FULFILLMENT_DATA), parse-feed-result-report, carrier-mapping-v2 (DB-Reader auf bestehende Tabelle amazon_carrier_mappings, kein statischer Port), v1-Guard als Top-of-function-Check in triggerAmazonShipmentConfirmation (einziger Touch in src/lib/amazon/), 3 Unit-Tests (64/64 grün). Spec aktualisiert: Carrier-Mapping als DB-Reader und v1-Guard als ein File-Touch dokumentiert.
v1.28.042
  • PROJ-158 Commit 1 — Migration orders.amazon_fulfillment_confirmed_at TIMESTAMPTZ + partieller Index (workspace_id, shipped_at) WHERE external_source=amazon AND shipped_at NOT NULL AND amazon_fulfillment_confirmed_at NULL. v2-isolierter Shipment-Confirmation-Marker, parallel zu v1.
v1.28.041
  • PROJ-158 Phase 5 kickoff — Spec für Amazon v2 Shipment Confirmation angelegt. Feeds-API-first Architektur (POST_ORDER_FULFILLMENT_DATA via @sp-api-sdk/feeds-api-2021-06-30), weil orders-api-2026-01-01 read-only ist. Neue Spalte orders.amazon_fulfillment_confirmed_at, Carrier-Mapping-v2-Port, 5-Commit-Plan, Test-Plan (5 Unit + 1 Smoke). SDK bereits installiert.
v1.28.040
  • PROJ-157 Phase 4 abgeschlossen — Amazon v2 Inventory Sync Deployed. FBM-Push via Listings PATCH + FBA-Pull via getInventorySummaries laufen kombiniert in einer Cron-Route, v2-isolierte Snapshots-Tabelle, Hybrid-Strategy mit Feeds-API-Stub (PROJ-157.5 Future Work), v1-Cron-Routes per Flag gegated. 55/55 Amazon-v2-Tests gruen, Spec synchron mit der finalen Architektur.
v1.28.039
  • PROJ-157 (Commit 4): Amazon v2 InventorySyncService-Orchestrator — FBM-Push + FBA-Pull sequentiell in einem Lauf, Soft-Lock via integration_sync_logs Sentinel (15min Cutoff), kombinierter sync_type='amazon_v2_inventory_sync', DI-Pattern mit InventorySyncDeps, Strategy-Selection ueber settings.amazon_v2.inventory_push_mode. Neue Cron-Route amazon-v2-inventory-sync mit Cron-Secret-Auth. 5 Unit-Tests (Strategy-DI-Wiring, FBM-Push-Errorhandling inkl. 401-Abort, FBA-Mapper aggregiert/leer/ohne-SKU, FBA-Pagination, FBA-Idempotency) + 1 Sandbox-Smoke (read-only getListingsItem mit Skip-Verhalten).
v1.28.038
  • PROJ-157 (Commit 3): Amazon v2 FBM-Push Strategien (Listings PATCH default, Feeds API stub mit PROJ-157.5 TODO), FBM-Push-Service (Queue-Read, Mapping-Lookup, Stock-Calc, Per-SKU-Push, DLQ, Queue-Cleanup), FBA-Pull-Service mit Pagination + Batch-Upsert + DLQ, fba-inventory-mapper mit aggregiertem reserved_total/unfulfillable_total, v2-Stock-Calc Port (PROJ-55-Semantik isoliert von v1), DLQ um inventory_push und fba_inventory_pull operation_types erweitert.
v1.28.037
  • PROJ-157 (Commit 2): Amazon v2 InventoryClient — kombinierter Wrapper um Listings (patchListingsItem) und FBA Inventory (getInventorySummaries paginiert) SDKs, gemeinsame Auth-Instanz, 100-Pages-Hardcap, AmazonV2AuthError-Mapping. v1-Cron-Routes (amazon-inventory-sync, amazon-fba-inventory-sync) bekommen negativen Filter auf settings.amazon_v2.inventory_sync_enabled. Spec mit den finalen Design-Entscheidungen synchronisiert.
v1.28.036
  • PROJ-157 (Commit 1): Migration fba_inventory_snapshots — neue v2-isolierte Tabelle mit seller_sku Unique, raw_details JSONB, snapshot_run_id Tracking, workspace-scoped RLS. v1 public.fba_inventory bleibt unveraendert.
v1.28.035
  • PROJ-157 (Commit 0): Amazon v2 Inventory-Sync Spec (Phase 4) — FBM-Push via patchListingsItem, FBA-Pull via getInventorySummaries, neue v2-isolierte Tabelle fba_inventory_snapshots, InventoryPushStrategy mit FeedsStrategy-Stub (PROJ-157.5 als Future Work)
v1.28.034
  • PROJ-157 (0a): npm-Deps für Listings & FBA Inventory hinzugefügt (@sp-api-sdk/listings-items-api-2021-08-01, @sp-api-sdk/fba-inventory-api-v1)
v1.28.033
  • PROJ-156 Phase 3 abgeschlossen — Amazon v2 Order Sync Deployed: Spec auf Status 'Deployed' gesetzt, alle Akzeptanzkriterien abgehakt, features/INDEX.md aktualisiert (PROJ-156 Deployed, Next Available ID = PROJ-158). Phase 3 ist das Herzstueck des Greenfield-Rewrites (PROJ-152) und liefert damit den ersten produktiv lauffaehigen End-to-End-Pfad der v2-Integration (OAuth → Connection-Health → Order-Sync mit DLQ), komplett parallel zu v1 und ueber settings.amazon_v2.v2_enabled gegatet.
v1.28.032
  • PROJ-156: OrderImportService + Cron-Route + 4 Unit-Tests + Sandbox-Smoke fuer Amazon v2 — runOrderImport orchestriert FBM+FBA sequentiell gegen dasselbe Rate-Limit-Budget, iteriert per Async-Iterator ueber searchOrdersPaged, holt pro Order einen frischen RDT, ruft getOrder mit BUYER/RECIPIENT/PROCEEDS/FULFILLMENT/PACKAGES-IncludedData, mapped via mapOrderToWmsRow und schreibt via batchUpsertOrders. Fehler-Klassifikation: 401/403 abort, 4xx/5xx pro Order in die DLQ mit version='v2'. Soft-Lock ueber integration_sync_logs Sentinel-Row statt Advisory-Lock (Begruendung in der Migration dokumentiert). Cron-Route /api/cron/amazon-v2-order-sync mit Cron-Secret-Auth iteriert ueber listV2EnabledIntegrations() sequentiell. 4 Unit-Tests (Strategy-Selection, Pagination, Idempotency, DLQ mit PII-Check) alle gruen, plus 1 Sandbox-Smoke der direkt den OrdersApiClient baut. Migration 20260407100001 erlaubt zusaetzlich sync_type='amazon_v2_order_import'. Gesamte Vitest-Suite gruen (15 Files, 42 Tests).
v1.28.031
  • PROJ-156: Order-Mapper + Batch-Upsert + DLQ-Wrapper fuer Amazon v2 — mapOrderToWmsRow ist pure function und mapped @sp-api-sdk/orders-api-2026-01-01 Order auf V2OrderDraft (Status via mapAmazonV2StatusToWms, Betrag aus proceeds.grandTotal in Cents, metadata.amazon_v2.raw_items als sanitized Line-Item-Snapshot OHNE PII, buyer_present/recipient_present nur als Boolean-Flags). batchUpsertOrders macht manuelles Insert/Update-Split via Pre-Query auf idx_orders_unique_external_order, generiert neue order_numbers via generate_wms_order_number-RPC nur fuer echte Inserts und erhaelt bestehende ids bei Updates. DLQ-Wrapper schreibt hart version='v2' mit Exponential-Backoff (5min * 2^(attempt-1), max 4h).
v1.28.030
  • PROJ-156: OrdersClient + RdtHelper fuer Amazon v2 — duenner Wrapper um @sp-api-sdk/orders-api-2026-01-01 und @sp-api-sdk/tokens-api-2021-03-01. searchOrdersPaged ist Async-Iterator mit 50-Pages-Hard-Cap, getOrder forwarded den RDT via x-amz-access-token-Header. RdtHelper baut RDTs pro Order auf Pfad /orders/2026-01-01/orders/{orderId}, mit lowercase Tokens-API dataElements und No-DataElements-Fallback bei fehlenden App-Rollen. Beide nutzen die memoized Auth-Instanz aus auth-instance-cache.ts. Keine DB-Zugriffe, keine PII in Logs.
v1.28.029
  • Retoure-Badge in der Kundenaufträge-Übersicht (Status-Spalte) sobald ein Retourenlabel existiert
v1.28.028
  • PROJ-156: Order-Status-Mapper fuer Amazon v2 (mapAmazonV2StatusToWms) — pure function, mapped die UPPERCASE-Enum-Werte aus @sp-api-sdk/orders-api-2026-01-01 (PENDING/UNSHIPPED/PARTIALLY_SHIPPED/SHIPPED/CANCELLED/UNFULFILLABLE/PENDING_AVAILABILITY) auf WMS-Status (open/in_progress/shipped/cancelled), fail-safe 'open' fuer unbekannte Werte mit Warn-Log ohne PII. Inkl. 4 Unit-Tests (alle gruen).
v1.28.027
  • PROJ-156: DB-Migration 20260407100000_proj156_amazon_failed_operations_version.sql — neue Spalte amazon_failed_operations.version (Default 'v1', CHECK v1/v2) plus Partial-Index (version, status) WHERE status IN ('pending','retrying'). Idempotent (IF NOT EXISTS + DO-Block fuer Constraint). Bereitet die DLQ auf v1/v2-Split fuer das spaetere Cutover (PROJ-161) vor; v1-Code bleibt unangetastet.
v1.28.025
  • PROJ-156: Spec-Alignment an die echte SDK-Surface von @sp-api-sdk/orders-api-2026-01-01@1.1.3 — nur 2 Methoden (searchOrders, getOrder) statt 5, includedData-Pattern statt separater Endpunkte, fulfilledBy: ['MERCHANT'|'AMAZON'] statt fulfillmentChannels, UPPERCASE FulfillmentStatus-Enums (CANCELLED mit zwei L), InvoiceUnconfirmed entfernt. Spec ist jetzt deckungsgleich mit dist/types des installierten SDK.
v1.28.023
  • PROJ-149: Filter und Suchen in der Kundenaufträge-Übersicht bleiben beim Zurück-Navigieren aus der Detailseite erhalten (Persistenz in localStorage). Neuer 'Filter zurücksetzen'-Button, der nur erscheint, wenn mindestens ein Filter aktiv ist.
v1.28.022
  • PROJ-156: Amazon v2 Order Sync Spec (Phase 3) — OrderImportService mit FBM+FBA Strategy, Orders v2026-01-01 via @sp-api-sdk/orders-api-2026-01-01, RDT-Pipeline pro Order, Batch-Upsert ON CONFLICT, Advisory Lock, DLQ mit version='v2', Cron-Route mit Feature-Flag-Gate, strikte PII-Disziplin.
v1.28.021
  • PROJ-155 Phase 2 abgeschlossen — Amazon v2 Connection & Health Deployed.
v1.28.020
  • PROJ-155: Unit-Tests + Sandbox-Smoke fuer Connection & Health (9 computeOverallStatus-Cases, disconnect-Idempotenz + Revoke-Fehler-Toleranz, testConnection Success + Sellers-Rolle-403, Feature-Flag-Gate auf beiden Routes). 280/280 gruen, Sandbox-Smoke gruen.
v1.28.018
  • PROJ-155: Amazon v2 Connection & Health Services — ConnectionService (testConnection + idempotenter disconnect mit LWA Token-Revoke), HealthService mit aggregiertem Status aus Sync-Logs/DLQ/Token/Connection-Test, neue API-Routes /test-connection + /health mit Feature-Flag-Gate
v1.28.016
  • PROJ-155: Amazon v2 Connection & Health Spec (Phase 2) — ConnectionService (testConnection, disconnect mit LWA-Token-Revoke), HealthService mit aggregiertem Status, v2-Routes /test-connection + /health mit Feature-Flag-Gate
v1.28.015
  • PROJ-154 (g): Sandbox-Smoke-Test — End-to-End-Beweis (LWA-Code-Tausch → encrypt/decrypt → SDK-Auth → getMarketplaceParticipations → Mapper). PROJ-154 Phase 1 abgeschlossen.
v1.28.014
  • PROJ-154 (f): Unit-Tests für OAuth-Flow-Module — crypto-Roundtrip + Tamper, oauth-state Sign/Verify/TTL/Tamper, error-classifier (Sellers-Rolle, 401/403), single-flight auth-instance-cache, marketplace-mapper
v1.28.013
  • PROJ-154 (d): SDK-Auth-Memo-Cache mit Single-Flight pro Integration (auth-instance-cache.ts), Reauth-Invalidation in Callback-Route
v1.28.012
  • PROJ-154: Amazon SP-API OAuth-Callback komplett — LWA-Code-Tausch, Marketplace-Detection, verschlüsselte Refresh-Token-Persistenz und klassifizierte Error-Redirects (Sellers-Rolle, abgelaufener Code, ungültiger Token)
v1.28.011
  • PROJ-154: Authorize-Route für den Amazon SP-API OAuth-Flow — Signed-State-Erzeugung, Region-Validierung und Redirect zur Seller-Central-Consent-Page
v1.28.010
  • PROJ-154: AES-256-GCM Token-Crypto und signed JWT für OAuth-State-Management (CSRF-Schutz) als Foundation für den Amazon SP-API OAuth-Flow
v1.28.009
  • PROJ-154: Amazon v2 OAuth-Flow Spec (Phase 1) — Authorize/Callback Routes, signed-JWT State, AES-256-GCM Token-Crypto, Single-Flight Refresh-Cache, Sellers-Rollen-Hint
v1.28.0082026-04-07
  • PROJ-153: vitest sandbox config laedt .env.local automatisch, Smoke-Test gegen Amazon-EU-Sandbox laeuft erfolgreich durch.
v1.28.0072026-04-07
  • PROJ-153: Sandbox-Smoke-Test fuer GET /sellers/v1/marketplaceParticipations (ueber @sp-api-sdk/sellers-api-v1, automatischer Skip ohne Sandbox-Credentials, anonymisiertes Logging ohne Marketplace-/Seller-IDs).
v1.28.0062026-04-07
  • PROJ-153: Sandbox-Env-Plan in .env.local.example und README fuer src/lib/amazon-v2/ mit Mermaid-Architektur, SDK-Begruendung, Sandbox-Setup-Schritten und Troubleshooting.
v1.28.0052026-04-07
  • PROJ-153: feature-flags.ts Helper (isV2EnabledFor / getV2PhasesFor) ueber zentralen Supabase-Admin-Helper, fail-safe Defaults, 6 Unit-Tests fuer alle Verhaltens-Pfade.
v1.28.0042026-04-07
  • PROJ-153: Vitest-Setup fuer v2-Phasen — Default-Lauf excludiert Integration-Tests, separate vitest.sandbox.config.ts mit 30s Timeout und neuer test:sandbox npm-Script.
v1.28.0032026-04-07
  • PROJ-153: Verzeichnis-Struktur src/lib/amazon-v2/ mit Stubs (sdk-client.ts, AmazonV2Error.ts) und Installation der drei Phase-0-SDK-Pakete @sp-api-sdk/auth, @sp-api-sdk/common, @sp-api-sdk/sellers-api-v1.
v1.28.0022026-04-07
  • Aufraeumer: verwaiste discount.test.ts entfernt (importierte ein nicht mehr existierendes Modul und liess npm test dauerhaft rot laufen).
v1.28.0012026-04-07
  • PROJ-153: Phase-0-Spec für das Amazon-v2-Fundament — SDK-Wahl @sp-api-sdk/* (live auf npm evaluiert, dediziertes orders-api-2026-01-01-Paket), Verzeichnis-Struktur src/lib/amazon-v2/, Vitest-Setup mit pragmatischer Test-Philosophie (4–5 Unit-Tests für kritische Logik + 1 Smoke-Test pro Phase), Sandbox-Env-Plan und Feature-Flag-Helper isV2EnabledFor.
v1.28.0002026-04-07
  • PROJ-152: Master-Spec für den kompletten Amazon-Integration-Neubau — OAuth-only, offizielles SDK, Orders v2026-01-01, Polling-first, Parallel-Build mit Per-Integration-Cutover. Ziel: ~9.500 LoC Alt-Code durch saubere v2-Architektur ersetzen, robust für 10k+ Bestellungen/Tag. Alle DB-Tabellen bleiben erhalten, andere Subsysteme sind nicht betroffen.
v1.27.0032026-04-07
  • PROJ-151: Crash-Schutz im Amazon test-connection Mode-2 — wenn die Integration noch keine gültige Region hat (z.B. nach gescheitertem Erstkontakt), kommt jetzt eine klare Fehlermeldung statt eines TypeErrors
v1.27.0022026-04-07
  • PROJ-151: User-Agent Header zu allen Amazon SP-API Requests hinzugefügt — Amazon verlangt diesen Header laut Doku, ohne ihn werden Requests mit 403 abgelehnt (sehr wahrscheinlicher Grund für die bisherigen 'Region nicht erkannt'-Fehler trotz gültigem Refresh Token und korrekten Rollen)
v1.27.0012026-04-07
  • PROJ-151: Amazon-Verbindungstest liefert jetzt konkrete Fehlerdiagnose pro Region (HTTP-Status, Amazon-Error-Body) statt der generischen Meldung 'Region nicht erkannt'
  • PROJ-151: Amazon Refresh Token wird erst nach erfolgreichem LWA-Exchange + Region-Detection + Validation persistiert — keine 'Karteileichen' mehr bei fehlgeschlagenen Verbindungstests
  • PROJ-151: Neuer 'Komplett löschen'-Button in der Amazon-Integration-Detail-Seite (sichtbar bei Status Fehler/Inaktiv) mit Texteingabe-Schutz, entfernt die Integration endgültig aus der DB
  • PROJ-151: DELETE /api/integrations/[id]?force=true Force-Delete-Pfad mit FK-/RLS-spezifischen Error-Codes
  • PROJ-151: Roter Error-Banner oberhalb der Amazon-Settings im Fehler-Status mit 'Neuer Token' / 'Verbindung testen' Quick-Actions
  • PROJ-151: Deutsche Umlaute in Amazon-Integration korrigiert (ungültig, Marktplätze, Eingeschränkt, Gestört, Löschvorgang, ausgewählt, Möchtest, endgültig, Südafrika, Ägypten, Türkei)
v1.27.000
  • Import-Notizen werden direkt in die order_notes-Tabelle geschrieben (PROJ-150): Shopify, Amazon FBA/FBM und manuelle Auftragsanlage nutzen jetzt einen einheitlichen Notiz-Helper mit Idempotenz-Schutz. Die alten orders.notes/import_notes-Spalten wurden entfernt, FreeScout eBay-Username-Lookup und die Notizsuche laufen über order_notes.
v1.26.083
  • Action-Buttons der neuen Auftragsdetailseite (Bearbeiten, Preisnachlass, Ersatzlieferung, Stornieren, Löschen) öffnen jetzt eigene Dialoge inline statt das alte Modal — Refund-/Cancel-/Delete-Dialoge in Standalone-Komponenten extrahiert, OrderDetailDialog komplett entfernt (PROJ-149)
v1.26.082
  • Auftragsdetailseite als Full-Page (PROJ-149 Task 7): Header mit Status/Financial-Popovers, Badges, Tags, 6 Tabs, Action-Buttons
v1.26.0812026-04-06
  • PROJ-149: Navigation zu Auftragsdetailseite — Klick auf Auftragszeile öffnet jetzt die neue Full-Page-Ansicht statt den Dialog, Kundendetails-Links ebenfalls umgestellt
v1.26.0802026-04-06
  • Workflow Intervall-Trigger — Workflows können jetzt in festen Intervallen ausgeführt werden (15min, 30min, 1h, 2h, 4h, 6h, 12h) zusätzlich zu täglich/wöchentlich
v1.26.079
  • PROJ-149: Notizen-Tab Komponente (OrderNotesSection mit CRUD, Inline-Edit, Source-Badges)
v1.26.0782026-04-06
  • Auftragslinks in Kundendetails (Aufträge-Tab) öffnen jetzt in neuem Browser-Tab statt im selben Tab
v1.26.077
  • PROJ-149: OrderNote-Typen, Adress-Update-Schema und Notiz-Validierung hinzugefügt
v1.26.0722026-04-04
  • PROJ-145: Kundendetailseite & Multi-Adressen — Full-Page /dashboard/customers/[id] mit 5 Tabs (Stammdaten, Adressen, Aufträge, Profitbutler, Notizen), customer_addresses Tabelle mit CRUD, Adress-Snapshots auf Orders, Shopify-Import Adressen-Deduplizierung
  • PROJ-146: Kundensperre — Block/Unblock API (Worker sperren, Admins entsperren), roter Banner + Badge, Versand-Guard (403), Import-Flagging in Order-Metadata
  • PROJ-147: Erweiterte Kundensuche — Collapsible Filter für PLZ (Prefix), Stadt, Land (CountryCombobox), Erstellungsdatum, letzter Auftrag; DB-Indexes auf customer_addresses, Badge-Pills mit Dismiss
  • PROJ-148: Kunden-Profitbutler — KPI-Cards (Gesamtumsatz, Aufträge, Ø Bestellwert, Erster/Letzter Auftrag, Erstattungen, Retourenquote), Umsatz-pro-Jahr Balkendiagramm, Top-10-Artikel Tabelle
v1.26.0612026-04-04
  • PROJ-136: Pending-Queue-Count Badge im Billkom Cron-Job — zeigt Anzahl ausstehender Rechnungs-Jobs direkt in der Cron-Job-Übersicht
v1.26.0602026-04-03
  • PROJ-136: billkom_job_queue CHECK Constraint fehlte 'skipped' — Processor konnte Jobs nicht als übersprungen markieren, blieben als 'processing' hängen und blockierten neue Jobs
v1.26.0592026-04-03
  • PROJ-136: billkom_job_queue Idempotency — Partial Unique Index statt absolutem UNIQUE, completed/failed Jobs blockieren keine neuen Workflow-Runs mehr, orders_changed zählt nur echte INSERTs
v1.26.0582026-04-03
  • PROJ-56: execute_workflow() aus PROJ-135/136 wiederhergestellt — fix_billkom_queue hatte massive Regression: fehlende Feld-Evaluierungen, kaputte is_one_of/is_none_of Operatoren, fehlende JOINs und Audit Trail
v1.26.0572026-04-03
  • PROJ-56: Bestehende Workflows hatten limitierte status_scope-Werte die Aufträge vor Bedingungsprüfung herausgefiltert haben — Backfill auf alle Status
v1.26.0552026-04-03
  • PROJ-56: Workflow status_scope Checkboxen entfernt — Auftragsstatus-Filterung nur noch über Bedingungen, redundante UI-Sektion und toter Code aufgeräumt
v1.26.0532026-04-03
  • PROJ-100: eBay Badge-Farbe im Auftragsdetail-Dialog nutzt jetzt DB-konfigurierte Farben wie die Tabellenansicht
v1.26.0492026-04-03
  • PROJ-144: Billkom Rundungsfehler (3,78€ statt 3,79€) — gross_price_per_unit in Order-API ergänzt, Produktname statt 'Position' in Auto-Rechnungen, Zahlstatus im PDF
v1.26.038
  • PROJ-144: Erstattungsblock in Auftragsdetails (Erstattet / Offener Betrag)
  • PROJ-144: shopify_total als Brutto-Gesamt (behebt Rundungsfehler durch Brutto→Netto→Brutto Roundtrip-Verlust)
  • PROJ-144: Refund-Vergleich auf Brutto-Referenz + ±2ct Toleranz (behebt falsche Teilerstattet-Status)
  • PROJ-144: Migration korrigiert bestehende falsche partially_refunded Status
  • PROJ-144: Shopify-Sync schreibt total_refunded aus Refund-Transaktionen (extern erstattete Aufträge)
  • PROJ-144: gross_price_per_unit — Billkom leitet MwSt aus originalem Shop-Brutto ab (behebt ±1ct Rechnungsfehler)
v1.26.0352026-04-03
  • PROJ-143: Deutsche Post Retouren — DHL Retoure + Internetmarke (umgedrehte Briefmarke) für DP-Versandarten, Popover-Auswahl, Auto-Return-Rules mit return_method
v1.26.0302026-04-03
  • Brutto-Preiseingabe in Aufträgen: Rundungsfehler behoben — 9,99€ wurde zu 9,98€ durch Brutto→Netto→Brutto Roundtrip
v1.26.0282026-04-03
  • Shopify Order Import matcht Artikel jetzt über integration_product_mappings statt products.shopify_variant_id — korrekt gemappte Artikel wurden fälschlich als Freiposition angelegt
v1.26.0252026-04-03
  • PROJ-142: Code-Review-Findings — Shipping-API Normalisierung, Workspace-Settings CountryCombobox, Validation max(2), CSV-Import Warnung für unbekannte 2-Letter-Codes
v1.26.0232026-04-03
  • PROJ-142: Country-Code-Normalisierung in allen API-Write-Paths (Kunden, Lieferanten, Produkte, Workspace) und CSV-Import mit Warnungen
v1.26.0212026-04-03
  • PROJ-141: Bestätigungsdialog bei manueller Änderung von Versandstatus und Zahlstatus
v1.26.0202026-04-03
  • PROJ-142: Alle Freitext-Länderfelder durch CountryCombobox ersetzt (Lieferanten, Produkte, Zolldaten, Workflows)
v1.26.0192026-04-03
  • PROJ-142: MultiCountryCombobox Komponente — Multi-Select mit Chips für Länderauswahl (ISO-Codes)
v1.26.0172026-04-03
  • PROJ-141: Auftragsdetail Action-Bar Redesign — klickbare Status-Badges im Header, farbige Aktions-Buttons, Mehr-Menü mit destruktiven Aktionen
v1.26.0162026-04-02
  • PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet
  • PROJ-140: Bundle-Artikel aus Bestellvorschlag, Einkaufsliste und Wareneingang ausgeschlossen
  • PROJ-140: Profitbutler zeigt Bundle-Komponentenkosten (FIFO/Lieferanten-EK, Aufschlüsselungstabelle)
  • PROJ-140: Profitbutler-Kalkulation verwendet Bundle-Komponentenkosten als Einstandspreisbasis
v1.26.009
  • PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet (watchIsBundle-Konditionierung für TabsTrigger und TabsContent)
v1.24.0052026-04-02
  • Produktseite: Suchfeld verschluckt keine Buchstaben mehr (debounced URL-Sync)
  • Produktseite: Filter, Suche und Sortierung bleiben beim Zurücknavigieren erhalten (URL-Parameter + router.back)
v1.24.0002026-04-02
  • PROJ-135: Workflow-Bedingungen für Versandstatus, Zahlstatus und Versanddatum (älter als X Tage)
  • PROJ-135: Neue Workflow-Aktion 'Versandstatus ändern' mit Vorwärts-Validierung (z.B. shipped → completed)
  • PROJ-135: Status-Scope um 'Versendet' erweitert für Auto-Abschluss-Workflows
  • PROJ-136: Workflow-Bedingungen 'Rechnung vorhanden' und 'Lieferschein vorhanden'
  • PROJ-136: Neue Workflow-Aktionen 'Rechnung erstellen' und 'Lieferschein erstellen' über Billkom Job-Queue
v1.23.0212026-04-02
  • Shopify Bestellstatus-Sync Cron Job — automatischer Abgleich von Status, Zahlungsstatus und Tracking alle 15 Minuten
  • Shopify-Sync: shopify_order_id statt external_order_id, Tracking in shipping_tasks statt shipping_labels
  • Shopify-Import: fulfilled → shipped statt completed
v1.23.0062026-04-02
  • MwSt-Rundung auf Gruppennetto statt per-line — behebt 1-Cent-Differenz zu Shopify-Gesamtpreis
v1.23.0042026-04-02
  • PROJ-134: Financial Status auf Aufträgen (pending/paid/partially_refunded/refunded)
  • PROJ-134: Shopify Refund API Integration (Erstattung/Preisnachlass direkt aus Flowkom)
  • PROJ-134: Erstattungs-Dialog im Auftragsdetail mit Shopify-Notify + Gutschrift-Option
  • PROJ-134: Shopify-Refund im Storno-Flow integriert
  • PROJ-134: Financial-Status-Badge in Auftragsübersicht + Auftragsdetail
  • PROJ-134: refund_enabled Toggle in Shopify-Integrations-Einstellungen
  • PROJ-134: financial_status Mapping beim Shopify-Import + PROJ-131 Sync
v1.21.034
  • PROJ-132: Varianten-Attribut Inline-Zuweisung — Attributwerte direkt in der Kindartikel-Tabelle per Dropdown zuweisen
  • PROJ-132: Kombinations-Validierung — Generierung blockiert wenn Kinder unvollständige Attributwerte haben
v1.21.0322026-04-01
  • PROJ-132: PATCH /api/products/[id] akzeptiert jetzt variant_attribute_values (JSONB Record) für Inline-Zuweisung von Varianten-Attributwerten
v1.21.0312026-04-01
  • PROJ-48: Pagination in Auftragsübersicht repariert — exakter Count statt ungenauer Planner-Schätzung, Weiter-Button funktioniert wieder
v1.21.0292026-04-01
  • PROJ-131: Temporärer Shopify Order-Sync (Tracking + Status aus Shopify auf Knopfdruck abrufen)
v1.21.0262026-04-01
  • PROJ-130: orders_with_totals View recreated für import_notes Sichtbarkeit
  • PROJ-130: Lade-UX verbessert (keepPreviousData statt Full-Page-Spinner, subtiler Loader in Suchfeldern)
v1.21.0232026-04-01
  • PROJ-100: Verkaufskanal-Logos (Otto, Kaufland, eBay, Amazon, TikTok, Zalando, Temu) in Auftragsübersicht & Detail-Dialog
  • PROJ-100: DB-konfigurierte Badge-Farben aus Channel-Rules werden jetzt in der Auftragsübersicht angezeigt
v1.21.0222026-04-01
  • PROJ-130: Separates Notiz-Suchfeld in der Auftragsübersicht (notes + import_notes, Trigram-Index)
v1.21.0212026-04-01
  • PROJ-111: eBay-Username-Lookup für FreeScout Connector (eBay-Proxy-Mails umgehen via Magnalister Import-Notizen)
  • PROJ-111: DHL Hex-Tracking-Nummern erkennen (z.B. A004C58C4500000D9E1F)
  • PROJ-111: Flowkom-Deeplink korrekter Query-Param (orderId statt order)
  • PROJ-111: Flowkom-URL Fallback auf app.flowkom.de
v1.21.0152026-04-01
  • PROJ-123: Speichern-Button bei Attribut-Umbenennung im Varianten-Tab aktivieren (isDirty berücksichtigt jetzt out-of-band State)
v1.21.0142026-04-01
  • PROJ-78: Versandart-Filter für Produktübersicht (Ist/Ist-nicht-Modus, Keine Versandart, Multi-Select)
v1.21.0132026-04-01
  • PROJ-112: Profitbutler Farben gedämpft (emerald-600 statt Gift-Grün), Zeitraum-Zahnrad zur Tabelle verschoben
v1.21.0122026-04-01
  • PROJ-19: Mausrad-Scrollen in Lieferanten-Auswahl-Dropdown repariert (stopPropagation auf CommandList)
v1.21.0112026-04-01
  • PROJ-112: Profitbutler Farben verbessert (Gewinn/Marge dynamisch grün/rot, Kosten kräftiger)
  • PROJ-112: Kanal-Aufschlüsselung mit Perioden-Tabs zum Zeitraum-Wechsel (zeigt jetzt alle Kanäle)
v1.21.0082026-04-01
  • PROJ-78: Hersteller-Filter mit Ist/Ist-nicht-Modus und Ohne-Marke-Option (Negierung + Artikel ohne zugewiesene Marke filtern)
v1.21.0072026-04-01
  • PROJ-78: Hersteller-Filter zeigt Markennamen statt UUIDs im Dropdown und in den Filter-Chips
v1.21.0062026-04-01
  • PROJ-125: Hersteller/Marke wird bei ausgeklappten Kindvarianten in der Produkttabelle korrekt angezeigt
v1.21.0052026-04-01
  • PROJ-122: Hersteller-Dropdown in Massenbearbeitung 'Feld setzen' war leer (falsches Feld-Mapping brand_name vs. name)
v1.21.0042026-04-01
  • PROJ-19: Lieferant über Spreadsheet/Massenbearbeitung/Vererbung zugewiesen wird jetzt korrekt im Lieferant & Kosten-Tab angezeigt (supplier_products Sync)
v1.21.0022026-04-01
  • PROJ-129: Dokumenten-Kategorien CRUD — Eigene Kategorien erstellen, alle Kategorien bearbeiten/löschen/kopieren, Richtlinien & Normen inline editieren, Preset-Reset (einzeln oder alle), Zusatztexte in DB persistiert, Konformitätserklärung nutzt DB-Kategorien
v1.20.0192026-03-31
  • PROJ-128: Drag & Drop Sortierung für Varianten-Attribute — Werte-Bubbles und Attribut-Karten per DnD sortierbar, Kindartikel-Tabelle sortiert nach Werte-Reihenfolge
v1.20.0182026-03-31
  • PROJ-2: Unsaved-Changes UX — Sticky Banner mit Speichern/Verwerfen, deaktivierter Save-Button ohne Änderungen, Browser-Leave-Guard, Zurück-Button warnt bei offenen Änderungen
v1.20.0172026-03-31
  • PROJ-15: Parent-Child Checkbox-Kaskadierung — Elternartikel-Checkbox selektiert/deselektiert alle Kindvarianten, Indeterminate-State bei Teilauswahl, 'Alle auswählen' kaskadiert ebenfalls
v1.20.0162026-03-31
  • PROJ-127: Werte-Übertragung Eltern→Kind — Typ-Mismatch bei Zahlen behoben (EK-Preis, Gewicht etc.), Artikelmaße + TARIC-Code als übertragbare Felder ergänzt, Stale-State nach Speichern behoben, Fehlerbehandlung + Loading-Spinner + Unsaved-Changes-Banner hinzugefügt
v1.20.0152026-03-31
  • PROJ-92: Profilkarten zeigen jetzt Max Aufträge, Auftragstypen, Scan-Modus, Auto-Flags, Lagerplatz- und Tag-Filter
v1.20.0132026-03-31
  • PROJ-92: Picklisten-Wizard wählt jetzt das angeklickte Profil vor statt immer das erste aktive Profil
v1.20.0122026-03-31
  • PROJ-8: Import-Notizen für Kundenaufträge — Shopify note_attributes (z.B. Magnalister eBay-Metadaten) als eigenes Feld importieren und im Detail-Dialog anzeigen
v1.20.0112026-03-31
  • PROJ-19: Lieferant-Dropdown im Zuordnungsdialog scrollbar gemacht + Firmenzusatz unter Firmenname anzeigen
v1.19.0242026-03-31
  • PROJ-120: Firmenzusatz unter Firmenname in Lieferantenliste anzeigen
v1.19.0162026-03-31
  • PROJ-2: Gewicht-Eingabe erlaubt jetzt beliebig viele Dezimalstellen (step=any statt 0.01)
v1.19.0092026-03-31
  • PROJ-125: Lieferant- und Versandart-Spalten in der Produkttabelle zeigen jetzt Namen statt abgeschnittene UUIDs
v1.19.0052026-03-31
  • PROJ-125: localStorage-Key in useColumnConfig generalisiert (wms_table_columns_<tableKey>_<userId>) mit automatischer Migration vom alten Order-spezifischen Key
v1.19.0032026-03-31
  • PROJ-122: Lieferant Quick-Assign-Button in der Massenbearbeitungs-Toolbar
  • PROJ-122: Inline-Validierung im Spreadsheet mit roten Fehler-Zellen
  • PROJ-122: Warnung bei 500+ Artikeln im Spreadsheet
  • PROJ-122: Lieferant-Dropdown im 'Feld setzen'-Dialog war leer (suppliers-Prop nicht durchgereicht)
  • PROJ-122: Bestätigungsdialog für Lieferant-Schnellzuweisung hinzugefügt
  • PROJ-123: supplier_id zu übertragbaren Feldern im Vererbungsdialog hinzugefügt
  • PROJ-123: Debug-Stub Toolbar durch richtige VariantToolbar ersetzt
  • PROJ-123: ProductSlideOver Panel wieder eingebaut mit Prev/Next-Navigation
  • PROJ-123: Varianten-Tabellenzeilen klickbar für SlideOver
  • PROJ-123: Bulk-Action API-Parameter-Format korrigiert (params-Objekt, affected_count)
v1.19.0002026-03-30
  • PROJ-124: Eltern-Kind Zuordnung & Lösung — Kindartikel vom Elternartikel lösen und bestehende Produkte als Kind zuordnen
v1.18.0432026-03-30
  • PROJ-15: VariantCombinationsTable zeigt nur noch neue (nicht-angelegte) Kombinationen — kein doppeltes Tabellen-Display mehr
v1.18.0372026-03-30
  • PROJ-123: Variant-Tab-Absturz (React Error #185 / Maximum update depth exceeded) behoben — TanStack-Query-Hooks aus ProductFormContent in die Elternseite verschoben
v1.18.0332026-03-30
  • PROJ-122: Spreadsheet-Styling verbessert (Grid-Linien, Alternating Rows, Header, Fokus-Rahmen, Changed-Zellen)
  • PROJ-122: Cmd+C/V/D Tastenkürzel für Kopieren, Einfügen und Ausfüllen im Tabellen-Editor
v1.18.0322026-03-30
  • Versandverpackungen sortierbar via Pfeil-Buttons in Einstellungen, Sortierung wird im Produkt-Dropdown übernommen
v1.18.0302026-03-30
  • PROJ-123: Attribut-Umbenennung feuert nicht mehr per Tastendruck, sondern nur beim Speichern
  • PROJ-123: Rename-API aktualisiert Kindvarianten vor variant_attributes (bessere Atomizität)
  • PROJ-123: SQL-Migration verwendet DISTINCT-Subquery statt ungültigem jsonb_agg(DISTINCT ... ORDER BY ...)
  • PROJ-123: product_options in Shopify-Produkt-Preview nur noch am ersten Varianten-Eintrag pro Produkt
  • PROJ-123: members-Prop aus ProductSlideOver-Interface entfernt (war ungenutzt)
  • PROJ-123: VariantTable-Keys basieren auf attr.id statt mutablem attribute_name
  • PROJ-123: InheritanceDialog resettet selectedFields bei jedem Öffnen
v1.18.0292026-03-30
  • PROJ-123: Varianten-Tab mit VariantTable, VariantToolbar, InheritanceDialog, ProductSlideOver und SpreadsheetView integriert
  • PROJ-123: Varianten-API gibt jetzt alle für Tabelle und Slide-Over benötigten Felder explizit zurück
v1.18.028
  • PROJ-123: Vererbungs-Dialog — Felder vom Elternartikel auf ausgewählte Kindartikel übertragen (Gruppenauswahl, Vorschau)
  • PROJ-123: Produkt-Slide-Over — Schnellbearbeitung von Kindartikeln ohne Seitenwechsel (Sheet-Panel, Formular mit react-hook-form)
v1.18.027
  • PROJ-123: VariantAttributeBuilder — onRename-Callback für editierbare Attributnamen (DB-gesicherte Attribute)
  • PROJ-123: VariantTable — neue read-only Tabelle mit Checkbox-Selektion, dynamischen Attribut-Spalten und Status-Badges
  • PROJ-123: VariantToolbar — Varianten-spezifische Toolbar mit 'Werte übertragen'-Button über dem BulkActionToolbar
v1.18.026
  • PROJ-123: PATCH /api/products/[id]/variants/attributes — Umbenennung von Variantenattributen inkl. JSONB-Key-Update in allen Kindvarianten
v1.18.0242026-03-30
  • PROJ-123: Shopify-Produktimport verwendet jetzt echte Variantenattribut-Namen (Größe, Farbe) statt generischer Option1/Option2-Bezeichnungen
  • PROJ-123: variant_attributes werden beim Import des Elternartikels via replace_variant_attributes RPC befüllt
v1.18.0232026-03-30
  • PROJ-122: clear_field bulk-action prüft jetzt BULK_EDITABLE_FIELDS Allowlist (Security-Fix)
  • PROJ-122: AG Grid cell editors (Dropdown, Number) auf forwardRef+useImperativeHandle umgestellt
  • PROJ-122: AdjustPriceDialog sendet jetzt korrekte API-Modi (absolute/percentage mit Vorzeichen)
  • PROJ-122: SpreadsheetView useMemo-Abhängigkeiten für columnDefs auf spezifische Props eingegrenzt
v1.18.021
  • PROJ-122: Tabellen-Editor (Spreadsheet View) mit AG Grid Community
  • PROJ-122: Spalten-Picker mit Gruppen, Checkboxen und localStorage-Persistierung
  • PROJ-122: Custom Dropdown-Zelleditor für Referenzfelder (Hersteller, Versandart, etc.)
  • PROJ-122: Custom Zahlen-Zelleditor mit deutschem Dezimalformat (Komma-Support)
v1.18.020
  • PROJ-122: Bulk-Action Toolbar — BulkActionToolbar-Komponente mit SetFieldDialog (Feld+Wert in 2 Schritten, gruppiert nach Kategorie) und AdjustPriceDialog (5 Modi: absolut, ±%, ±€), inkl. AlertDialog-Bestätigungen für Archivieren/Löschen
v1.18.019
  • PROJ-122: POST /api/products/bulk-action Endpoint für Toolbar-Aktionen (set_field, clear_field, adjust_price, archive, unarchive, delete — mit filter-basierter Auswahl via all_matching)
v1.18.018
  • PROJ-122: PATCH /api/products/bulk Endpoint für Spreadsheet-Speichern (Bulk-Update einzelner Felder pro Produkt, Auth + Rate-Limit + 207 Multi-Status)
v1.18.017
  • PROJ-122: Bulk-Edit Validierungen — bulkUpdateSchema, bulkActionSchema, BULK_EDITABLE_FIELDS, NON_BULK_EDITABLE_FIELDS, validateBulkFieldValue
v1.18.0162026-03-30
  • PROJ-114: MIME-Type-Normalisierung & Cache-Busting bei Logo/Unterschrift-Upload (PNG-Fix)
v1.18.0152026-03-30
  • PROJ-114: Marken-Duplizierung nutzt download+upload statt storage.copy für zuverlässige Dateikopie
v1.18.0142026-03-30
  • PROJ-114: Marken direkt aus Tabellenübersicht duplizieren inkl. Logo & Unterschrift
v1.18.0132026-03-30
  • PROJ-114: Marke/Hersteller in Produktübersicht zeigt jetzt den Markennamen statt der UUID
v1.18.0122026-03-29
  • PROJ-8.5: Shopify-Import holt jetzt Produktbeschreibung (body_html) und Gewicht (kg-Konvertierung) mit
v1.18.0112026-03-29
  • Dev-Tools: Neues Cleanup-Target 'Produkte' — löscht alle Produkte, Bestände, Bestandsbuchungen, Wareneingänge und produktbezogene Daten
v1.18.0102026-03-27
  • PROJ-120: Feld 'Nächster Hafen' bei Lieferanten-Stammdaten hinzugefügt
v1.18.0092026-03-27
  • PROJ-120: Dev-Tools Lieferanten-Cleanup setzt jetzt auch supplier_number_next_seq zurück
v1.18.0072026-03-26
  • PROJ-85: Lager-Auswahl und Auto-Barcode beim Lagerplatz-Import — Dropdown für Ziel-Lager im Import-Wizard, Barcode wird automatisch aus Name generiert
v1.18.0062026-03-26
  • PROJ-85: Import von Lagerplätzen behoben — workspace_id-Injection, Duplikat-Erkennung und ON CONFLICT für warehouse-scoped Tabellen korrigiert
v1.18.0052026-03-26
  • PROJ-86: Export von Lagerplätzen behoben — storage_locations hat kein workspace_id, Filter läuft jetzt über warehouses-Join
v1.18.0002026-03-26
  • PROJ-121: Nachträgliche Sendungsnummern an Shopify — Zusatzlabels und Retourenlabels aus Auftragsdetails optional an Shopify syncen, Toggle pro Integration (Default: aus, Multi-Channel-sicher), Override pro Auftrag im Label-Popover, Kundenbenachrichtigungs-Option, Multi-Channel-Warnung
v1.17.0002026-03-25
  • PROJ-119: Produkte vollständig löschen (Hard Delete) — Admins können Produkte endgültig löschen (einzeln + Bulk), Abhängigkeitsprüfung (Bestand, Picklisten, Varianten, Bundles), Bestellpositionen werden automatisch in Freipositionen entkoppelt, 4-Phasen-Bestätigungsdialog
v1.15.0032026-03-24
  • PROJ-2: UVP-Feld (Unverbindliche Preisempfehlung) im Basis-Tab hinzugefügt, inkl. Daten-Hub Synonym-Mapping
v1.15.0022026-03-24
  • PROJ-85: Upsert ON CONFLICT fix für zusammengesetzte Unique-Constraints (workspace_id + key)
  • PROJ-84: JTL-Ameise Synonyme ergänzt (artikelname, versandgewicht, netto_ek, herkunftsland), country_of_origin im Schema-Overlay registriert
v1.15.0012026-03-24
  • PROJ-2: Produktbeschreibung-Feld (HTML/Fließtext) im Sonstiges-Tab hinzugefügt
  • PROJ-89: Tags von Sonstiges in den Basis-Tab verschoben
v1.15.0002026-03-24
  • Ausführliche Sync-Logs: Strukturierte Per-Item-Details für jeden Import (importiert/übersprungen/fehlgeschlagen mit Bestellnummer und Fehlergrund) (PROJ-118)
  • Detail-Sheet: Klickbare Sync-Log-Einträge öffnen Seitenleiste mit Admin-Übersicht und aufklappbaren technischen Details (PROJ-118)
  • Import-Rollback: Einzelne Imports rückgängig machen mit Bestätigungsdialog, Impact-Vorschau und verwaister-Kunden-Bereinigung (PROJ-118)
v1.14.0252026-03-24
  • PROJ-102: Billkom Kanäle-Tab zeigt nur noch Verkaufskanäle (Shop/Marketplace), keine Support-Integrationen wie FreeScout mehr
v1.14.0242026-03-24
  • Shopify-Import: Bestellungen ohne Tags schlugen fehl wegen NOT-NULL-Constraint auf metadata-Spalte — jetzt leeres Objekt statt null (PROJ-8)
v1.14.0232026-03-24
  • PROJ-2: ASIN-Feld (Amazon Standard Identification Number) bei Produkten hinzugefügt
v1.14.0222026-03-24
  • PROJ-100: Filter-Leiste (Status, Quellen, Kanäle) bleibt sichtbar wenn Kanal-Filter keine Ergebnisse liefert
v1.14.019
  • PROJ-117: Amazon FBM-Import erhält jetzt automatisch Versandart via Prioritätsauflösung (war vorher NULL)
  • PROJ-117: Versandarten-Priorität als Deployed markiert
v1.14.018
  • PROJ-117: Shopify-Import nutzt jetzt zentrale resolveShippingMethodByPriority() statt Inline-Sort-Order-Logik — shippingMethodSortOrders Map und Prefetch-Query entfernt
v1.14.017
  • PROJ-117: Versandarten-Priorität korrigiert — niedrigste sort_order gewinnt (ASC statt DESC)
  • PROJ-117: Fallback auf Grundversandart für Artikel ohne zugewiesene Versandart
  • PROJ-117: Toast-Info bei Fallback-Nutzung der Grundversandart
  • PROJ-117: Stale-Closure-Bug behoben — productShippingMap in useCallback-Deps ergänzt
  • PROJ-117: Inaktive Versandarten werden bei der Prioritätauflösung übersprungen
v1.14.016
  • PROJ-117: Orders-API nutzt jetzt resolveShippingMethodByPriority() statt eigenem Inline-Code (Service-Artikel-Filter, Inaktiv-Filter, Basis-Versandart-Fallback, ASC-Sortierung)
v1.14.015
  • PROJ-117: Info-Banner in Versandarten-Einstellungen (Prioritäts-Erklärung mit Truck-Icon)
  • PROJ-117: onReorder-Callback in ShippingMethodTable verdrahtet (Cache-Invalidierung nach Drag-and-Drop)
v1.14.014
  • PROJ-117: Neue Versandarten erhalten automatisch sort_order = MAX + 1, landen damit am Ende der Prioritätsliste
v1.14.013
  • PROJ-117: Drag-and-Drop Priorität für Versandarten-Tabelle – Prio-Spalte mit Griffpunkt, optimistisches UI, persistiert via /api/shipping-methods/reorder
v1.14.012
  • PROJ-117: Reorder-API für Versandarten hinzugefügt (PATCH /api/shipping-methods/reorder)
v1.14.0112026-03-23
  • PROJ-53: Importierte Bestellungen übernehmen jetzt das Original-Datum von Shopify statt dem Import-Zeitpunkt
v1.14.0102026-03-23
  • PROJ-53: Versandpositionen (Service-Artikel) werden jetzt immer als letzte Position in den Auftragsdetails angezeigt
v1.14.0092026-03-23
  • PROJ-53: Marketplace-Bestellnummern (Otto, Kaufland etc.) werden jetzt korrekt aus dem Shopify name-Feld übernommen statt der numerischen Sequenz
v1.14.0082026-03-23
  • PROJ-53: Shopify-Bestellungen werden jetzt in chronologischer Reihenfolge importiert (älteste zuerst)
  • PROJ-53: Shopify-Bestellname (z.B. #DE1001) wird in der Vorschau-Tabelle angezeigt
  • PROJ-53: 'Jetzt synchronisieren' zeigt jetzt die tatsächliche Fehlerursache statt generischer Meldung
  • PROJ-53: Deutsche Umlaute im Bestellungs-Vorschau-Dialog korrigiert
v1.14.0072026-03-23
  • PROJ-115: Vorschau nutzt direkte Download-URLs statt Preview-Endpoint (schneller, zuverlässiger)
  • PROJ-115: 'In OneDrive' Button nutzt echte Ordner-URL statt fragiler URL-Konstruktion
  • PROJ-115: HTML-Entities in webUrl werden korrekt dekodiert
  • PROJ-115: Loading-Spinner während Vorschau-Laden
v1.14.006
  • PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
  • Neuer Tab "Dokumente" in Produktdetailseite (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
  • 18 vordefinierte EU-Produktkategorien mit aktuellen Richtlinien und EN-Normen (Stand 2026)
  • EG-Konformitätserklärung mit Kategorie-Vorauswahl, Normen-Wizard und PDF-Generierung
  • Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen, Symbolen und Markdown-Editor
  • Umkarton-Etikett im Tool-Stack-Format (A4 Querformat, Barcode, Formularfelder)
  • Hersteller-Stammdaten erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
  • Hersteller duplizieren und echtes Löschen (inkl. Storage-Cleanup)
  • Einstellungen: "Marken & Hersteller" → "Produkte" mit Dokumenten-Konfiguration
  • Varianten-Support: Ein PDF für alle Varianten (Bilder im 3er-Raster, automatischer Seitenumbruch)
  • Dokumentation: Ausführliche Hilfeseite unter Artikel & Lager → Produktdokumente
v1.14.0052026-03-23
  • PROJ-116: Umkarton-Etikett PDF komplett neu geschrieben (A4 Landscape, Formularfelder, Barcode rechts)
v1.14.0042026-03-23
  • PROJ-116: Hard-Delete für Hersteller mit Logo/Signatur-Cleanup
v1.14.0022026-03-23
  • PROJ-116: Logo/Signatur-Upload, Duplizieren-Funktion, Umkarton-Etikett Null-Safety, PATCH-Validierung
v1.14.0012026-03-23
  • PROJ-116: PDF-Generatoren, Render-Dialoge und Download-Buttons verdrahtet
v1.14.000
  • PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
  • Neuer Tab "Dokumente" in Produktdetailseite
  • EG-Konformitätserklärung mit 18 EU-Produktkategorien und Normen-Wizard
  • Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen
  • Umkarton-Etikett (Ein-Klick PDF)
  • Hersteller erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
  • Einstellungen: Marken & Hersteller → Produkte mit Dokumenten-Konfiguration
v1.13.0372026-03-22
  • PROJ-115: Integration-Kategorie von 'Sonstiges' in 'Cloud-Speicher' umbenannt
v1.13.0362026-03-22
  • PROJ-115: Status auf Deployed gesetzt
v1.13.0352026-03-22
  • PROJ-115: type=button auf allen Cloud-Buttons (verhindert ungewolltes Form-Submit und 'Produkt aktualisiert'-Spam)
v1.13.0342026-03-22
  • PROJ-115: Cloud-Speicher von eigenem Settings-Tab in Integrationen-Seite verschoben (OneDrive-Karte)
v1.13.0332026-03-22
  • PROJ-115: Unterordner werden jetzt in allen Ordnerebenen als Kacheln angezeigt (nicht nur im Root)
v1.13.0322026-03-22
  • PROJ-115: Sidebar zeigt immer alle Root-Ordner (auch in Unterordnern), HTML-Entities in Dateinamen werden korrekt dekodiert
v1.13.0312026-03-22
  • PROJ-115: Rekursive SKU-Ordner-Suche beim Auto-Match (bis 3 Ebenen tief in Unterordnern)
v1.13.0302026-03-22
  • PROJ-115: Manufacturer-Join auf Produkt-Detailseite für Cloud Auto-Match Button
v1.13.0292026-03-22
  • PROJ-115: Lint-Fixes in Cloud-Komponenten (next/image, setState-in-Effect, useEffect-Dependencies)
v1.13.0282026-03-22
  • PROJ-115: Env-Vars Dokumentation, Feature-Index und Implementation Plan
v1.13.0272026-03-22
  • PROJ-115 Tasks 12-16: Cloud-Speicher Settings-Seite, Folder Picker, Dateien-Tab im Produktformular, File Browser mit Sidebar/Grid/List, Lightbox-Vorschau, Upload-Zone
v1.13.0262026-03-22
  • PROJ-115: Dateien-Tab in Produktdetails + Cloud File Browser (Sidebar, Ordner-Kacheln, Thumbnail-Grid, Dateiliste)
v1.13.0252026-03-22
  • PROJ-115: Cloud Folder Picker Dialog (Breadcrumb-Navigation, Ordner-Auswahl per Klick/Doppelklick)
v1.13.0242026-03-22
  • PROJ-115: Cloud-Speicher Einstellungsseite (OneDrive-Verbindung, Basis-Ordner, Ordner-Vorlagen, Bulk Auto-Match)
v1.13.0232026-03-22
  • PROJ-115: TanStack Query Hooks für Cloud Storage (Connections, Files, Folders, Templates, Product-Folder)
v1.13.0222026-03-22
  • PROJ-115: Bulk Auto-Match API (alle Produkte automatisch per Marke + SKU mit Cloud-Ordnern verknüpfen)
v1.13.0212026-03-22
  • PROJ-115: Ordner-Vorlagen API (CRUD + Drag & Drop Sortierung)
v1.13.0202026-03-22
  • PROJ-115: Product-Cloud-Folder API (Verknüpfung, Auto-Match per Marke/SKU, Ordnerstruktur erstellen)
v1.13.0192026-03-22
  • PROJ-115: Cloud File & Folder API Routes (List, Create, Upload, Download, Rename, Move, Delete, Thumbnail, Preview) + get-provider Helper mit Auto-Token-Refresh
v1.13.0182026-03-22
  • PROJ-115: OAuth2 Flow (CSRF-State, Token-Verschlüsselung) + Connection Management API (CRUD, Root-Folder-Update)
v1.13.0172026-03-22
  • PROJ-115: Zod-Validierungsschemas + DB-Row-Types für Cloud Storage (Folder-Templates, Connections, Product-Folder-Links)
v1.13.0162026-03-22
  • PROJ-115: OneDrive Provider (Microsoft Graph API) + Provider Factory für Cloud-Storage-Modul
v1.13.002
  • PROJ-113: Nicht-Admin-Nutzer sehen Firmendaten-Formular jetzt als schreibgeschützt (alle Felder deaktiviert, Speichern-Button ausgeblendet, Logo-Aktionen ausgeblendet)
  • PROJ-113: Logo-Upload zeigt jetzt eine Warnung wenn das Bild kleiner als die empfohlene Mindestgröße von 600×200 Pixeln ist
v1.13.0012026-03-22
  • PROJ-113: Sender-Snapshot wendet Override-Logik (company_overrides) jetzt auch auf Finanzfelder an (vat_id, tax_number, trade_register, managing_director, bank_name, bank_iban, bank_bic, bank_account_holder)
v1.12.0142026-03-22
  • PROJ-113: LB-PDF neues Header-Layout — Logo, Absenderzeile, Liefer-/Rechnungsanschrift, Bearbeiter, zentrierter Titel
v1.12.0132026-03-22
  • PROJ-113: Billkom PDF-Generator company_overrides & Logo-Fallback (billkom-logos → workspace-logos)
v1.12.0122026-03-22
  • PROJ-113: Billkom Setup-Wizard — Button 'Firmendaten aus Workspace übernehmen' zum Prefill aller Felder
v1.12.0112026-03-22
  • PROJ-113: Billkom Company-Tab Override-UI — OverridableField-Pattern mit Workspace-Werten als Read-Only, Per-Field Override mit Badges, Logo-Override
v1.12.0102026-03-22
  • PROJ-113: Billkom Override-Logik — companyOverridesSchema, company_overrides in UpdateSettingsSchema, workspace_company im GET-Response
v1.12.0092026-03-22
  • PROJ-113: Workspace-Einstellungen mit Tab-Struktur (Firmendaten + Nummernkreise), Logo-Upload, Firmendetails, Steuerdaten, Bankverbindung
v1.12.006
  • PROJ-113 Task 1: DB-Migration — Workspace-Firmenprofil (company_name, Adresse, Bankdaten, USt-ID, Logo-URL), billkom company_overrides JSONB, Storage Bucket workspace-logos mit RLS
v1.12.0052026-03-22
  • PROJ-24: SKU + EAN als Textzeile unter jedem Produktnamen im Bestell-PDF
v1.12.0042026-03-22
  • PROJ-24: Ländernamen im englischen PDF übersetzen (Deutschland → Germany etc.)
v1.12.0032026-03-22
  • PROJ-24: Ziellager-Auswahl auf Bestellungen, Firmendaten (Absender) + Lager-Lieferadresse im PDF nebeneinander
v1.12.0022026-03-22
  • PROJ-24: Bestellungssprache pro Lieferant (DE/EN) für PDF-Export, Produktbilder in jeder Position
v1.12.0012026-03-22
  • PROJ-112: Fix column name unit_price → price_per_unit in migration index
v1.12.0002026-03-22
  • PROJ-112: Phase 3 complete — Profitbutler Statistik mit Dashboard, Fixkosten, Kanal-Aufschlüsselung, CSV/PDF-Export
v1.11.0132026-03-22
  • PROJ-112: PDF-Export — Server-side PDF-Generierung mit jsPDF/autotable, API-Route /api/profitbutler/stats/export
v1.11.0122026-03-22
  • PROJ-112: CSV-Export — Client-side CSV-Generierung mit deutschem Zahlenformat, UTF-8 BOM, Exportieren-Dropdown in Filterleiste
v1.11.0112026-03-22
  • PROJ-112: Profitbutler Tagesstatistik Cron-Job-Eintrag in Settings-Seite
v1.11.0102026-03-22
  • PROJ-112: Daily Stats Aggregation — Tagesstatistiken vorberechnen mit Backfill-Support, Aggregate-Shortcut in Stats API für schnellere Ladezeiten
v1.11.0092026-03-22
  • PROJ-112: Konfigurierbare Zeiträume — User Preferences API, Period Config Dialog mit Drag-Reihenfolge, Custom-Zeitraum-Eingabe, max 10 Spalten
v1.11.0082026-03-22
  • PROJ-112: Quartal-, Jahres- und Custom-Zeitraum-Parser mit TDD (quarter, year, custom:YYYY-MM-DD:YYYY-MM-DD)
v1.11.0072026-03-22
  • PROJ-112: Empty States für nicht konfigurierte Profitbutler-Settings und inaktives Billkom-Modul, Channel-Dropdown in Fixkosten-Dialog zeigt jetzt alle Kanäle aus Bestellungen
v1.11.0062026-03-22
  • PROJ-112: Echte Versand-/Verpackungs-/PickPack-Kosten in Stats API — shipping_method_country_costs, shipping_packagings und product_profitbutler_settings für reale Kostenberechnung statt Nullen
v1.11.0052026-03-22
  • PROJ-112: Kostenberechnungsmodul extrahiert — Pure Functions für Versand, Verpackung, Pick&Pack, Wareneinsatz, Provision, Werbung, MwSt mit 18 Unit-Tests
v1.11.0032026-03-22
  • PROJ-112: Profitbutler Tests — 14d/90d/unknown Period Resolution, negative netRevenue, Leap Year 366d, Weekly due_date, Channel-Scoped Fixed Cost, Partial Period Validity
v1.11.0022026-03-22
  • PROJ-112: Rechnungsansicht ignoriert Kanal- und Produkt-Filter nicht mehr — Filter werden über Auftragsverknüpfung angewendet
  • PROJ-112: Kanalaufschlüsselung zeigt jetzt Daten für Rechnungsansicht (über billkom_documents → orders Join)
  • PROJ-112: Kanal-Profit und Marge werden mit dynamischem Profitfaktor berechnet statt hartcodierter 0
  • PROJ-112: Query-Limits erhöht (50k Bestellungen, 100k Positionen, 50k Belege) mit Truncation-Warnungen bei Überschreitung
v1.10.0322026-03-22
  • PROJ-112: Pick & Pack Kosten in Workspace-Standardwerten und Produkt-Overrides — neuer Standardwerte-Tab in Profitbutler-Settings, EUR-Eingabe pro Stück, produktspezifische Überschreibung mit Workspace-Default als Placeholder
v1.10.0312026-03-22
  • PROJ-112: Revenue/Profit Chart mit Recharts — Umsatz als Balken, Gewinn als Linie, 7T/14T/30T/90T Zeitraumwahl, Orders/Invoices View, Dark-Theme-Tooltip
v1.10.0302026-03-22
  • PROJ-112: Fixkosten Settings Tab — Summary Cards, Add/Edit Dialog mit Zod-Validierung, CRUD-Tabelle mit Pause/Resume/Löschen, Kanalzuweisung, Abschreibungsmodi
v1.10.0292026-03-22
  • PROJ-112: Fixed Costs CRUD API — GET/POST Liste & Erstellen, PATCH/DELETE Einzeleintrag, Pause/Resume Toggle
v1.10.0272026-03-22
  • PROJ-112: Profitbutler KPI-Widgets auf Dashboard (admin-only) — Tagesumsatz, Tagesgewinn, Marge mit Link zu /dashboard/profitbutler
v1.10.0262026-03-22
  • PROJ-112: Artikelsuche mit Autocomplete und Multi-Select — debounced Suche gegen /api/products, Produkt-Badges mit Entfernen, Filter Bar Integration
v1.10.0252026-03-22
  • PROJ-112: Kanal-Aufschlüsselung — Collapsible Section mit Kanal-Cards (Umsatz, Anteil, Gewinn, Marge), responsive Grid
v1.10.0242026-03-22
  • PROJ-112: Sellerboard-Tabelle mit aufklappbaren Kostengruppen (Warenkosten, Logistik, Vertrieb, Steuern, Fixkosten), Gewinn/Marge/Bestellungen, formatCents Helper
v1.10.0232026-03-22
  • PROJ-112: Profitbutler Filter Bar — Kanal-Dropdown (Alle Kanäle + Einzelkanäle), Aufträge/Rechnungen-Toggle mit Tabs
v1.10.0222026-03-22
  • PROJ-112: React Query Hook für Stats API — useProfitbutlerStats mit View/Periods/Channel/ProductIds Params
v1.10.0212026-03-22
  • PROJ-112: Profitbutler Stats Page Shell — Server Component mit Admin-Guard, Client Shell mit View/Channel/Period State
v1.10.0202026-03-22
  • PROJ-112: Profitbutler Sidebar-Navigation — Admin-only Nav Item mit TrendingUp Icon, adminOnly-Flag im NavItem Interface
v1.10.0192026-03-22
  • PROJ-112: Stats API Endpoint — /api/profitbutler/stats mit Revenue, Kosten, Gewinn pro Periode, Kanal-Aufschlüsselung, Orders/Invoices-View
v1.10.0182026-03-22
  • PROJ-112: Profitbutler Stats-Berechnungslogik mit TDD (resolvePeriodToDateRange, calculatePeriodStats, calculateGroupedCosts, calculateMarginPct)
v1.10.0172026-03-22
  • PROJ-112: Fixed-Cost-Berechnung mit TDD — calculateDailyFixedCost (distributed/due_date), calculateFixedCostsForPeriod, 12 Unit-Tests
v1.10.0162026-03-22
  • PROJ-112: Stats-Types & Interfaces für Profitbutler Statistik-Modul (PeriodStats, FixedCost, StatsResponse etc.)
v1.10.0142026-03-21
  • PROJ-98: Versand-/Service-Positionen werden in Auftragsdetails immer als letzte Positionen angezeigt
v1.10.0132026-03-21
  • PROJ-98: Shopify shipping_lines als Versandpositionen importieren — Versandkosten kommen bei Shopify nicht in line_items sondern in shipping_lines, werden jetzt mit Shipping Detection verarbeitet
v1.10.0122026-03-21
  • PROJ-98: Ziel-Artikel-Dropdown in Versandpositions-Erkennung war leer — data.products → data.data korrigiert
v1.10.0112026-03-21
  • PROJ-53: Fix Reverse Carrier Matching — is_default → is_base_method Spaltenname korrigiert, Debug-Logs entfernt
v1.10.0092026-03-21
  • PROJ-53: Reverse Carrier Matching — Shopify tracking_company wird über shopify_carrier_mappings rückwärts auf WMS-Versandart gemappt, damit Retoure-Button und Carrier-Features bei importierten Bestellungen funktionieren
v1.10.0082026-03-21
  • PROJ-53: Shopify Fulfillment-Daten beim Import übernehmen — Tracking-Nummern und shipped_at für bereits versendete Bestellungen als completed shipping_tasks importieren
v1.10.0072026-03-21
  • PROJ-107: Ländercodes bei Import normalisieren — Shopify/Amazon FBM/FBA nutzen jetzt normalizeCountryCode(), ~60 neue Länder-Mappings (EN+DE), 10 neue Dropdown-Einträge
v1.10.0012026-03-20
  • PROJ-111: FreeScout-Flowkom Connector — Read-only Lookup-API, API-Key-Authentifizierung, Marketplace-URL-Builder, Integration-Registry (freescout + support-Kategorie), DB-Migration
v1.09.035
  • Auftragsstornierung mit Beleg-Aktionen: Rechnung stornieren oder Gutschrift erstellen bei Auftragsstornierung (PROJ-110)
  • Void-Logik in wiederverwendbare Funktionen extrahiert (void-document.ts, create-credit-note.ts)
v1.09.0342026-03-20
  • PROJ-110: Erweiterter Stornierungsdialog in Auftragsübersicht — gleiche Cancel-Preview mit Belegaktionen wie im Detaildialog (Rechnungen stornieren/gutschreiben, weitere Belege, Entwurf-Löschung)
v1.09.0332026-03-20
  • PROJ-110: Erweiterter Stornierungsdialog — Rechnungs-Aktionen (Stornieren/Gutschrift/Nichts), Checkbox für weitere Belege, automatische Entwurf-Löschung, Cancel-Preview-API
v1.09.0322026-03-20
  • PROJ-110: Cancel-Route mit optionalen Document Actions — Belege vor Stornierung löschen/stornieren/gutschreiben (void/credit_note/delete), Validierung aller Aktionen vor Ausführung, Audit-Trail mit document_actions
v1.09.0302026-03-20
  • PROJ-110: Void-Route nutzt extrahierte voidDocument-Funktion (Refactoring für Wiederverwendung in cancel-with-documents)
v1.09.0292026-03-20
  • PROJ-110: createFullCreditNote-Funktion — erzeugt vollständige Gutschrift aus Rechnung ohne Stornierung (für versendete Bestellungen)
v1.09.0282026-03-20
  • PROJ-110: Extract voidDocument function into reusable lib (Billkom Phase 3)
v1.09.026
  • Gutschrift-Dialog erweitert: Dual-Modus (Positionen/Betrag) mit Brutto/Netto-Toggle
  • Verbleibender Rechnungsbetrag wird im Gutschrift-Dialog angezeigt
  • Übersteigung-Warnung mit Pflicht-Begründung statt Hard-Block
  • Belegübersicht in Auftrags-Details zeigt Rechnungen, Gutschriften und effektiven Umsatz
  • Preisnachlass-Feature komplett entfernt (ersetzt durch erweiterte Gutschrift)
v1.09.0252026-03-20
  • PROJ-109: Belegübersicht im Auftragsdetail-Dialog — Rechnungen mit Gutschriften und effektivem Umsatz (brutto), klickbare Belegnummern öffnen DocumentDetailDialog
v1.09.0232026-03-20
  • PROJ-109: Dual-Mode Gutschriftdialog — Umschaltung Positionen/Betrag, Restrechnungsinfo-Box mit Rechnungsbetrag/Gutschriften/Verbleibend, Betragseingabe (brutto/netto) mit Live-Berechnung, Überschreitungs-AlertDialog mit Pflicht-Begründung (min. 10 Zeichen)
v1.09.0222026-03-20
  • PROJ-109: Preisnachlass-Button und BillkomDiscountDialog aus documents-tab entfernt, calculateRemainingBalance integriert, activeInvoice und remainingBalance an DocumentFormDialog übergeben
v1.09.0212026-03-20
  • PROJ-109: Amount-mode Gutschriften mit Concurrency-Lock, Betragsberechnung (gross/net), Überschreitungsvalidierung und Audit-Trail (exceeding_reason Event)
  • PROJ-109: Positions-mode Gutschriften mit related_document_id, Überschreitungsvalidierung und exceeding Event-Logging
v1.09.0202026-03-20
  • PROJ-109: useRemainingInvoiceBalance-Hook hinzugefügt — leitet Restbetrag aus useBillkomDocumentsByOrder via calculateRemainingBalance ab
  • PROJ-109: useCreateDiscount (Preisnachlass) aus use-billkom.ts entfernt
v1.09.0182026-03-20
  • PROJ-109: CreditNoteAmountSchema (Betragsmodus mit gross/net-Refinement) und CreditNotePositionsSchema (Positionsmodus via CreateDocumentSchema.extend) hinzugefügt
  • PROJ-109: DiscountSchema (Preisnachlass) entfernt
v1.09.016
  • Auftragslöschung mit Belegen: Vollständige Löschung inkl. Billkom-Dokumente & Nummern-Rückgabe (PROJ-108)
  • Umlaute in Bestätigungsdialogen und Orders-API korrigiert
v1.09.0142026-03-20
  • PROJ-108: Zweistufiger Lösch-Dialog in Auftragsübersicht — optionale Beleglöschung mit Checkbox, Dokumentenliste, GoBD-Warnung, Bestätigungseingabe; Umlaut-Korrekturen
v1.09.0132026-03-20
  • PROJ-108: Zweistufiger Lösch-Dialog in Auftragsdetails — optionale Beleglöschung, Dokumentenliste mit Zahlungsstatus, Bestätigungseingabe bei Beleglöschung (GoBD-Warnung)
v1.09.0112026-03-20
  • PROJ-108: DELETE /api/orders/:id ruft bei includeDocuments=true die RPC delete_order_with_documents auf (atomische Löschung mit Belegen & Nummernkreis-Rückgabe)
v1.09.0082026-03-20
  • PROJ-108: RPC delete_order_with_documents — atomische Auftragslöschung mit Belegen, Nummernkreis-Rückgabe, Quotation-Reset, FOR UPDATE Locks
v1.09.0072026-03-20
  • PROJ-107: QA Cleanup — Test für logo_url-Feld korrigiert, doppelte Ländercodes entfernt, || 19 Falsy-Bug in Angebots-/Konvertierungslogik behoben, TS-Fehler behoben
v1.09.0032026-03-20
  • Shopify-Import: Rechnungsadresse + Lieferanschrift werden jetzt beide importiert (billing_address + shipping_address)
v1.09.0012026-03-20
  • PROJ-107: Fehlende shipping_country-Normalisierung nachgeholt (35 Länder-Mappings die in der ursprünglichen Migration fehlten)
  • PROJ-107: Gesamt-Spalte im Auftragsdetail berücksichtigt jetzt den Rabatt (discount_percent)
v1.08.0462026-03-20
  • PROJ-107: Steuerprüfung ist jetzt Pflicht vor Rechnungserstellung — bei fehlgeschlagener Prüfung Toast-Fehler statt Dialog-Öffnung; 'Erstellen & Finalisieren' in DocumentFormDialog gesperrt bis Steuer-Szenario ermittelt, Hinweistext unter dem Button
v1.08.0452026-03-20
  • PROJ-107: Billkom-Belegstatus-Badge im Auftragsdetail-Dialog (Entwurf/Rechnungsnummer/Bezahlt/Teilzahlung), ORDER_DETAIL_SELECT um billkom_documents!order_id erweitert
v1.08.0442026-03-20
  • PROJ-107: SKU wird beim Erstellen von Billkom-Belegen aus Auftragsposition in billkom_document_items übernommen (DocumentItemSchema, document-form-dialog, documents API)
v1.08.0432026-03-20
  • PROJ-107: Auftragsdetail-Dialog auf 8 Spalten erweitert (Art.-Nr., Bezeichnung, Menge, Einheit, E.-Preis, MwSt %, Rabatt %, Gesamt) + Summenblock mit Netto/MwSt-Aufschlüsselung pro Steuersatz
v1.08.0422026-03-20
  • PROJ-107: Auto-MwSt im Auftragsformular basierend auf Kundenland (Tax-Preview-Banner, automatische Steuersatz-Setzung, Read-Only MwSt bei aktivem Szenario)
v1.08.0412026-03-20
  • PROJ-107: GET /api/billkom/tax-preview Endpoint + useTaxPreview Hook (vereinfachte Steuer-Vorschau per customer_id, Standard- & Ermäßigter Satz)
v1.08.0392026-03-20
  • PROJ-107: Länder-Freitext durch Combobox-Dropdown ersetzt (34 Länder, Suche nach Name/Code, Warnung bei unbekannten Werten)
v1.08.0382026-03-20
  • PROJ-107: COUNTRY_LIST für Länder-Dropdown-Combobox exportiert (34 Länder mit deutschen Labels)
v1.08.0372026-03-20
  • SKU (Art.-Nr.) immer leer auf Rechnungen — product_id wurde nicht von Auftrags-Positionen an Beleg-Positionen übergeben
  • 7% MwSt wird als 19% gespeichert — fehlende Felder (tax_rate_percent, unit, discount_percent) in order_line_items SELECT
  • Schweizer Kunde bekommt deutsche USt — billing_country 'Schweiz' wird jetzt zu 'CH' normalisiert (zentrale normalizeCountryCode Utility)
  • Country-Normalisierung in allen 5 Finalize/Dunning-Endpoints + Queue Processor
v1.08.0342026-03-20
  • PROJ-103: DIN 5008 Form B Layout für PDF-Rechnungen (korrekte Abstände, Falz-/Lochmarken, Logo proportional skaliert in fester Box)
v1.08.0302026-03-20
  • PROJ-103: ZUGFeRD-PDF auf Deutsch (locale de-DE), Logo-Einbindung aus Billkom-Settings, Artikelnummer (SKU) in Positionstabelle
v1.08.0282026-03-20
  • PROJ-103: Ländernamen→ISO-Code Normalisierung für ZUGFeRD — 'Deutschland' statt 'DE' im customer_snapshot verursachte Profil-Validierungsfehler
  • PROJ-103: DB-Snapshot Feldnamen-Mapping für ZUGFeRD/XRechnung — sender_snapshot nutzt Settings-Keys (zip, address_line1, bank_iban) statt Mapper-Keys (postal_code, street, iban)
  • PROJ-103: Diagnostik-Daten in ZUGFeRD-Fehlermeldung für schnelleres Debugging
v1.08.024
  • PROJ-106: Billkom Positions-Integration & PDF-Overhaul — Einheitliche Positionskette Angebot→Auftrag→Rechnung
  • PROJ-106: Pixkom-Style PDF-Layout mit Logo, Artikelnummer, dreispaltiger Fußzeile, Zahlungsstatus
  • PROJ-106: Logo-Upload in Billkom-Einstellungen (Drag & Drop)
  • PROJ-106: Freiposition-Support in Kundenaufträgen und Angeboten
  • PROJ-106: Abweichungswarnungen und Teilrechnungen im Beleg-Dialog
  • PROJ-106: Shopify/Amazon Import mit Netto-Preisen und erweiterten Positionsfeldern
  • PROJ-106: Rückwärts-Tracking zwischen Angebot, Auftrag und Rechnung
  • PROJ-106: order_line_items Preise von Brutto auf Netto umgestellt
  • PROJ-106: Produkte um default_tax_category und default_unit erweitert
v1.08.0202026-03-20
  • PROJ-103: Umfassender Empty-String-Schutz im ZUGFeRD-Mapper — Pflichtfeld-Validierung + nonEmpty()-Guard für alle optionalen Felder
v1.08.0192026-03-20
  • TypeScript-Fehler in Etikettenformat-Dialog behoben (z.coerce.number → z.number + valueAsNumber)
  • TypeScript-Fehler in Auftragsdetail-Dialog behoben (Shopify-Fulfillment-Felder in OrderMetadata explizit typisiert)
v1.08.0182026-03-20
  • PROJ-103: ZUGFeRD-Download bei leerem vat_id gefixt — leere Strings verursachten 'Unknown Profile'-Fehler in factur-x-kit
v1.08.0172026-03-20
  • PROJ-98: Bestandsführung-Toggle von Tab Lieferant & Kosten nach Basisdaten verschoben
v1.08.0072026-03-20
  • PROJ-102: Nummernkreise verschwinden nach Bearbeitung — Default-Sequences werden jetzt mit DB-Einträgen gemergt statt nur bei leerer DB angezeigt
v1.08.0022026-03-20
  • PROJ-104: Produkt-Suche im Angebots-/Proforma-Formular — Artikel direkt aus Produktstamm hinzufügen mit SKU, Preis (Profitbutler VK), product_id-Verknüpfung für Auftragskonvertierung
  • PROJ-104: "Neuer Auftrag"-Button im Angebote-Tab ausgeblendet
v1.08.000
  • Billkom Phase 3: Angebote & Proforma-Rechnungen (CRUD, Finalisieren, Auftrag erstellen)
  • Billkom Phase 3: Mahnwesen mit 3 Stufen (Einzel + Batch, pg_cron Überfälligkeitserkennung)
  • Billkom Phase 3: GoBD-konforme Korrekturbearbeitung mit Concurrent Locking
  • Mahnwesen-Settings-Tab (Fristen + Gebühren pro Stufe)
  • Angebote-Tab auf Auftragsseite (nur bei billkom_enabled)
v1.07.0322026-03-20
  • PROJ-21: Auftragspositionen verschiebbar — Reihenfolge per Hoch/Runter-Buttons, persistiert über position-Spalte in DB
v1.07.0312026-03-19
  • PROJ-103: Konfigurierbares Belegnummernformat — Mit/Ohne Jahreszahl, Kurzjahr, Trennzeichen und Stellenanzahl pro Dokumenttyp einstellbar
v1.07.0292026-03-19
  • PROJ-103: Auftragspositionen werden jetzt automatisch in die Rechnungserstellung übernommen (orderLineItems Prop fehlte)
  • PROJ-103: Validierungsfehler bei leeren optionalen Feldern (E-Mail, Website, HRB, USt-ID, etc.) behoben — leere Strings werden zu null transformiert
v1.07.0282026-03-19
  • PROJ-103: Kanäle-Tab zeigt jetzt alle verbundenen Integrationen (auch ohne gespeicherte Config) — Merge von Integrations-API + Channel-Configs mit Defaults, tax_handling-Enum-Mismatch behoben
  • PROJ-103: Nummernkreise-Präfix editierbar — PUT /api/billkom/sequences (admin-only, nur wenn current_value=0), Inline-Edit-UI mit Vorschau
v1.07.0242026-03-19
  • PROJ-102: TypeScript-Fehler in tax-engine.test.ts behoben — Cast via unknown für Record<string, unknown>
v1.07.0232026-03-19
  • PROJ-103: TypeScript-Fehler behoben — Buffer/Uint8Array BodyInit-Kompatibilität, FacturX.fromObject() statt nicht-exportiertem ComfortProfileConverter, profile-Feld aus TotalsCalculatorInputType entfernt, null→undefined Coercion für customerId
v1.07.0212026-03-19
  • PROJ-103: Phase-2-Integration in Belege-Tab — BillkomDownloadButtons (PDF/ZUGFeRD/XRechnung) ersetzt Einzel-Download, canCreateInvoice-Guard mit Tooltip, Tax-Preview vor manueller Rechnungserstellung, Preisnachlass-Button + Discount-Dialog für aktive Rechnungen
v1.07.0202026-03-19
  • PROJ-103: Tax-Info-Komponente (Steuer-Szenario-Badge, Warnungen), Download-Buttons (PDF/ZUGFeRD/XRechnung mit Tooltip), Preisnachlass-Dialog (Live-Berechnung, Validierung, useCreateDiscount)
v1.07.0192026-03-19
  • PROJ-103: Kanäle-Tab in Billkom-Einstellungen mit Channel-Config-Cards (Steuerbehandlung, Absenderland, Zahlungsart, Auto-Rechnung, Auto-Bezahlt pro Kanal)
v1.07.0182026-03-19
  • PROJ-103: Job Queue Processor (processJobQueue) mit Batch-Claim, Workspace-Advisory-Lock, paralleler Workspace-Verarbeitung, Tax-Engine-Integration, Duplikatschutz, Auto-Finalisierung, Auto-Paid-Markierung und Cron API Route (POST /api/billkom/queue/process)
v1.07.0172026-03-19
  • PROJ-103: Discount (Preisnachlass) API-Endpoint mit Row-Locking, Teilgutschrift-Erstellung, Betragsvalidierung, Invoice-Status-Update und useCreateDiscount Hook
v1.07.0162026-03-19
  • PROJ-103: Channel Config GET/PUT API Routes (authenticateRequest/authenticateAdmin, rateLimitAsync, Zod-Validierung) und TanStack Query Hooks (useChannelConfigs, useUpdateChannelConfig)
v1.07.0152026-03-19
  • PROJ-103: Download-Endpoint um ZUGFeRD- und XRechnung-Formate erweitert (format Query-Parameter, Status-Prüfung auf finalisierte Belege, buyer_reference-Validierung für XRechnung, TaxResult aus Snapshot)
v1.07.0142026-03-19
  • PROJ-103: E-Invoice Adapter (EInvoiceGenerator) mit dynamic import für factur-x-kit (ZUGFeRD Comfort PDF/A-3) und xrechnung-generator (XRechnung UBL 2.1 XML), Singleton-Export, 7 Tests
v1.07.0132026-03-19
  • PROJ-103: XRechnung UBL 2.1 Mapper (mapToXRechnungInput) für xrechnung-generator Library, cents→decimal Konvertierung, buyer_reference Pflichtvalidierung, Supplier/Customer/Payment/LineItems Mapping, Reverse-Charge Notes, 57 Tests
v1.07.0122026-03-19
  • PROJ-103: ZUGFeRD ComfortProfile Mapper (mapToZugferdInput) mit TotalsCalculatorInputType-Ziel, cents→decimal Konvertierung, Discount-Allowances, Reverse-Charge taxExemptionReason, SEPA-Bankdaten, 41 Tests + Shared Fixtures
v1.07.0112026-03-19
  • PROJ-103: factur-x-kit@0.3.1 und xrechnung-generator@1.1.0 als Dependencies installiert (ZUGFeRD/Factur-X PDF-Einbettung + XRechnung UBL-XML-Generierung)
v1.07.0082026-03-19
  • E-Invoice Types, Unit Codes & Tax Category Mappings (PROJ-103): BillkomDocumentForInvoice/ItemForInvoice Interfaces, EInvoiceGenerator Interface, INVOICE_TYPE_CODES (380/381/325), UN/ECE Unit Code Map (11 WMS-Einheiten → CEFACT), Tax Category Map (7 Szenarien → ZUGFeRD-Codes S/AE/G/O)
v1.07.006
  • PROJ-102 Billkom Phase 1 als Deployed markiert
v1.07.005
  • Settings: Steuern-Tab (EU-Steuersätze, OSS-Status)
  • Settings: Nummernkreise-Tab (Präfix, Nächste-Nummer)
  • Corrective Edit Dialog (GoBD-Warnung)
  • Tax Preview (Live-Steuervorschau im Formular)
  • API: /tax-rates und /sequences Endpoints
v1.07.004
  • Bugfixes: 4 kritische + 6 wichtige Fehler behoben (DB-Spaltennamen, Corrective Edit Beträge, Search-Injection, Tax-Kategorie)
v1.07.002
  • PROJ-102: Billkom-Integrationspoints verdrahtet — konditionaler "Belege"-Tab im Auftragsdetail-Dialog (lazy-loaded, billkom_enabled-Flag), Phase-3-Kommentar in Auftragsübersicht
  • PRD aktualisiert: Rechnungsmodul (Billkom) aus Non-Goals herausgenommen, Billkom Phase 1-3 in Roadmap-Tabelle aufgenommen
v1.07.0012026-03-19
  • Billkom Document UI Components (PROJ-102): Belege-Tab für Auftragsdetails, Beleg-Detail-Dialog mit Positionen/Zahlungen/Aktionen, Beleg-Formular-Dialog mit dynamischen Positionen und Live-Summenberechnung, Zahlungsbuchungs-Dialog, Stornierungs-Dialog mit Gutschrift-Hinweis
v1.07.0002026-03-19
  • Billkom Settings-Seiten & Setup-Wizard (PROJ-102): Settings-Navigation-Eintrag, Hauptseite mit Tab-Navigation (Unternehmen, Zahlungen, Vorlagen), 3-Schritt-Setup-Wizard mit Firmen- und Bankdaten, Skonto-Konfiguration, Accordion-Vorlagen-Editor für 6 Belegtypen
v1.06.012
  • src/hooks/use-billkom.ts — TanStack Query hooks für alle Billkom-Endpunkte (Settings, Dokumente, Zahlungen, Tax/VIES)
  • src/components/billkom/status-badge.tsx — BillkomStatusBadge-Komponente mit 7 Status-Konfigurationen (Entwurf, Finalisiert, Teilbezahlt, Bezahlt, Überfällig, Storniert, Umgewandelt)
v1.06.011
  • pdf-generator.ts — Billkom PDF-Generator mit jsPDF + jspdf-autotable; rendert aus Snapshots (customer_snapshot, sender_snapshot, tax_rate_snapshot)
  • GET /api/billkom/documents/[id]/download — PDF-Download-Endpoint aktiviert, gibt echtes PDF statt 501 zurück
v1.06.010
  • POST /api/billkom/payments — Zahlung an Beleg buchen, DB-Trigger aktualisiert Status
  • DELETE /api/billkom/payments/[id] — Zahlung löschen (Admin only)
  • POST /api/billkom/tax/check — Steuervorschau ohne Belegerststellung
  • POST /api/billkom/tax/vies-validate — USt-IdNr. via EU VIES API validieren mit Caching
v1.06.0092026-03-19
  • Billkom Document Action APIs (PROJ-102): Finalize (Tax Engine + Snapshot + RPC), Void (Admin-only + Auto-Gutschrift), Corrective Edit (GoBD SET LOCAL bypass), Download (501-Platzhalter für Task 13), billkom_apply_corrective_edit SQL-Funktion
v1.06.008
  • PROJ-102: Billkom Settings API (GET/PUT) mit EU-Steuerrate-Seeding (27 Länder)
  • PROJ-102: Billkom Documents CRUD API (POST, GET Liste mit Cursor-Pagination)
  • PROJ-102: Billkom Document Detail & PATCH API (Entwurf bearbeiten)
  • PROJ-102: Billkom Documents by-Order API (GET nach Order-ID)
v1.06.0072026-03-19
  • Billkom Phase 1 DB-Migration (PROJ-102): Komplettes Datenbankschema — 11 Tabellen, 3 ENUMs, 6 Funktionen (inkl. GoBD-Trigger, gap-free Nummernvergabe, atomische Finalisierung), 13 Indexes, RLS-Policies
v1.06.0042026-03-19
  • Billkom Document Lifecycle Helpers (PROJ-102): Pure-Function-Bibliothek für Zeilenposten-Berechnung, Dokumentsummen, Aufbewahrungsfristen (§147 AO), Zahlungszieldaten, Status-Transitionen und Kunden-/Absender-Snapshots
v1.06.003
  • PROJ-102: VIES-Validierungsmodul (vat-validation.ts) mit Cache-Logik, API-Isolation und Override-Validierung
  • PROJ-102: lookupTaxRate() in tax-engine.ts für Steuerssatz-Lookup aus billkom_tax_rates
v1.06.0002026-03-19
  • Billkom Foundation (PROJ-102): TypeScript-Typen, EU-Länderliste und Konstanten für das Rechnungsmodul — TaxContext, TaxResult, TaxScenario, DocumentTypeAllowed, TaxEngineError, ALLOWED_TRANSITIONS, DOCUMENT_PREFIXES, RETENTION_YEARS
v1.05.0082026-03-19
  • Vitest Test-Framework eingerichtet (PROJ-102 Billkom-Vorbereitung): node-Umgebung, globals, @-Alias
v1.05.0072026-03-19
  • Profitbutler Settings: Dropdown durch Tab-Page ersetzt (konsistent mit Versand-Pattern), alte URLs redirecten automatisch, HelpLink-Pfade auf neue Docs-Struktur aktualisiert
v1.05.0062026-03-19
  • Profitbutler Settings-Restrukturierung (PROJ-105): USt-Sätze und Wechselkurse unter neuer Profitbutler Tab-Page in den Settings zusammengefasst
v1.05.0052026-03-19
  • Billkom Rechnungsmodul Specs (PROJ-102/103/104): Vollständige Feature-Spezifikationen für 3-phasiges Rechnungsmodul — Tax Engine, GoBD-Compliance, E-Rechnung, Angebote, Mahnwesen
v1.05.0012026-03-19
  • Server-seitige Validierung für is_one_of/is_none_of Operatoren und sales_channel Feld ergänzt
  • Value-Reset beim Wechsel zwischen Single/Multi-Operator im Workflow-Builder
v1.05.0002026-03-19
  • Mehrfachauswahl-Operatoren für Workflow-Bedingungen (PROJ-101): IST EINES VON / IST KEINES VON für Versandart, Verkaufskanal und Lieferland — z.B. 'WENN Kanal = Otto UND Versandart ist eines von [Brief, Kompaktbrief, Großbrief] DANN Versandart = DHL Kleinpaket'
  • Multi-Select UI mit Checkbox-Popover und Chip-Badges im Workflow-Builder
v1.04.0022026-03-19
  • Workflow-Tabelle: Drag & Drop für Prioritätsreihenfolge mit GripVertical-Handle und Prioritätsnummer
  • Cross-Workflow Conflict Resolution: First-Write-Wins pro Feld — spätere Workflows überspringen bereits geänderte Felder
  • Workflow Audit-Trail: Übersprungene Aktionen werden mit skipped_reason dokumentiert
  • Verkaufskanal-Badge im Auftragsdetail-Dialog
  • Kanal-Filter und Workflow-Builder Dropdowns dynamisch aus DB statt hardcoded
  • Batch-Zuweisung: Bestehende Bestellungen nachträglich einem Verkaufskanal zuordnen
  • Aktiv/Inaktiv-Toggle für Channel-Rules
  • Verkaufskanal als konfigurierbare Spalte im Spalten-Picker
v1.04.0002026-03-19
  • Verkaufskanal-Erkennung (PROJ-100): Tag-basiertes Channel-Mapping pro Shopify-Integration (Otto, Temu, eBay, Kaufland, TikTok, Zalando etc.)
  • Channel-Rules UI: Drag & Drop Reihenfolge, Preset-Farben, Tag-Vorschläge, Kanal-Badges in Auftragsliste
  • Verkaufskanal-Filter: Neue Filterleiste in der Auftragsliste nach Verkaufskanal
  • Workflow-Condition 'Verkaufskanal': Regeln wie 'WENN Kanal = Otto DANN Versandart DHL' möglich
  • Workflow-Priorität: sort_order für Workflows, Ausführungsreihenfolge steuerbar, first-match-wins bei Konflikten
v1.03.0032026-03-19
  • HelpLink-Pfad für Nachfüll-Profile korrigiert (nachfüllung → nachfuellung in URL)
v1.03.0012026-03-19
  • Service-Artikel & Versandpositions-Erkennung (PROJ-98): inventory_tracking Flag auf Produktebene, automatische Keyword-Erkennung beim Import (Shopify/Amazon), Service-Badge in Produktliste und Aufträgen, ShippingDetectionSection pro Integration, Systemausschlüsse (Picklisten, Wareneingang, Bestandsübersicht, Bestellvorschlag)
  • Shopify OAuth Callback überschreibt User-konfigurierte Versandpositions-Keywords nicht mehr
  • Korrekter Hinweistext für Versandpositions-Erkennung (Freiposition statt Überspringen)
v1.02.011
  • PROJ-99: Etikettendruck-Modul (Formate, Vorlagen, Barcode-Druck für Lagerplätze & Produkte)
  • Lint-Fehler behoben: Date.now() in currency-rates Seite, setState in useEffect in use-column-config Hook
v1.02.007
  • PROJ-99: Storage-Cleanup für Etiketten-Labels in print-job-result – temporäre Label-PDFs (storage_label, product_label) werden nach erfolgreichem Druck automatisch aus dem Supabase Storage gelöscht
v1.02.005
  • PROJ-99: PDF-Renderer für Etikettendruck – renderLabelPdf() mit dynamischer Skalierung, EAN-13-Validierung, HRI-Text und optionalem Label-Text
v1.02.004
  • Barcode-Adapter für Etikettendruck-Modul (PROJ-99): EAN-13-Validierung mit Prüfziffer, Code128/Code39-Rendering, dynamische Skalierung auf verfügbare Labelgröße, 300-DPI-Auflösung
v1.02.000
  • PROJ-99: Etikettendruck-Modul — label_formats und label_templates Tabellen mit System-Presets (7 Templates, 2 Formate), RLS, label_type Enum-Erweiterung (storage_label, product_label, return_label)
v1.01.0182026-03-18
  • PROJ-97 Code Cleanup: Duplizierte GraphQL Mutation, No-Op Code, unused Variables, redundanter Ship-Route Call entfernt
v1.01.0172026-03-18
  • Shopify Return-Tracking: Inline GraphQL-Call statt fire-and-forget (behebt still fehlschlagenden separaten Aufruf)
v1.01.0162026-03-18
  • Shopify Return-Tracking: GraphQL API statt REST (REST unterstützt nur 1 Trackingnummer)
  • Outbound + Return Trackingnummern werden als Array via GraphQL fulfillmentTrackingInfoUpdate übergeben
v1.01.0152026-03-18
  • Shopify Return-Tracking: Überschreibt nicht mehr das Outbound-Tracking (beide Nummern werden zusammen gesendet)
  • Shopify Carrier: Wird aus dem Carrier-Mapping geladen statt hardcoded "DHL Express"
v1.01.0142026-03-18
  • Shopify DHL Carrier: "DHL Germany" als korrekter Shopify tracking_company Wert bestätigt
v1.01.0132026-03-18
  • Shopify DHL Carrier-Code: "DHL" statt "DHL Germany" — korrekter offizieller Shopify tracking_company Wert
v1.01.0122026-03-18
  • Shopify Carrier-Liste: DHL Germany, DPD Germany, Hermes Germany hinzugefügt
  • Shopify Retour-Tracking: Wird nach Fulfillment-Retry automatisch mitgesendet
v1.01.0112026-03-18
  • Shopify Fulfillment Scopes: read/write_merchant_managed_fulfillment_orders hinzugefügt (API 2023-01+)
  • Shopify 403 Handler: Fehlende Scopes setzen Integration nicht mehr auf error
v1.01.0102026-03-18
  • Shopify confirm-shipment: Falscher Spaltenname (external_source → source) behoben
  • Shopify manueller Retry: pending Status als retryable hinzugefügt
v1.01.0092026-03-18
  • Shopify OAuth Reconnect nach Disconnect/Deinstallation funktioniert jetzt zuverlässig
  • Reconnect-Banner in UI für getrennte/fehlerhafte Shopify-Verbindungen
  • Fulfillment Service erkennt ungültige Tokens (401/403) und markiert Integration als fehlerhaft
v1.01.0022026-03-18
  • Shopify Metafeld-Sync: Flexibler Builder zum Befüllen von Shopify-Metafeldern mit WMS-Daten (Auftragsnummer, Tracking, Retour-Tracking, Tags, etc.)
v1.01.0002026-03-18
  • Shopify Versandrückmeldung: Trackingnummer + Carrier automatisch an Shopify senden (Fulfillment API)
  • Carrier-Mapping: WMS-Versandart → Shopify Carrier konfigurierbar (DHL Express, Deutsche Post, etc.)
  • Retour-Tracking: Auto-Return Trackingnummer als zusätzliche Trackingnummer an Shopify senden
  • Fulfillment-Toggle pro Integration, Retry-Queue mit Cron, Status-Badge im Auftragsdetail
v1.00.0252026-03-18
  • Shopify-Import löschen Button in Multi-Integration Detailseite hinzugefügt — ermöglicht erneuten Import für Tests
v1.00.0242026-03-18
  • Aufträge mit Picklist-Zuweisungen können jetzt gelöscht werden — FK-Constraint von RESTRICT auf CASCADE geändert
v1.00.0232026-03-18
  • Auto-Retourenlabel nutzt jetzt die separate DHL Retoure API statt dhlRetoure VAS — behebt 'The service entered is unknown' Fehler
v1.00.0222026-03-18
  • Freipositionen im Auftrags-Bearbeiten-Dialog sichtbar und löschbar — vorher konnten Shop-Artikel ohne WMS-Zuordnung nicht entfernt werden
v1.00.0212026-03-18
  • Shopify Produkt-Import Button fehlte in der Multi-Integration Detailseite — bei PROJ-50-52 Migration vergessen
v1.00.0202026-03-18
  • Settings-Tabs: Layout-Shift bei Tab-Wechsel behoben — Tabs springen nicht mehr durch Bold-Font-Wechsel
v1.00.0192026-03-18
  • DHL Retoure: Locations ohne billingNumber-Filter abfragen — Empfänger ist kontogebunden, nicht BN-gebunden
v1.00.0182026-03-18
  • DHL Retoure: Einheitliche Retoure API für alle Länder — ReceiverID ist der Empfänger (dein Lager), Kundenland wird über shipper.country übergeben
v1.00.0162026-03-17
  • DHL Retoure: ReceiverID wird automatisch per Abrechnungsnummer aufgelöst (GET /locations?billingNumber=...) — kein manuelles Konfigurieren nötig
  • DHL Retoure: fehlende DB-Spalte "currency" blockierte alle Retourenlabel-Erstellungen
  • Code-Cleanup: Shipping API v2 dhlRetoure-VAS-Pfad und Debug-Logging entfernt
v1.00.0072026-03-17
  • DHL Retoure International: Zollinhaltsangaben für Nicht-EU Retouren (Schweiz etc.)
v1.00.0062026-03-17
  • DHL Retoure International: Auslands-Retouren über Shipping API mit dhlRetoure VAS statt Retoure API
v1.00.0052026-03-17
  • DHL Retoure: Receiver-ID automatisch nach Kundenland auflösen (internationale Retouren)
v1.00.0042026-03-17
  • DHL Retoure API: Straße und Hausnummer korrekt als separate Felder splitten
v1.00.0032026-03-17
  • DHL Retoure API Auth: nur Bearer Token, kein dhl-api-key Header (DHL akzeptiert nicht beides gleichzeitig)
v1.00.0022026-03-17
  • DHL Retoure API Auth-Fix: dhl-api-key Header + diagnostisches Error-Logging
v1.00.0012026-03-17
  • Echte DHL RETOURE ONLINE Labels statt normale Paketlabels mit getauschten Adressen (DHL Retoure API)
v1.00.0002026-03-01
  • Produktverwaltung mit Varianten, Bundles und Tags (PROJ-2, 15, 16, 78, 79, 88, 89)
  • Lagerverwaltung mit 5-stufiger Hierarchie und Standort-Wizard (PROJ-3, 4, 34-36)
  • Bestandsführung mit Bewegungshistorie und FIFO-Bewertung (PROJ-5, 14, 73, 74)
  • Wareneingang frei und gegen Bestellung (PROJ-6)
  • Kundenauftrags-Verwaltung mit Audit-Trail (PROJ-21, 59, 90)
  • Sammelkommissionierung mit Picklisten-Profilen (PROJ-9, 10, 92)
  • Versandprozess mit Label-Generierung und Zollinhaltserklärung (PROJ-11, 70)
  • Lieferanten- und Einkaufsbestellungen mit Kanban-Board (PROJ-18-24, 75, 76, 81)
  • Shopify-Integration mit Multi-Shop und SKU-Matching (PROJ-7, 8, 50-55)
  • Amazon SP-API Integration (FBM + FBA) mit Carrier-Mapping (PROJ-60-64, 67-69, 71, 72)
  • DHL und Deutsche Post Internetmarke Integration (PROJ-12, 27, 40)
  • Print Broker mit Workstation-Pairing und Job-Queue (PROJ-25, 37-39, 41)
  • Nachfüllung / Replenishment mit Profilen und Berichten (PROJ-94)
  • Daten-Hub mit CSV Import/Export und Templates (PROJ-84-87)
  • Workflow-Engine mit Trigger, Bedingungen und Aktionen (PROJ-56-58, 93)
  • Einstandspreis und Profitbutler-Integration (PROJ-73, 74, 82, 83)
  • Team-Verwaltung mit Rollen und PIN für Mobile (PROJ-32, 33, 80)
  • Sortiernummer pro Lagerplatz für Picking-Routen (PROJ-91)
  • Performance: Trigram-Indexe, JWT-Claims, Batch-Operationen (PROJ-40-49)
  • Datenbereinigung mit TTL-Policies (60d Print-Jobs, 90d Sync-Logs) (PROJ-47)
Flowkom Mobilev1.8.13
v1.8.12Latest2026-05-08
  • Drawer-Navigation nutzt jetzt durchgängig router.replace statt router.push für Modul-Wechsel. Vorher stackten sich Module übereinander wenn der Worker übers Burger-Menü zwischen Plus, Minus, Umlagern etc. wechselte — Wisch-zurück lief dann durch jedes je-geöffnete Modul. Jetzt: Modul-zu-Modul-Wechsel ersetzt den Stack-Eintrag, Wisch-zurück geht direkt zu Home. Innerhalb eines Moduls (z.B. Picking → Picklist-Detail) bleibt push aktiv, damit Wisch-zurück sauber zur Liste führt.
v1.8.102026-05-08
  • PROJ-305 (intern PROJ-304 wegen ID-Race): Pickliste am Scanner-Gerät erstellen. Plus-Button '+ Neue Pickliste erstellen' über der Picklisten-Liste im Picking-Modul. Tap öffnet ein Bottom-Sheet mit aktiven Picklisten-Profilen + 'X pickbare Aufträge'-Counter pro Profil. Tap auf Profil mit Aufträgen → POST /api/picklists → 'PICKLISTE ERSTELLT'-Vollbild-Overlay → Modal schließt → Liste refreshed. Profile mit 0 Aufträgen ausgegraut. Keine Auto-Navigation — User entscheidet selbst was als nächstes. Kein Backend-Change, alle Endpoints existierten schon. Pattern 1:1 vom Replenishment-Modul (inline NewOrderModal).
v1.8.82026-05-07
  • (A) GEBUCHT-Bestätigung in Plusbuchung-by_location-Buchen-Button-Pfad: stock-increase resetFlow() rief setFeedback(null), was durch React-Batching die success-Animation überschrieb — ScanFeedback sah nie status=success. Andere Module hatten den Bug nicht. Fix: setFeedback(null) aus resetFlow entfernt, onAnimationEnd resettet sauber.
  • (B) Tap auf Lagerplatz in by_article-Modus (Plus + Minus) löste sofort Buchung aus — User-Feedback 'sehr fehleranfällig'. Fix: handleSourceSelect setzt nur noch State, Banner 'Ausgewählt: {Lagerplatz}' + großer 'Buchen auf X'-Button erscheint, User klickt explizit Buchen. Lagerplatz-Scan bleibt der schnelle Power-User-Pfad.
v1.8.62026-05-07
  • Prominentes Buchungs-Bestätigungs-Overlay 'GEBUCHT' nach jeder erfolgreichen Buchung in allen 5 Buchungs-Modulen (LB-WE, Frei-WE, Umlagern, Plus, Minus). Bisheriges ScanFeedback war mit opacity 0.4 / 400ms / ohne Text viel zu subtil — User-Feedback 'wenn ich etwas buche bekomme ich keinerlei bestätigung angezeigt'. ScanFeedback erweitert um optionales text-Prop: mit Text → big mode (opacity 0.92, 1200ms, fontSize 48 fett mit Schatten, klar als Buchungs-Bestätigung lesbar), ohne Text → small mode wie bisher (für reine Scan-Events).
v1.8.42026-05-07
  • PROJ-295: Universal-Post-Scan-Card jetzt auch in Umlagern, Plusbuchung und Minusbuchung. Im by_article-Modus zeigt die App nach Artikel-Scan die ProductLocationsList aus PROJ-291 — jetzt mit Tap-to-select für Quell-Lagerplatz, FBA gefiltert, Sperr-Pill bei Sperrlager (ersetzt die bestehende inline-stockLocations-Implementierung, die FBA nicht filterte). Im by_location-Modus zeigt nach Lagerplatz-Scan eine neue LocationContentsList die Artikel mit Bild (32×32) + Tap-to-select. Tap setzt Menge=1 + Step=ready (einheitlich über alle Module per Memory-Regel). Max-Button neben QuantityInput füllt vollen Lagerplatz-Bestand (besonders nützlich bei Minusbuchung 'Lagerplatz leerräumen'). FBA-Lagerplatz-Scan bekommt 403 mit klarer Fehlermeldung. Wareneingang/Inventur/Picking/Replenishment unangetastet.
v1.8.22026-05-06
  • PROJ-291: Im Wareneingang (LB + Frei) zeigt die App nach dem Artikel-Scan eine Bestandsliste pro Lagerplatz (Top 3 + '+ N weitere'-Chip, sortiert nach Menge desc). FBA-Pool gefiltert via warehouses.is_read_only, Sperrlager bleibt drin mit '[Sperr]'-Pill in Amber. Bei Multi-Warehouse-Workspace kommt ein Lager-Präfix vor den Lagerplatznamen. Freier WE bekommt zusätzlich einen Artikel-Lookup-Step über /api/products/by-barcode — bei bekanntem Artikel volle Card mit Bild + Bestandsliste, bei unbekanntem Barcode bleibt der bisherige Flow als Fallback. Branch + Commit-Tag tragen historisch PROJ-290 wegen ID-Race mit der Cost-Breakdown-PR im Web-Repo.
v1.7.02026-03-17
  • Responsive Scaling für alle Android-Geräte (26 Dateien)
  • Auto-Logout nach konfigurierbarer Zeit
  • ConnectionContext — ein einziger Netzwerk-Listener statt pro Screen
  • Nachschub-Modul im Drawer-Menü ergänzt
  • ModuleCard mit optionaler Beschreibung
  • Token-Refresh Race Condition behoben (Promise-Lock)
  • Idempotency-Keys aus Buchungsdaten statt Date.now()
  • Bestätigungsdialog vor Gerät zurücksetzen
  • OTA-Update unterbricht laufende Buchungen nicht mehr
  • processQueue Concurrency-Lock gegen Doppelverarbeitung
  • JSON.parse Safety in Auth, Settings und Offline-Queue
  • ScanFeedback useEffect Dependencies korrigiert
  • Unnötige Android-Permissions blockiert (RECORD_AUDIO, SYSTEM_ALERT_WINDOW)
  • Cache-Cleanup bei vollem In-Memory-Cache
  • advanceToNext Deklarationsreihenfolge in Picking korrigiert
  • Release-Build mit eigenem Production-Keystore statt Debug-Key
v1.4.02026-02-15
  • Nachfüllung / Replenishment Workflow (PROJ-94)
  • Auto-Confirm Picking ohne Mengenbestätigung
  • Text-to-Speech für Lagerplatz-Ansage
  • Kompakter Homescreen mit 2-Spalten Grid
  • Picking-Einstellungen (Mengenbestätigung, TTS)
  • Android-Navigationsleiste im Dark Theme
  • ScanInput OK-Button Verhalten korrigiert
  • Scanner-Erkennung und Picking Skip-Logik
  • Bottom-Padding für Navbar auf allen Workflow-Screens
v1.3.02026-02-01
  • Wareneingang gegen Lieferantenbestellung (LB)
  • Picking komplett neu geschrieben (Scanner-optimiert)
  • Custom NumPad für Mengeneingabe
  • Produktbild-Anzeige
  • Lagerplatz-Vorschläge bei Einlagerung
  • Rescan für Menge +1, Lagerplatz-Scan bucht automatisch
  • API-Feldnamen korrigiert (ean → barcode)
  • Grund-Buttons durch optionales Textfeld ersetzt
v1.2.02026-01-20
  • Dual-Mode Flows (nach Lagerplatz / nach Artikel)
  • Burger-Menü Navigation
  • Scan-Validierung in allen Workflows
  • Konfigurierbarer Server-URL bei Aktivierung
  • Versionsbadge auf allen Screens
  • OTA-Update Check beim App-Start
  • Enter-Taste nutzt Input-Text direkt
  • Auto-Focus auf ScanInput
  • expo-av Import für Expo Go abgesichert
v1.0.02026-01-01
  • Geräte-Aktivierung mit Pairing-Code
  • Worker-Login mit PIN
  • HID-Scanner-Integration (Timing-basiert)
  • Sammelkommissionierung / Picking
  • Umlagern zwischen Lagerplätzen
  • Plusbuchung (Bestandserhöhung)
  • Minusbuchung (Bestandsreduzierung)
  • Freier Wareneingang
  • Offline-Queue mit Auto-Sync bei Reconnect
  • Sound- und Vibrations-Feedback beim Scannen
  • Einstellungen (Sound, Vibration, Lautstärke, Tastatur)
v0.0.0-fix-double-submit2026-04-14
  • Double-Submit-Schutz für Plusbuchung, Minusbuchung und Umlagerung (Native App) — synchroner useRef-Guard verhindert Mehrfachbuchungen
Flowkom Print Agentv1.0.3
v1.0.1Latest2026-03-17
  • Rebranding zu Flowkom Print Agent
  • Alle Abhängigkeiten in EXE eingebettet (pdfium.dll)
  • Automatische Versionierung bei jedem Build
  • Cross-Compilation von macOS ermöglicht
v1.0.02026-02-01
  • Silent ZPL Label Printing auf lokale Drucker
  • Silent PDF Label Printing via PdfiumViewer
  • Supabase Edge Function Integration (Polling)
  • Device Pairing mit 6-stelligem Code
  • Heartbeat und automatische Printer-Discovery
  • Windows Installer mit Inno Setup (Autostart, Voraussetzungsprüfung)
  • Self-contained EXE ohne .NET-Installation
  • GitHub Actions CI/CD Pipeline
Flowkom Docsv1.1.27
v1.14.020Latest2026-04-27
  • Neue Architektur-Sektion mit Seite "Bestandssynchronisation" — beschreibt Queue-Modell, DB-Trigger, App-Hook-Defense-in-Depth, Safety-Sync und Drift-Diagnose. Mermaid-Diagramm zeigt den Flow Stock-Change/Order-Lifecycle → Queue → Cron → Shopify/Amazon.
v1.14.019
  • Versandarten-Hilfeseite: Vollständige Anleitung mit Priorität, Drag & Drop, Workflows, Fallback-Logik
v1.14.006
  • Neue Hilfeseite: Produktdokumente (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
  • Dokumentation aller 18 EU-Produktkategorien mit Richtlinien und Normen
  • Anleitung für Hersteller-Stammdaten, Varianten-Support und FAQ
v1.1.252026-04-19
  • PROJ-237: Neue Hilfeseite 'Nachlaufkosten' (einkauf/nachlaufkosten) — Was sind Nachlaufkosten (Fracht/Zoll/Sonstige EUR+Fremdwährung), Karten im Kosten-Tab, Vergleichstabelle der drei Verteilmethoden (Volumen/Warenwert/Menge) mit Empfehlungen pro Szenario (Container→Volumen, Versicherung→Warenwert, Handling→Menge), Wechselkurs-Semantik (1 EUR = X Fremdwährung, Quelle api/manual), retroaktive FIFO-Korrektur mit Mermaid-Flowchart (DB-Trigger → calculate_landed_costs → goods_receipt_items + stock_movements), typischer Workflow (Container-Import aus China mit CNY+EUR-Kosten) als Mermaid-Sequenz, FAQ (Division bei Kurs, Verteilmethoden-Wechsel, LB-übergreifende Fracht, Rechnungen), aufklappbare Technik-Details (calculate_landed_costs-RPC, Trigger, purchase_orders/goods_receipt_items/stock_movements).
v1.1.232026-04-19
  • PROJ-232: Neue Hilfeseite 'Versandinfo-Tags' (einkauf/versandinfo-tags) — Vollständige Incoterms-2020-Referenz (alle 11 Codes EXW/FCA/FAS/FOB/CFR/CIF/CPT/CIP/DAP/DPU/DDP mit Kosten/Risikoübergang/Use-Case), Transportart-Tabelle (Schiff/Luft/Zug/LKW mit Laufzeiten aus Asien), Händler-Entscheidungsvergleich FOB vs. CIF vs. DDP, Mermaid-Flowchart für den Tag-Setzen-Workflow beim LB-Anlegen, Gantt-Diagramm für Laufzeitvergleich, aufklappbare technische Details (DB-Spalten `incoterm`/`transport_mode`, Zod-Schemas, Audit Trail), FAQ zu rechtlicher Relevanz und Incoterms-2010-Altbegriffen (DAT→DPU, DDU→DAP). Neuer Top-Level-Bereich 'Einkauf' im Sidebar-Meta.
v1.1.222026-04-18
  • PROJ-223: Dokuseite 'Bestellungen' überarbeitet — alte Filterleisten-Beschreibung ersetzt durch drei klar getrennte Abschnitte: Unified Search mit Scope-Dropdown-Tabelle (Überall/Auftrag+Kunde/Artikel/Notiz/Externe Nr.) inkl. konkreten Beispielen (Amazon-Nr. findet externe Bestellnr., eBay-Nr. findet Notiz, SKU/EAN/ASIN/FNSKU findet Artikel), kompakte Status-Pipeline-Tabs, Filter-Drawer mit sekundären Filtern und Aktive-Filter-Chipleiste mit prominentem 'Alle zurücksetzen'-Button.
v1.1.202026-04-09
  • PROJ-177: Neue Dokuseite 'Amazon FBA-Bestand' (integrationen/amazon-fba-bestand) — Mermaid-Flowchart des FBA-Stock-Sync-Pfads (SP-API → pullFbaInventory → sync_amazon_fba_stock RPC → public.stock + stock_movements), Erklärung von FBA-POOL als virtueller Sammel-Location, read-only Warehouse-Semantik, Bewertung/Bestellvorschlag-Effekte, Tabelle der bekannten Einschränkungen (Doppelzählung, Cost-Approximation, Retouren-Semantik, Unmapped SKUs) mit Verweis auf PROJ-178, technische Referenz (RPC-Signaturen, Movement-Type, Code-Pfade).
v1.1.192026-04-08
  • PROJ-172: Neuer Abschnitt 'Nächtlicher automatischer Refresh' auf der Amazon-Angebote-verwalten-Doku. Enthält Mermaid-Flowchart des Cron-Pfads (Scheduler → Integrations-Loop → advanceListingsJob → per-MP-Isolation → Cross-MP-Propagation → finishLog), Vergleichstabelle der Amazon-Cron-Zeiten (Listings 02:00, FBA-Inventory 03:15), Opt-Out-Erklärung, Anleitung für manuelles Testen (Cron-Jobs-Tab-Trigger + 'Jetzt starten'-Button pro Integration), aufklappbare Technik-Details zu 'Warum kein pg_cron?' und 'Warum kein wöchentlicher Force-Full?'.
v1.1.182026-04-08
  • Amazon-Angebote verwalten: Neuer Abschnitt 'FBA-Bestand' mit Mermaid-Flow, Ereignis-Tabelle und Technik-Details zum Trigger-basierten Sync (PROJ-171).
v1.1.172026-04-08
  • PROJ-170: Neue Dokuseite 'Amazon-Angebote verwalten' — Mermaid-Workflow-Flowchart (Filter → Selektion → Bulk-Aktion), FBA/FBM-Vergleichstabelle, Filter-Übersicht, Beispiel-Workflow '50 unzugeordnete FBA-DE-Angebote auf einmal mappen', Spalten-Konfiguration, CSV-Export, aufklappbare Technik-Details (API-Endpoints, Indizes, Selektions-Modell).
v1.1.162026-04-08
  • Amazon-Integration: Vollständige Dokumentation ersetzt den Stub — Mermaid-Flowchart, FBM/FBA-Vergleichstabelle, Filter-Übersicht, Status-Mapping Amazon → Flowkom, FAQ (PROJ-167)
v1.1.152026-04-02
  • Shopify-Integration: Vollständige Dokumentation (Verbindung, Import, Fulfillment, Erstattungen, Fehlerbehebung)
  • Bestellungen: Zahlstatus-Erklärung und Erstattungs-Anleitung ergänzt
v1.1.142026-04-01
  • FreeScout-Integration Doku überarbeitet: Matching-Logik mit Mermaid-Flowchart, eBay-Username-Lookup, Carrier-Erkennung, Deeplinks, marktplatzspezifische Fehlerbehebung
v1.1.82026-03-22
  • Cloud-Speicher Dokumentation: Übersichtsseite (Funktionen, unterstützte Anbieter, Ordnerstruktur) + ausführliche OneDrive-Einrichtungsanleitung (Azure App-Registrierung, Berechtigungen, Env-Vars, Fehlerbehebung)
v1.1.72026-03-20
  • FreeScout-Integration: Ausführliche Einrichtungsanleitung (Flowkom + FreeScout Modul), Sidebar-Funktionen, Fehlerbehebung, Sicherheitsübersicht
v1.1.62026-03-19
  • Profitbutler Restrukturierung: USt-Sätze und Wechselkurse von einstellungen/ nach einstellungen/profitbutler/ verschoben, neue Profitbutler-Unternavigation
v1.1.42026-03-19
  • Druckvorlagen-Dokumentation (PROJ-99): Etikettenvorlagen, Etikettenformate, Druckflow, Barcode-Typen, Layout-Erklärung, FAQ
  • Service-Artikel-Dokumentation (PROJ-98): Versandpositions-Erkennung und inventory_tracking Flag
v1.1.22026-03-15
  • Automatische Versionierung mit Bump-Script
  • Drucker-Dokumentation (Einrichtung, Fehlerbehebung)
  • Nachfüllung komplett dokumentiert (5 Seiten: Übersicht, Profile, Bericht, Mobile, Prozess)
  • Picklisten-Dokumentation erweitert (Profile, Mobile Picking, Prozessdetails)
  • Tags-Dokumentation
  • Sortiernummer-Dokumentation
  • Flowkom Mobile Dokumentation (5 Seiten: Übersicht, Einrichtung, Bedienung, Einstellungen, Fehlerbehebung)
  • Deutsche Umlaute in allen Dokumentationsseiten korrigiert
v1.0.02026-01-15
  • Erste Schritte Guide (Workspace einrichten, Benutzer anlegen, erste Bestellung)
  • Artikel und Lager Dokumentation (Produkte, Lagerplätze, Bestände, Systemlagerplätze)
  • Aufträge und Versand Dokumentation (Bestellungen, Picklisten, Versand, Retouren)
  • Daten-Hub Dokumentation (CSV Import/Export, Vorlagen, Feldreferenz)
  • Einstellungen Dokumentation (13 Seiten)
  • Integrationen Dokumentation (Shopify, Amazon)