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
Lagerplatz-Vorschläge bei Einlagerung
Rescan für Menge +1, Lagerplatz-Scan bucht automatisch
Dual-Mode Flows (nach Lagerplatz / nach Artikel)
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
HID-Scanner-Integration (Timing-basiert)
Sammelkommissionierung / Picking
Umlagern zwischen Lagerplätzen
Plusbuchung (Bestandserhöhung)
Minusbuchung (Bestandsreduzierung)
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.
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)
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)