10
Ideen
0
In Arbeit
896
Features
Ideen
10
Flowkom Print Agent für Mac
Nativer Print Agent für macOS mit CUPS-Integration, gleiche Supabase-API wie der Windows-Agent.
Boxen-Picking (PROJ-297)
Wagen-Stammdaten (Box-Anzahl, optionale Sammelbox), neuer Picklisten-Profil-Modus box_picking. Picker bekommt beim Greifen direkte Box-Anweisung ("→ Box 5"), Multi-Order-Aufträge stehen am Pack-Tisch vorsortiert in Boxen, Versand-Flow unverändert. Optionale Sammelbox für Single-Item-qty-1-Aufträge.
Drucker-Zuweisung für Etiketten-Typen pro Workstation
Strukturelle Lücke im Etikettendruck-Modul: Print-Label-Dialog schreibt print_jobs ohne printer_id. Neue Tabelle label_type_printer_assignments analog zur Versand-Mapping-Tabelle, mit eigener Sektion „Etiketten" im Workstation-Drawer. Blockt den gesamten „An Drucker senden"-Pfad bis zum Fix.
Teilversand (Partial Fulfillment)
Picklisten-Profil-Option Teilversand erlauben: Aufträge mit Teildeckung kommen auf die Pickliste, verfügbare Positionen werden versendet, Auftrag bleibt für den Rest offen (Zweitlieferungs-Flow). Braucht: Rest-offen-Konzept (teilversendete Aufträge wieder picklisten-fähig), positionsgenaue Bestandsabbuchung, positionsgenaue Marktplatz-Bestätigung (Amazon Item-Level, Shopify FO-Positionen), Label-Anker teilversand-bewusst, Porto-×2-Produktentscheidung. Prod-Messung 06.07.26: 0 von 13.096 Sendungen je teilversendet — echtes neues Feature, eigene Spec.
Workflows: Fallback-Rechnungs-Workflow neu bewerten
Nach Bestätigung des reparierten Auto-Rechnungs-Triggers (PROJ-611) ist der 18:00-Workflow nur noch Sicherheitsnetz — Scope/Frequenz ggf. schrumpfen (weniger Scan-Last, Re-Queue-Churn sollte fast verschwinden). Erst nach einigen Tagen Beobachtung entscheiden.
Workflows: Benachrichtigung v2 (eigener Titel/Text)
Die Notify-Aktion (count-only, PROJ-617 P2) um konfigurierbaren Titel/Text pro Workflow erweitern, damit die Meldung ohne Kontext verständlich ist.
Workflows: Artikel-Bedingung (Auftrag enthält Artikel X)
Bedingungsfeld analog zum Picklisten-Profil-Artikel-Filter (PROJ-516) — bestimmte SKU im Auftrag als WENN-Bedingung.
Workflows: Beobachtungsmodus (Shadow-Mode)
Workflow aktiv, aber nur protokollieren statt ändern (Dry-Run-Infrastruktur aus PROJ-617 P3 wiederverwenden) — neuen Workflows vor dem Scharfschalten zusehen.
Mehrsprachigkeit / i18n (EN, TR)
UI-Sprache pro User umstellbar (Deutsch/Englisch/Türkisch). Aktuell keine i18n-Grundlage – alle ~2.000–4.000 Strings hart in ~507 Komponenten/Seiten verdrahtet. Umfang: next-intl-Infrastruktur + Sprachfeld pro User (workspace_members/neue user_settings) + Language-Switcher; dann wellenweise String-Extraktion (Kernstrecke zuerst), PDFs (Rechnungen/Picklisten/Etiketten) und date-fns-Locale (47 Dateien) dynamisch. Stammdaten (Produktnamen/Custom Fields) bleiben in Eingabesprache. Grundinfra klein, Vollausbau mehrere Wochen.
Automatischer Zahlungsabgleich (Bank + PayPal)
Mandanten binden ein oder mehrere Bankkonten (Open Banking / PSD2 via Aggregator wie GoCardless Bank Account Data oder finAPI) sowie PayPal an. Transaktionen werden periodisch gepullt und per Matching-Engine (Verwendungszweck → Auftrags-/Rechnungsnummer, Betrag, Kundenname) offenen Kundenaufträgen bzw. Billkom-Rechnungen zugeordnet — mit Auto-Match, manuellem Abgleich-Cockpit und „als bezahlt“-Übernahme in den bestehenden financial_status/Billkom-Zahlstatus. Zuschnitt in Wellen: (1) read-only Transaktionen + manueller Abgleich, (2) Auto-Match, (3) PayPal. Offene Punkte: Anbieterwahl (Kosten/Banken-Abdeckung), PSD2-Consent-Erneuerung (~90 Tage), Teilzahlungen/Sammelüberweisungen, verschlüsselte Speicherung + DSGVO.
In Arbeit
0
Aktuell nichts in Arbeit
Implementiert
896
Sync-Screen: ausstehende/fehlgeschlagene Offline-Buchungen einsehen, erneut versuchen oder verwerfen (Drawer-Eintrag mit Zähler-Badge)
Offline-Status überall sichtbar: globaler Banner (amber = ausstehend, rot = dauerhaft fehlgeschlagen, antippbar), 'GEMERKT (OFFLINE)' statt 'GEBUCHT' bei gequeuten Buchungen
Display bleibt in allen Buchungs-Flows an (Keep-Awake)
Pick-Schritt zeigt bei Boxen-Picking-Picklisten das Box-Ziel ('→ Box 5', Sammelbox als 'Box S') inkl. Sprachansage
PROJ-343 Mobile — Scanner verlieren die Kopplung nicht mehr unnötig: ApiError trägt jetzt den Server-code; Heartbeat alle ~60s + bei Foreground branched auf SESSION_EXPIRED → nur neu einloggen (Kopplung bleibt) vs DEVICE_UNPAIRED → Wiederverbinden-Screen. „Gerät verbinden“-Flow (Code → Worker → PIN) aus activate+reconnect zusammengeführt, Einmal-Aktivierung entfernt. Selbst-Wiederverbindung ohne Admin über den aufgeklebten Geräte-Code + PIN. Prominenter Reset-Button entschärft, Login-Screen bietet „Gerät erneut verbinden“. Signierte APK v1.8.14 (versionCode 13).
PROJ-305 (intern PROJ-304 wegen ID-Race): Pickliste am Scanner-Gerät erstellen. Plus-Button '+ Neue Pickliste erstellen' über der Picklisten-Liste im Picking-Modul. Tap öffnet ein Bottom-Sheet mit aktiven Picklisten-Profilen + 'X pickbare Aufträge'-Counter pro Profil. Tap auf Profil mit Aufträgen → POST /api/picklists → 'PICKLISTE ERSTELLT'-Vollbild-Overlay → Modal schließt → Liste refreshed. Profile mit 0 Aufträgen ausgegraut. Keine Auto-Navigation — User entscheidet selbst was als nächstes. Kein Backend-Change, alle Endpoints existierten schon. Pattern 1:1 vom Replenishment-Modul (inline NewOrderModal).
Prominentes Buchungs-Bestätigungs-Overlay 'GEBUCHT' nach jeder erfolgreichen Buchung in allen 5 Buchungs-Modulen (LB-WE, Frei-WE, Umlagern, Plus, Minus). Bisheriges ScanFeedback war mit opacity 0.4 / 400ms / ohne Text viel zu subtil — User-Feedback 'wenn ich etwas buche bekomme ich keinerlei bestätigung angezeigt'. ScanFeedback erweitert um optionales text-Prop: mit Text → big mode (opacity 0.92, 1200ms, fontSize 48 fett mit Schatten, klar als Buchungs-Bestätigung lesbar), ohne Text → small mode wie bisher (für reine Scan-Events).
PROJ-295: Universal-Post-Scan-Card jetzt auch in Umlagern, Plusbuchung und Minusbuchung. Im by_article-Modus zeigt die App nach Artikel-Scan die ProductLocationsList aus PROJ-291 — jetzt mit Tap-to-select für Quell-Lagerplatz, FBA gefiltert, Sperr-Pill bei Sperrlager (ersetzt die bestehende inline-stockLocations-Implementierung, die FBA nicht filterte). Im by_location-Modus zeigt nach Lagerplatz-Scan eine neue LocationContentsList die Artikel mit Bild (32×32) + Tap-to-select. Tap setzt Menge=1 + Step=ready (einheitlich über alle Module per Memory-Regel). Max-Button neben QuantityInput füllt vollen Lagerplatz-Bestand (besonders nützlich bei Minusbuchung 'Lagerplatz leerräumen'). FBA-Lagerplatz-Scan bekommt 403 mit klarer Fehlermeldung. Wareneingang/Inventur/Picking/Replenishment unangetastet.
PROJ-291: Im Wareneingang (LB + Frei) zeigt die App nach dem Artikel-Scan eine Bestandsliste pro Lagerplatz (Top 3 + '+ N weitere'-Chip, sortiert nach Menge desc). FBA-Pool gefiltert via warehouses.is_read_only, Sperrlager bleibt drin mit '[Sperr]'-Pill in Amber. Bei Multi-Warehouse-Workspace kommt ein Lager-Präfix vor den Lagerplatznamen. Freier WE bekommt zusätzlich einen Artikel-Lookup-Step über /api/products/by-barcode — bei bekanntem Artikel volle Card mit Bild + Bestandsliste, bei unbekanntem Barcode bleibt der bisherige Flow als Fallback. Branch + Commit-Tag tragen historisch PROJ-290 wegen ID-Race mit der Cost-Breakdown-PR im Web-Repo.
Responsive Scaling für alle Android-Geräte (26 Dateien)
Auto-Logout nach konfigurierbarer Zeit
ConnectionContext — ein einziger Netzwerk-Listener statt pro Screen
Nachschub-Modul im Drawer-Menü ergänzt
ModuleCard mit optionaler Beschreibung
Nachfüllung / Replenishment Workflow (PROJ-94)
Auto-Confirm Picking ohne Mengenbestätigung
Text-to-Speech für Lagerplatz-Ansage
Kompakter Homescreen mit 2-Spalten Grid
Picking-Einstellungen (Mengenbestätigung, TTS)
Android-Navigationsleiste im Dark Theme
Wareneingang gegen Lieferantenbestellung (LB)
Picking komplett neu geschrieben (Scanner-optimiert)
Custom NumPad für Mengeneingabe
Produktbild-Anzeige
Lagerplatz-Vorschläge bei Einlagerung
Rescan für Menge +1, Lagerplatz-Scan bucht automatisch
Dual-Mode Flows (nach Lagerplatz / nach Artikel)
Burger-Menü Navigation
Scan-Validierung in allen Workflows
Konfigurierbarer Server-URL bei Aktivierung
Versionsbadge auf allen Screens
OTA-Update Check beim App-Start
Geräte-Aktivierung mit Pairing-Code
Worker-Login mit PIN
HID-Scanner-Integration (Timing-basiert)
Sammelkommissionierung / Picking
Umlagern zwischen Lagerplätzen
Plusbuchung (Bestandserhöhung)
Minusbuchung (Bestandsreduzierung)
Freier Wareneingang
Offline-Queue mit Auto-Sync bei Reconnect
Sound- und Vibrations-Feedback beim Scannen
Einstellungen (Sound, Vibration, Lautstärke, Tastatur)
Ein-Code-Kopplung über die WMS-Domain (z.B. web.flowkom.de-483921) — der Kopplungscode enthält keine Server-Interna mehr; Broker-Adresse wird beim Koppeln automatisch ermittelt
Auto-Updater: Update-Hinweis im Tray, Installation per Klick mit Fortschrittsbalken, automatischer Neustart
Ein-Code-Kopplung: kombinierter Kopplungscode befüllt die Broker-URL automatisch
Broadcast-Aufweck-Kanal: Sofort-Druck per Push, Polling nur noch als Fallback
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
eBay: Eigene Mengen je Angebot/Variante (Auffuellmenge + Mindestmenge mit automatischem Auffuellen, Checkbox Restbestand abverkaufen, Ueberverkaufsschutz)
eBay: Auktionen im Lister (Laufzeit 1/3/5/7/10 Tage, Startpreis, optional Mindestpreis; genau eine Variante; manuelles Neu-Einstellen nach Auktionsende)
eBay: Out-of-Stock-Control wird jetzt echt im eBay-Konto geprueft und kann per Klick aktiviert werden (Menge 0 nur bei verifiziertem Status)
Kaufland W9 Belegabgleich (PROJ-642): Kaufland-seitige Erstattungen aus dem Bookings-Report automatisch verbuchen inkl. Billkom-Gutschrift (Voll + Teil), 3-facher Doppelbuchungs-Schutz
Shopify-Push überträgt jetzt die Produktbild-Galerie mit — Titelbild zuerst, bei Varianten-Produkten bekommt jede Variante automatisch das Bild ihres Kind-Artikels (PROJ-643)
Neue Aktion „Bilder übertragen“ auf der Shopify-Karte im Plattformen-Tab: ersetzt die Shopify-Produktbilder bereits gelisteter Artikel durch die aktuelle Flowkom-Galerie (PROJ-643)
Shopify-Push-Dialog zeigt vorab, welche Bilder mit übertragen werden (Thumbnail-Vorschau + Zähler, Hinweis bei Artikeln ohne Bilder) (PROJ-643)
eBay Theme-Designer: professionelle Angebotsvorlagen per Konfigurator (Layout, Farben, Schriften, Logo, eBay-Links) mit Live-Vorschau — statt HTML von Hand (PROJ-631 W9c)
eBay Themes: neue CSS-Bildergalerie mit klickbaren Thumbnails aus den Flowkom-Produktbildern ({{galerie}}-Platzhalter) (PROJ-631 W9c)
Kaufland-Direktanbindung komplett (PROJ-642 W1-W8): Bestellimport, Versandbestätigung, Bestands-Push, Storno/Refund-Push (gated), Listings-Inventur + Zuordnung, Lister (EAN-Attach + Produktdaten-Anlage), Retouren + Tickets, Multi-Storefront DE/AT/CZ/SK/PL/FR/IT
Gemeinsame Produkttexte am Artikel (Bulletpoints + Marketing-Beschreibung) als Quelle für Kaufland/eBay/Otto/Shopify-Lister
eBay-Lister: MwSt-Satz je Angebot (Default 19 %) und optionaler Streichpreis werden an eBay übertragen (PROJ-631 W9b)
eBay-Lister: Kategorievorschläge zeigen den vollen Kategoriepfad + neuer Kategoriebaum-Browser zum Durchklicken (PROJ-631 W9b)
eBay-Lister: Fehlgeschlagenes Veröffentlichen zeigt jetzt eine vollständige Fehlerliste mit Sprung zum betroffenen Schritt (PROJ-631 W9b)
eBay: Design-Themes für Angebotsbeschreibungen — Verwaltung mit Live-Vorschau in den Integrations-Einstellungen, Platzhalter (Titel/Beschreibung/Merkmale/Bilder) werden beim Veröffentlichen zu HTML gerendert (PROJ-631 W9)
eBay: Angebots-Vorlagen — im Lister als Vorlage speichern, Standard-Vorlage pro Integration wird bei neuen Angeboten automatisch angewandt, inkl. Preisregel VK + X % (PROJ-631 W9)
eBay: Theme auf bestehende Angebote anwenden — gedrosselter Bulk-Re-Render mit Tages-Limit-Schutz (PROJ-631 W9)
eBay-Lister: Freitext-Werte bei Merkmalen, eigene Merkmale hinzufügen, und Entwurf speichern (Formularstand geht beim Abbrechen nicht mehr verloren)
Kaufland-Direktanbindung W0 (PROJ-642): Verkäuferkonto per API-Schlüssel verbinden (HMAC-signierte Seller-API), geführtes Onboarding, Marktplatz-Auswahl (DE/AT/CZ/SK/PL/FR/IT)
Otto-Lister: Titel-Attribute (Modellbezeichnung, Set-Typ, Set-Info, Besondere Merkmale) prominent im Formular + GPSR-Vorlagen mit Schnellauswahl (PROJ-641 W7)
PROJ-631 W8a: eBay-Lister Foundation — Produkte aus Flowkom als eBay-Angebote listen/aktualisieren/beenden (Inventory/Metadata/Account APIs, unsigniert). Mehrstufiger Lister-Dialog (Kategorie/Merkmale/Inhalt/Richtlinien), hartes Preflight, Varianten-Familien. Default-safe (kein Auto-Publish, reversibel via withdraw), Live-Gates am Brixkom-Piloten offen
Otto-Lister komplett: alle Kategorie-Attribute (Gruppen, Empfehlungen, Mehrfachauswahl), Entwurf speichern + Jetzt listen, Versandprofil & Bearbeitungszeit (Artikel werden auf otto.de sichtbar), otto.de-Status live am Produkt, Preis-Push (PROJ-641 W5)
PROJ-631 W7b: eBay Erstattungs-/Storno-Push an eBay (signierter Geldpfad, default AUS) — Push-Jobs-Zustandsmaschine mit at-most-once-Garantie, issueRefund + Verkäufer-Storno + Käufer-Storno approve/reject, Cron-Drain, Dead-Letter-UI
Alle 6 eBay-Crons im Einstellungen→Cron-Jobs-Tab sichtbar (eigene eBay-Kategorie, Health-Dot + letzter-Lauf-Anzeige)
Otto-Integration: kompletter Lebenszyklus — Storno wird an Otto gemeldet, Otto-Teil-Stornos und Adressänderungen erreichen offene Aufträge, Erstattungs-Belege (Storno-/Service-/Teilerstattungen) werden automatisch verbucht (PROJ-641 W4)
Otto-Lister: durchsuchbare Kategorie-Auswahl über den vollen Otto-Katalog (14.000+ Kategorien, gecacht), USt-Option 'Keine (Differenzbesteuerung)', Hersteller/Vertreiber-Auswahl beim Wirtschaftsakteur
Otto: Retourenlabel automatisch beim Versand erzeugen — konfigurierbar pro Integration (Schalter + Retouren-Versanddienstleister, aktuell DHL; GLS/Hermes vorbereitet)
Otto-Produktlister: Artikel direkt aus Flowkom bei Otto listen (Kategorie/Marke/Pflicht-Attribute/Preis/USt/GPSR, asynchroner Publish-Status mit Ablehnungsgrund, Bestandssync-Schalter je Listing)
eBay-Direktanbindung W7a (PROJ-631): Käufer-Stornoanfragen werden erkannt und angezeigt. Ein Hintergrund-Job liest offene Käufer-Stornoanträge bei eBay und zeigt sie direkt am betroffenen Auftrag an (plus Benachrichtigung) — Flowkom storniert oder erstattet dabei nichts automatisch. Pro Integration ein-/ausschaltbar (Standard AUS). Zusätzlich das technische Fundament für die kommende automatische Storno-/Erstattungs-Abwicklung (eBay-Digital-Signaturen, gegen eBays offiziellen Test-Vektor abgesichert).
Otto-Marktplatz: Retouren direkt in Flowkom. Eingehende Ruecksendungen pruefen und annehmen (Otto erstattet daraufhin den Kunden) oder mit Grund ablehnen — inklusive Retour-Tracking und Link zum Flowkom-Auftrag. Kein Gang ins Otto-Portal mehr noetig.
eBay-Direktanbindung W6 (PROJ-631): automatische Versandbestätigung. Sobald eine übernommene eBay-Bestellung in Flowkom als versendet gilt, meldet ein Hintergrund-Job die Trackingnummer + den Versanddienstleister an eBay — der Käufer bekommt die eBay-native Versandbenachrichtigung. Der Versanddienstleister wird automatisch erkannt (DHL, DHL Express, Deutsche Post, DPD, GLS, Hermes) und lässt sich pro Versandart überschreiben, falls die Erkennung daneben liegt. Absicherungen: doppelte Bestätigungen sind ausgeschlossen (Flowkom prüft vor jeder Meldung den aktuellen Stand bei eBay), eine Bestellung ohne erkennbare Tracking-Daten wird erst gemeldet, sobald die Nummer vorliegt, und wiederholt scheiternde Bestätigungen erzeugen eine Fehler-Benachrichtigung. Pro Integration ein-/ausschaltbar (Standard AUS).
Otto-Marktplatz: Grundlage fuer natives Produkt-Listing. Otto-Kategorien und -Marken sind jetzt abrufbar — das Fundament fuer den spaeteren Listing-Assistenten, mit dem Artikel direkt aus Flowkom bei Otto eingestellt werden.
Otto-Marktplatz: Bestandsuebertragung (Lager -> Otto). Der verfuegbare Lagerbestand der zugeordneten Artikel wird an Otto uebertragen — Transit- und FBA-Bestaende ausgeschlossen, offene Reservierungen abgezogen. Standardmaessig aus; nur im Direkt-Modus.
Otto-Marktplatz: Versandbestaetigung. Versendete Otto-Bestellungen werden mit Trackingnummer und Retourenlabel automatisch an Otto gemeldet. Standardmaessig aus; manuell oder automatisch pro Verbindung.
eBay-Direktanbindung W5 (PROJ-631): automatischer Bestands-Push WMS → eBay. Sobald sich der verfügbare Bestand eines übernommenen Artikels ändert (Bestellung, Wareneingang, CSV-/JTL-Import, manueller Anstoß), überträgt Flowkom die neue Menge automatisch an das eBay-Angebot. Die verfügbare Menge = Lagerbestand minus offene Kommissionierungen (Bundles korrekt heruntergerechnet), niemals unter 0. Pro Angebot doppelt abzusichern (Schalter an der Integration UND am Listing); mit Tages-Änderungsbudget gegen das eBay-Limit von 250 Revisionen pro Angebot/Tag, einem Schutz gegen versehentliches Beenden eines Angebots bei Menge 0 (nur mit bestätigter eBay-Bestandsverwaltung) und einem täglichen Sicherheits-Abgleich. Externer Scheduler ruft den 5-Minuten-Push-Job auf.
Otto-Marktplatz: Direkter Bestellimport. Otto-Bestellungen koennen jetzt direkt in Flowkom importiert werden — als Alternative zum Weg ueber Magnalister. Mit Doppel-Import-Schutz (keine Bestellung landet doppelt), korrekter Netto-/Brutto-/Steuer-Ermittlung und Storno-Erkennung. Standardmaessig aus; pro Otto-Verbindung aktivierbar.
Otto-Marktplatz: Artikel manuell zuordnen. In der Otto-Integration laesst sich jeder Otto-Artikel manuell einem Flowkom-Artikel zuordnen (oder die Zuordnung loesen) — mit Filter "nur nicht zugeordnete" und Suche, fuer SKUs, die die automatische Zuordnung nicht trifft.
Sprachauswahl als Dropdown + mehr Sprachen (Beta, PROJ-636): Die Sprachauswahl in den Konto-Einstellungen ist jetzt ein Dropdown mit Deutsch, English, Español, Français, Italiano, Nederlands und Türkçe. Vollständig übersetzt sind aktuell Deutsch und Türkisch; die übrigen Sprachen sind als „· in Arbeit“ markiert und erscheinen bis zur Fertigstellung überwiegend auf Deutsch (Beta-Hinweis in der Oberfläche).
eBay-Direktanbindung W4 (PROJ-631): Listing-Adoption — bestehende aktive eBay-Festpreis-Angebote per Klick unter die neue Bestandsverwaltung (Inventory API) bringen. Voraussetzung für den späteren automatischen Bestands-Push. Mit Eligibility-Vorprüfung (nur Festpreis + aktiv + SKU auf Listing und jeder Variante) samt konkreter Fix-Anleitung bei Blockern, Aktivierung der eBay Business Policies, familienweiter Übernahme pro Angebot und mehrschichtigem Schutz gegen versehentliche Doppel-Übernahme (die Migration ist endgültig). Nicht übernommene Angebote erhalten noch keinen Bestands-Push (folgt).
Produktverwaltung & Brainflow auf Türkisch (PROJ-634/635): Die komplette Produktverwaltung (Liste, Kanban, Tabelle, Filter, Detailseite, Anlegen/Bearbeiten, Varianten, Bundle) und das Brainflow-Notizmodul sind jetzt auf Türkisch verfügbar — umschaltbar pro User in den Konto-Einstellungen. Eingegebene Inhalte (Produkttitel, Notizen, Tags, SKU/EAN) bleiben unverändert. Weitere Module und Sprachen (z.B. Englisch) folgen schrittweise auf demselben Fundament. Hinweis: türkische Erstübersetzung, fachlicher Feinschliff folgt.
Mehrsprachigkeit — Fundament (PROJ-634): Flowkom kann jetzt pro User in einer anderen Sprache angezeigt werden. Neuer Sprachumschalter in den Konto-Einstellungen (Deutsch/Türkçe), die Wahl gilt nur für dich und folgt dir über Geräte. Deutsch bleibt Standard — für bestehende Nutzer ändert sich nichts.
Status & Notiz beim Produkt anlegen (PROJ-633): Im „Neues Produkt“-Popup lassen sich jetzt der Kanban-Status (Board-Spalte) und eine erste Notiz direkt setzen — statt sie nachträglich per Board-Drag bzw. Notizen-Tab zu ergänzen. Beim Anlegen ist die erste Board-Spalte vorausgewählt; das Status-Feld erscheint auch im Bearbeiten-Popup.
eBay Adoption-UI (W4): Übernehmen-Aktion pro Zeile + Bulk (Inventory API), Eligibility-Badges pro Listing, Business-Policies-Opt-in-Banner, irreversibler Bestätigungs-Dialog
eBay-Direktanbindung W3 (PROJ-631): Direkter Bestellimport — eBay-Bestellungen laufen jetzt direkt (ohne magnalister-Umweg) in Flowkom ein, mit automatischer Artikel-Zuordnung, Kunden-Dedupe, korrekter Steuer-/Rabatt-/Total-Übernahme, konfigurierbaren Filtern + Vorschau, nächtlichem Import-Cron + manuellem Import, und Doppel-Import-Schutz gegen dieselben eBay-Bestellungen, die parallel via Shopify laufen; Cutover-Checkliste (magnalister-Abgleich abschalten) in der eBay-Integration
eBay-Direktanbindung W2 (PROJ-631): Angebots-Inventur — bestehende eBay-Angebote (auch magnalister-erstellte) werden read-only eingelesen, automatisch per SKU den Flowkom-Produkten zugeordnet und in einer Angebots-Verwaltung gepflegt; Fundament für Angebots-Übernahme + Bestands-Sync
eBay-Direktanbindung W1 (PROJ-631): Produktbild-Galerie — mehrere Bilder pro Artikel mit Drag&Drop-Sortierung, Titelbild-Auswahl und clientseitiger Kompression; Fundament für den späteren eBay-Lister
eBay-Direktanbindung W0 (PROJ-631): OAuth-Verbindung fürs eBay-Verkäuferkonto (Ein-Klick-Consent, verschlüsselter Refresh-Token, Re-Connect bei Ablauf), eBay-Integrations-Detailseite, Account-Löschungs-Endpoint (Pflicht für eBay-Production-Keys) und eBay-REST-Client-Fundament
PROJ-630: PDF-Inventurliste mit Festschreibungs-Hinweis. Die Bestandsbewertung lässt sich jetzt als druckbare PDF-Inventurliste exportieren — live oder zu jedem Stichtag (z. B. Monatsultimo für die Buchhaltung). Das PDF enthält den Summen-Block inklusive bezahltem Zulauf, alle Artikel mit Menge, Einstandspreis und Wert sowie einen Hinweis, welcher Anteil des Lagerwerts noch nicht durch kostenfestgeschriebene Bestellungen gedeckt ist (diese Kosten können sich rückwirkend ändern).
PROJ-629: Zahlungsstatus-Verlauf an der Lieferantenbestellung. Im Verlauf-Tab der Bestellung gibt es jetzt eine zweite Sektion, die jede Änderung des Zahlungsstatus (bezahlt / anbezahlt / unbezahlt) mit Zeitpunkt und Nutzer zeigt — automatische Änderungen sind als solche markiert. Damit ist jederzeit nachvollziehbar, warum die Stichtags-Bestandsbewertung eine Bestellung zu einem Datum als bezahlt oder unbezahlt zählt.
Nachfüllung: Nachfüllbedarf-Benachrichtigung — pro Profil aktivierbar (Default aus), prüft einmal täglich ab 7 Uhr und meldet Artikel unter dem Schwellenwert mit exakter Artikel-/Positions-Zahl
Nachfüllung: Überspringen mit optionalem Grund (mobil erfassbar, im Auftrags-Detail sichtbar)
Nachfüllung: Mitarbeiter-Zuweisung direkt in der Übersicht, Profil-Duplizieren, Vorschau im mobilen Erstellen-Dialog (Artikel/Positionen + Wagen-Check)
PROJ-628: Stichtags-Vergleich. Neue aufklappbare Karte in der Bestandsbewertung: zwei Stichtage wählen (Schnellwahl über Ultimo-Chips, als Vergleichsseite geht auch die Live-Ansicht) und vergleichen — Lagerwert-, Einheiten- und Artikel-Deltas auf einen Blick plus die 50 größten Wert-Veränderungen pro Artikel, inklusive neu aufgebauter und komplett abgebauter Artikel. Beantwortet direkt Fragen wie „was hat sich im Juni verändert?“.
PROJ-626: Bestandswert-Verlauf. Neue aufklappbare Chart-Karte in der Bestandsbewertung zeigt den Lagerwert zu den letzten 12 Monatsultimos — Kapitalbindung als Trend statt Einzelwert. Ein Klick auf einen Datenpunkt springt direkt in die Stichtags-Ansicht dieses Ultimos. Der Verlauf wird erst beim Aufklappen berechnet (rückwirkend aus der Lagerbewegungs-Historie, kein Snapshot nötig).
Nachfüllung W1 (PROJ-627): Storno/Überspringen buchen eingesammelte Ware transaktional vom Wagen auf den Quellplatz zurück (neue RPCs)
PROJ-625: Stichtag-Bedienung deutlich schneller. Im Stichtag-Kalender der Bestandsbewertung gibt es jetzt Schnellwahl-Chips (letzter und vorletzter Monatsultimo, letztes Quartalsende, 31.12. des Vorjahres) — ein Klick statt Kalender-Navigation. Der gewählte Stichtag steht außerdem in der URL: Ansichten lassen sich verlinken, neu laden und z.B. dem Steuerberater schicken. Und die Zulauf-Zeile ist jetzt aufklappbar und zeigt, welche Lieferantenbestellungen mit wie vielen Stück und welchem Wert im Zulauf stecken — in der Live-Ansicht genauso wie zu jedem Stichtag.
PROJ-622: Zahlungserfassung für Lieferantenbestellungen pro Mandant einstellbar. Neuer Bereich Einstellungen → Allgemein → Einkauf: Modus Status-Tag (Zahlungsstatus wird wie bisher von Hand am Auftrag gesetzt; Einzelzahlungen sind gesperrt, damit die Automatik den gesetzten Status nie überschreibt) oder Modus Einzelzahlungen (Zahlungen mit Datum/Betrag erfassen, Status wird automatisch berechnet und ist nur noch lesbar). Die Migration erkennt automatisch, welche Mandanten bereits Einzelzahlungen nutzen. Zusätzlich wird jeder Wechsel des Zahlungsstatus jetzt mit Zeitstempel historisiert — der Stichtags-Zulauf der Bestandsbewertung rechnet damit künftig tagesgenau, auch wenn nur der Status-Tag gepflegt wird (bezahlt → wieder unbezahlt wird zum jeweiligen Stichtag korrekt abgebildet).
PROJ-621: Daten-Hub — Import und Export laufen jetzt als Hintergrund-Jobs mit Fortschrittsanzeige („12.000 von 48.000 Zeilen“): große Dateien brechen nicht mehr mit „Bad Gateway“ ab, der Status ist jederzeit in der Job-Historie sichtbar, hängengebliebene Jobs werden ehrlich als fehlgeschlagen markiert.
PROJ-621: Daten-Hub — Kundenstamm ist jetzt importier- und exportierbar (inkl. Rechnungs-/Lieferadresse, USt-IdNr.; deutsche ERP-Spaltennamen werden automatisch zugeordnet); die Kundenverwaltung hat eigene Import-/Export-Buttons.
PROJ-621: Daten-Hub — Excel-Dateien (.xlsx/.xls) können direkt importiert werden, ohne Umweg über CSV.
PROJ-621: Daten-Hub — Importe lassen sich pro Job rückgängig machen: neu angelegte Zeilen werden gelöscht, bereits verwendete Zeilen (z.B. Artikel mit Bestand) bleiben geschützt und werden gemeldet.
PROJ-621: Daten-Hub — Onboarding-Checkliste „Erste Schritte“ führt neue Mandanten in der richtigen Reihenfolge durch den Erstimport (Artikel → Lagerplätze → Bestände → Lieferanten → Kunden).
PROJ-624: Die „Nachfüllung“ lässt sich pro Mandant ein- und ausschalten (Einstellungen → Lager & Versand → Nachfüll-Profile). Standardmäßig aus; wer bereits Nachfüll-Profile angelegt hat, behält den Menüpunkt. Angelegte Profile bleiben beim Ausschalten erhalten.
Workflows: Zeiteingabe in deiner Zeitzone — Uhrzeiten werden lokal eingegeben und angezeigt (UTC-Umrechnung inkl. Wochentagen passiert automatisch)
Workflows: Duplizieren per Klick (Kopie startet deaktiviert) und drei Starter-Vorlagen (Versand-Abschluss, Rechnung nach Versand, Unbezahlt-Meldung)
PROJ-619: Stichtags-Zulauf in der Bestandsbewertung. Die Stichtags-Bestandsbewertung zeigt jetzt auch die zum Stichtag voll bezahlte, noch nicht eingetroffene Ware aus Lieferantenbestellungen — als eigene Zulauf-Zeile plus Gesamt inkl. Zulauf, exakt wie in der Live-Ansicht. Rekonstruiert wird tagesgenau aus der Bestellstatus-Historie, dem Zahlungs-Ledger (Zahlungsdatum bis zum Stichtag, währungsbewusst) und den Wareneingangs-Zeitpunkten; Preise und Kurse fließen mit heutigem Stand ein. Fällt die Zulauf-Berechnung aus, bleibt die restliche Stichtagsbewertung unberührt.
Workflows: Klartext-Zusammenfassung — jeder Workflow erklärt sich als deutscher Satz („Wenn …, dann …"), live im Editor und als Untertitel in der Workflow-Liste
Workflows: Editor mit klarer WANN→WENN→DANN-Gliederung und gruppiertem, durchsuchbarem Feld-Dropdown mit Einheiten (EUR/g/Tage)
Workflows: neuer Trigger „Bei Statuswechsel" — Workflows laufen automatisch, sobald ein Auftrag auf einen gewählten Status wechselt (z.B. versendet → Folgeaktionen), statt auf den nächtlichen Zeitplan zu warten; Verarbeitung i.d.R. binnen 15 Minuten
Workflows: Dry-Run-Vorschau im Editor — „Treffer ermitteln" zeigt, wie viele Aufträge der Workflow AKTUELL treffen würde (inkl. Beispiel-Auftragsnummern), ohne irgendetwas zu ändern; funktioniert auch für ungespeicherte Änderungen
Workflows: „Auftrag testen" — Auftragsnummer eingeben und pro Bedingung sehen, warum ein Auftrag (nicht) getroffen wird, inkl. Hinweis wenn der Status außerhalb des gewählten Bereichs liegt
Workflows: neue Bedingung „Bestelldatum ÄLTER ALS X Tage" — z.B. für Erinnerungs- oder Aufräum-Workflows auf liegengebliebene Aufträge
Workflows: neue Aktion „Benachrichtigung senden" — erzeugt pro Lauf eine Meldung in der Glocke mit der Anzahl getroffener Aufträge (aktualisiert sich statt zu spammen)
Print Agent: Kopplungscode zeigt die WMS-Domain statt Server-Interna (z.B. web.flowkom.de-483921); die Verbindung wird beim Koppeln automatisch ermittelt (neue Route /api/print/broker-info)
Workflows: Fehlschlag-Benachrichtigungen — scheiterte ein zeitgesteuerter Workflow (inkl. Timeout/Claim-Fehler), erscheint eine workspace-weite Fehler-Meldung; der nächste Erfolgslauf (auch manuell) quittiert sie automatisch
Workflows: Due-Check-Catch-up — ein verpasster Scheduler-Tick holt den Tageslauf jetzt nach (überfällig seit letztem Soll-Termin statt ±15-Minuten-Fenster); neue/aktivierte Workflows starten erst mit ihrem nächsten Termin
PROJ-614: Stichtags-Bestandsbewertung. Die Profitbutler-Bestandsbewertung kann den Warenbestandswert jetzt zu einem beliebigen vergangenen Stichtag anzeigen (z.B. 31.05.2026) — rekonstruiert aus dem Lagerbewegungs-Ledger, ohne Snapshot-System. Neuer Stichtag-Datepicker auf der Bestandsbewertungs-Seite (leer = Live wie bisher), gleiche Ansicht mit Gesamtwert, Artikel-Liste und Lager-Aufschlüsselung zum Stichtag, Hinweis-Banner erklärt die Kostenbasis (heutiger Wissensstand, FIFO-Schichten historisch exakt). Zulauf- und Absatz-Kennzahlen bleiben der Live-Ansicht vorbehalten; CSV-Export trägt den Stichtag im Dateinamen. Technisch: neue SECURITY-DEFINER-RPC stock_quantities_at_date (workspace-gesichert, DST-sichere Berlin-Tagesgrenze), Bewertungs-Engine aus der API-Route extrahiert — Live- und Stichtag-Pfad teilen exakt dieselbe FIFO+Kaskaden-Logik.
PROJ-613: Daten-Hub — Import-Vorlagen funktionieren jetzt end-to-end: gespeicherte Vorlagen erscheinen im Import-Assistenten, und „Verwenden“ in der Vorlagen-Liste öffnet den Assistenten mit vorgewählter Tabelle und wendet die Vorlage nach dem CSV-Upload automatisch an.
PROJ-611: Workflows — Intervall-Trigger nutzbar (alle 15–720 Minuten); die Option war wählbar, wurde beim Speichern aber immer abgelehnt.
PROJ-611: Workflows — Verlaufs-Dialoge zeigen übersprungene Aufträge mit Begründung, 'Jetzt ausführen' verlinkt direkt zu den Details, Dark Mode im gesamten Modul.
PROJ-610: Amazon-Custom Personalisierung beim FBM-Import abholen (Gravur-Text/Font/Farbe je Oberfläche) — Anzeige nur im Kundenauftrag-Detail, opt-in Toggle (Default AUS), FBM-only. Neue Tabelle order_line_item_customizations + privater Bucket, SSRF-sicherer ZIP-Download, Reconcile-Cron gegen URL-TTL.
PROJ-609: Verkäufer-Bestellnummer-Pull läuft jetzt automatisch — huckepack am „Amazon Bestellstatus-Sync“-Cron (self-gedrosselt ~1×/Stunde, gleiches Muster wie der Finanzereignisse-Reconcile). Es ist KEIN eigener Eintrag im externen Scheduler mehr nötig; der Job bleibt in der Cron-Jobs-Übersicht sichtbar und per „Ausführen“ manuell startbar. „An Amazon senden“ (Push) ist davon unberührt.
PROJ-609: Amazon Verkäufer-Bestellnummer (SellerOrderId) — pro Amazon-Integration ein Modus (Aus/Von Amazon holen/An Amazon senden). Pull-Cron liest die von Amazon vergebene Verkäufer-Bestellnummer per getOrder (ohne RDT) in ein neues Auftragsfeld; Push überträgt eine im Auftrag gesetzte Flowkom-Nummer per OrderAcknowledgement-Feed (MerchantOrderID) an Amazon (nur FBM). Neues Feld orders.amazon_seller_order_number (+ Herkunft manuell/amazon) mit Inline-Edit im Auftragsdetail, Verlaufs-Eintrag und RadioGroup in der Integrations-Einstellung. Fehler 18025 (bereits bestätigt) wird still übersprungen, nicht als Fehler gemeldet.
PROJ-605 Kanal-scharfe Kundenbenachrichtigung (Shopify): Ein 'Kundenbenachrichtigung'-Schalter pro Verkaufskanal steuert, ob Shopify die Versand-/Erstattungs-/Retouren-Mail an den Kunden schickt. Marktplaetze (Otto/Kaufland/eBay) sind per Default stumm — behebt die Otto-Anlage-9-Beschwerde (automatische Mails an verschluesselte Relay-Adressen). Webshop-Kunden bekommen weiter ihre Bestaetigungen.
FreeScout→KI Kontext-Provider (/api/freescout/ai-draft): erdet KI-Antwortentwürfe im Helpdesk mit einem PII-minimierten Fakten-Sheet + Brainflow-SOPs über den eigenen LLM-Schlüssel des Mandanten (BYOK). Standard AUS, strikt isoliert — rohe Handelsdaten und der Schlüssel verlassen Flowkom nie.
Dashboard-Widgets zeigen jetzt echte Informationsdichte je Kachelgroesse (Mini/Standard/Breit/XXL) statt nur zu skalieren — jedes Widget rendert pro Groesse den sinnvollen Inhalt (Mini = eine Kennzahl, Breit = Aufschluesselung/Sparkline, XXL = Tabelle/GuV/Verlauf).
Kachelgroesse per bewusstem Dropdown-Picker waehlen (statt Blind-Klick-Wechsel).
Dezente (i)-Info-Einblendung bei erklaerungsbeduerftigen Kacheln.
Neues konfigurierbares Brainflow-Widget: Zuletzt bearbeitet, Suche, Aufgaben aus einer Sammlung und Schnell-Notiz — pro Nutzer im Bearbeiten-Modus einrichtbar.
Dashboard personalisierbar: eigene Abschnitte mit Ueberschriften anlegen, ein-/ausklappen und alles frei sortieren.
Dashboard-Kacheln in vier Groessen (Mini/Standard/Breit/XXL) — unwichtigere Infos kompakt statt fett.
Profitbutler als einzelne KPI-Kacheln (Umsatz/Gewinn/Marge) aufs Dashboard nehmbar, zusaetzlich zur grossen Uebersicht.
Dashboard-'Anpassen' ist jetzt ein dezenter Stift.
Dashboard: 'Gestern'-Zeitraum ueberall (Profitbutler-Cockpit + 'Heute versendet'-Popup).
Dashboard: Profitbutler-Kacheln (Umsatz/Gewinn/Marge) per Klick mit Vorwochen-/Vormonatsvergleich (Umsatz + Bestellungen).
FreeScout-Brainflow-Import: interne Ticket-Notizen optional mitnehmen (Toggle im FreeScout-Modul)
Dashboard-Personalisierung: Widgets ein/aus, Reihenfolge per Drag & Drop, Größe normal/breit, Inline-Bearbeiten-Modus + Widget-Katalog (PROJ-589)
FreeScout-Import: Zielseite wird automatisch zur Brainflow-Sammlung mit konfigurierbaren Ticket-Spalten (Ticket-Link, Nr, Kunde, Postfach, Kanal, Datum)
FreeScout-Brainflow-Import (PROJ-588): E-Mails/Tickets aus FreeScout mit einem Klick als Brainflow-Seite in Flowkom sichern — die Seite gehört dem eingeloggten Nutzer, öffnet sich im neuen Tab; ein-/ausschaltbar und nur nutzbar, wenn Brainflow im Workspace aktiv ist
Dashboard-Detailansichten: Klick auf die Kachel Heute versendet zeigt die Aufschluesselung nach FBM/FBA, Versandart und Lager (mit Zeitraum-Umschalter); Klick auf Offene Auftraege zeigt Alter und Verkaufskanal. Neue Braucht-Aufmerksamkeit-Zeile mit Direktspruengen (Versandfehler, Ueberverkaeufe, unbezahlt seit ueber 3 Tagen, offene Picklisten, ASIN-Konflikte) erscheint nur, wenn es etwas zu tun gibt (PROJ-587)
Dark Mode fuer die gesamte App: umschaltbar zwischen Hell, Dunkel und System (oben rechts neben der Glocke sowie in Einstellungen -> Konto). Standard bleibt Hell; die Wahl gilt pro Nutzer und wird auf allen Geraeten uebernommen. Kuratierte dunkle Optik mit guter Lesbarkeit, alle Flaechen durchgaengig unterstuetzt (PROJ-586)
System-Lagerplätze (Wareneingangsplatz, Nachfüllwagen, Sperrlagerplatz, FBA-POOL) sind jetzt umbenennbar und deaktivierbar: bei mehreren Lagern tragen sie automatisch den Lagernamen als Zusatz (z.B. "Wareneingangsplatz (Westheim)") und lassen sich über das Zeilen-Menü umbenennen; Deaktivieren ist nur bei leerem Platz möglich, hartes Löschen bleibt gesperrt. Barcode und Funktion bleiben dabei stabil — gedruckte Etiketten und die Bestandslogik sind vom Umbenennen nicht betroffen (PROJ-585).
Dashboard: Die Profitbutler-Kacheln (Umsatz/Gewinn/Marge) zeigen jetzt echte Zahlen aus dem Profitbutler-Modul statt einer festen Pauschale — Netto-Umsatz, echter Gewinn nach Wareneinsatz/Gebühren/Werbung/Versand/Fixkosten und eine variable Marge. Neu: Zeitraum-Umschalter (Heute/Diese Woche/Dieser Monat/Vormonat), Trend gegen die Vorperiode, Ist/Schätzung-Kennzeichnung und eine aufklappbare Gewinn-Aufschlüsselung mit Kanal-Split (PROJ-584)
Kundenaufträge: der Überverkäufe-Filter (offene Aufträge, deren Positionen der verfügbare Bestand nicht deckt) ist jetzt auch als Schalter im Filter-Menü verfügbar — nicht mehr nur über die Dashboard-Kachel (PROJ-582)
Lieferantenbestellungen: neuer Schalter „Festgeschriebene ausblenden" (standardmäßig an) blendet abgewickelte Bestellungen aus Liste, Kanban und den Zählern aus, damit die Übersicht schlank bleibt (PROJ-581)
Lieferschein automatisch drucken: neuer Schalter im Picklisten-Profil — beim Versand wird der Billkom-Lieferschein erstellt und am Dokumentendrucker der Workstation mitgedruckt (PROJ-580)
Packflächen-Karte im Dashboard: aktive Stationen, Durchsatz, versandbereite Aufträge und Versandschluss-Countdown je Versandart mit Detail-Dialog (PROJ-580)
Versandschluss (Cutoff-Zeit) pro Versandart konfigurierbar (PROJ-580)
Überverkauf-Filter: Dashboard-Kachel + Filter in den Kundenaufträgen zeigen offene Aufträge, deren Bestand nicht verfügbar ist (PROJ-580)
Neue Hilfe-Seite Einkauf → Lieferantenbestellungen (Statuswege, Kanban, Detail-Tabs, Festschreiben, FAQ) + Hilfe-Button auf der LB-Übersicht (PROJ-574 W8)
Lieferanten-Detailseite: Kennzahlen (offene Bestellungen, Einkaufsvolumen 12 Monate, Ø-Lieferzeit Ist vs. zugesagt), Bestellhistorie mit Deep-Links und vollständige Stammdaten-Karte (PROJ-574 W7)
Lieferanten-Detailseite: Zuordnungen mit Suche + Seiten und neuem Produkt-zuordnen-Dialog (PROJ-574 W7)
Lieferanten-Formular in Tabs (Stammdaten/Kontakt/Adresse/Bank/Sonstiges) mit Nächste-Nummer-Hinweis, Duplikat- und Währungswechsel-Warnung (PROJ-574 W7)
Bestellvorschlag: Reichweite-Spalte (reicht bis TT.MM., rot bei Engpass vor Liefereintreffen) und Lieferzeit des Lieferanten fließt in den Prognose-Horizont ein (PROJ-574 W6)
Bestellvorschlag: Mengen direkt in der Tabelle anpassbar (Inline-Override mit MOQ-Hinweis), Bulk-Add übernimmt die angepassten Mengen (PROJ-574 W6)
Lieferantenbestellung: Wareneingänge-Tab im Detail zeigt alle gebuchten Wareneingänge mit Positionen und Lagerplätzen (PROJ-574 W5)
Versand Multi-Station: „Nächster Auftrag“-Zuteilung (atomar, picklisten-scoped) + „In Arbeit“-Transparenz + Picklisten-Fortschritt (PROJ-568 Welle 2)
Kanban-Sortierung: vordefiniert (Neueste/Titel/SKU) oder eigene Reihenfolge per Drag-and-Drop, pro Benutzer gespeichert; beim ersten Verschieben wechselt die Ansicht automatisch auf „Eigene Reihenfolge“, Varianten-Familien wandern als Block, zurücksetzbar (PROJ-571 W5)
Vollständigkeits-Check pro Artikel: konfigurierbare Pflichtfelder, Badge + Fortschritt zeigen, was noch fehlt (PROJ-571 W4)
Lieferantenbestellungen: Kanban mit Drag & Drop (Status per Ziehen wechseln, erlaubte Ziele werden hervorgehoben) und neuer Überfällig-Tab mit Server-Zähler (PROJ-574 W4)
Betreiber-Zugang auf Kundeninstanzen: eine Server-Allowlist (OPERATOR_EMAILS) schaltet dem Betreiber dort Cron-Jobs, Logs und eine neue Instanz-Überwachung (Cron-Status + offene Fehler über alle Workspaces) frei — Mandanten sehen davon nichts.
PPC-Butler: Kind-Artikel direkt am Elternartikel verwalten — neue Karte im PPC-Butler-Tab pusht manuelle Variablen-Werte pro Kind einzeln oder mit 'Alle setzen' für alle Varianten auf einmal (pro Marktplatz).
Benachrichtigungen: Cron-Fehler-Meldungen erledigen sich automatisch, sobald derselbe Cron wieder erfolgreich durchläuft („Erledigt von System — Lauf wieder erfolgreich“); schlägt er erneut fehl, öffnet sich die Meldung von selbst wieder.
Produktliste: Suche und Filter durchsuchen jetzt den gesamten Katalog direkt in der Datenbank (auch bei zehntausenden Artikeln); Schalter unter Einstellungen → Produkte → Produktliste
Produkt-Aufgaben: Auf jeder Kanban-Karte lassen sich Aufgaben mit optionaler Person festhalten und direkt abhaken (mit Rückgängig); dazu Aufgaben-Filter, Bereich im Produktdetail und optionale Tabellen-Spalte
Karten-Dichte: Schalter Kompakt / Standard / Detailliert fürs Produkt-Kanban (pro Person gespeichert); Detailliert zeigt Tags, Aufgaben und einen Fortschrittsbalken; Artikel lassen sich direkt von der Karte aus einer Person zuweisen
Benachrichtigungen: Glocke mit Vorschau-Popover — offene Fehler und neue Aktionen direkt im Header sehen, ohne die Arbeitsfläche zu verlassen.
Benachrichtigungsseite modernisiert: „Weitere laden“ für ältere Meldungen, sprechende Link-Beschriftungen („Auftrag öffnen“ statt „Log anzeigen“), relative Zeitstempel, Mobile-Layout.
Deutsche Post: Portokatalog aktualisiert sich jetzt live aus der Internetmarke-API (Preise + Verfügbarkeit, täglicher Abgleich) — bei der nächsten Portoerhöhung laufen Briefkäufe weiter statt mit veralteten Preisen zu scheitern; Benachrichtigung bei Preisänderungen und abgeschalteten Produkten inkl. Warnung, wenn eine Versandart betroffen ist (PROJ-560)
Amazon: In Seller Central erstattete Fremdwährungs-Refunds (UK/SE/PL …) werden jetzt automatisch über den Order-Wechselkurs in EUR gebucht (inkl. Gutschrift); ohne verwertbaren Kurs weiterhin Archiv + Benachrichtigung (PROJ-559)
Produktverwaltung: Tags-Massenbearbeitung (PROJ-532) — Tags im „Feld setzen“-Dialog mehrfach hinzufügen/entfernen
Amazon-Integration Härtung (PROJ-558, Phasen A–H): PII-Retention-Cron (30 Tage, Toggle default AUS, Dry-Run-Vorschau), Versandbestätigung ohne Falsch-Bestätigungen (Result-Verifikation, Plausibilitätsgate, nur Outbound-Tracking), FBA-Pull-Guard gegen Bestands-Komplett-Nullung, Refund-Push positionsgenau verteilt mit Doppel-Refund-Schutz (Claim + feed_id-Sofort-Persist), Finance-Events Claim-first (nie Doppel-Buchung) inkl. Promotions in der Erstattungs-Summe, Lease-Lock-Tabelle statt Session-Locks, Credentials nie mehr im Browser, ehrliche Fehler-Notifications (Auth, Dead-Letter, Carrier-Mapping)
Print Agent: Broadcast-Aufweck-Kanal — Server weckt den Agent nach jedem Druckjob sofort per Push (PROJ-549)
Print Agent: Download-Button in den Drucker-Einstellungen lädt den neuesten Installer (PROJ-544)
Print Agent: Ein-Code-Kopplung — Kopplungscode enthält die Server-Adresse, kein URL-Eintippen mehr (PROJ-548)
Pan-EU-FBA (PROJ-554): Warenabgangsland aus dem Amazon-Versandbericht; USt-Auswertung weist Verkäufe aus ausländischen FBA-Lagern an Kunden im selben Land korrekt als 'Lokal im Lagerland' aus (lokale Voranmeldung statt OSS)
Shopify DSGVO-Pflicht-Webhooks (PROJ-543): HMAC-verifizierter Endpoint für customers/data_request, customers/redact und shop/redact mit Admin-Benachrichtigung
Zeilen-basierter Status-Sync-Lock pro Integration
Zeilen-basierter Import-Lock pro Integration (Cron und manueller Import laufen nie mehr parallel)
Profitbutler Live-BWA (PROJ-553): neuer Tab mit monatlicher betriebswirtschaftlicher Auswertung (Netto-Umsatz, Rohertrag, Deckungsbeitrag, Betriebsergebnis je Monat + Jahressumme), laufender Monat tagesaktuell
Billkom Sammel-ZIP für den Steuerberater (PROJ-551): alle Belege eines Zeitraums als ZIP mit MANIFEST, Monats-Picker in der Belegzentrale
Billkom Skonto-Snapshot (PROJ-552): Skonto aus den Einstellungen wird beim Finalisieren GoBD-fest am Beleg gespeichert und erscheint auf der PDF und in den Zahlungsbedingungen der E-Rechnung
Billkom Archiv-Trilogie (PROJ-550): Original-Download aus dem GoBD-Archiv (byte-identisch zum SHA-256), Entwurfs-PDF-Vorschau mit ENTWURF-Wasserzeichen, automatischer Archiv-Backfill aller Bestandsbelege
Profitbutler: Fixkosten-Tab zeigt normalisierte Monatslast (≈ €/Monat) je Eintrag
Profitbutler: Fixkosten-Einträge duplizieren
Profitbutler: Direktlink Fixkosten verwalten aus der GuV-Tabelle
Profitbutler: Einrichtungs-Check warnt bei Fixkosten-Einträgen, die still nicht wirken (verwaister Kanal, fehlender Stichtag-Wochentag, Alt-Pause)
Profitbutler: Betrag ändern ab Datum — Mieterhöhungen & Co. beenden den alten Fixkosten-Eintrag und legen automatisch einen Nachfolger an, vergangene Auswertungen bleiben unverändert
Profitbutler: GuV zeigt Deckungsbeitrag (vor Fixkosten) und Fixkostendeckung in Prozent
Profitbutler: Einmalkosten (z.B. Messe, Anschaffung) — am Stichtag gebucht oder über einen Zeitraum verteilt
Profitbutler: neue Hilfeseite zu Fixkosten (inkl. Hinweis: Beträge netto erfassen)
Profitbutler: Fixkosten fair auf Verkaufskanäle verteilt — kanalspezifische Kosten zu 100% ihrem Kanal, allgemeine anteilig nach Umsatz; Kanal-GuV zeigt neue Zeile Fixkosten (anteilig)
Profitbutler: GuV-Zeile Fixkosten zeigt beim Aufklappen jeden Eintrag einzeln
Profitbutler: Chart-Gewinnlinie enthält jetzt die tagesgenauen Fixkosten (passt zur Heute-Kachel)
Billkom-Belegzentrale: eigene Modul-Seite mit Belegübersicht, Filtern, Suche und Offene-Posten-Liste inkl. KPI-Kacheln (PROJ-545)
Billkom: Reverse-Charge für EU-B2B — USt-IdNr. am Kunden mit VIES-Prüfung, 0 % nur bei frisch validierter ID (PROJ-534)
Produkte: Tags per Massenbearbeitung setzen — im Dialog 'Feld setzen' lassen sich Tags jetzt fuer die gesamte Auswahl hinzufuegen oder entfernen.
Produkte: Bulk-Aktion 'Wiederherstellen' — steht die Filterleiste auf Archiviert, bietet die Massenleiste das Wiederherstellen an.
Produktfilter: Artikeltyp-Filter (Bestandsgefuehrt / Service-Artikel) in die Filterleiste integriert.
PROJ-527: Manuelle Auftragsanlage — Rabatt in Euro (pro Position %/€-Umschalter + Gesamtrabatt proportional verteilt) und Versandkosten-Schnellfeld (als Freiposition).
Mobile-App-Update-Endpoint: die Scanner-App kann neue Versionen über den Flowkom-Server finden und laden (GitHub-Release-Proxy, PROJ-530)
Billkom: Beleg-Archivierung mit SHA-256-Hash beim Finalisieren (GoBD-Nachweis), Storno-PDFs mit Wasserzeichen weiter abrufbar (PROJ-530)
Billkom: §19 Kleinunternehmerregelung als Schalter, OSS-Schwelle prüft jetzt auch das Vorjahr, Territorien (Nordirland/Monaco/Kanaren) korrekt (PROJ-530)
Billkom: Steuersatz-Pflege in den Einstellungen + Einrichtungs-Check-Banner für fehlende Pflichtangaben (PROJ-530)
Billkom: E-Rechnung referenziert bei Gutschriften die Ursprungsrechnung (BT-25); PDF bricht lange Belege sauber um (PROJ-530)
Billkom als Modul schaltbar: Toggle 'Billkom (Rechnungsmodul)' in Einstellungen -> Allgemein (bestehende Workspaces bleiben aktiv, neue starten ohne Billkom)
Picklisten-Profile: Ausschluss-Filter Verkaufskanal + Lieferland ('alles ausser ...') — Auftraege ohne Kanal/Land bleiben drin, eigene 'ohne ...'-Chips in der Profil-Liste
Boxen-Picking: Picklisten-PDF zeigt Box-Ziele (Box-Spalte in Pick-Positionen, Auftraege Box-sortiert, Wagen-Zeile im Kopf)
Boxen-Picking: Wagen-Barcode (WGN-Code) — Barcode-Dialog in den Wagen-Einstellungen zum Aufkleben; Scan im Versand oeffnet die offene Pickliste des Wagens direkt (auch Picklisten-Nummer scannbar)
Boxen-Picking (Boxenkommissionierung): Boxenwagen als Stammdaten (Einstellungen → Boxen-Picking), Picklisten-Profil-Modus 'Boxen-Picking' mit Wagen-Auswahl und Sammelbox-Option
Boxen-Picking: deterministische Box-Vergabe beim Erstellen (aelteste Auftraege zuerst, 1-Artikel-Auftraege gebuendelt in die Sammelbox, Sammelpakete = eine Box)
Boxen-Picking: Versand-Ansicht sortiert nach Box (Sammelbox als 'S'), Box-Spalte im Picklisten-Detail
Picklisten-Profile: Catch-All-Schalter — ein Profil nimmt jeden offenen Auftrag, ohne einzelne Filter zu pflegen (Zahlungsstatus, Lagerbereich und Mengenbegrenzung gelten weiterhin)
Picklisten-Profile: neue Filter Verkaufskanal, Lieferland und Artikel (enthaelt-Semantik)
Picklisten-Profile: 'Warum? Details anzeigen' am Hinweis 'X von Y Auftraegen passen zu keinem Profil' — zeigt pro Auftrag den Grund je Profil, gruppiert nach Ablehnungs-Muster
Profitbutler: Einrichtungs-Check — das Dashboard warnt jetzt, wenn der Gewinn mit unvollständigen Stammdaten gerechnet wird (Lieferländer ohne Versandkosten-Satz, Artikel ohne Standard-Versandart oder ohne Einkaufspreis); der Hinweis zeigt die konkreten Lücken mit Beispiel-Artikeln und verschwindet automatisch, sobald alles gepflegt ist
Profitbutler: Der Schalter „Retouren einrechnen“ funktioniert jetzt auch im Dashboard — KPI-Kacheln und Kanal-Tabelle zeigen auf Wunsch den Gewinn nach Retouren (USt-korrigiert abgezogen), die aufklappbare Kanal-GuV weist den Abzug als eigene Zeile aus; die Einstellung gilt gemeinsam für Dashboard, Artikel- und Regionen-Tab
Picklisten-Profile: Dialog in 3 Tabs (Filter | Kommissionierung | Versand & Druck) - deutlich uebersichtlicher, Scan-Modus semantisch unter Kommissionierung
Picklisten-Profile: Starter-Vorlagen (Alle bezahlten Auftraege / One-Scan Express / Stapeldruck ohne Scan) + Profil duplizieren
Picklisten-Profile: Verhalten-Badges in der Liste (Stapeldruck / Auto-Versand / inkl. unbezahlt / Fehler: weiter)
Stapeldruck: identische Auftraege per Ein-Klick versenden - Picklisten-Profil-Schalter, Versand-Ansicht gruppiert nach Artikel x Menge, Batch-Druck je Gruppe ueber den bestehenden Versandweg (ohne Scan), Packliste je Gruppe
PDF-Ausgabe ohne Drucker: Pseudo-Workstation "PDF-Ausgabe (im Tab oeffnen)" - Labels als Sammel-PDF, Zolldokumente als zweite Datei
Profitbutler: Datenbasis-Badge auf allen Auswertungsflächen — Dashboard, Artikel, Regionen und Produkt-Auswertung zeigen jetzt oben, ob mit echten Amazon-Kosten (Sellerboard) oder kalkulierten Kosten (Soll) gerechnet wird; ein Klick erklärt die Datenbasis, die Abdeckung, die Einkaufspreis-Herkunft und warum Artikel/Regionen bewusst kalkulatorisch bleiben
Bestellvorschlag: Neue Spalte Retouren zeigt die Retourenquote des Analysezeitraums pro Artikel (Vorgänge ÷ Aufträge, farbcodiert ab 10 %/25 %).
Bestellvorschlag: Filter 'Nur mit Vorschlag' und Summenzeile mit der gesamten vorgeschlagenen Menge.
Profitbutler Kanal-Tabelle: jede Zeile (inkl. Amazon-Marktplätze) klappt zur Berechnungs-Aufstellung auf — Umsatz, Stornos, Waren, Versand, Verpackung, Pick&Pack, Amazon-Gebühren, Werbung, USt = Gewinn, jede Kostenzeile mit Herkunfts-Kennzeichnung (Ist aus Sellerboard / Soll-Modell / Mischung mit Tage-Verteilung); Erstattungen als nachrichtliche Zeile mit Hinweis zum Sellerboard-Vergleich
Profitbutler: Echte Amazon-Kosten (Sellerboard) per Schalter — ersetzt Soll-Provision durch echte Amazon-Gebühren (inkl. FBA-Fulfillment) und Soll-Werbung durch echte Ads-Kosten je Tag und Marktplatz; Verpackung/Pick&Pack zählen nur noch für FBM; Badge „Amazon: Ist-Kosten“ zeigt die Abdeckung, Tage ohne Sellerboard-Daten bleiben ehrlich auf Soll; vollständig abschaltbar (automatische Neuberechnung der letzten ~90 Tage beim Umschalten)
Profitbutler: Perioden-Vergleich (vs. Vorperiode / vs. Vorjahr) in Artikel- und Regionen-Tab — Delta-Anzeigen unter Umsatz/Gewinn, Steiger/Faller-Sortierung per „Δ Umsatz“-Spalte
Bestandsbewertung: Ladenhüter-Auswertung — neue Spalten Absatz/Tag (alle Kanäle, Fenster wählbar), Reichweite und Letzter Verkauf; Schalter „Nur Ladenhüter“ mit gebundenem Kapital
Profitbutler: Schalter „Retouren einrechnen“ in Artikel- und Regionen-Tab — Gewinn/Marge wahlweise nach Retouren (USt-korrigierter Netto-Abzug)
Profitbutler: neuer Tab „Versand“ — Sendungen je Versandart (DHL Paket, Kleinpaket, Briefe, FBA, Zusatz-/Retouren-Labels, manuelles Tracking) und je Mitarbeiter (Sendungen, aktive Tage, Ø/Tag), rückwirkend auswertbar
Profitbutler: Retouren-Quote in % — Artikel- und Regionen-Tab zeigen unter dem Retouren-Betrag jetzt die Quote (Retouren ÷ Brutto-Umsatz, z.B. „149× · 2,9 %“)
Profitbutler: Benutzerdefinierter Zeitraum — Zeitraum-Auswahl in Artikel- und Regionen-Tab um „Benutzerdefiniert…“ (Von/Bis-Datum) erweitert; wirkt auch auf Ausklappen/Drilldown
PROJ-499 Kundensuche deutlich schneller — Die Suche in der Kundenverwaltung dauerte bei großem Kundenstamm mehrere Sekunden. Ursache war (wie bei der Auftragssuche) die zeilenweise Rechteprüfung über zehntausende Kunden, nicht die Datenmenge. Neue Datenbank-Funktion (search_customers) übernimmt Suche und alle Filter in einer optimierten Abfrage — erwartete Antwortzeit im Bereich von Millisekunden statt Sekunden. Umschaltbar per Feature-Flag mit automatischem Rückfall auf den bisherigen Pfad.
PROJ-498 Profitbutler Retouren sauber: artikelscharfe Attribution + Retouren-Spalten — Bugfix: eine 30-EUR-Auftrags-Erstattung erschien voll auf einem 12-EUR-Artikel (Produktdetail-Retouren + Retouren-Tab buchten den vollen Auftragsbetrag pro Artikel), und ~90 % der Erstattungen (Amazon-Pull, Teilerstattungen) fehlten in der Artikel-Sicht komplett. Jetzt wird der Erstattungsbetrag anteilig nach Positionswert auf die Artikel verteilt und pro Artikel auf dessen Warenwert gekappt. Neu: sortierbare Spalte 'Retouren' im Artikel-Tab (artikelscharf) und im Regionen-Tab (je Lieferland); Artikel lassen sich aus dem Artikel-Tab direkt in neuem Tab oeffnen (Titel-Link + Breakdown-Link). Teilerstattungen schreiben ab jetzt die betroffenen Artikel + den Verkaufskanal mit; Bestandsdaten wurden per Migration nachgezogen (Kanalfilter der Retourenauswertung erfasst jetzt alle Eintraege).
PROJ-497 Profitbutler: Netto-Umsaetze klar ausweisen (netto primaer) — durchgaengig war unklar, ob eine Umsatzzahl brutto oder netto ist. Jetzt zeigt der Profitbutler in allen Uebersichten (KPI-Kacheln, Artikel-Tab + Ausklappen, Kanal-Aufschluesselung, Regionen, Produktdetail-Auswertung) netto als grosse Primaerzahl mit Label 'netto' und brutto klein darunter (nur wenn USt > 0); Marge wird auf Netto-Basis gerechnet. Ausnahme wie vom Nutzer gewuenscht: die GuV/Preiskalkulations-Aufstellung bleibt brutto (dort wird die USt explizit als eigene Zeile abgezogen), das Umsatz-Chart bleibt brutto (Tooltip/Titel klar mit '(brutto)' gelabelt). Netto ist ueberall aus der bereits vorhandenen USt ableitbar (kein Re-Backfill): KPI = Umsatz minus USt-Kosten; Kanaele/Regionen aus den Tagesaggregaten bzw. echtem Beleg-Netto (subtotal_net) in der Rechnungen-Ansicht; Artikel/Regionen-RPCs um revenue_net erweitert. Adversariale Multi-Agent-Review (2 Runs, 7 bestaetigte Findings alle gefixt: u.a. Rechnungen-Kanaltabelle labelte brutto als netto, Artikel-Spalte sortierte nach brutto, Produktdetail-Regionen blieben brutto). Volle Testsuite gruen, live auf Produktion verifiziert (Regionen-RPCs liefern revenue_net, DE 98.135,92 EUR brutto -> 82.885,45 EUR netto).
PROJ-495: Profitbutler-Tab Artikel - Zeilen ausklappbar mit Aufschluesselung nach Verkaufskanal (Amazon-Marktplaetze gruppiert) und Lieferland je Artikel, plus Link zum Produktdetail
Profitbutler Regionen-Tab: Gewinn + Marge pro Lieferland (neue Regionen-Tagesaggregate, gleiche Kosten-Engine wie Kanal-Tabelle) (PROJ-490)
Profitbutler KPI-Kacheln: Vergleich zur Vorperiode — ▲/▼ x % Umsatz-Delta pro Zeitraum (PROJ-492)
Profitbutler: neuer Tab 'Artikel' — sortierbare Top/Flop-Liste über alle Kanäle (Einheiten, Umsatz, Gewinn, Marge, Anteil) mit Suche + Filtern (PROJ-493)
Brainflow mobil: Seitenbaum, Suche und Papierkorb als einblendbare Navigation (Sheet) auf kleinen Bildschirmen
Brainflow: Seiten im Baum per Drag & Drop verschachteln und umsortieren
Brainflow: Inline-Suche in der Seitenleiste (Titel-Treffer oben, Inhalts-Treffer mit Vorschau darunter, ⌘K) statt Such-Dialog; Seitenleiste einklappbar und in der Breite verstellbar
Produkt-Auswertung (Profitbutler im Artikel): neue Sektion 'Auswertung nach Region' — Einheiten, Umsatz und Gewinn des Artikels pro Lieferland (Flagge, Anteils-Balken, farbcodierte Marge, Zeitraum-Tabs) (PROJ-484)
Produkt-Auswertung: KPI-Kacheln (Umsatz/Gewinn/Marge/Bestellungen je Zeitraum) über dem Chart wie auf der Profitbutler-Hauptseite (PROJ-484)
Brainflow privates Freigabemodell (PROJ-483): Neue Seiten sind privat, Zugriff wird explizit freigegeben — an Personen, „Alle Admins" oder „Alle Mitglieder", mit Lesen/Bearbeiten; neuer Teilen-Dialog zeigt effektive Freigaben inkl. Vererbung
Profitbutler: Umsatz-Chart mit gestapelten Balken nach Verkaufskanal — Top-3-Kanäle farblich (Amazon kumuliert, Otto, eBay) + Sonstige, Legende & Multi-Serien-Tooltip; Wachstum/Stagnation pro Marktplatz auf einen Blick (PROJ-482)
Brainflow PM-Views (PROJ-481): Sammlungen mit benannten Ansichten — Kanban-Board (Drag & Drop nach Status/Auswahl) und Zeitleiste (Balken verschieben/dehnen, Zoom, Heute-Linie, Ungeplant-Liste); Datums-Felder optional mit Start/Ende
Brainflow Berechtigungen pro Seite (PROJ-480): Seiten einschränkbar auf Personen oder „Alle Admins" mit Lesen/Schreiben, Vererbung auf Unterseiten, Teilen-Dialog, Read-only-Modus
Brainflow Sammlungen & Properties (PROJ-479): Seiten als Sammlung markierbar — eigene Felder (Auswahl, Status, Datum, URL, Text, Zahl u.a.) für Unterseiten, filterbare/sortierbare Tabelle mit Inline-Bearbeitung, Property-Panel auf Unterseiten
Brainflow (PROJ-476): Neues Notizen- & Wiki-Modul — Seitenbaum mit Unterseiten, Notion-artiger Block-Editor (Slash-Befehle, Bilder, Autosave), Volltextsuche, Papierkorb; per Workspace-Schalter aktivierbar (Einstellungen → Allgemein)
Profitbutler: Kanal-Aufschluesselung zeigt Amazon kumuliert als aufklappbare Sammelzeile mit den einzelnen Marktplaetzen (PROJ-478)
Profitbutler: Uebersichtlicheres Dashboard - KPI-Kacheln (Heute/Gestern/7T/30T), Kanal-Aufschluesselung als Tabelle mit echten Margen und Anteils-Balken, praezisere Zeitraum-Labels (PROJ-475)
Profitbutler: Neuer Tab Regionen - Umsatz, Bestellungen, Einheiten und Top-Artikel pro Lieferland mit Zeitraum- und Kanal-Filter (PROJ-474)
PPC-Butler Varianten-Familien: Sellerboard-Kennzahlen optional umsatzgewichtet über Varianten-Familien aggregiert (Opt-in-Toggle + Modus 'Alle Sellerboard-Quellen' / 'Pro Mapping wählbar') — behebt Phantom-Margen durch Sellerboards Werbekosten-Attribution auf die beworbene Variante.
Varianten-Familien-Verwaltung in der PPC-Butler-Integration: Auto-Familien aus Eltern/Kind-Artikeln, bearbeiten/auflösen/manuell anlegen, Reset auf Flowkom-Stand (pro Familie + global), 30d-Familien-Marge sichtbar.
PPC-Butler Mapping-Dialog: Datenquellen-Auswahl mit Suchfeld; jede Quelle trägt die Daten-Herkunft im Namen (Flowkom / Sellerboard / kombiniert); aufklappbare Formel-Beispiele mit Erklärung (Sicherheitspuffer, Deckel, Korridor, …); echte Umlaute in allen PPC-Butler-Texten.
Sellerboard-Import robuster: kurzzeitige Abruf-Fehler der Report-Links werden automatisch wiederholt; die Import-Meldung zeigt das Ergebnis je Quelle (EU/USA) ehrlich an.
Sellerboard SKU-Zuordnung: Auto-Zuordnen kann jetzt zusätzlich über die ASIN mappen (nur eindeutige Treffer) — für Konten, deren Sellerboard-SKUs von den Flowkom-SKUs abweichen. Die Karte erklärt jetzt die Match-Reihenfolge.
Sellerboard-Einstellungen: Report-URLs werden maskiert angezeigt (Zugriffs-Tokens nicht mehr im Klartext, Auge-Symbol zum Einblenden); EU- und USA-Quelle in einer Karte — Speichern/Importieren gilt sichtbar für beide.
Sellerboard USA: Der US-Account (eigener Report-Link) lässt sich als zweite Quelle an der bestehenden Sellerboard-Integration hinterlegen (Einstellungen → Sellerboard USA). US-Daten fließen in USD in den Sellerboard-Tab (Amazon.us-Filter zeigt $), in den EK-Vergleich und als PPC-Butler-Datenquelle; eigener „EK-Export USA"-Button schreibt den Flowkom-EK mit ECB-Tageskurs in USD.
Integration hinzufügen: Sellerboard und PPC Butler zeigen „Bereits verbunden" statt eines Fehlers, wenn schon eine Verbindung existiert.
PPC-Butler: „Alle Marktplätze (Gesamt)" als Datenquelle — Sellerboard-Kennzahlen (TACoS, ACoS, Marge, Umsatz, …) über alle Marktplätze aggregiert an jedes Butler-Profil pushen. Neue oberste Option im Datenquelle-Marktplatz-Auswahlfeld des Mapping-Dialogs.
PPC-Butler Multi-Marktplatz: Sellerboard-Datenquelle vom Ziel-Profil entkoppelt — pro Mapping optional wählbar, aus welchem Marktplatz die Sellerboard-Zahlen kommen (z.B. DE-TACoS ins FR-Butler-Profil pushen). Standard = gleiches Land wie das Ziel-Profil (unverändertes Verhalten). Neuer editierbarer „Datenquelle-Marktplatz"-Auswahl im Mapping-Dialog.
PPC-Butler KPI-Voll-Katalog (Teil 2 von 2): 17 neue Mapping-Datenquellen — Bestand-Split (FBA/FBM/je Lager einzeln), kompletter Sellerboard-Katalog je Marktplatz und Zeitfenster (Absatz, Velocity, Umsatz, Organic-Anteil, Conversion-Rate, Sessions, Retouren-Quote, Werbekosten, Amazon-Gebühren, Netto-Gewinn, ROI, Auszahlung) und Lagerreichweite/Days-of-Supply (gesamt + FBA). Gruppiertes Quellen-Dropdown, Lager-Auswahl, Sellerboard-Staleness-Alarm. (PROJ-460)
PPC-Butler Multi-Marktplatz-Steuerung (Teil 1 von 2): eine Butler-Verbindung steuert jetzt N Amazon-Marktplatz-Profile statt nur DE. Auto-Discovery der Butler-Profile, pro Marktplatz ein eigenes/unabhängiges Mapping-Set (mit „Von-Marktplatz-kopieren"-Button), Sync-Loop je Marktplatz an das jeweilige Profil mit der Landes-ASIN, und Marktplatz-Subtabs (DE/FR/…) im Produkt-Detail. Baut auf Sellerboard-Profitdaten (12 Marktplätze). (PROJ-459)
Shopify: Zahlungsstatus-Rückmeldung (mark-as-paid) — wird ein unbezahlt importierter Shopify-Auftrag (Vorkasse/Rechnung/Überweisung) in Flowkom manuell auf „Bezahlt“ gesetzt, meldet Flowkom den Zahlungseingang via orderMarkAsPaid an Shopify zurück. Pro Shopify-Integration ein-/ausschaltbar (Default aus); bereits bezahlte Aufträge werden übersprungen, Fehler erzeugen eine Benachrichtigung, der lokale Bezahlt-Status bleibt immer erhalten. (PROJ-458)
Varianten-Liste im Elternartikel zeigt jetzt das Bild jedes Kind-Artikels (PROJ-443)
PPC Butler: Läuft die Verbindung ab (der Zugang gilt ~30 Tage), gibt es jetzt einen „Erneut anmelden"-Button — einmal das PPC-Butler-Passwort eingeben und die Verbindung ist erneuert. Deine Variablen-Zuordnungen bleiben dabei erhalten (kein Trennen und neu Einrichten mehr nötig).
PPC Butler: Schlägt ein Sync fehl, bekommen Admins jetzt eine Benachrichtigung in der Glocke mit direktem Link zur Integration — vorher blieb ein Ausfall unbemerkt.
PROJ-434: Kundenaufträge lassen sich jetzt über die Sendungsnummer (Tracking-Nr.) finden — neuer Suchbereich „Nur Sendungsnr.“ und zusätzlich in „Überall suchen“ integriert. Volle Nummer einfügen oder scannen findet den zugehörigen Auftrag (deckt Versand-Tracking, Retouren und manuell hinterlegtes Tracking ab).
PROJ-421: Die Lieferantenbestellung-PDF zeigt jetzt die Zolltarifnummer (TARIC/HS-Code) jedes Artikels — direkt neben SKU und EAN (z. B. „SKU: 100071-001 | EAN: 4270003831161 | HS Code: 8714990000"). Die Beschriftung folgt der PDF-Sprache (deutsch „Zolltarifnr.", englisch „HS Code"); bei Artikeln ohne hinterlegte Zolltarifnummer bleibt die Zeile unverändert. Die Nummer wird am Artikel über die bestehende TARIC-Auswahl gepflegt.
Teilerstattung / Retoure: Bei Bestellungen mit mehreren Artikeln lassen sich jetzt einzelne zurückgesendete Artikel positionsgenau erstatten. Der Auftrag bleibt bestehen, und es wird eine Teilgutschrift über genau die gewählten Artikel (inkl. korrektem Steuersatz pro Position) erstellt.
PROJ-426: Beim Sellerboard-EK-Export lässt sich das Datum „Kostenperiode ab“ jetzt frei wählen (Standard: heute) und gilt für alle exportierten Artikel. Nach dem Export zeigt eine Meldung, wie viele Artikel einen Einkaufspreis bekommen haben und wie viele übersprungen wurden; ein separater „Diagnose“-Download nennt pro Artikel den Grund. Die hochzuladende Datei bleibt unverändert ein einzelnes Tabellenblatt.
PROJ-417: Bestellungen zusammenfassen (Sammelpaket) — Mehrere offene Bestellungen desselben Empfängers zu einem Paket bündeln: ein Label, eine Tracking-Nr.; Mitglieder bleiben eigenständig und werden je Kanal (Amazon/eBay/Shopify) mit eindeutiger Tracking-Nr. bestätigt. Hinter Feature-Flag (per Einstellungen schaltbar).
Admins können die Lieferadresse eines bereits abgeschlossenen oder stornierten Auftrags nachträglich korrigieren — als bewusster, protokollierter Override mit Warnhinweis. Die Änderung erscheint in der Auftragshistorie als Admin-Override samt optionalem Grund; normale Mitarbeiter bleiben für abgeschlossene Aufträge weiterhin gesperrt.
PROJ-416: Sellerboard-Profitabilität (TACoS, echter ACoS, Marge, Gewinn/Stück × 7/14/30/60d+Lifetime) als 20 neue PPC-Butler-Produktvariablen — 1:1 aus sellerboard_daily pro Artikel (FBM+FBA summiert), marktplatz-getrennt, über den bestehenden täglichen PPC-Butler-Sync.
Profitbutler → Sellerboard: neuer Button "EK-Export für Sellerboard". Erzeugt eine CSV im Sellerboard-Einkaufspreise-Format aus den Flowkom-FIFO-Einstandspreisen, die direkt in Sellerboard hochladbar ist. Bei FBM-Artikeln werden die Verpackungskosten auf den EK aufgeschlagen, und das passende Sellerboard-Versandprofil wird je nach Flowkom-Versandart des Artikels eingetragen (Zuordnung einmalig in den Sellerboard-Einstellungen pflegbar). Andere Sellerboard-Einstellungen (MwSt., Kategorie etc.) bleiben unberührt.
Profitbutler → Sellerboard: Einkaufspreise aus Sellerboard werden jetzt importiert und je Artikel direkt in der Produktliste angezeigt - daneben der Flowkom-FIFO-Einstandspreis. So sieht man auf einen Blick, ob bei einem Artikel in Sellerboard kein Einkaufspreis hinterlegt ist (rotes "EK fehlt") und ob der Sellerboard-Preis noch aktuell ist (Hinweis bei Abweichung über 15%). Dafür wird in den Einstellungen der Sellerboard-Integration eine zweite Report-URL ("Einkaufspreise") hinterlegt, die der bestehende tägliche Import automatisch mit abholt.
Festgeschriebene Lieferantenbestellungen tragen jetzt einen grünen „Festgeschrieben“-Badge (Schloss-Symbol) auf den Kanban-Karten, in der Listenansicht und in der Bestelltabelle — auf einen Blick erkennbar, welche LBs gegen rückwirkende Einstandskosten-Änderungen gesperrt sind.
Lieferantenbestellung festschreiben: Einstandskosten einer LB lassen sich manuell einfrieren (nur bei abgeschlossenem Wareneingang). Festgeschriebene LBs werden bei späteren Maß-/Verpackungsänderungen nicht mehr rückwirkend neu berechnet — keine FIFO-/Margen-Drift. Kosten-Tab ist dann gesperrt; Entsperren nur durch Admins.
Die Benachrichtigung über neue Shopify-Produkte nennt jetzt direkt die gefundenen Produkte (Name + SKU) statt nur einer Anzahl. "Jetzt importieren" öffnet außerdem den Import-Dialog direkt, statt nur auf die Integrationsseite weiterzuleiten.
Pro Cronjob gibt es jetzt einen Schalter "Bei Fehler benachrichtigen" (Standard: an). Schlägt ein Hintergrund-Job fehl, erscheint automatisch eine Fehler-Benachrichtigung mit Link zu den Cron-Einstellungen — und du kannst einzelne Jobs gezielt stummschalten. Mehrfaches Fehlschlagen erzeugt nur eine Meldung (kein Spam).
Fehler-Benachrichtigungen lassen sich jetzt workspace-weit bestätigen: Setzt ein Admin einen Fehler auf "behoben", sehen alle anderen Admins, wer ihn wann erledigt hat. Der Systemstatus-Tab trennt jetzt klar zwischen "Offen" und "Erledigt".
Fehlgeschlagene Bestandssyncs erzeugen jetzt automatisch eine Fehler-Benachrichtigung (mit Link zur Integration) — vorher war so ein Fehler stumm und nur in den Einstellungen sichtbar. Der Glocken-Zähler bleibt rot, bis ein Admin den Fehler aktiv erledigt hat.
Versandfehler beheben: Das Etikett wird beim "Korrigieren & Erneut versenden" jetzt direkt an die gewählte Versandstation gedruckt — kein Umweg mehr über den Tab "Etiketten".
Versandfehler-Eintrag zeigt jetzt aufklappbar die Auftragspositionen (Bild, Name, SKU, EAN, Menge) — schnelle Prüfung, ohne den Auftrag zu öffnen.
Versandstation-Auswahl ist jetzt in allen Versand-Tabs sichtbar (Versand, Versandhistorie, Etiketten, Versandfehler).
PROJ-345 Zwei-Faktor-Authentifizierung (TOTP) — Optionales 2FA über Authenticator-Apps (Google Authenticator, Authy, 1Password, MS Authenticator). Jeder Nutzer aktiviert/deaktiviert 2FA selbst in den Konto-Einstellungen (Setup-Wizard mit Passwort-Bestätigung, QR-Code und Verifikation). Beim Login wird danach ein 6-stelliger Code abgefragt. Workspace-Admins sehen pro Teammitglied, ob 2FA aktiv ist, und können es bei Geräteverlust zurücksetzen. Ein dezenter Dashboard-Hinweis bewirbt 2FA für Nutzer ohne aktivierten Faktor und lässt sich dauerhaft ausblenden.
PROJ-343 Web-UI — Geräteverwaltung (Einstellungen → Geräte): echte Online/Offline-Spalte (statt nur is_active) via Heartbeat/last_seen_at mit 30s-Live-Refresh, Button „Gerät hinzufügen“ (zeigt den dauerhaften Geräte-Code sofort zum Notieren/Aufkleben), durchgängiges Rebranding „Reconnect-Code“ → „Geräte-Code“, Bestätigungsdialog beim Neu-Generieren. Einmal-Aktivierungscodes komplett aus dem Pairing-Flow entfernt (nur noch ein Code pro Gerät).
PROJ-343 Backend — Mobile-Geräte dauerhafte Kopplung: maschinenlesbare Auth-Codes (SESSION_EXPIRED vs DEVICE_UNPAIRED) auf den 401-Antworten von login/workers/refresh/heartbeat/auth-helper (deutsche error-Strings unverändert, code nur additiv), sodass die App ein abgelaufenes PIN-Login nicht mehr mit einem echten Geräte-Unpair verwechselt. Neuer Admin-Endpoint POST /api/mobile/devices (Gerät mit Namen anlegen → dauerhafter Geräte-Code = bestehender reconnect_code, läuft nie ab). Neuer leichter POST /api/mobile/heartbeat (Device-Token) für echtes Online/Offline via last_seen_at. Migration paired_at (additiv/idempotent), gesetzt in reconnect/activate. 14 neue Vitest-Specs.
PROJ-347 Billkom-Belege im Auftrags-Verlauf — Rechnungen, Gutschriften/Teilgutschriften, Rechnungs-Zahlungen und Stornos erscheinen jetzt im Verlauf eines Auftrags (bisher nur in der Billkom-eigenen Beleg-Historie). 4 neue Verlauf-Eintragstypen, die an den bestehenden Billkom-Stellen mitgeschrieben werden (nur bei order-verknüpften Belegen). Backfill-Migration trägt Rechnungen & Gutschriften für bestehende Aufträge nach. Bewusst minimal (kein Read-Time-Merge, keine Flags). Adversarialer QA-Pass: 0 Bugs, Build clean. PR #355, v1.98.028.
PROJ-344 Dokumente bei Vaterartikeln — Konformitätserklärung & Bedienungsanleitung listen jetzt die aktiven Varianten (EAN, Name, Bild) statt des Parents. Greift in beiden Pfaden „Speichern & PDF“ und beim Download; einfache Produkte bleiben unverändert.
Adressetikett-Versandart meldet an die Verkaufskanäle jetzt Carrier „Deutsche Post" (Amazon zusätzlich Versandart „Brief") statt einer internen Pseudo-Nummer — ohne echte Trackingnummer, da Briefe unverfolgt sind. (PROJ-342)
Neue Versandart "Adressetikett": druckt beim Versenden nur die Empfängeradresse auf ein Briefmarken-Etikett (Deutsche-Post-Adresszonen-Layout, aber ohne Frankierung) mit freiem Feld zum Aufkleben einer echten Briefmarke. Wird lokal als PDF erzeugt — keine Deutsche-Post-API, kein Porto, kein Tracking — und druckt über die bestehende Druck-Pipeline auf dem Brother QL 600 / 62mm-Endlosetikett. (PROJ-342)
PROJ-338 Profitbutler-Sellerboard-Spiegel (v1): neue Sellerboard-Tab unter Profitbutler + Sub-Tab in der Produktdetailansicht, die Sellerboards täglichen 30-Tage-CSV-Report 1:1 spiegelt (kein Nachbau, kein EK-Swap). Eigenes, von Amazon entkoppeltes SKU→Artikel-Mapping mit Auto-Zuordnen. Täglicher Auto-Import + manueller Trigger. Kacheln (Heute/Gestern/7T/30T) geben Zeitraum & Summen vor, Produkttabelle mit FBM/FBA-Trennung und voller GuV per „Mehr“. Strikt isoliert vom bestehenden Profit-Stats-Layer. (PPC-Butler-Push von Profit/TACOS folgt als Schritt 2.)
PROJ-337: FBM-Gewinn nutzt echte Versandkosten je Lieferland (shipping_method_country_costs) + Verpackung statt Sellerboards Pauschal-Versand (Swap, kein Doppelzählen). Nur FBM; fehlt ein Versandsatz, bleibt Sellerboards Versand. Prod-verifiziert.
PROJ-336: Profitbutler Amazon-GuV jetzt Sellerboard-treu (1:1) mit Flowkoms FIFO-Einstandspreisen. Umsatz + Kosten kommen aus derselben Sellerboard-Periode (kein Coverage-Mismatch mehr), EK aus Flowkom-FIFO via EK-Swap auf NetProfit. Behebt überhöhte Gewinne (z.B. 100068-FBA 67,8% → 7,5%). Inkl. 72-Spalten-Parser, amazon_listings-Matching, täglicher Import-Cron, Coverage-Badge (T-1), Kacheln auf Suche skopen. Live für Pixkom.
PROJ-335 Profitbutler — Period-KPI-Kacheln auf echte Amazon-Kosten (schließt QA-Finding LOW-2). Die Kacheln (Heute/Gestern/Aktueller Monat) zeigten Gewinn/Deckungsbeitrag/Werbung auf Soll-Basis, das Grid (PROJ-332/333) aber echte Amazon-Kosten. Lösung: client-seitige Kachel-Korrektur (applyAmazonRealToTile, pure+getestet) + ein additives /stats-Feld (amazonNetRevenue) — kein In-Place-Mutieren, daher Legacy-GuV + PDF-Export byte-identisch. Ersetzt den Amazon-Soll-Anteil (Netto-Basis) durch Ist (provision+fba+amazon_fees_combined). Gate-Fix type IN (amazon,sellerboard) damit Sellerboard-Workspaces das Overlay bekommen. v1-Grenzen dokumentiert (prev_month bleibt Soll wegen 35d-Retention, mit Ist/Soll-Marker). Design + adversariale Review via Multi-Agent-Workflows, berechtigte Findings eingearbeitet. 39 Vitest-Specs grün. PR #325, v1.91.000.
PROJ-333 Profitbutler — Kanal-Aufschlüsselung im Produkt-Ausklappen. Das Ausklappen zeigt zusätzlich zur GuV des Gesamtprodukts eine Aufschlüsselung nach Verkaufskanal: Amazon-FBM, Amazon-FBA, Otto, Kaufland, eBay, Webshop, Flowkom (+ Sammelbuckets). Neuer PLPGSQL-RPC profitbutler_by_product_channel_aggregate; Umsatz/USt/Einheiten exakt pro Kanal, Amazon-Ist-Kosten umsatzanteilig per Largest-Remainder pro Bucket (Σ Kanäle == Produkt-Total Cent-exakt), FBA-Buckets nur auf FBA-Zeile, Nicht-Amazon=Soll. Pro-ratierte Amazon-Zeilen tragen Ist-(anteilig)-Badge. Gemeinsame profitCents()-Funktion. Lazy expand_channels, Default-Pfad byte-identisch. Design + adversariale Review via Multi-Agent-Workflows. 58 Vitest-Specs grün. PR #323, v1.90.000.
PROJ-234 Migration (#298, Squash fbd21cda) — Profitbutler-Auswertungs-Tab im Produkt-Detail auf die PROJ-330 Sellerboard-UI umgestellt. Bisher zeigte der Tab den Legacy ProfitbutlerSellerboard (tabular HEUTE/GESTERN/7T/MONAT/30T). Jetzt rendert er hinter dem workspace-Beta-Flag dieselben klickbaren Period-Tiles + ProductGrid wie die Hauptseite, aber pre-filtered auf den einen productId. Neue Komponente ProfitbutlerProductOverview: 4 Period-Tiles mit lokalem (nicht URL-) Period-State, ProductGrid mit expand_marketplaces=true fuer Drilldown auf Marketplace-Sub-Zeilen, Hinweis-Banner wenn amazonReal.hasData=false (linkt zu Cron-Jobs). Branch-Logik in profitbutler-product-stats.tsx: Beta-aktive Workspaces bekommen die neue UI, alle anderen die Legacy unveraendert.
PROJ-330 Echte Amazon-Kosten pro SKU (Sellerboard-Parität) — Phase A + B + C komplett. Phase A: separate SP-API-Pipeline neben PROJ-189 für ShipmentEvent + ServiceFeeEvent (RefundList + AdjustmentList werden bewusst ignoriert), FBA-Storage-Fees-Cron monatlich, Aggregate-Cron stündlich. Zwei neue Tabellen amazon_sku_cost_events (raw, append-only, Hash-Idempotenz, 21 cost_types) + amazon_sku_costs_daily (rolling 35d). RPC refresh_amazon_sku_costs_daily mit self-healing SKU-Mapping über amazon_listings. Phase B: komplett neue Integration type='amazon_ads' mit separater OAuth pro Workspace (LwA-Credentials werden im Connect-Dialog eingegeben, keine globalen Env-Vars), Reports v3 Lifecycle für spAdvertisedProduct, sync-runner mit Token-Refresh + cursor-driven Backfill. Phase C: additives amazonReal-Feld in /api/profitbutler/stats (Response byte-identisch für Nicht-Opt-In Workspaces), neuer paginierter /api/profitbutler/stats/by-product Endpoint (per-product real-costs aus amazon_sku_costs_daily, kein Pro-Rata), Sellerboard-artige UI mit 4 klickbaren Period-Tiles + Filter-Bar + Product-Grid mit Marketplace-Sub-Zeilen + Checkbox-Selektion + Source-Badges (Ist/Soll/Mix). Beta-UI hinter workspaces.profitbutler_new_ui_enabled-Toggle (default false, Legacy bleibt aktiv). Settings-Toggle cost_events_pull_enabled (default false) hängt am AmazonTogglesBlock. Strikte Isolation der PROJ-189 Refund-Pipeline garantiert (finance-events-pull.ts / finance-events-filter.ts / finance-events-dedup.ts byte-identisch, SHA-256-Baseline in features/PROJ-330-isolation-baseline.md). QA-Audit vor Merge fand 6 Bugs (0 Critical/High, 2 Medium, 4 Low), alle gefixt. 168/168 Vitest grün, TS clean. Default-State nach Deploy: kein SP-API-Polling, keine UI-Änderung, kein Ads-Cron — alles bleibt safe bis User die Toggles aktiviert. Deployed via PR #293 Squash 65a04462.
PROJ-328 PPC-Butler-Sub-Tab im Produktdetail — neuer Sub-Tab unter Profitbutler (nur sichtbar wenn PPC-Butler-Integration im Workspace existiert). Zeigt pro ASIN alle PPC-Butler-Variablen mit Mapping-Status. Gemappte Variablen sind read-only mit 'Auto-Sync'-Badge + Source-Kind + live-berechnetem Wert. Ungemappte Variablen haben Number-Input + Push-Button für manuellen Push pro Produkt. Architektur: neue lokale Tabelle ppc_butler_product_variable_values (UNIQUE integration_id+product_id+variable_name) als Audit-Trail, weil PPC Butler keinen GET-Endpoint hat. sync-runner upsertet alle erfolgreichen Auto-Sync-Pushes in Chunks à 500. Manueller Override gemappter Variablen via API gesperrt (HTTP 409 managed_by_mapping). Tab erscheint via /api/integrations?type=ppc_butler&limit=1-Auto-Detect.
PROJ-328 Automatischer Sync — Phase-2-Item nachgereicht. Neuer Endpoint /api/cron/ppc-butler-sync mit authenticateCron-Auth iteriert über alle PPC-Butler-Integrationen mit settings.auto_sync_enabled=true UND status=active und triggert pro Verbindung Fire-and-Forget runSync(). acquireSyncLock verhindert Doppelläufe bei überlappenden Triggern (Lock-Konflikte werden als 'skipped: Sync already running' geloggt). Toggle 'Automatischer Sync' im PPC-Butler-Detail-Header (PATCH /api/integrations/[id] mit gemergten settings, optimistic UI mit Rollback). Eintrag in /dashboard/settings/cron-jobs mit neuer Kategorie 'PPC Butler' (Target-Icon), Manual-Trigger-Button und Health-Indikator. Trigger-Intervall liegt komplett im externen Scheduler (Coolify/all-inkl), Empfehlung stündlich (0 * * * *). Pattern identisch zu Shopify Order-Import.
PROJ-328 QA — Audit-Report ergänzt 'QA Test Results'-Sektion in der Spec. 18/18 Acceptance Criteria PASS gegen Code verifiziert (Connection-Setup 7/7, Variable Discovery 4/4, Mapping-Konfiguration 3/3, Datenfilter & ASIN-Resolution 6/6, Sync-Ausführung 6/6, Cognito-Token-Lifecycle 3/3, Sicherheit & RLS 3/3, Integration-Registry 3/3). 16/16 Edge Cases PASS (alle im Code-Pfad behandelt, jeweils mit Datei-Referenz). Security-Audit 8/8 PASS — Cognito-Passwort wird NIE persistiert (grep über alle credentials_encrypted-Schreibstellen bestätigt), Refresh-Token AES-verschlüsselt via src/lib/crypto.ts, RLS auf ppc_butler_variable_mappings + ppc_butler_sync_logs aktiv via is_workspace_member() (PROJ-415-Pattern), Workspace-Isolation auf allen 9 API-Routes, Rate-Limits auf allen Endpoints (Werte dokumentiert), Zod .strict() auf allen POST/PATCH-Schemas (Mass-Assignment-Schutz), kein PII in Sync-Logs, Audit-Log für Connect/Sync/Mapping-CRUD. Tests: 54/54 Vitest grün (4 Files: client/cognito-srp/formula-parser/mapping-engine), TypeScript clean (0 Findings für PPC-Butler-Files), ESLint clean (0 Errors, 0 Warnings), Production-Build erfolgreich (8 PPC-Butler-Routen kompiliert). Performance-Check statisch: 10-Slot-Semaphor implementiert, 401-Retry-Once nicht in Endlosschleife (token401Retried-Flag), Polling-Cap 5 Min im Frontend, PostgREST-10k-Cap beachtet. 0 Critical/High/Medium Bugs gefunden. 2 Low-Findings dokumentiert für Folge-Ticket (LOW-1: integrations.last_sync_at wird vom Sync-Runner nicht aktualisiert — UX-Fallback via History-Endpoint deckt das ab; LOW-2: stock_available zählt Sperrlager mit — semantisch unklar, bewusste Phase-2-Entscheidung). Production-Ready: YES.
PROJ-328 Frontend — PPC Butler UI komplett. Dedizierter PpcButlerConnectDialog mit Cognito-Username + Passwort + Profile-ID, ruft direkt POST /connect (Cognito-Login + Profile-Validierung + verschlüsseltes Speichern in einem Schritt) statt des generischen Empty-Insert-Flows — sonst hätte die Partial-Unique-Constraint die zweite Anfrage blockiert. AddIntegrationDialog fängt ppc_butler ab und öffnet diesen Dialog. PpcButlerIntegrationDetail rendert im generischen /dashboard/settings/integrations/[id] (analog Shopify/Amazon/Freescout): Header mit Profile-ID, auth_failed-Badge bei Token-Expiry, 'Verbindung trennen' mit Confirm-Dialog. Variablen-Tabelle mit Live-Discovery (GET /variables), Mapping-Status-Badges (gemappt / nicht gemappt / verwaist), Refresh-Button, per-Zeile Mapping-Bearbeiten + -Entfernen. PpcButlerMappingDialog mit Datenquelle-Dropdown (5 MVP-Quellen), bedingten Tag-Boost-Feldern (Tag-Combobox via /api/tags, Boost-Wert + Default-Wert), Formel-Textarea mit clientseitiger Live-Syntax-Validierung (parseFormula aus @/lib/ppc-butler/formula-parser — kein Server-Roundtrip beim Tippen), Vorschau-Button (POST /preview, 5-Zeilen-Tabelle SKU/ASIN/Rohwert/Endwert mit Formel-Fehler-Badge), Aktiv-Toggle. PpcButlerSyncPanel mit großem 'Jetzt syncen'-Button (disabled während Lauf), Live-Progress-Panel mit Progress-Bar + Zählern + Per-Variable-Liste, Polling alle 2s, Timeout nach 5 Min, picks laufende Syncs nach Page-Reload auf. Sync-Historie mit Drill-Down-Toggle pro Lauf. Shadcn-Komponenten ausschließlich, keine neuen npm-Dependencies. Toasts via sonner für alle CRUD-Aktionen. Icon 'target' + 'headphones' zu integration-card.tsx ICON_MAP hinzugefügt.
PROJ-328 Backend — PPC Butler Integration Phase 1. Neuer Integration-Typ ppc_butler (category=marketplace), 4 DB-Migrationen (CHECK-Constraint-Erweiterung, ppc_butler_variable_mappings, ppc_butler_sync_logs, Partial-Unique-Index für eine Connection pro Workspace). Cognito-SRP-Auth via amazon-cognito-identity-js mit Node-Polyfills, PpcButlerClient-Wrapper mit Token-Refresh + 401-Retry + 404-Skip + Rate-Limiting (max 10 parallel), eigene Mini-Formel-Parser-Implementierung (Recursive-Descent, Whitelist MAX/MIN/ROUND + 4 Operatoren, ~150 LoC TypeScript, kein eval/Function-Constructor, ~120 Vitest-Specs grün), 5 deklarative Datenquellen (stock_total/stock_available/inbound_stock/days_to_restock/tag_boost) via Mapping-Engine. Sync-Runner orchestriert kompletten Lauf mit Per-Variable-Fehler-Isolation, Sync-Lock via Partial-Unique-Index auf (integration_id) WHERE status='running' (race-free DB-Lock, überlebt Pod-Restarts), Zombie-Cleanup (>30min auf failed setzen). 8 API-Routes unter /api/integrations/ppc-butler/ (connect, [id]/variables, [id]/mappings, [id]/mappings/[mappingId], [id]/mappings/[mappingId]/preview, [id]/sync, [id]/sync/[logId], [id]/sync-logs). Refresh-Token AES-verschlüsselt in integrations.credentials_encrypted, Passwort wird sofort nach SRP verworfen. RLS auf allen neuen Tabellen via is_workspace_member().
PROJ-329 Frontend — Source-Badge + Konflikt-Banner im ASIN-Feld des Produkt-Detail-Formulars. Badge 'Auto aus Listing' bzw. 'Import' erscheint direkt unter dem ASIN-Input, sobald products.asin_source IN ('listing_auto','import') — bei 'manual' und NULL bleibt das Feld bewusst rauscharm. Konflikt-Banner (amber Alert mit AlertTriangle + zwei Buttons) wird sichtbar wenn products.asin_conflict_listing_id gesetzt ist. Banner fetched die Listing-ASIN best-effort aus amazon_listings für eine sprechende Meldung ('… abweichende ASIN: B08...'); fällt der Fetch aus (Permissions/Listing fehlt) bleibt der Übernehmen-Button trotzdem nutzbar weil das Backend selbst gegen das Listing resolved. Beide Buttons rufen POST /api/products/[id]/resolve-asin-conflict mit action accept_listing / keep_manual, zeigen Loading-Spinner und Toast-Feedback, triggern danach Product-Refresh. Gelbes Warndreieck mit Tooltip 'ASIN-Konflikt vorhanden' neben dem Produkt-Titel im Kanban und in der Produkt-Tabelle (stopPropagation gegen Card-Click). Optionaler Filter 'Nur ASIN-Konflikt' in der Filterleiste — als Boolean-Toggle direkt im Filter-Popover-Stage-1 implementiert (kein Stage 2), eigener Filter-Chip mit X-Removal, URL-Param ?asin_conflict=1 für Deeplink. ProductFilters-Type und Filter-Pipeline um has_asin_conflict erweitert (filterByAsinConflict, getActiveFilterCount). Product-Interface in src/lib/validations/product.ts um asin_source und asin_conflict_listing_id ergänzt — bestehender select('*') in Detail-Page und Listings-API lädt die Felder automatisch.
PROJ-329 Backend — Auto-ASIN-Pflege auf Produktebene. Neuer PL/pgSQL-Trigger sync_asin_from_listing() (SECURITY DEFINER) auf amazon_listings, fired AFTER INSERT OR UPDATE OF flowkom_product_id, asin. Befüllt products.asin aus dem gemappten Listing wenn das Produkt noch keine ASIN hat (asin_source='listing_auto'), respektiert manuelle ASINs (kein Overwrite — stattdessen Konflikt-Marker products.asin_conflict_listing_id), idempotent bei mehrfacher Trigger-Feuerung, mit Workspace-Konsistenz-Check (RAISE EXCEPTION bei Mismatch). Zwei neue Spalten: asin_source TEXT CHECK ('manual','listing_auto','import') und asin_conflict_listing_id UUID FK ON DELETE SET NULL, plus Partial-Index. Backfill via DO-Block (DISTINCT ON sorted by created_at ASC — erstes Listing gewinnt bei Mehrfach-Marketplace-Mapping, Edge Case 2), reentrant, RAISE NOTICE loggt n_filled/n_conflicts. PATCH /api/products/[id] akzeptiert nun asin (Zod /^[A-Z0-9]{10}$/) und stempelt asin_source='manual' + cleart Konflikt-Marker. POST /api/products macht dasselbe beim manuellen Anlegen. Neuer Endpoint POST /api/products/[id]/resolve-asin-conflict mit Body { action: 'accept_listing'|'keep_manual' } für die Konflikt-Auflösung (Auth + Rate-Limit 60/min). Produkt-Form Edit-Pfad (direkter supabase-Update aus dem Browser) stempelt source='manual' + cleart Marker nur bei tatsächlicher ASIN-Änderung. 32 neue Vitest-Specs (22 Trigger-Semantik + Migration-File-Strukturchecks, 10 API-Route-Branches). Folge: Frontend (ASIN-Badge + Konflikt-Banner) und QA via /frontend bzw. /qa.
PROJ-325: Dashboard-Widget für offene manuelle Picklisten. Neuer fünfter KPI-Tile auf der allgemeinen Dashboard-Übersicht (sichtbar für alle Workspace-Member, nicht admin-only — Picking/Writeoff sind operative Themen). Zeigt Counter aller Picklisten mit `writeoff_reason IS NOT NULL AND written_off_at IS NULL`. Visual Emphasis (border-red-300 / bg-red-50/30 / red-700-Text + AlertTriangle-Icon rot) sobald `count > 0 UND die älteste offene Ausbuchung > 24h alt` ist — verhindert dass vergessene Ausbuchungen tagelang im Backlog liegen. Klick auf die Card navigiert auf `/dashboard/outbound/picklists?pending_writeoff=true` (gefilterte Ansicht aus PROJ-325 Task 7). Bei Count = 0 zeigt die Card 'Keine offenen Ausbuchungen' statt eines Datums. Fetch läuft parallel im bestehenden `Promise.all`-Block der Dashboard-Page (Server Component, kein zusätzlicher Roundtrip).
Manuelle Pickliste — Bestandsausbuchung (PROJ-325). Manuelle Picklisten haben jetzt einen expliziten Ausbuchen-Flow mit Pflicht-Grund (FBA, Muster, Defekt, Sonstiges), Teilmengen-Unterstützung und prominenten Anti-Vergess-Badges in Liste, Detail und Versand-Screen.
PROJ-321 — Parent-Fortschritt: Editierbare Child-Matrix unter dem Aggregat-Block. Zeilen = Child-SKUs (sticky erste Spalte mit SKU + Variant-Attributen), Spalten = Optionen einer Checkbox-Gruppe. Spalten-Header-Klick = Mehrheits-Toggle (alle setzen wenn nicht alle gesetzt; alle entfernen wenn alle gesetzt). Pure Helpers in src/lib/products/checkbox-matrix-helpers.ts (14 Vitest-Tests). Neuer Endpoint POST /api/products/checkbox-bulk-toggle (Auth + Rate-Limit 10/min + Workspace-Scope + Group/Option-Validation) ersetzt N parallele PATCHes durch einen atomaren Server-Loop. Cell-Checkboxes sind während Spalten-Toggle disabled (Race-Schutz Single-Cell ↔ Bulk). QA-Skill fand 3 Low-Findings, alle vor Merge gefixt: BUG-1 (Rate-Limit → dedizierter Bulk-Endpoint), BUG-2 (Race-Condition → cell-disable), BUG-3 (Toast-Wording „Updates" → „Child-Updates" gemäß Spec). Auslöser: Live-Pain-Point auf Parent-SKU 200154 (Pflege musste bisher Child-für-Child erfolgen). PR #272.
PROJ-320 — Manuelles Tracking erzeugt jetzt eine begleitende `shipping_task`, damit Retoure- und Zusatz-Etikett-Buttons im Auftragsdetail sofort verfuegbar sind. Bisher setzte PROJ-209 nur `orders.manual_tracking_number`/`status='shipped'` und legte keine `shipping_tasks`-Zeile an. Die Label-Action-Bar und die `additional-label`/`return-label`-Endpoints sind aber hart an `shipping_tasks.id` als Pivot gekoppelt -> „+ Etikett“ disabled, „Retoure“ gar nicht gerendert. Live-Vorfall Pixkom 2026-05-18 Auftrag 36317 (Dropshipper-Versand mit DHL-Tracking) fuehrte zu Quick-Fix per DB-Insert + dieser strukturellen Loesung. POST/PATCH/DELETE-Handler in `manual-tracking/route.ts` rufen jetzt einen neuen Helper `src/lib/shipping/manual-tracking-task.ts` auf, der eine `shipping_task` mit `label_type='outbound'`, `status='completed'`, `shipping_label_url=null` schreibt/updated/loescht. Idempotent ueber `(order_id, tracking_number)`. Schutz vor Antasten echter DHL/DP-Tasks via `shipping_label_url IS NULL`-Filter in PATCH/DELETE. Plus Backfill-Migration fuer 52 Bestands-Orders auf Pixkom mit `manual_tracking_number` ohne entsprechende Task. 11 Vitest-Specs gruen, TS+Lint clean.
PROJ-319: Picklisten-Tag-Filter Schema-Split — `tag_filters` JSONB aufgeteilt in zwei semantisch klare Konzepte: `must_have` (Einschluss, AND/OR-Toggle) und `must_not_have` (Ausschluss, immer AND). Behebt einen Live-Bug bei Pixkom, wo alle drei Standard-Profile (One-Scan, Multi, DHL Paket) `logic="OR"` mit reinen `HAS_NOT`-Regeln kombiniert hatten — strukturell wirkungslos (`HAS_NOT(A) ∨ HAS_NOT(B)` ist nur false wenn beide Tags). PL-2026-0240/0237/0236 hatten dadurch je 1-2 Aufträge mit Personalisierte-Artikel-Tag obwohl ausgeschlossen. Root Cause war nicht der Helper-Code (boole'sch korrekt), sondern dass das Schema HAS und HAS_NOT als gleichwertige Operatoren mit globalem Logic-Toggle modellierte — die Kombination HAS_NOT+OR ist damit strukturell unmöglich geworden. Migration backfillt deterministisch (4 Profile, kein Mixed-Fall im Bestand), Helper hat Read-Fallback für eine Release-Phase. UI: zwei klar getrennte Sektionen 'Aufträge müssen diese Tags haben' und 'Aufträge dürfen diese Tags NICHT haben'. Sofort-Daten-Hotfix der 3 betroffenen Pixkom-Profile von OR auf AND auf Production am 2026-05-15 vor Implementierung deployed. PR #267, Production-Migration verifiziert (alle 4 Profile sauber im neuen Schema), 23 Vitest-Specs grün, Independent-Code-Review clean.
PROJ-317 Kostenlose Ersatzlieferung sofort als bezahlt anlegen — Neuer Switch „Sofort als bezahlt markieren“ (Default an) im Replacement-Modus des OrderFormDialog; POST /api/orders/[id]/replacement akzeptiert mark_as_paid: boolean und setzt financial_status beim Insert auf 'paid' oder 'pending'. Spart einen manuellen Klick pro Ersatzanlage, Order erscheint direkt auf der Standard-Pickliste (PROJ-210-Filter status='open' AND financial_status='paid'). Nur im Replacement-Modus sichtbar, Edit/Normal-Anlage unverändert. Keine Migration. Deployed via PR #259.
PROJ-315: Drucker-Zuweisung für Etiketten-Typen pro Workstation. Neue Tabelle label_type_printer_assignments (Workstation × label_type → Primär+Fallback-Drucker) symmetrisch zur bestehenden shipping_method_printer_assignments. Workstation-Detail-Drawer bekommt zwei Sektionen 'Versandarten' + 'Etiketten' — der bestehende Form-Component wurde via entityKind-Pattern generalisiert. Print-Label-Dialog macht jetzt einen Lookup auf die neue Tabelle vor print_jobs.insert und schreibt printer_id mit; ohne Zuweisung erscheint ein Toast mit Hinweis auf Settings statt eines hängenden Print-Jobs. Behebt strukturelle Lücke aus PROJ-99/304/306/312/314 (der gesamte 'An Drucker senden'-Pfad im Etikettendruck-Modul hatte zuvor keinen Drucker).
PROJ-306: Etikettenvorlagen — Multi-Field, Marke, Default-Vorlage. Vorlagen können jetzt mehrere Text-Felder gleichzeitig anzeigen (z.B. Name + SKU + Marke), die Marke ist als neue Feld-Option dazugekommen (Lookup gegen `manufacturers.brand_name`), und Vorlagen können als "Standard" für ihre Kategorie markiert werden — im Druck-Dialog automatisch vorausgewählt (Workspace-Default vor System-Default). Plus Bug-Fix: Toast bei Anlege-Fehler reicht jetzt die DB-Fehlermeldung durch (vorher anonym „Fehler beim Erstellen:"). DB-CHECK-Constraints für Whitelist-Werte hinzu, damit ungültige Enum-Werte nicht mehr silent in der DB landen. Migration backfilled bestehende Single-Field-Vorlagen verlustfrei ins neue Multi-Field-Format.
PROJ-303: Amazon Carrier + Versandart Mapping. Behebt strukturell den Live-Bug 2026-05-07 (17+ FBM-Orders dauerhaft mit Amazon-Fehler 25 weil Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` einen ungültigen CarrierCode-Enum-Wert produzierte — der Hotfix #240 mit Commit-Tag PROJ-301 hatte das Symptom bereits behoben). Neues Mapping-Feld `amazon_method_overrides` parallel zum legacy `carrier_overrides` (Backward-Compat 1 Release), 3-Spalten-Settings-UI: Flowkom Versandart | Amazon Transportdienst (Combobox aus AMAZON_CARRIER_CODES-Whitelist mit ~63 SP-API-XSD-Enum-Werten, ungültige Werte rot mit Save-Block) | Amazon Versandart (Freitext, leer = Element weglassen). Resolver `resolveCarrierAndMethodForOrder` nutzt neue Map zuerst, fällt auf Legacy-Pfad zurück (PROJ-293-Manual-Tracking-Verhalten unverändert). Idempotente Backfill-Migration kopiert bestehende `carrier_overrides`-Daten als `{carrier: <wert>, method: ""}` ins neue Schema, skippt Workspaces ohne Daten. KEIN DEFAULT_SHIPPING_METHOD_MAP (vermeidet stillen Behavior-Change bei live-only-Testing). 13 Vitest-Specs grün (10 resolveCarrierAndMethodForOrder + 3 buildShipmentConfirmationXml), TS+Lint clean, Staging+Production-Migration ohne Fehler durchgelaufen. SP-API-Doku-Recherche bestätigt: CarrierCode = strikter XSD-Enum, ShippingMethod = Freitext. INDEX wurde von PROJ-301 auf PROJ-303 retagged nach Race mit PROJ-301 (LB Flexible Kostenstruktur, #233) und PROJ-302 (LB-Kanban Cost-Pills, #237) — Hotfix-Commit-Tag bleibt PROJ-301 per Memory-Regel.
PROJ-302: LB-Kanban Cost-Presence-Pills. Drei kleine Pills auf den LB-Kanban-Karten (Truck/Landmark/Package für Fracht/Zoll/Sonstige) zeigen auf einen Blick, ob für eine Lieferantenbestellung Kostenpositionen erfasst wurden. Pills nur sichtbar wenn `purchase_order_costs`-Zeilen vom jeweiligen Typ existieren — bei leeren LBs bleibt die Card unverändert kompakt. Tooltip beim Hover zeigt den EUR-aggregierten Betrag pro Typ (FX-konvertiert via `convertCostLineToEur`, de-DE-Format mit Komma-Dezimaltrennung und Euro-Symbol). Visueller Stil parallel zu IncotermBadge/TransportModeBadge (shadcn `Badge variant=outline`, kompaktes 3x3-Icon). Approach: separater Endpoint `GET /api/purchase-orders/cost-summary?ids=...` (cap 200, RLS-isoliert über bestehende Policy auf `purchase_order_costs`) plus dedicated TanStack-Query-Hook, der nur im Kanban-Modus aktiv ist — der bestehende `/api/purchase-orders`-Listen-Endpoint (mit der PROJ-294-Search-RPC) bleibt unangetastet, kein Migrations-/Schema-Risiko. 12 neue Vitest-Specs (7 Endpoint-Boundary inkl. ID-Cap, malformed-UUIDs, FX-Konvertierung + 5 Component-Render mit Umlaute-Check), Lint+Build clean.
PROJ-301: Lieferantenbestellung — Flexible Kostenstruktur mit Multi-Currency. Ablöse der vier festen Kosten-Slots (`freight_cost`/`customs_cost`/`other_costs_eur`/`other_costs_foreign`) auf `purchase_orders` durch zwei neue Tabellen `purchase_order_costs` (N Zeilen pro LB mit Typ Frachtkosten/Zollkosten/Sonstige + Beschreibung + Betrag + Währung + Verteilung) und `purchase_order_fx_rates` (ein Kurs pro genutzter Fremdwährung pro LB, 'Kurs abrufen' gegen EZB/Frankfurter API). Frachtkosten in Fremdwährung sind jetzt erfassbar (vorher nur EUR), jede Position hat eigene Verteilung (Volumen/Warenwert/Menge), Beschreibung Pflicht bei Typ=Sonstige. RPC `calculate_landed_costs` komplett neu geschrieben — iteriert Cost-Lines, FX-konvertiert in EUR, aggregiert pro Allocation-Method UND pro Typ → `goods_receipt_items.{freight,customs,other}_allocation_eur` bleiben für Profitbutler-Reporting befüllt. Auto-Recalc-Trigger auf beiden neuen Tabellen + Advisory-Lock gegen Doppelberechnung sichern rückwirkende Einstandspreis-Synchronität bei jeder Korrektur (auch für Wareneingänge die Wochen zurückliegen). Migration backfillt Bestand atomar inkl. Parity-Check (Toleranz 0,01 €) gegen vorherige `landed_cost_eur` — Drift bricht Migration ab. UI-Tab-Rewrite: shadcn-Table mit Inline-Edit, Empty-State, Live-EUR-Summe + per-Typ-Aufschlüsselung mit FX-Konvertierungs-Hinweis. Deutsche Decimal-Eingabe (Komma) korrekt geparst via defaultValue+onBlur. Details-Sidebar 'Summen' synchronisiert via geteiltem TanStack-Query-Cache — Edits propagieren sofort in beide Views. Branch + Migration tragen Tag PROJ-299 (initial-Race), INDEX wurde nach zweiter Race retagged auf PROJ-301. Alte Spalten erst per Folge-Migration nach 1 Woche stabilem Rollout gedroppt (PROJ-302 geplant).
PROJ-295: Neuer Mobile-Endpoint /api/mobile/storage-locations/[id]/contents — liefert Artikel + Bestand pro Lagerplatz, sortiert nach Menge desc, gefiltert auf nicht-archivierte Artikel im Mapper. FBA-Lagerplätze (warehouses.is_read_only) geben 403 mit klarer deutscher Fehlermeldung. Pure mapper + Route mit Zod-UUID-Validation + workspace-scoped Queries. 5 Vitest-Tests grün. Companion zu PROJ-291. Wird in Mobile-Komponenten ProductLocationsList (jetzt mit onSelect-Erweiterung) und neuer LocationContentsList genutzt — siehe Mobile-Eintrag 1.8.4.
PROJ-291: Neuer Mobile-Endpoint /api/mobile/products/[id]/locations für die Wareneingang-Erweiterung der Mobile-App. Liefert Bestände pro Lagerplatz (Menge desc), filtert FBA-Pool serverseitig via warehouses.is_read_only, Sperrlager bleiben drin (UI-Markierung downstream). Standard authenticateRequest()-Auth, Zod-UUID-Validation, defensiver Null-Join-Filter im Mapper, 5 Vitest-Tests. Branch + Commit-Tag historisch PROJ-290 (ID-Race mit Cost-Breakdown-PR #219), INDEX-Eintrag retagged auf PROJ-291.
PROJ-289: Bestellvorschlag rechnet ab sofort mit Total-Inventory. current_stock umfasst Hauptlager + FBA-Pool, Sperrlager bleibt raus (Discriminator warehouses.is_read_only aus PROJ-177). Behebt drei stille Bugs aus PROJ-251/PROJ-287: reine FBA-Artikel mit leerem Hauptlager bekamen mit Toggle 'Nur Tage mit Bestand' Vorschlag 0 obwohl sie sich verkauften, Backwards-Rekonstruktion startete bei Hauptlager-Stand und zog FBA-Movements mit ab (Drift), und FBA-Demand wurde zwar gezaehlt aber FBA-Bestand nicht abgezogen. Response erweitert um fba_stock fuers UI-Breakdown. Keine DB-Migration. PR #218.
PROJ-288: LB-PDF Produkt-Cell. Produkttitel wrappt zweizeilig statt hartem Ellipsis-Cut bei 28/35 Zeichen, Lieferantenbeschreibung (supplier_products.supplier_product_description) erscheint klein/grau als optionale 3. Zeile unter SKU/EAN. Bestehende Spalte 'Lief.-Art.-Nr.' bleibt rechts. Live-Lookup zur PDF-Zeit, keine DB-Migration. Dynamische rowHeight pro Item, alternierender Hintergrund und Page-Break-Check ziehen die echte Hoehe. PR #217.
PROJ-287: Bestellvorschlag auftragsbasiert. Tagesverbrauch wird aus order_line_items + orders berechnet statt aus stock_movements (PROJ-274 wird abgelöst). Behebt Live-Vorfall SKU 100147 — eine einzelne PROJ-177-Drift-Reset-Zeile (-442 Einheiten am 09.04.) hatte den Vorschlag auf 20,17 Einheiten/Tag aufgeblasen, obwohl real nur 45 Bestellungen in 30 Tagen liefen (~1,5/Tag). Stornos und Voll-Refunds zählen nicht, Bundle-Verkäufe schlagen via Komponenten-Expansion durch, Datum über created_at. Neue SECURITY-INVOKER RPC calculate_supplier_order_consumption mit UNION ALL über direkte und Bundle-Komponenten-Sales. Frontend, Schema und Toggles unverändert. PR #216.
PROJ-283: Einkaufsliste 'Alle löschen'-Button. Toolbar-Button neben 'Produkt hinzufuegen' mit Trash-Icon, leert die komplette Einkaufsliste workspace-weit nach Confirm-Dialog. Neuer DELETE-Endpoint /api/shopping-list/items (rate-limited 10/min, optional ?supplier_id=<uuid> für lieferantenscharfes Leeren) gibt deleted-Count zurück, damit der Toast die exakte Anzahl entfernter Artikel zeigt. Confirm-Dialog ist destructive-styled (rot) und nennt Anzahl Artikel und Lieferanten beim Namen. Button erscheint nur wenn die Liste nicht leer ist.
PROJ-282: Bestellvorschlag berücksichtigt Einkaufslisten-Mengen. Analog zum bestehenden 'Im-Zulauf-Bestand einbeziehen'-Toggle gibt es jetzt einen zweiten Toggle 'Mengen auf Einkaufsliste einbeziehen' (Default an). Mengen, die für diesen Lieferanten bereits auf shopping_list_items stehen, werden aus der Vorgeschl. Menge abgezogen — verhindert doppelten Einkauf wenn man den Vorschlag mehrfach durchläuft oder zwischendurch manuell Artikel auf die Liste setzt. Lieferantenscharf: gleiche SKU für anderen Lieferanten auf der Einkaufsliste zählt NICHT mit. Schema-Erweiterung consider_shopping_list, neue Map onShoppingListByProduct, Subtraktion in der MOQ-Formel: max(forecastedNeed - alreadyOrdered - currentStock - onShoppingList, 0). Response-Item bekommt on_shopping_list-Feld, Tabelle bekommt sortierbare Spalte 'Auf Einkaufsliste' zwischen 'Im Zulauf' und 'Vorgeschl. Menge', Mobile-Card-Detail-Grid bekommt eine Zeile mehr.
PROJ-279: Bestellvorschlag — Lieferanten-Produkt aus Vorschlag ausschließen. Neues Flag supplier_products.exclude_from_purchase_suggestion (BOOLEAN DEFAULT false) ermöglicht es, einzelne Lieferanten-Produkt-Mappings dauerhaft aus dem Bestellvorschlag zu entfernen — z.B. für Auslaufprodukte, manuell bewirtschaftete Artikel, oder einzelne zu teure Lieferanten einer SKU ohne andere Lieferanten der gleichen SKU zu blockieren. Default false = bestehendes Verhalten für alle Live-Daten, kein Bestandsdaten-Eingriff. UI: per-Row EyeOff-Icon im Vorschlag (Desktop) bzw. Aus-Vorschlag-ausschliessen-Button (Mobile) mit optimistic remove und Success-Toast inkl. Reaktivierungs-Hinweis. Reaktivierung via zweiter Checkbox im Lieferanten-Zuordnungs-Dialog (analog is_preferred). API: neuer rate-limited PATCH-Endpoint /api/supplier-products/[id]/exclude-from-suggestion mit Workspace-Ownership-Check. Calculate-Route filtert markierte Mappings raus und gibt supplier_product_id mit zurück. Partial-Index auf (supplier_id) WHERE exclude=false hält den Suggestion-Pfad schnell. Branch trägt Tag PROJ-278 wegen ID-Race mit dem parallel gemergten Allokations-UI-Refactor.
PROJ-278: Allokations-Dropdowns inline in den Kosten-Cards des LB-Detail-Overlays. UX-Folge zu PROJ-271 — statt einer separaten 'Verteilmethode pro Kostenart'-Card mit drei Zeilen ist die Allokations-Auswahl jetzt direkt in den Frachtkosten-, Zollkosten- und Sonstige-Kosten (EUR)-Cards integriert (jeweils als 'Verteilung'-Zeile unter dem Betrag-Input). Hinweis in der Sonstige-Card markiert, dass die Methode für EUR und Fremdwährung gemeinsam gilt (es ist ein einziges Bucket im RPC). Reine UI-Restrukturierung, RPC und Datenmodell unverändert. Branch trägt Tag PROJ-277 wegen ID-Race mit dem Bulk-Add-Final-Fix; INDEX und commit nutzen PROJ-278.
PROJ-276 (TARIC): LB-Detail-Overlay zeigt jetzt den TARIC-Code des Produkts inline neben der SKU in der Positionsliste (Format '<sku> · TARIC <code>'), damit Einkauf und Lager den Zolltarifcode sehen, ohne den Artikel öffnen zu müssen. Wird nur gerendert, wenn das Produkt einen Code hat (PROJ-126), sonst bleibt die Anzeige bei der bisherigen reinen SKU. Technisch: taric_code wurde durch den PO_DETAIL_SELECT-Join, den POLineItem.product-Type und PositionRowData gezogen; itemToRow mappt aus dem Join in das Row-Modell. Reine UI-Erweiterung im Detail-Overlay, keine DB-Migration. Branch + Commit-Tag bleiben auf PROJ-275 wegen ID-Race mit dem Mixed-Allocation-Hotfix in v1.84.017 (PR #201 wurde gemerged während dieses Feature im Review war).
PROJ-274: Bestellvorschlag — FBA-Bedarf einbeziehen + Tabellen-Polish. Bisher zählten nur pick/transfer_out-Movements als Verbrauch; FBA-Verkäufe (gebucht als amazon_fba_sync, siehe PROJ-177) wurden ignoriert, sodass für rein FBA-vertriebene SKUs Bestellvorschlag stets 0 herauskam. Fix: amazon_fba_sync ist jetzt Teil der Consumption-Movement-Types, aber nur negative Quantity-Changes zählen — positive Werte sind Inbound-Versand zu Amazon oder Drift-up-Korrekturen und dürfen nicht als Verkauf gezählt werden. Production-Verifikation: 1000 letzte amazon_fba_sync-Movements zeigten 874 negativ vs 126 positiv. Plus UI-Polish in der Bestellvorschlags-Tabelle: Sticky-Header bleibt beim Scrollen sichtbar (max-h-Container mit overflow-auto), alle Spalten sind klickbar sortierbar mit ArrowUp/ArrowDown-Icon-Indikator, neues Suchfeld filtert live nach Produktname und SKU, Footer zeigt bei aktiver Suche 'X von Y (gefiltert)'. Default-Sort bleibt 'Vorgeschl. Menge' absteigend (heutiges visuelles Verhalten, jetzt explizit). Mobile-Cards respektieren die Suche ebenfalls. Bewusst NICHT in Scope: Lager-Auswahl-Filter — erstmal beobachten, ob FBA-Einbeziehung allein reicht.
PROJ-271: Hybrid-Allokation für Nachlaufkosten (Fracht / Zoll / Sonstige). Bisher wurde eine einzige cost_allocation_method (volume / value / quantity) für Fracht UND Zoll UND Sonstige zugleich genutzt — konzeptuell falsch, weil Zoll im EU-Recht stets ein Prozentsatz auf den Warenwert ist und Fracht physisch nach Volumen abgerechnet wird. Drei neue Spalten auf purchase_orders (freight/customs/other_allocation_method), Default für neue LBs: freight=volume, customs=value, other=value. Bestehende LBs erben rückwärtskompatibel ihre alte Methode in alle drei Felder, kein Verhaltenswandel auf historischen FIFO-Werten. RPC calculate_landed_costs() berechnet drei separate Shares pro Kostenart mit Mixed-Mode-Normalisierung (Items ohne Maße im Volume-Modus → qty-Anteil, Σ shares = 1 garantiert). Neue UI im LB-Detail mit drei Dropdowns. landed-cost-preview.ts spiegelt die DB-Logik exakt. 9 Vitest-Tests, 84 von 84 Tests im purchase-order-Bereich grün. Konkret betraf das LB-10056/SKU 200155: Differenz zwischen volume- und value-allokiertem Zoll war ~0,07 €/Stk (102,75 € vs. 82,77 € auf 300 Einheiten).
PROJ-265: BEFORE-DELETE-Trigger auf orders fängt Order-Hard-Delete atomar in der Transaktion ab — App-Hook-Snapshot ist jetzt redundante Defense-in-Depth statt einzige Verteidigung.
PROJ-265: DB-Trigger auf order_line_items + orders.status UPSERTen Reservierungsänderungen automatisch in inventory_sync_queue — Shopify-Bestandssync ist jetzt resilient gegen App-Layer-Hook-Failures (verhindert Drift wie zuletzt SKU 200266: Shopify zeigte 998 statt 997).
PROJ-262 Produkt-SKU Auto-Vergabe & Nummernkreis: Konfigurierbarer Nummernkreis für Produkt-SKUs analog PROJ-65/120 — vierte Card im Nummernkreise-Tab unter Einstellungen → Allgemein. Auto-Vergabe greift NUR bei manueller Produkt-Anlage und im Variantengenerator; Importe (Shopify, Amazon, CSV) behalten ihre Original-SKU bewusst, weil deren SKU der Lookup-Key fürs Re-Import-Dedupe ist. Atomarer `generate_product_sku()` RPC mit Retry-Loop gegen den bestehenden Unique-Constraint `products_unique_sku_per_workspace` zählt automatisch über Kollisionen mit existierenden SKUs hinweg (z.B. wenn jemand parallel manuell `200270` setzt). POST `/api/products` neu (war vorher nur GET), Frontend-Anlage geht über den neuen Endpoint statt direktem `supabase.from().insert()`. Variantengenerator fällt auf RPC zurück wenn Kind-SKU leer bleibt. PUT `/api/settings/workspace/product-sku-sequence` mit monotonic-guard `>= current` für den Startwert-Setter (anders als die anderen drei Nummernkreise immer verfügbar, weil Bestandskunden mit existierenden SKUs den Counter initial setzen müssen — User-Initial: 200270). QA-Härtung: POST-Schema mit `.strict()` + expliziter Allowlist (~30 Felder) gegen Mass-Assignment, Retry-Loop on 23505 (max 3) für Race gegen parallel manuell vergebene SKU, kein `parentSku || "PROD"`-Fallback mehr im Variantengenerator (sonst inkonsistente Eltern/Kind-SKUs wenn Eltern auto-vergeben wird). 24 neue Vitest-Tests (Helper, POST-Route, Variantengenerator). Doku in flowkom-docs unter einstellungen/allgemein.mdx ergänzt.
PROJ-260: Produkt-Notizen + Dateien-Tab-Restrukturierung. Neuer Main-Tab 'Notizen' im Produktdetail analog Aufträge/LBs (product_notes-Tabelle mit RLS, eigene Notizen editier-/löschbar). Die Main-Tabs 'Dateien' und 'Dokumente' sind zu einem Main-Tab 'Dateien' mit Subtabs Cloud/Dokumente zusammengefasst — Tab-Count im Strip bleibt gleich. Zusätzlich: Shared NoteContent-Renderer macht URLs in Produkt-, Auftrags- und LB-Notizen klickbar (öffnet in neuem Tab, erkennt trailing Punctuation).
Amazon FBM Bearbeitungszeit (lead_time_to_ship_max_days) pro SKU pflegbar — im Produktdetail-Plattformen-Tab und im Integrations-Listings-Manager inkl. Bulk-Action (PROJ-255).
PROJ-254 FBA Bulk-Backfill UI-Modal: Der in v1.81.000 als CLI-only gedachte Admin-Endpoint bekommt doch eine UI — neuer Button „Bulk-Backfill…" im FBA-Bereich der Amazon-Settings-Seite öffnet einen Dialog mit Days/Concurrency-Inputs und Start-Button. Der Dialog verbindet sich direkt per `fetch` + `ReadableStream`-Reader mit dem SSE-Endpoint, rendert Live-Progress mit Badges (processed/total, ok/skipped/failed), Progress-Bar und gescrolltem Log (max 500 Zeilen). Abort-Button bricht den Stream sauber via AbortController ab. Dialog ist nicht schließbar während aktiv (Toast-Hint). Nur bei FBA sichtbar, FBM sieht den Button nicht. Bash-Script Default-Host mit korrigiert (`flowkom.app` → `app.flowkom.de`).
PROJ-254 Amazon FBA Bulk-Backfill (One-Shot Admin): Admin-SSE-Endpoint `POST /api/admin/amazon/backfill-fba` für einmalige großvolumige FBA-Imports (10k+ Orders in einem Rutsch). Zieht **einen einzigen** Shipments-Invoicing-Report statt 40× via Auto-Cron, paginiert `getOrders` mit NextToken und ruft processOne concurrent mit Limit 3 auf (bleibt unter Amazon's 30-getOrder-Burst). Live-Progress als Server-Sent-Events, Bash-Looper `scripts/run-fba-backfill.sh` streamt pro Order eine Terminal-Zeile. Idempotent (bestehender `amazon_order_id`-Upsert überspringt schon importierte Orders — erscheint als `order_skipped`-Event). Admin-only, Workspace-scoped, keine UI — bewusst CLI-only damit keiner den Bulk-Import versehentlich klickt. Realistische Dauer: 1–2 h für 10 000 EU-Orders statt 20h+ via Auto-Cron. Keine DB-Migration.
PROJ-253 Versandfehler-Aufträge im Pickliste-Versand-Scan werden ans Queue-Ende gestellt: Wenn ein Auftrag einen DHL- oder Deutsche-Post-Internetmarken-Fehler geworfen hat (offener `dhl_error_log`-Eintrag), sortiert der Picklist-Orders-Endpoint ihn ans Ende der Liste — der Quick-Scan-Flow überspringt ihn automatisch und greift sich zuerst fehlerfreie Aufträge für den gescannten Artikel. Fehlerhafte Aufträge bleiben in der Tabelle sichtbar mit einem roten „Versandfehler"-Badge, damit klar ist warum der Auftrag nicht drankommt. Korrektur läuft wie gehabt über den Versandfehler-Tab; nach erfolgreichem Retry setzt der Auto-Resolve-Pfad den Auftrag automatisch zurück in die reguläre Chronologie.
PROJ-250 FBA-Tracking sichtbar im Auftragsdetail: Neuer Card-Block „Versand durch Amazon" unter der Versandart zeigt Tracking-Nummer + Carrier-Badge + Copy-Button pro FBA-Sendung. Greift auf `shipping_labels`-Rows mit `shipping_task_id IS NULL` (Amazon versendet selbst, keine Flowkom-Packtask). Multi-Paket-FBA rendert mehrere Cards.
PROJ-251 Bestellvorschlag OOS-Korrektur: Neue Option „Nur Tage mit Bestand berücksichtigen" teilt den Verbrauch durch die Tage, an denen tatsächlich Bestand vorhanden war (rückwärts aus `stock_movements` rekonstruiert), statt stur durch den kompletten Analysezeitraum. Verhindert systematische Unterschätzung des Bedarfs bei Artikeln mit OOS-Phasen. Default aus — bestehendes Verhalten bleibt unverändert.
PROJ-250 Amazon FBA-Tracking-Import & Billing-Konsistenz: Der bestehende Shipments-Invoicing-Report (EU) bzw. -Tax-Report (NA) wird nun zusätzlich auf `carrier`, `tracking-number` und `shipment-date` pro Shipment-Zeile geparst. Für jede FBA-Order landet pro versendetem Paket eine eigene Row in `shipping_labels` (idempotent via `(order_id, tracking_number)`-Precheck und neuem Composite-Index). `orders.shipped_at` wird beim ersten Import auf die früheste Shipment-Date gesetzt — NULL-guarded via PostgREST `.is("shipped_at", null)`, damit manuell eingetragene Werte nie überschrieben werden. Billing-Snapshot wurde empirisch auf Production verifiziert: der bestehende Mapper `buildAmazonOrderAddressFields` füllt bereits alle 14 `billing_*`-Felder korrekt aus Shipping-Daten (Amazon liefert strukturell keine separate Rechnungsadresse — Bill=Ship ist Branchenstandard wie bei JTL/Sellerboard/Linnworks). Migration: `shipping_labels.label_pdf_url` auf nullable (FBA-Rows haben kein eigenes Label-PDF). Helper `upsertFbaShipments` ist try/catch-hardened — Netzwerk-Blips dürfen den Import nicht aufreißen. Multi-Paket-Orders zeigen alle Tracking-Nummern automatisch im bestehenden Versandhistorie-Sheet (PROJ-218). FBM-Pfad komplett unberührt durch `channel === "FBA"`-Guard. Kein neuer SP-API-Call, kein neuer RDT-Scope — nutzt denselben Report wie PROJ-175.
PROJ-249 Amazon Feed-Historie (Audit-Trail): Neue Tabelle amazon_feed_history + privater Storage-Bucket amazon-feeds. Jeder SP-API-Feed-Submit (inventory, zero_out, dry_run) persistiert Metadaten + JSON-Payload. RLS workspace-scoped, signed-URL-Downloads, Retention 90 Tage analog PROJ-47.
PROJ-249 Feed-Vorschau (Dry-Run) unter /dashboard/settings/integrations/[id]/amazon/feed-preview: Zeigt pro Marketplace den nächsten Inventory-Feed, Item-Count, SKU-Liste mit qty, Raw-JSON-Accordion, JSON-Download. Durchläuft denselben Code-Pfad wie der echte Push ohne submitFeed. Jeder Dry-Run wird in der Feed-Historie protokolliert.
PROJ-249 FBA Zero-Out-Admin-Button: Einmalige gelbe Warning-Card auf der Amazon-Integration-Seite, die für alle Listings mit amazon_fba_inventory-Eintrag einen JSON_LISTINGS_FEED mit qty=0 über den FBM-Kanal sendet. Admin-only, AlertDialog-Confirm, idempotent. Neutralisiert historisch fälschlich übertragenen FBM-Bestand für FBA-SKUs bei Amazon, ohne den FBA-Bestand anzufassen.
PROJ-249 FBA-Badge mit Tooltip in der Listings-Management-Tabelle: `FBA • Sync aus` macht explizit, dass für FBA-Listings kein Flowkom-Bestand an Amazon übertragen wird (Amazon verwaltet FBA-Bestand selbst).
PROJ-248 PR-g2: DB-Drop der Legacy-Shipping-Spalten. 7 Spalten auf `orders` (shipping_company, shipping_first_name, shipping_last_name, shipping_recipient_name, shipping_address_line_2, shipping_address_line_3, shipping_address_category) + 3 auf `customers` gedroppt. `customer_addresses` unberührt (Billing nutzt Canonical-Felder weiter). `orders_with_totals`-View wird mit-dropped und neu erstellt (PostgreSQL-Constraint). 16 Dateien Code-Cleanup. Finale Abschluss der PROJ-248-Serie nach 10 PRs.
PROJ-248 Shipping Address DHL-Flat Schema — Lieferadressen folgen jetzt 1:1 dem DHL-Geschäftskundenportal-Schema (name1/name2/name3 + street + post_number + PLZ/Ort/Bundesland/Land/Telefon). UIs in Customer-Dialog, Order-Edit-Dialog, Manual-Create-Dialog und Versandfehler-Cockpit nutzen einheitliches DHL-Portal-Layout mit 4-Adresstyp-Radio (Straße/Packstation/Filiale/Postfach), NAME 1/2/3-Block mit Tauschen-Button für Amazon-B2B-Vertauschungs-Fälle und mode-aware Straße-Block. Shopify- und Amazon-Importer schreiben direkt in die flat-Felder. DHL- und DP-Internetmarke-Ship-Routes lesen flat. Strukturelle Bug-Behebung: Amazon-BuyerName kann nicht mehr ins DHL-/DP-Label als Empfängerzeile rutschen (z.B. „Amazon Business EU SARL"-Fall). Billing-Adressen bleiben bewusst auf Canonical-Schema für Anrede + USt-IdNr. + ZUGFeRD-Export. Shared Helper canonicalNamesToFlat + canonicalRowToShippingAddress fasst vorher 4× duplizierte Mapping-Logik zusammen und fixt nebenbei latenten Whitespace-Bug.
PROJ-246 Profitbutler Bestandsbewertung zeigt jetzt den Zulauf aus bezahlten und genehmigten/verschickten Lieferantenbestellungen als Pseudo-Lager „Im Zulauf" (plus „Gesamt inkl. Zulauf"-Zeile und Sublabel am Lagerwert-Tile). Bewertungsbasis: offene Menge × Stückpreis / Wechselkurs — Nachlaufkosten sind bewusst nicht enthalten, weil sie erst beim Wareneingang final allokiert werden. Teilweise oder vollständig erhaltene LBs fallen automatisch raus, damit nichts doppelt zählt; die erhaltenen Stücke laufen weiter durch FIFO.
PROJ-245 Auftragspositionen im Versandhistorie-Sheet: Im Side-Sheet der Versandhistorie werden jetzt die Auftragspositionen mit Produktbild, Titel, SKU und Menge angezeigt. Badges für Freipositionen, Service-Artikel und archivierte Produkte. Bild-Fallback auf deleted_product_image_url für gelöschte Produkte (PROJ-119). Reine UI-Erweiterung — Daten kommen bereits über useOrder().
PROJ-244 Picklisten-Profile-Badge mit Bestandsprüfung: Die Auftragszahl auf den Profile-Karten zeigt jetzt die tatsächlich picklistbare Anzahl — vorher nur Filter-Match, weichte beim Klick auf 'Pickliste erstellen' häufig ab. Neuer Shared-Helper `computeFulfillableOrders` wird von Badge, Preview-Count und Create gemeinsam genutzt (Drift-Prevention per Konstruktion): Bundle-Expansion (PROJ-184), Service-Artikel-Ausschluss (PROJ-98), Stock-Query mit Lager-/Lagerplatz-Filter, Reservierungs-Abzug (PROJ-195), Greedy-Fulfillment. Info-Icon + Tooltip neben Badge wenn Aufträge wegen fehlendem Bestand rausfallen. Unmatched-Banner bleibt filter-basiert (Konfigurationslücke ≠ Bestandslücke).
Produktfilter: Neue Option 'Ohne Lieferant' im Lieferanten-Filter (analog zu 'Ohne Marke' und 'Keine Versandart'). Findet alle Produkte ohne supplier_products-Zuordnung — ideal, um Artikel zu identifizieren, bei denen der Einkauf noch nachpflegen muss.
PROJ-241 PR-a — Foundation: CanonicalAddress TypeScript-Type + 5 Mapper (orders, customers, customer_addresses, billkom JSONB, workspaces) + 7 UI-Primitives (AddressFields, AddressFormSkeleton, AddressCompanyBlock, AddressPersonBlock, AddressStreetBlock mit Packstation-Detection, AddressLocationBlock mit CountryCombobox, AddressContactBlock) + Zod-Validation-Schemata (shipping/billing/sender) + 64 Tests mit realen Fixture-Daten (Auftrag 02041 Amazon, 02042 Shopify Packstation, synthetisches B2B, US-International, Legacy-Billkom-Snapshot). Rein additiv — keine bestehende Form geändert.
PROJ-240 — Label-Aktionen für abgeschlossene und stornierte Aufträge freigegeben: Die Buttons "Nachdrucken" (Reprint), "Retoure" und "+ Etikett" in der Versand-Sektion des Auftragsdetails sind jetzt auch bei Status completed/cancelled sichtbar. Vorher hat die PROJ-200-Auftragssperre die gesamte Versand-Section auf readonly gesetzt und damit Label-Aktionen versteckt — obwohl die dahinterliegenden APIs (reprint, return-label, additional-label) den Order-Status ohnehin nicht prüfen. Adress- und Tracking-Edits bleiben weiterhin gesperrt (ManualTrackingSection behält readonly).
PROJ-239 Teil 2/4 — Versandfehler-Cockpit: In der Versandfehler-Queue blendet sich bei jedem Fehler-Row eine Collapsible "Original-Daten vom Shop" ein, die alle Import-Notizen (Shopify/Amazon-Rohdaten) als Monospace-Block anzeigt. Mitarbeiter sieht sofort was der Kunde wirklich eingetragen hat. Korrektur-Formular um Adresszeile 2, Adresszeile 3, DHL-Postnummer erweitert; Postnummer wird bei erkanntem Packstation/Postfiliale-Pattern als Pflicht mit rotem Rand markiert. /api/shipping/errors/[id]/correct speichert die neuen Felder, Retry nutzt sie automatisch.
PROJ-239 Teil 1/4 — Adress-Mapping Foundation: Schema-Migration mit neuen Spalten orders.shipping_post_number/billing_post_number, customers.shipping_post_number/billing_post_number + shipping_address_line_2/3 + billing_address_line_2/3, customer_addresses.post_number. Neuer shipping-address-parser mit parsePackstationStreet (matchet Packstation + 3-stellige ID, lockerID 100-999), parsePostfilialeStreet (retailID 401-999), isDhlPostNumber (6-10 Ziffern), routeAddressLine2 (entscheidet ob address2 in address_line_2 oder post_number gehört). Shopify-Importer routet address2 jetzt strukturiert: bei Packstation-Pattern in post_number, sonst in address_line_2. 22 Unit-Tests inkl. Edge Cases wie 'Packstationstraße 5' (matcht nicht). Grundlage für DHL- und DP-Versand-Mapping.
Profitbutler Bestandsbewertung UI-Rework: Volltext-Suche, Filter-Drawer mit Lager/Quelle/Schätzungs-Typ/Bestand-Spanne/Lagerwert-Spanne, aktive Filter-Chips, klickbare Coverage-Badges als Quickfilter + Progress-Bar, Lager-Card mit aufklappbaren Drill-Down-Zeilen (Top-10 Artikel pro Lager) und klickbaren Lager-Namen als Quickfilter, CSV-Export mit pro-Lager-Spalten, Produktdetail-Direktlinks in jeder Zeile, Live-Summen unter aktiven Filtern
PROJ-237: LB Nachlaufkosten UI — Fracht/Zoll/Sonstige EUR/Sonstige Fremdwährung mit Kurs-Abruf-Button (EZB), drei Verteilmethoden (Volumen/Warenwert/Menge), retroaktive FIFO-Korrektur für bereits gebuchte Wareneingänge, Einstandspreis-Preview pro Position. HelpLink zur neuen Nachlaufkosten-Doku im Kosten-Tab.
Profitbutler Bestandsbewertung — Hybrid-Bewertung: FIFO-abgedeckte Stücke aus echten LB-Schichten + Rest-Stücke via manual_landed_cost_eur → supplier_products.purchase_price (preferred) → 0. Neue Response-Felder fifo_qty/fallback_qty/unvalued_qty pro Produkt. UI zeigt Coverage-Badges (FIFO/Lieferanten-EK/Unbewertet) und bei Mischbestand per-Zeile Aufteilung (z.B. '500 FIFO · 1048 LE')
PROJ-236: Kanban Parent/Child-Gruppierung — Eltern-Karten kollabieren zu einer Karte mit Kinder-Zähler, Expand/Collapse pro User persistiert. Cascade-Drag beim Parent-Move bewegt Eltern + alle Kinder mit gleichem Board-Status atomar (neue Supabase-RPC + API-Route). Stray-Kinder in abweichender Spalte erscheinen eigenständig mit ↳-Parent-Hinweis und amber Akzent-Rand. Undo-Toast (6 Sek) nach Cascade-Move. Bundles bleiben Einzelkarten.
PROJ-234: Profitbutler-Auswertung pro Artikel — im Profitbutler-Tab der Produktdetailansicht gibt es jetzt einen neuen Untertab „Auswertung" zwischen „Kalkulation" und „Retouren". Der Tab zeigt genau die Auswertungen der Profitbutler-Hauptseite (Umsatz-/Gewinn-Chart über 7/14/30/90 Tage, Multi-Perioden-Sellerboard mit Umsatz, Stornos, Warenkosten-Gruppen, Gewinn, Marge, Bestellungen, Ø Bestellwert und Erstattungen, sowie aufklappbarer Kanal-Breakdown) — aber eingeschränkt auf den aktuell geöffneten Artikel. Ohne Bestellungen im Zeitraum erscheint ein Empty State. Perioden-Konfiguration bleibt workspace-weit auf der Hauptseite.
PROJ-233: Zahlungen-Tab an Lieferantenbestellungen — jede LB hat jetzt einen eigenen Reiter, in dem Anzahlungen und Teilzahlungen mit Datum, Betrag und optionaler Notiz erfasst werden. Der Zahlungsstatus der Bestellung (Unbezahlt / Anbezahlt / Vollständig bezahlt) wird automatisch aus der Summe aller Zahlungen und dem PO-Total abgeleitet — sowohl beim Erfassen als auch beim Löschen. Die Sidebar-Card „Zahlung" zeigt den gezahlten Betrag und den offenen Restbetrag live in LB-Währung. Beträge werden intern in Cents gespeichert, UI akzeptiert deutsche Dezimalformate (1,23 oder 1.23). Zahlungen sind immutable (nur anlegen + löschen, kein Edit).
PROJ-232: LB-Übersichts-Redesign — analog zur Kundenaufträge-Seite. Neuer View-Toggle zwischen Kanban und konfigurierbarer Listen-Ansicht (14 Spalten, 6 als Default sichtbar, Auswahl pro User persistiert). Pipeline-Tabs zeigen Live-Counts pro Status. Neue Unified Search mit sechs Scopes (Überall / LB-Nummer / Lieferant / Lieferanten-Artikelnummer / Produkt SKU+Name / Notizen) — „Überall" macht eine OR-Union über alle Scopes. Neuer Filter-Drawer rechts mit Multi-Select für Zahlungsstatus, Lieferant, Lager, Incoterm, Transportart plus Datum-Ranges. Aktive Filter erscheinen als Chips mit einzeln-entfernbaren X-Icons plus einem roten „Alle zurücksetzen"-Button. Listenspalten für Incoterm, Transportart, Lager, Positionen, Erhalten %, Erstellt-von und Genehmigt-von neu verfügbar.
PROJ-232: Notizen-Tab an Lieferantenbestellungen — jeder Workspace-Member kann chronologisch Kommentare hinzufügen (Autor + Zeitstempel werden automatisch gesetzt, „bearbeitet"-Hinweis wenn nachträglich geändert). Eigene Notizen lassen sich editieren oder löschen, fremde sind schreibgeschützt (API gibt 403 zurück). Tab-Label zeigt Count-Badge. Cmd+Enter speichert eine neue Notiz direkt.
PROJ-232: Versandinfo-Tags und Notizen sind jetzt volltext-durchsuchbar — die Übersicht findet LBs auch wenn der Suchbegriff nur in einer Notiz oder der Lieferanten-Artikelnummer steht.
PROJ-232: Versandinfo-Tags (Incoterm & Transportart) sind jetzt im LB-Detail-Overlay und auf den Kanban-Karten sichtbar. Im Detail gibt es eine neue Sidebar-Card zwischen Lieferant und Summen — im Bearbeiten-Modus per Dropdown änderbar, im Ansichtsmodus mit Badges. Der Header des Overlays zeigt die gesetzten Tags neben dem Status-Badge, die Kanban-Karte zeigt sie unter dem Gesamtbetrag (nur wenn gesetzt). Jeder Tag lässt sich einzeln auf „Nicht gesetzt" zurücksetzen und verschwindet dann wieder aus allen Ansichten.
PROJ-232: Lieferantenbestellungen können jetzt mit Versandinfo-Tags (Incoterm & Transportart) angereichert werden. Incoterms gemäß ICC 2020 (EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, DDP), Transportarten Schiff/Luft/Zug/LKW. Backend-Endpoint akzeptiert die neuen Felder, null entfernt einen gesetzten Tag wieder. UI folgt in einem Folgecommit.
PROJ-231: Google Drive als zweiter Cloud-Provider neben OneDrive. Admins können beide Clouds parallel verbinden und pro Use-Case (Produkte / Lieferantenbestellungen) einzeln aktivieren — pro Workspace und Use-Case darf nur eine Cloud aktiv sein (DB-Level-Exklusivität via Partial-Unique-Indexes, UI zeigt bei Kollision disabled-Checkbox mit Hinweis auf den aktuellen Blocker-Provider).
PROJ-231: Neuer „Dokumente"-Tab im LB-Detail-Overlay zeigt Cloud-Ordner-Inhalte direkt in Flowkom. Auto-Match sucht Drive-weit nach der LB-Nummer mit Token-Boundary-Erkennung (LB-10058 matcht nicht LB-10008), Shared-Ordner wie „LB-10058 / LB-10061 / LB-10067" erscheinen als Kandidaten-Picker, leere Treffer bieten „Ordner anlegen" oder manuelle Auswahl. Lazy Mount via Radix Tabs — Drive-API-Quota wird nur belastet wenn der Tab tatsächlich geöffnet wird.
PROJ-231: Tabelle product_cloud_folders wurde zu polymorphem cloud_folder_links (entity_type: product | purchase_order) generalisiert. Bestehende OneDrive-Produkt-Verknüpfungen bleiben unverändert, die alte Tabelle wird für die Rolling-Deploy-Phase als Compat-View weiter bereitgestellt.
PROJ-229: Neuer Import-Typ „JTL Historische Aufträge" im Daten-Hub. Upload-Step lädt den CSV-Export direkt in Supabase Storage; Preview-Step analysiert die ersten 512 KB und zeigt Anzahl der Aufträge, erkannte Verkaufskanäle, Duplikate gegen bestehende Aufträge sowie ggf. Mojibake. Klick auf „Import starten" legt einen Background-Job an — der Worker läuft asynchron (1–3 h bei 150k Aufträgen).
PROJ-230: Lieferantenbestellungen können gelöscht werden (via 3-Punkte-Menü in der Liste und im Detail-Overlay). Guard verhindert das Löschen, wenn bereits Wareneingänge gebucht wurden — der Server antwortet dann mit einer klaren Fehlermeldung.
PROJ-230: LB-Status sind jetzt in beide Richtungen bewegbar — draft ↔ pending_approval ↔ approved ↔ shipped, sowie cancelled → draft und rejected → pending_approval. Partially_received und completed bleiben WE-gesteuerte Einbahnstraßen (werden nur beim Buchen eines Wareneingangs gesetzt). Jede Status-Änderung wird in der History protokolliert.
PROJ-228: Versandart-Filter in der Kundenaufträge-Übersicht. Neuer Multi-Select-Abschnitt im Filter-Drawer mit allen aktiven Versandarten als lila Toggles. Aktive Auswahl erscheint als Chip in der Aktive-Filter-Leiste.
PROJ-228: Copy-Buttons neben der Auftragsnummer und der externen Bestellnummer in der Auftragsliste. Hover-Icon + Klick kopieren den Wert in die Zwischenablage.
PROJ-223: Kundenaufträge-Übersicht aufgeräumt — kompakte Status-Tabs ersetzen die großen Pipeline-Kacheln. Eine Unified Search mit Scope-Dropdown (Überall/Auftrag+Kunde/Artikel/Notizen/Externe Nr.) findet Amazon-Bestellnummern in der externen Bestellnr., eBay-Nummern in Notizen und Artikel per SKU/EAN/ASIN/FNSKU. Neuer Filter-Drawer rechts bündelt Verkaufskanal, Zahlstatus, Kanal-Quelle, Tags, Zeitraum und Freipositionen. Aktive Filter erscheinen als Chipleiste mit auffälligem rotem 'Alle zurücksetzen'-Button.
PROJ-223 Backend: Neuer search_scope-Parameter an GET /api/orders mit OR-Union über orders.order_number, orders.external_order_number, customers.*, order_notes.content und order_line_items (via products.sku/sku2/barcode/fnsku + amazon_listings.seller_sku/asin). Trigram-GIN-Indizes auf allen neuen Suchfeldern für Full-Table-Scan-Vermeidung. notes_search bleibt als Legacy-Alias funktional.
Shopify Bestellstatus-Sync granular pro Integration steuerbar: Master-Toggle plus vier Sub-Toggles (Stornierungen, Versandstatus, Zahlstatus & Erstattungen, Sendungsnummern). Master aus → Cron überspringt die Integration komplett; einzelne Sub-Toggles aus → nur die abgeschalteten Bereiche werden übersprungen. Tracking-Import bleibt an den Versandstatus-Sync gekoppelt. Bestandsintegrationen behalten Standardverhalten (alle Toggles an).
Amazon Bestellstatus-Sync granular steuerbar: Drei neue Sub-Toggles (Stornierungen, Versandstatus, Sendungsnummern). Abgeschaltete Teile werden vom Cron übersprungen, Tracking-Import bleibt vom Versandstatus-Sync abhängig. Bestandsintegrationen behalten Standardverhalten (alle Sub-Toggles an).
Versand-Dialog: Vollständige Lieferadresse (inkl. Land als Klartext) und Versandverpackung mit Preis dezent angezeigt
PROJ-215: Picklisten-Versand-Entkopplung — Versand aus laufenden/pending Picklisten, Bestandsabbuchung beim Versand, Auto-Complete
Volle Mitarbeiter-Rechte: Alle 192 API-Routen + alle RLS-Policies + alle RPCs für Mitarbeiter geöffnet. Nur Einstellungen, Profitbutler und Team-Verwaltung bleiben Admin-exklusiv.
Wareneingang LB-basiert: Lagerplatz-Feld ist jetzt eine durchsuchbare Combobox (Barcode-Scanner + Tastatursuche)
PROJ-209: Manuelle Trackingnummer & Fulfillment-Trigger — Tracking + Carrier im Auftrag hinterlegen, Status auf versendet setzen, Fulfillment an Shopify/Amazon übertragen
PROJ-207: Report-Worker upserted Listing-Daten aus GET_MERCHANT_LISTINGS_ALL_DATA direkt in DB (Status, ASIN, Titel, Preis, Menge, Fulfillment-Channel)
PROJ-207: Auto-Mapping (remapUnmappedListings + propagateCrossMpMapping) läuft nach jedem Report-Cleanup-Lauf
PROJ-207: Vereinfachte Diff-Logik — Reaktivierungs-Block entfernt, da Upsert bereits korrekten Status setzt
PROJ-64: Auftragsreservierungen vom Bestandssync abgezogen (Amazon + Shopify) — verhindert Überverkauf am Wochenende, Safety-Sync pusht jetzt physisch − offene Aufträge
Audit-Logging in alle Admin API Routes eingebaut (user_management, integration, workflow, settings, tags, print, picklist, customers, orders, products)
PROJ-203: Pipeline-Navigation und Alert Strip in Auftragsübersicht integriert (Status-Filter per Klick, Tages-KPIs mit Umsatz/unbezahlt/Adressfehler)
PROJ-203: OrderStatusIndicator circle component — 32x32px Statuskreis pro Auftragszeile mit 7 Prioritätsstufen (Problem, NEU, Wartend, In Bearbeitung, Gepickt, Versendet/Abgeschlossen, Storniert)
PROJ-203: /api/orders/stats Endpoint (Status-Counts + Tages-KPIs: Aufträge, Umsatz, unbezahlt, Adressfehler) + useOrderStats Hook für Pipeline-Navigation und Alert Strip
OrderPipeline Navigation-Komponente: Klickbare Status-Segmente mit farbigen Fortschrittsbalken für Auftragsübersicht (PROJ-203)
Produkt-Plattformen-Tab: Zentrale Übersicht aller Integrations-Verknüpfungen pro Artikel (Multi-SKU, FBA/FBM, Bestandssync-Toggle)
PROJ-203: inventory_sync_enabled auf integration_product_mappings, amazon_sync_inventory migriert und entfernt
PROJ-202: Amazon Listing Stale-Detection & Cleanup — Wöchentlicher Report-basierter Vollabgleich (GET_MERCHANT_LISTINGS_ALL_DATA + CANCELLED), Status deleted mit Löschdatum/Grund, 90-Tage-Archivierung, Order-Mapping Archiv-Fallback, Cron-Endpoint mit Toggle
Bundle-Badge auch bei ausgeklappten Kindartikel in Produktübersicht
Child-Badge in Produktübersicht bei Kindartikel
Bundle-Badge in Varianten-Tabelle bei Elternartikel (is_bundle im API ergänzt)
Bundle-Badge in Varianten-Tabelle bei Elternartikel (neben SKU)
Per-Product Amazon Sync — Checkbox pro Artikel steuert ob FBM-Bestandsabgleich den Lagerbestand an Amazon überträgt (Default: aus)
PROJ-201: Shopify Product Push — Produkte (Einzelartikel + Varianten) per GraphQL Admin API als Draft auf Shopify anlegen, automatische Verknüpfung via integration_product_mappings, Bestandssync greift sofort
PROJ-200: Frontend-Bearbeitungssperre — Action-Buttons gesperrt bei abgeschlossenen/stornierten Aufträgen, Lock-Banner mit Statushinweis, Adressbearbeitung readonly, Versand-Aktionen (Etikett/Retoure/Nachdrucken) ausgeblendet
PROJ-200: Auftrags-Bearbeitungssperre — Abgeschlossene/stornierte Aufträge: PUT/Adressen/Versandart/Status gesperrt, Erstattungen bei stornierten Aufträgen blockiert, Status-Änderungen bei abgeschlossenen Aufträgen nur noch Stornierung erlaubt
Einzelner Versandfehler löschbar per Trash-Button in der Fehler-Zeile
Alle Versandfehler auf einmal löschen mit Bestätigungs-Dialog (AlertDialog)
Versandfehler-Queue & Adresskorrektur — Fehlerliste mit Badge, Inline-Adresskorrektur, Blocking/Non-Blocking pro Picklisten-Profil, zweistufiges Error-Mapping für DHL & Deutsche Post (PROJ-199)
PROJ-199: Ship-API gibt error_log_id zurück (DHL + DP Fehler-Insert mit .select('id').single())
PROJ-199: ShippingErrorCorrectionModal — Blocking-Dialog mit Fehlermapping, editierbaren Adressfeldern (nur bei address-Fehlern) und Retry via PATCH /api/shipping/errors/:id/correct
PROJ-199: ShippingScanningDialog Non-Blocking-Modus — bei shippingErrorBehavior='non_blocking' Toast + Fehlerliste statt Modal
PROJ-199: ShippingPicklist-Typ um shipping_error_behavior erweitert, Prop an ShippingScanningDialog weitergegeben
PROJ-199: Shipping Errors Table — aufklappbare Fehlerliste mit Schweregrad-Farbkodierung, Adresskorrektur-Formular (nur bei address-Fehlern), technischen Details und Carrier-Filter
PROJ-199: Shipping Errors Page unter /dashboard/outbound/shipping/errors mit Carrier-Dropdown und Gesamtanzahl-Anzeige
PROJ-199: TanStack Query hooks useShippingErrors und useShippingErrorCount (30s Auto-Refetch)
PROJ-199: ShippingNav-Badge zeigt offene Versandfehler mit rotem Counter-Badge
PROJ-199: GET /api/shipping/errors — Versandfehler-Liste mit Auftrags-Adress-Join, Count-Only-Modus für Badge, Carrier-Filter und Pagination
PROJ-199: PATCH /api/shipping/errors/[id]/correct — Adresskorrektur mit optionalem Versand-Retry, Auto-Resolve bei bereits versendeten Aufträgen, Retry-Count-Tracking
PROJ-199: Zwei-Stufen Versandfehler-Mapping-Modul — Tier 1 feste Codes (AUTH_FAILED, DP_BALANCE_INSUFFICIENT etc.), Tier 2 Keyword-Parsing von Fehlermeldungen (PLZ, Hausnummer, Straße, Stadt, Land, Gewicht, EKP, Produktcode) mit Schweregrad-Farbgebung für Versandfehler-Queue
Amazon-Import triggert jetzt Workflows (FBM + FBA), neue ignore_fba Checkbox in Workflow-Einstellungen
PROJ-197: Bundle-Scan im Versand — Komponenten einzeln oder Bundle-Barcode scannen, visuelles Bundle-Badge, Server-Validierung für Komponenten-IDs
PROJ-166: Versandbestätigung Vorschau (Trockenlauf) — Preview-Dialog zeigt ausstehende FBM-Bestellungen mit Carrier, Tracking, Versanddatum
PROJ-196: Pickliste Löschen statt Stornieren — delete_picklist() RPC mit Rebook-Option, Smart Delete Dialog, cancelled Status komplett entfernt
Neuer Auftrag direkt aus Kundendetailseite erstellen (Kunde vorausgewählt)
PROJ-195: Picklisten-Bestandsreservierung — Lagerplatzbezogene Reservierung durch offene Picklisten, DB-Level Enforcement (FOR UPDATE Lock), verfügbare Menge in UI/API, Doppel-Reservierungs-Schutz bei Picklisten-Erstellung
PROJ-4: Bulk-Typ-Änderung für Lagerplätze — Checkbox-Auswahl + Dropdown zum Setzen von Pick & Versand / Nachfüll / Gesperrt für mehrere Standorte gleichzeitig
PROJ-192: Zwei-Phasen Status+Tracking Sync — Phase 1 (GENERAL Report) für Status, Phase 2 (restricted SHIPPING Report mit RDT) für Tracking-Nummern und Carrier
PROJ-194: show_alternative_currency Toggles (Amazon, Billkom Kanäle) + Währungs-Info-Banner im Belegdialog
PROJ-194: BMF-Kursverwaltung UI (Billkom Settings Tab "Währungen", Pending-Banner, Bulk-Apply)
PROJ-194: PDF-Generator rendert Alternativwährung pro Position + Kurs-Footer (§16 Abs. 6 UStG)
PROJ-194: Invoice-Creation speichert Währungsfelder aus Order (BMF > ECB Kurs-Priorität)
PROJ-194: BMF-Monatskurs API (GET/PUT/POST apply) für manuelle Kursverwaltung
PROJ-194: Währungs-Formatierung (formatCentsCurrency) und currency-helpers für Kurs-Logik
PROJ-194: DB-Migration — Währungs-Spalten auf billkom_documents, document_items und channel_configs
PROJ-55: Shopify Safety-Sync — vollständiger Bestandsabgleich aller Artikel als Reconciliation-Layer, Intervall konfigurierbar (Standard: 2h)
PROJ-55: Safety-Sync Intervall-Selector in Shopify-Integrationseinstellungen (1h bis 24h)
PROJ-193: Multi-Currency Orders — Amazon-Bestellungen in Originalwährung importieren, ECB-Tageskurs beim Import konvertieren (Dual-Storage), Kurs-Cache-Tabelle, retroaktive Migration für bestehende Nicht-EUR-Bestellungen, Währungs-Badge in Bestellliste, Kurs-Info-Box im Bestelldetail
Cron-Jobs Einstellungsseite komplett redesigned — 20+ Jobs in 5 Kategorien (Shopify, Amazon, Workflows, Profitbutler, Cleanup) gruppiert, kompakte Zeilen mit Health-Dots statt voller Cards, Summary-Bar mit Gesund/Verspätet/Fehler-Zähler, Einrichtungsanleitungen auf 3 Ein-Klick-Kopier-Cards reduziert (vorher 3× die volle 20-Job-Liste)
PROJ-55: Bundle-Artikel Bestandssync — Shopify + Amazon erhalten berechneten Bundle-Bestand (MIN(Komponenten/Menge)), nicht mehr 0
PROJ-55: Dirty-Flag Cascade — Komponenten-Änderung flaggt automatisch Eltern-Bundles für Shopify- und Amazon-Sync
PROJ-193: Freie Wareneingänge aus FIFO-Bewertung ausgeschlossen — nur LB-basierte WEs fließen in den Einstandspreis ein, DB-Migration bereinigt bestehende Daten, 3 API-Routen gefiltert
PROJ-192 Amazon FBM Bestellstatus-Sync — Neuer Cron-Job holt regelmäßig den Bestellstatus und Tracking-Nummern für FBM-Bestellungen von Amazon ab (Reports API: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL). Status-Mapping (Shipped→shipped, Cancelled→cancelled, PartiallyShipped→in_progress), Tracking als shipping_task mit Duplikat-Check, Shipment-Confirmation-Skip (amazon_confirmation_sent_at), Downgrade-Schutz, Audit Trail, Advisory Lock, Cursor-basiert. Toggle 'Automatischer Bestellstatus-Sync' in den Amazon-Einstellungen (default: aus). 22 Unit Tests.
PROJ-191 Amazon JSON_LISTINGS_FEED Migration — FBM-Bestandssync migriert von deprecated POST_INVENTORY_AVAILABILITY_DATA (XML, tot seit Juli 2025) auf JSON_LISTINGS_FEED mit PATCH-Semantik. fulfillment_channel_code DEFAULT für FBM, productType PRODUCT universell, Content-Type application/json; charset=UTF-8. Per-Marketplace-Architektur bleibt bestehen.
PROJ-190: Bestandsbewertung & Einstandspreis-Konsolidierung — Manueller Einstandspreis am Produkt mit FIFO-Kaskade (Toggle → FIFO → Manuell → null), FBA-Bewertung auf Durchschnitts-Einstandspreis umgestellt, neuer Profitbutler Sub-Tab "Bestandsbewertung" mit Lagerwert pro Lager, Artikelliste und Lücken-Warnung, Lagerwert aus Bestandsübersicht entfernt, Datenhub-Import für manuellen Einstandspreis
PROJ-190: Datenhub Schema-Overlay um manual_landed_cost_eur erweitert — Feld erhält deutschen Anzeigenamen 'Manueller Einstandspreis (EUR)', Gruppe 'Einkauf' und Synonyme für CSV-Auto-Mapping
Bestandsbewertung-Link im Profitbutler-Header (navigiert zu /dashboard/profitbutler/inventory-valuation)
Gesamter-Lagerwert-Karte aus Bestandsübersicht entfernt (Lagerwert jetzt im Profitbutler-Modul)
PROJ-190 Bestandsbewertung Profitbutler Sub-Tab — Neue Unterseite /dashboard/profitbutler/inventory-valuation mit Lagerwert-Summary, Warehouse-Breakdown-Tabelle, sortierbarer Artikelbewertungs-Tabelle (FIFO/Manuell/Keine Bewertung Badges), Warnbanner für Artikel ohne Einstandspreis mit Filter-Toggle.
PROJ-189: Amazon Financial Events Pull — Automatischer Import von Erstattungen & Adjustments aus Amazon (Cron mit Cursor + 6h Overlap, Hash-basierte Idempotenz, Auto-Gutschrift bei Voll-/Teil-Refund, Dedup gegen Push-Marker, AdjustmentEvent capture-only)
PROJ-190 FBA-Kostenlookup auf Bewertungskaskade umgestellt — getAmazonFbaValuationCost() in src/lib/amazon/fba-cost-lookup.ts nutzt jetzt resolveValuation() statt supplier_products.purchase_price. Kaskade: prefer_manual_cost + manual_landed_cost_eur > FIFO-Avg aus stock_movements Receipts > manual_landed_cost_eur Fallback > null.
PROJ-190 Bewertungskaskade in cost-breakdown API — GET /api/products/[id]/cost-breakdown liefert jetzt zusaetzlich effective_cost_eur, valuation_source, manual_landed_cost_eur, prefer_manual_cost und fifo_receipt_count. Produktabfrage wurde auf manual_landed_cost_eur und prefer_manual_cost erweitert. resolveValuation() aus src/lib/inventory-valuation.ts loest die Kaskade auf (manuell > FIFO-Avg > null) und gibt die aktive Quelle zurueck.
Amazon Refund & Cancel Push (PROJ-188): Erstattungen und FBM-Stornierungen werden über SP-API Feeds an Amazon gepusht. Job-Queue mit Status-Cron, Dedup-Marker, Badge + Historie-Sheet im Auftragsdetail, Settings-Toggles, Dialog-Checkboxen.
[object Object]
PROJ-186 Verkaufskanal „Flowkom" für manuell angelegte Aufträge — Kundenaufträge, die direkt in Flowkom angelegt werden (source=manual), bekommen jetzt automatisch den Verkaufskanal `flowkom`. Neuer Eintrag in src/lib/channel-config.ts (KNOWN_CHANNELS) mit Flowkom-Blau (#2563EB) und eigenem SVG-Icon (public/channels/flowkom.svg). API-Insert in src/app/api/orders/route.ts setzt sales_channel=flowkom beim Anlegen, Backfill-Migration setzt bestehende Manual-Aufträge ohne Kanal rückwirkend. Badge „Flowkom" erscheint automatisch in Auftragsliste, Filter-Dropdown und Profitbutler-Kanalaufschlüsselung; Workflow-Bedingungen auf sales_channel greifen jetzt auch für manuelle Aufträge.
PROJ-185: Beim manuellen Anlegen einer Rechnungsadresse erscheint jetzt eine optionale Checkbox 'Auch als Lieferadresse übernehmen'. Wenn aktiv, wird die Adresse zusätzlich als Lieferadresse gespeichert — spart den doppelten Eintrag. Einmaliges Kopieren, keine Verknüpfung (spätere Änderungen an der Rechnungsadresse wirken sich nicht auf die Lieferadresse aus). Nur bei Neuanlage, nicht im Bearbeiten-Modus.
PROJ-184: Bundle-Artikel können endlich auf Picklisten landen. Bundles haben selbst keinen Bestand — nur ihre Komponenten (bundle_items). Vorher hat der Stock-Check gegen die leere Bundle-SKU geprüft und jede Bestellung mit Bundle-Artikel als 'nicht genug Bestand' stumm gedroppt. Neuer Expand-Schritt (src/lib/picklist-bundles.ts) löst Bundle-Line-Items in ihre Komponenten auf, bevor der Stock-Check läuft. picklist_item_assignments zeigt weiterhin auf den echten Bestell-Line-Item (Bundle-Parent), der Packer sieht die Bundle-SKU wie bisher, der Picker sieht die physischen Komponenten.
PROJ-184: Safety-Gate gegen Zero-Position-Picklisten — Aufträge, deren Bundle-Expansion leer ist (Bundle-Artikel ohne konfigurierte Komponenten), werden nicht mehr als erfüllbar markiert und erzeugen eine Warning beim Admin, damit die Bundle-Definition nachgezogen werden kann.
PROJ-182: Picklisten Filter-Parity — Shared picklist-filters Modul, Preview und Erstellung teilen sich jetzt eine einzige Filter-Pipeline. tag_filters, max_orders, warehouse_ids und location_filters werden jetzt konsistent von Profil-Karten, Vorschau und Erstellung angewandt (vorher drifteten die drei Implementierungen auseinander und Preview zeigte Aufträge die dann nicht auf der Pickliste landeten). Stock-Hinweis-Pill im Erstell-Dialog wenn Bestand/Lagerfilter gesetzt sind.
PROJ-182: Picklisten-Erstellung max_orders-Cap läuft jetzt NACH dem Stock-Check (nicht davor) — Stock-Drops fressen nicht mehr ins Cap-Budget. Drop-Counter pro Filter-Stage (Auftragstyp, Tag-Filter, Stock, Max-Limit) werden als Toast beim Erstellen angezeigt.
PROJ-182: Versand-Detailseite zeigt jetzt einen echten Fehler-State mit 'Erneut versuchen'-Button wenn die API fehlschlägt, statt stumm 'Alle Aufträge versendet' zu rendern. Schützt zukünftig vor Bugs der Klasse v1.44.011 (gedroppte Spalten).
PROJ-181: Neue Lieferantenbestellung — Supplier-First-Flow (kleines Dialog zur Lieferantenauswahl, dann direkt ins Fullscreen-Bestellformular im Edit-Modus, altes Popup-Formular entfernt)
PROJ-180: Auftragsdetail zeigt magnalister Otto Retoure-Bridge Status (Übertragen/Fehlgeschlagen) wenn Metadaten vorhanden
PROJ-180: Zod-Schema für Integration-PATCH erweitert — bridge_m2e_cloud_enabled und bridge_magnalister_enabled explizit als boolean optional deklariert
PROJ-180: Marktplatz-Bridges UI — M2E Cloud Modus und magnalister Modus als unabhängige Toggles in der Shopify-Integrationsdetailseite
PROJ-179 Bestands-Reiter im Artikeldetail — Neuer Tab "Bestand" in der Artikeldetailseite mit Sub-Tabs Uebersicht, Im Zulauf, Reserviert und Historie. Lazy Loading pro Sub-Tab, keine neuen Tabellen (nutzt bestehende stock/stock_movements/purchase_order_items/order_items). Fuer Bundle-Artikel wird ein Info-Banner statt der Sub-Tabs angezeigt; Service-Artikel (inventory_tracking=false) bekommen den Tab nicht. Die alte FBA-Overlap-Warnung im Header der Artikelseite wurde entfernt und lebt jetzt im Bestand-Uebersicht-Panel.
PROJ-180: pushMagnalisterReturnAttributes GraphQL helper — read-merge-write auf Shopify Order.customAttributes für magnalister Otto Retoure-Felder
PROJ-180 mergeOrderCustomAttributes — Pure Hilfsfunktion in src/lib/shopify/fulfillment.ts, die Shopify-Order customAttributes (bestehende Liste + Updates) sicher zusammenfuehrt: bestehende Keys ohne Update bleiben an ihrer Position, aktualisierte Keys werden ans Ende verschoben. TDD: 4 Tests (neue Keys anhaengen, Idempotenz, leere existing, Reihenfolge-Invarianz). Wird von pushMagnalisterReturnAttributes genutzt, um Shopifys orderUpdate-Semantik (ersetzt die gesamte customAttributes-Liste) zu erfuellen.
PROJ-180 magnalister Otto Retoure-Bridge — Migration setzt bridge_m2e_cloud_enabled = true für alle bestehenden Shopify-Integrationen, damit Bestandsinstallationen ihr bisheriges Verhalten (Retoure als zweites Tracking) behalten. bridge_magnalister_enabled bleibt false und muss manuell aktiviert werden.
PROJ-177 Amazon FBA-Bestand als echtes Flowkom-Lager — FBA-Pull schreibt jetzt stock-Rows im FBA-POOL des FBA-Warehouses (sync_amazon_fba_stock RPC + Reconciliation), Bewertung via supplier_products.purchase_price. Dadurch enthalten Lagerwert (PROJ-74) und Bestellvorschlag (PROJ-22) automatisch den FBA-Bestand. Read-only Warehouse + FBA-POOL Location via neuem create_system_locations Trigger-Branch, Backfill-Hook beim Mapping (Single + Bulk). Interim-Phase bis PROJ-178 mit Doppelzählungs-Warnung auf der Artikel-Detailseite.
PROJ-176 Profitbutler-Integration: Amazon FBA-Bestellungen werden automatisch mit 0 EUR Versand-, Verpackungs- und Pick&Pack-Kosten ausgewiesen, weil Amazon das Fulfillment uebernimmt. Order-Level Versandart hat Vorrang vor Produkt-Default.
PROJ-176 Amazon FBA Auto-Versandart — alle FBA-Bestellungen bekommen automatisch die Versandart "Versand durch Amazon" (Carrier: Amazon). Bestehende FBA-Orders werden rueckwirkend getaggt, neue Workspaces bekommen die Versandart per Seed. Workflow-Regeln und Profitbutler koennen FBA jetzt sauber filtern.
PROJ-175 Amazon FBA Kundendaten-Enrichment — volle Käufer-PII (Name, Straße, PLZ, Stadt) werden jetzt über den Shipments-Invoicing-Report (Reports-API) nachgeladen, wie es auch JTL macht. Ersetzt die von Amazon redigierten Orders-v0-Daten bei EU-FBA.
Picklist-Profil-Karten zeigen die konfigurierten Artikel-Tag-Filter jetzt direkt als Badges mit Tag-Name, Farbe und HAS_NOT-Kennzeichnung an (statt nur 'X Tag-Filter').
PROJ-174: Fehlerzeilen-CSV-Download im Lagerbestand-Initialimport Dry-Run. Neuer Button im Strict-Mode-Banner lädt bei Fehlerzeilen eine CSV mit allen Originalspalten plus zusätzlicher 'Fehler'-Spalte herunter — so kann der Nutzer die problematischen Zeilen gezielt korrigieren und neu hochladen.
PROJ-174: Lagerbestand-Initialimport (CSV) für JTL-Migration. Neuer Import-Target-Typ 'Lagerbestand — Initialbefüllung (JTL-Migration)' im Daten-Hub Import-Wizard. Akzeptiert JTL-Bestands-Export-CSVs mit Pflichtspalten Artikelnummer, Lagerplatz, Einzubuchende Menge (Header case-insensitive + Synonyme, DE-Dezimalkomma). Kein Mapping-Step — Spalten sind fix. Strict-Mode hart erzwungen: bei ≥1 Fehlerzeile (unbekannte SKU, unbekannter Lagerplatz, Bundle/Service-Artikel, ungültige Menge) wird der Import blockiert, User muss CSV korrigieren und neu hochladen. Bei grünem Dry-Run werden die Zeilen nach warehouse_id gruppiert und in Chunks à 200 Items atomar über die bestehende complete_goods_receipt-RPC (PROJ-6/PROJ-73) gebucht — Stock, Stock-Movements, Goods-Receipt-Header, FIFO-Layer und Landed-Cost-Integration bleiben automatisch konsistent. Mengen werden additiv pro Zeile verbucht. Job-Protokollierung in data_jobs, sichtbar im bestehenden Daten-Hub Job-Verlauf.
PROJ-172: Nächtlicher automatischer Amazon Listings Refresh. Neuer Cron-Endpoint /api/cron/amazon-listings-nightly-refresh iteriert seriell über alle aktiven Amazon-Integrationen (Opt-Out pro Integration via metadata.amazon.nightly_refresh_enabled) und treibt den PROJ-169-Listings-Sync-Worker komplett ohne HTTP-Loop zur Completion. Geschedulet extern wie die anderen Amazon-Crons (0 2 * * *, vor dem FBA-Inventory-Pull um 03:15). Time-Budget 20 Minuten pro Integration, per-Marketplace-Fehler-Isolation (ein fehlgeschlagener MP stoppt den Job nicht mehr). Neuer Settings-Toggle 'Nächtlicher Listings-Refresh' + 'Jetzt starten'-Testbutton pro Integration. Neuer Eintrag in der Cron-Jobs-Tab-Übersicht.
PROJ-167: Testing-Button 'Importierte löschen' pro Kanal (FBM und FBA) in den Amazon-Order-Import-Blöcken. Löscht alle importierten Bestellungen des gewählten Kanals inkl. abhängiger Tabellen und der dadurch verwaisten Amazon-Kunden dieser Integration. Nur für die Testphase gedacht, Confirm-Dialog mit 'nicht rückgängig'-Warnung, keine Safety-Checks (die saubere Version folgt über PROJ-173).
PROJ-171: Amazon FBA-Bestand wird in der Listings-Management-UI angezeigt — Spalte 'FBA-Bestand' default-sichtbar, Filter 'Bestand = 0' aktiv. DB-Trigger aggregiert amazon_fba_inventory → amazon_listings.quantity automatisch, stündlicher Cron und manueller Pull-Button bleiben unverändert.
PROJ-170: Amazon-Angebote verwalten — Neue Full-Page unter Integration → Amazon → 'Alle Angebote verwalten'. JTL-artige Multi-Select-Tabelle (shadcn/ui) mit Filterleiste (Marktplatz-Multi-Select, Fulfillment, Status, 'Nur nicht zugeordnet', Volltextsuche via Trigram-Indizes), Filter-Chips, URL-Deep-Links, serverseitiger Pagination (50/Page), sortierbaren Headers auf indizierten Spalten. Bulk-Aktionen: Zuordnen (mit Cross-Marketplace-Propagation), Zuordnung aufheben, Aus Sortiment entfernen (Soft-Delete). 'Alle N gefilterten auswählen'-Modus lädt IDs on-demand. Selektion überlebt Page-Wechsel, Confirm-Dialog bei Filter-Wechsel mit aktiver Auswahl. Konfigurierbare Spalten via ColumnPicker (localStorage pro User, Drag & Drop). CSV-Export der gefilterten Ansicht (Excel-DE, 50k Hard-Cap). Empty-States für leere Filter vs. kein Sync. HelpLink auf neue MDX-Doku. Wiederverwendbarer ProductPickerDialog aus AmazonMappingDialog extrahiert (src/components/products/product-picker-dialog.tsx). AmazonListingsBlock im Integration-Detail auf Kurz-Übersicht (5 jüngste Zeilen + Button) reduziert, alter Einzelzeilen-Dialog entfernt.
PROJ-170: Backend-Fundament für das JTL-Style Amazon Listings-Management — Trigram-Indizes für Volltextsuche (Titel, SKU, ASIN), erweiterter List-Endpoint mit Multi-Marketplace-/Fulfillment-/Status-/Unmapped-/Sort-Filtern, drei Bulk-Endpoints (Zuordnen mit Cross-MP-Vererbung, Zuordnung aufheben, Aus-Sortiment-entfernen als Soft-Delete via status='inactive') und CSV-Export (Excel-DE, BOM, Semikolon) — UI folgt in Session 2
PROJ-169: Amazon Listings-Sync als Background-Job mit Multi-Marketplace-Support, Live-Progress-Bar, JTL-Wawi-Modell (N:1 Mapping, FBA/FBM-Suffix Auto-Match, Cross-MP Mapping-Propagation), server-seitiger withStatus=BUYABLE Filter, inkrementeller Default-Sync, Abbrechen-Funktion
PROJ-168 LB-Detail-Rework — Lieferantenbestellungs-Detail als Fullscreen-Overlay (ersetzt alten Modal-Dialog). Cursor-Bug im EK-Preis-Input behoben (lokaler State + onBlur-Commit + React.memo PositionRow → keine Sibling-Re-Renders mehr). Multi-Select-Artikelpicker mit Live-Suche (Name/SKU/EAN/Lief.-Art.-Nr), Mengen-Eingabe pro Zeile und Footer-Live-Summe ersetzt den One-by-One-Flow. LB-Nummer inline editierbar mit debouncetem Live-Unique-Check (300 ms). Status-Badges klickbar mit Folge-Status-Dropdown. Kontext-Primäraktion (Einreichen / Genehmigen / Wareneingang buchen) und Mehr-Menü (Duplizieren / PDF / E-Mail / Stornieren / Löschen) im Header. 6 Tabs mit Lucide-Icons (Details, Positionen, Zahlungen, Wareneingänge, Dokumente, Verlauf). Sidebar-Cards (Lieferant, Summen, Zahlung) und Meta-Grid (Erstellt/Lieferdatum/Lager/Währung). Status-History-Timeline portiert. Neue stabile-ID API-Endpoints (POST /items, PATCH /items/[itemId], DELETE /items/[itemId], PATCH /[id] mit po_number-Rename) ersetzen den alten delete+reinsert-PUT und bewahren goods_receipt-FKs. 23 neue API-Tests, 343/343 Gesamt grün, 0 Lint-Errors.
PROJ-167 Amazon Bestellungs-Filter & Import-Vorschau — Getrennt konfigurierbare Filter pro Kanal (FBM: Bestellstatus, Zahlungsstatus, Versandstatus, Synchronisierungszeitraum; FBA: ohne Versandstatus), neuer 'Bestellungen laden'-Dialog mit Mehrfachauswahl für selektiven Import, 'Jetzt synchronisieren' respektiert die Filter. Neuer GET /amazon/orders/preview Endpoint mit 250er Cap und already_imported-Lookup. importOrders erweitert um amazonOrderIds + filters. Kaputte FBM/FBA-Import-Buttons aus AmazonManualActionsBlock entfernt (Fix nebenbei).
PROJ-166 Amazon Integration Rebuild — FBM/FBA Order-Import, Listings-Sync mit SKU-Automap und manueller Zuordnung, FBM-Bestandspush via Dirty-Queue + Safety-Sync, FBA-Bestand-Pull, Versandbestätigung mit Carrier-Mapping + Overrides, Multi-Region (EU/NA), Multi-Marketplace. Inklusive neuer Tabellen (amazon_listings, amazon_inventory_dirty_queue, amazon_fba_inventory, amazon_sync_log), LWA-Token-Refresh + RDT, Advisory Locks pro (Integration, Job-Type), komplette Cron-Suite (FBM/FBA-Import, Inventory-Flush, Safety-Sync, FBA-Pull, Shipment-Confirmation), Credentials-Verschluesselung, Problems-API, Lifecycle-Service (Enable/Disable mit Stock-Safety-Check), neue UI-Sektion im Integrationen-Hub (Connection, Marketplaces, Toggles, Listings, Problems, Carrier-Overrides, Manual-Actions) und Burst-Test fuer die Dirty-Queue-Deduplication.
PROJ-165 Amazon Nuke & Pave: Amazon v1-Reste und komplettes v2 wurden restlos entfernt. Drop-Migration entfernt alle Amazon-Tabellen (amazon_carrier_mappings, amazon_shipment_retry_queue, amazon_failed_operations, amazon_v1_failed_operations_deprecated, amazon_v2_circuit_state, fba_inventory, fba_inventory_snapshots), die Spalte orders.amazon_fulfillment_confirmed_at, alle Amazon-Integrationen, FBA-Virtual-Warehouses und Amazon sync_log-Eintraege. integrations.type und integration_sync_logs.sync_type CHECKs werden ohne Amazon-Werte neu gesetzt. BREAKING CHANGE — Produktions-Deployment erfordert Backup und Pruefung offener Eintraege in amazon_v1_failed_operations_deprecated.
PROJ-164: Amazon v2 FBA-Bestand UI & Steuerung — schliesst die UI-Luecke aus PROJ-157 (Backend lief, war aber unsichtbar/unsteuerbar). Neue Card 'FBA-Bestandssync' im Integration-Detail mit Auto-Sync-Toggle, letztem Lauf, Snapshot-Counter, Status-Badge, Jetzt-synchronisieren-Button und Link zur Detail-Seite. Neue GET/POST-Routes unter /api/integrations/[id]/amazon/fba/. Waisenseite fba-inventory/page.tsx an v2-Schema angepasst (reserved_total/unfulfillable_total) inkl. Back-Link und korrektem Empty-State.
PROJ-122: Spreadsheet-Bulk-Edit kann jetzt EK-Preis pro Lieferant und Standard-Lieferant setzen — neue Spalten 'Einkaufspreis (Lieferant)' und 'Standard-Lieferant', Validierung verlangt Lieferanten in Scope, beim Setzen von Standard-Lieferant wird der bisherige automatisch entmarkiert. Vorbefuellung der Zellen ueber neuen Endpoint /api/supplier-products/preferred-batch.
PROJ-163 Commit 2: Amazon-Setup-UI auf Self-Authorize-Card umgestellt. Neue Card mit Region-Select + Refresh-Token-Textarea + 'Speichern & testen'-Button. Inline-Ergebnis: Success-Alert mit Marketplace-Liste oder Error-Alert mit kind, http_status, message und togglable Rohdaten-Viewer des Amazon-Bodys. Gerendert bei isSetup/isInactive/isError sowie via 'Token ersetzen'-Toggle im active-State. Error-Banner 'Neu verbinden' scrollt jetzt zur Self-Authorize-Card. OAuth-Query-Param-Reader + oauthCallbackResult-State + handleConnectViaOAuth entfernt. 3-Schritte-Anleitung verweist auf self-authorize-guide.md.
PROJ-163 Commit 1: Amazon v2 Self-Authorize-Service + POST /api/integrations/amazon-v2/self-authorize. Nimmt einen manuell aus Seller Central kopierten Refresh-Token entgegen, verschluesselt ihn, legt die Integration an (oder updated eine bestehende) und macht einen Soft-Probe-Call gegen getMarketplaceParticipations. Token wird IMMER persistiert (auch bei Probe-Fehler), Probe-Ergebnis landet im probe-Feld der JSON-Response. Reauth-Pfad mit Cross-Workspace-Check. 5 Unit-Tests (Happy Path, missing_seller_role, Reauth, Cross-Workspace, Token-Laenge).
PROJ-162 Commit 2/3: Amazon-Setup-UI auf OAuth-Connect-Card umgestellt. Beim Hinzufuegen einer neuen Amazon-Integration erscheint jetzt eine Region-Auswahl (EU/NA/FE) + Button 'Mit Amazon verbinden', der per Browser-Redirect den OAuth-Flow zu Amazon Seller Central startet. Reauth-Pfade: 'Verbindung erneuern' im Action-Bar bei aktiver Integration, 'Neu verbinden' im Error-Banner bei gestoerter Verbindung. Toast-Handling beim Mount fuer ?amazon_v2_oauth=success|error&kind=...-Redirects. Dead-Code-Abbau: refresh_token-State, marketplace-Dropdown, handleSaveAndTest und die komplette Refresh-Token-Eingabe-Form (postete auf eine in PROJ-161 geloeschte v1-Route) ersatzlos entfernt. -187 / +136 LoC.
PROJ-161 Phase 8 Amazon v1 vollstaendig entfernt — Greenfield-Cutover auf v2 abgeschlossen. 18215 Zeilen v1-Code (lib/amazon, 13 Routen, 9 Cron-Routes, UI-Komponenten) geloescht. Migration: amazon_failed_operations → amazon_v1_failed_operations_deprecated (defensiv umbenannt statt gedroppt). BREAKING: kein Rollback auf v1 mehr moeglich.
PROJ-161 Phase 8 v1-UI-Bloecke hinter v2Active-Flag ausgeblendet (Settings-Tabs, OpenIssues) — v2-Connections sehen nur noch das Status-Dashboard
PROJ-161 Phase 8 Cron-Skip + v1-Routen 410: alle 13 v1-Amazon-Routen liefern 410 Gone, alle 9 v1-Cron-Routes ueberspringen v2-aktivierte Integrationen (geteilter Handler + 2 custom Crons + DLQ-Retry)
PROJ-161 Phase 8 Cutover-Tooling: Admin-Routen /amazon-v2/enable und /amazon-v2/disable plus Cutover-Button im Detail-View (Confirm-Dialog, Reload nach Erfolg)
PROJ-160 Phase 7 Deployed — Amazon v2 Status-Dashboard live (Read-only Dashboard pro v2-Connection mit Letzter Lauf, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
PROJ-160: Manueller Trigger POST /api/integrations/[id]/amazon-v2/trigger (admin-only, isV2EnabledFor-Gate, Dispatch auf runOrderImport/runInventorySync/runShipmentConfirmation, respektiert Service-Soft-Lock, 3 Wire-In-Tests)
PROJ-160: Amazon v2 Status-Dashboard UI (3 Karten pro Operation mit letztem Lauf, Circuit-Breaker-Badge, nächstem geplanten Lauf; eingehängt in AmazonIntegrationDetail, shadcn Card/Badge/Button/Tooltip/Skeleton)
PROJ-160: Status-Aggregator + GET /api/integrations/[id]/amazon-v2/status (liest sync-logs, circuit-state, schedule-JSON; DI-Storage; 3 Unit-Tests)
PROJ-160 Phase 7 Kickoff — Amazon v2 Status-Dashboard Spec (Read-only Dashboard pro v2-Connection mit Karte je Operation, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
PROJ-159 Phase 6 Deployed — Amazon v2 Circuit-Breaker & Smart-Intervals (Status auf Deployed gesetzt)
PROJ-159: Circuit-Breaker + Smart-Interval in alle drei v2-Cron-Routes (order-sync, inventory-sync, shipment-confirmation) verdrahtet, schedule-Persistenz in integrations.settings.amazon_v2.schedule, 3 Wire-In-Tests
PROJ-159: CircuitBreaker + Smart-Interval Helper unter src/lib/amazon-v2/reliability/ inkl. 11 Unit-Tests (state-transitions, half-open, isolation, smart-interval-Heuristik)
PROJ-159: Migration amazon_v2_circuit_state (Tabelle, RLS, partieller Index WHERE state=open)
PROJ-159 Phase 6 Spec — Amazon v2 Circuit-Breaker & Smart-Intervals (Planned)
PROJ-158 Phase 5 Deployed — Amazon v2 Shipment Confirmation komplett (Migration, FeedsClient, Carrier-Mapping-v2 DB-Reader, Strategy + Service, v1-Guard, Cron-Route, 5 Unit-Tests, Sandbox-Smoke)
PROJ-158 Phase 5 — Cron-Route /api/cron/amazon-v2-shipment-confirmation (Feature-Flag-Gate, Soft-Lock-respektierend, sequentielle Iteration aller v2-Integrationen)
PROJ-158 — 5 Unit-Tests fuer runShipmentConfirmation (Strategy-DI, Auth-Abort, Per-Order-Fehler-Isolation, Idempotency, Soft-Lock) + Sandbox-Smoke fuer Feeds-API getFeeds
PROJ-158 Commit 3 — ShipmentConfirmationStrategy-Interface, FeedsXmlConfirmShipmentStrategy (Default), ShipmentConfirmationService (DI-Orchestrator: Soft-Lock, Pending-Order-Selektion, Carrier-Mapping-Resolution, Strategy-Aufruf, amazon_fulfillment_confirmed_at-Update, DLQ-Insert pro Order-Fehler), Feature-Flag-Helper listV2ShipmentConfirmationEnabledIntegrations, dlq-Operationtype 'shipment_confirmation' ergänzt. 64/64 Tests grün.
PROJ-158 Commit 2 — FeedsClient (5-Schritt-Pipeline um @sp-api-sdk/feeds-api-2021-06-30), build-fulfillment-feed-xml (POST_ORDER_FULFILLMENT_DATA), parse-feed-result-report, carrier-mapping-v2 (DB-Reader auf bestehende Tabelle amazon_carrier_mappings, kein statischer Port), v1-Guard als Top-of-function-Check in triggerAmazonShipmentConfirmation (einziger Touch in src/lib/amazon/), 3 Unit-Tests (64/64 grün). Spec aktualisiert: Carrier-Mapping als DB-Reader und v1-Guard als ein File-Touch dokumentiert.
PROJ-158 Commit 1 — Migration orders.amazon_fulfillment_confirmed_at TIMESTAMPTZ + partieller Index (workspace_id, shipped_at) WHERE external_source=amazon AND shipped_at NOT NULL AND amazon_fulfillment_confirmed_at NULL. v2-isolierter Shipment-Confirmation-Marker, parallel zu v1.
PROJ-158 Phase 5 kickoff — Spec für Amazon v2 Shipment Confirmation angelegt. Feeds-API-first Architektur (POST_ORDER_FULFILLMENT_DATA via @sp-api-sdk/feeds-api-2021-06-30), weil orders-api-2026-01-01 read-only ist. Neue Spalte orders.amazon_fulfillment_confirmed_at, Carrier-Mapping-v2-Port, 5-Commit-Plan, Test-Plan (5 Unit + 1 Smoke). SDK bereits installiert.
PROJ-157 Phase 4 abgeschlossen — Amazon v2 Inventory Sync Deployed. FBM-Push via Listings PATCH + FBA-Pull via getInventorySummaries laufen kombiniert in einer Cron-Route, v2-isolierte Snapshots-Tabelle, Hybrid-Strategy mit Feeds-API-Stub (PROJ-157.5 Future Work), v1-Cron-Routes per Flag gegated. 55/55 Amazon-v2-Tests gruen, Spec synchron mit der finalen Architektur.
PROJ-157 (Commit 4): Amazon v2 InventorySyncService-Orchestrator — FBM-Push + FBA-Pull sequentiell in einem Lauf, Soft-Lock via integration_sync_logs Sentinel (15min Cutoff), kombinierter sync_type='amazon_v2_inventory_sync', DI-Pattern mit InventorySyncDeps, Strategy-Selection ueber settings.amazon_v2.inventory_push_mode. Neue Cron-Route amazon-v2-inventory-sync mit Cron-Secret-Auth. 5 Unit-Tests (Strategy-DI-Wiring, FBM-Push-Errorhandling inkl. 401-Abort, FBA-Mapper aggregiert/leer/ohne-SKU, FBA-Pagination, FBA-Idempotency) + 1 Sandbox-Smoke (read-only getListingsItem mit Skip-Verhalten).
PROJ-157 (Commit 3): Amazon v2 FBM-Push Strategien (Listings PATCH default, Feeds API stub mit PROJ-157.5 TODO), FBM-Push-Service (Queue-Read, Mapping-Lookup, Stock-Calc, Per-SKU-Push, DLQ, Queue-Cleanup), FBA-Pull-Service mit Pagination + Batch-Upsert + DLQ, fba-inventory-mapper mit aggregiertem reserved_total/unfulfillable_total, v2-Stock-Calc Port (PROJ-55-Semantik isoliert von v1), DLQ um inventory_push und fba_inventory_pull operation_types erweitert.
PROJ-157 (Commit 2): Amazon v2 InventoryClient — kombinierter Wrapper um Listings (patchListingsItem) und FBA Inventory (getInventorySummaries paginiert) SDKs, gemeinsame Auth-Instanz, 100-Pages-Hardcap, AmazonV2AuthError-Mapping. v1-Cron-Routes (amazon-inventory-sync, amazon-fba-inventory-sync) bekommen negativen Filter auf settings.amazon_v2.inventory_sync_enabled. Spec mit den finalen Design-Entscheidungen synchronisiert.
PROJ-157 (Commit 1): Migration fba_inventory_snapshots — neue v2-isolierte Tabelle mit seller_sku Unique, raw_details JSONB, snapshot_run_id Tracking, workspace-scoped RLS. v1 public.fba_inventory bleibt unveraendert.
PROJ-157 (Commit 0): Amazon v2 Inventory-Sync Spec (Phase 4) — FBM-Push via patchListingsItem, FBA-Pull via getInventorySummaries, neue v2-isolierte Tabelle fba_inventory_snapshots, InventoryPushStrategy mit FeedsStrategy-Stub (PROJ-157.5 als Future Work)
PROJ-156 Phase 3 abgeschlossen — Amazon v2 Order Sync Deployed: Spec auf Status 'Deployed' gesetzt, alle Akzeptanzkriterien abgehakt, features/INDEX.md aktualisiert (PROJ-156 Deployed, Next Available ID = PROJ-158). Phase 3 ist das Herzstueck des Greenfield-Rewrites (PROJ-152) und liefert damit den ersten produktiv lauffaehigen End-to-End-Pfad der v2-Integration (OAuth → Connection-Health → Order-Sync mit DLQ), komplett parallel zu v1 und ueber settings.amazon_v2.v2_enabled gegatet.
PROJ-156: OrderImportService + Cron-Route + 4 Unit-Tests + Sandbox-Smoke fuer Amazon v2 — runOrderImport orchestriert FBM+FBA sequentiell gegen dasselbe Rate-Limit-Budget, iteriert per Async-Iterator ueber searchOrdersPaged, holt pro Order einen frischen RDT, ruft getOrder mit BUYER/RECIPIENT/PROCEEDS/FULFILLMENT/PACKAGES-IncludedData, mapped via mapOrderToWmsRow und schreibt via batchUpsertOrders. Fehler-Klassifikation: 401/403 abort, 4xx/5xx pro Order in die DLQ mit version='v2'. Soft-Lock ueber integration_sync_logs Sentinel-Row statt Advisory-Lock (Begruendung in der Migration dokumentiert). Cron-Route /api/cron/amazon-v2-order-sync mit Cron-Secret-Auth iteriert ueber listV2EnabledIntegrations() sequentiell. 4 Unit-Tests (Strategy-Selection, Pagination, Idempotency, DLQ mit PII-Check) alle gruen, plus 1 Sandbox-Smoke der direkt den OrdersApiClient baut. Migration 20260407100001 erlaubt zusaetzlich sync_type='amazon_v2_order_import'. Gesamte Vitest-Suite gruen (15 Files, 42 Tests).
PROJ-156: Order-Mapper + Batch-Upsert + DLQ-Wrapper fuer Amazon v2 — mapOrderToWmsRow ist pure function und mapped @sp-api-sdk/orders-api-2026-01-01 Order auf V2OrderDraft (Status via mapAmazonV2StatusToWms, Betrag aus proceeds.grandTotal in Cents, metadata.amazon_v2.raw_items als sanitized Line-Item-Snapshot OHNE PII, buyer_present/recipient_present nur als Boolean-Flags). batchUpsertOrders macht manuelles Insert/Update-Split via Pre-Query auf idx_orders_unique_external_order, generiert neue order_numbers via generate_wms_order_number-RPC nur fuer echte Inserts und erhaelt bestehende ids bei Updates. DLQ-Wrapper schreibt hart version='v2' mit Exponential-Backoff (5min * 2^(attempt-1), max 4h).
PROJ-156: OrdersClient + RdtHelper fuer Amazon v2 — duenner Wrapper um @sp-api-sdk/orders-api-2026-01-01 und @sp-api-sdk/tokens-api-2021-03-01. searchOrdersPaged ist Async-Iterator mit 50-Pages-Hard-Cap, getOrder forwarded den RDT via x-amz-access-token-Header. RdtHelper baut RDTs pro Order auf Pfad /orders/2026-01-01/orders/{orderId}, mit lowercase Tokens-API dataElements und No-DataElements-Fallback bei fehlenden App-Rollen. Beide nutzen die memoized Auth-Instanz aus auth-instance-cache.ts. Keine DB-Zugriffe, keine PII in Logs.
Retoure-Badge in der Kundenaufträge-Übersicht (Status-Spalte) sobald ein Retourenlabel existiert
PROJ-156: Order-Status-Mapper fuer Amazon v2 (mapAmazonV2StatusToWms) — pure function, mapped die UPPERCASE-Enum-Werte aus @sp-api-sdk/orders-api-2026-01-01 (PENDING/UNSHIPPED/PARTIALLY_SHIPPED/SHIPPED/CANCELLED/UNFULFILLABLE/PENDING_AVAILABILITY) auf WMS-Status (open/in_progress/shipped/cancelled), fail-safe 'open' fuer unbekannte Werte mit Warn-Log ohne PII. Inkl. 4 Unit-Tests (alle gruen).
PROJ-156: DB-Migration 20260407100000_proj156_amazon_failed_operations_version.sql — neue Spalte amazon_failed_operations.version (Default 'v1', CHECK v1/v2) plus Partial-Index (version, status) WHERE status IN ('pending','retrying'). Idempotent (IF NOT EXISTS + DO-Block fuer Constraint). Bereitet die DLQ auf v1/v2-Split fuer das spaetere Cutover (PROJ-161) vor; v1-Code bleibt unangetastet.
PROJ-156: Amazon v2 Order Sync Spec (Phase 3) — OrderImportService mit FBM+FBA Strategy, Orders v2026-01-01 via @sp-api-sdk/orders-api-2026-01-01, RDT-Pipeline pro Order, Batch-Upsert ON CONFLICT, Advisory Lock, DLQ mit version='v2', Cron-Route mit Feature-Flag-Gate, strikte PII-Disziplin.
PROJ-155 Phase 2 abgeschlossen — Amazon v2 Connection & Health Deployed.
PROJ-155: Unit-Tests + Sandbox-Smoke fuer Connection & Health (9 computeOverallStatus-Cases, disconnect-Idempotenz + Revoke-Fehler-Toleranz, testConnection Success + Sellers-Rolle-403, Feature-Flag-Gate auf beiden Routes). 280/280 gruen, Sandbox-Smoke gruen.
PROJ-155: Amazon v2 Connection & Health Services — ConnectionService (testConnection + idempotenter disconnect mit LWA Token-Revoke), HealthService mit aggregiertem Status aus Sync-Logs/DLQ/Token/Connection-Test, neue API-Routes /test-connection + /health mit Feature-Flag-Gate
PROJ-155: Amazon v2 Connection & Health Spec (Phase 2) — ConnectionService (testConnection, disconnect mit LWA-Token-Revoke), HealthService mit aggregiertem Status, v2-Routes /test-connection + /health mit Feature-Flag-Gate
PROJ-154 (g): Sandbox-Smoke-Test — End-to-End-Beweis (LWA-Code-Tausch → encrypt/decrypt → SDK-Auth → getMarketplaceParticipations → Mapper). PROJ-154 Phase 1 abgeschlossen.
PROJ-154 (f): Unit-Tests für OAuth-Flow-Module — crypto-Roundtrip + Tamper, oauth-state Sign/Verify/TTL/Tamper, error-classifier (Sellers-Rolle, 401/403), single-flight auth-instance-cache, marketplace-mapper
PROJ-154 (d): SDK-Auth-Memo-Cache mit Single-Flight pro Integration (auth-instance-cache.ts), Reauth-Invalidation in Callback-Route
PROJ-154: Amazon SP-API OAuth-Callback komplett — LWA-Code-Tausch, Marketplace-Detection, verschlüsselte Refresh-Token-Persistenz und klassifizierte Error-Redirects (Sellers-Rolle, abgelaufener Code, ungültiger Token)
PROJ-154: Authorize-Route für den Amazon SP-API OAuth-Flow — Signed-State-Erzeugung, Region-Validierung und Redirect zur Seller-Central-Consent-Page
PROJ-154: AES-256-GCM Token-Crypto und signed JWT für OAuth-State-Management (CSRF-Schutz) als Foundation für den Amazon SP-API OAuth-Flow
PROJ-154: Amazon v2 OAuth-Flow Spec (Phase 1) — Authorize/Callback Routes, signed-JWT State, AES-256-GCM Token-Crypto, Single-Flight Refresh-Cache, Sellers-Rollen-Hint
PROJ-153: Sandbox-Smoke-Test fuer GET /sellers/v1/marketplaceParticipations (ueber @sp-api-sdk/sellers-api-v1, automatischer Skip ohne Sandbox-Credentials, anonymisiertes Logging ohne Marketplace-/Seller-IDs).
PROJ-153: Sandbox-Env-Plan in .env.local.example und README fuer src/lib/amazon-v2/ mit Mermaid-Architektur, SDK-Begruendung, Sandbox-Setup-Schritten und Troubleshooting.
PROJ-153: feature-flags.ts Helper (isV2EnabledFor / getV2PhasesFor) ueber zentralen Supabase-Admin-Helper, fail-safe Defaults, 6 Unit-Tests fuer alle Verhaltens-Pfade.
PROJ-153: Vitest-Setup fuer v2-Phasen — Default-Lauf excludiert Integration-Tests, separate vitest.sandbox.config.ts mit 30s Timeout und neuer test:sandbox npm-Script.
PROJ-153: Verzeichnis-Struktur src/lib/amazon-v2/ mit Stubs (sdk-client.ts, AmazonV2Error.ts) und Installation der drei Phase-0-SDK-Pakete @sp-api-sdk/auth, @sp-api-sdk/common, @sp-api-sdk/sellers-api-v1.
PROJ-153: Phase-0-Spec für das Amazon-v2-Fundament — SDK-Wahl @sp-api-sdk/* (live auf npm evaluiert, dediziertes orders-api-2026-01-01-Paket), Verzeichnis-Struktur src/lib/amazon-v2/, Vitest-Setup mit pragmatischer Test-Philosophie (4–5 Unit-Tests für kritische Logik + 1 Smoke-Test pro Phase), Sandbox-Env-Plan und Feature-Flag-Helper isV2EnabledFor.
PROJ-152: Master-Spec für den kompletten Amazon-Integration-Neubau — OAuth-only, offizielles SDK, Orders v2026-01-01, Polling-first, Parallel-Build mit Per-Integration-Cutover. Ziel: ~9.500 LoC Alt-Code durch saubere v2-Architektur ersetzen, robust für 10k+ Bestellungen/Tag. Alle DB-Tabellen bleiben erhalten, andere Subsysteme sind nicht betroffen.
Import-Notizen werden direkt in die order_notes-Tabelle geschrieben (PROJ-150): Shopify, Amazon FBA/FBM und manuelle Auftragsanlage nutzen jetzt einen einheitlichen Notiz-Helper mit Idempotenz-Schutz. Die alten orders.notes/import_notes-Spalten wurden entfernt, FreeScout eBay-Username-Lookup und die Notizsuche laufen über order_notes.
Auftragsdetailseite als Full-Page (PROJ-149 Task 7): Header mit Status/Financial-Popovers, Badges, Tags, 6 Tabs, Action-Buttons
PROJ-149: Navigation zu Auftragsdetailseite — Klick auf Auftragszeile öffnet jetzt die neue Full-Page-Ansicht statt den Dialog, Kundendetails-Links ebenfalls umgestellt
Workflow Intervall-Trigger — Workflows können jetzt in festen Intervallen ausgeführt werden (15min, 30min, 1h, 2h, 4h, 6h, 12h) zusätzlich zu täglich/wöchentlich
PROJ-149: Notizen-Tab Komponente (OrderNotesSection mit CRUD, Inline-Edit, Source-Badges)
PROJ-149: OrderNote-Typen, Adress-Update-Schema und Notiz-Validierung hinzugefügt
PROJ-145: Kundendetailseite & Multi-Adressen — Full-Page /dashboard/customers/[id] mit 5 Tabs (Stammdaten, Adressen, Aufträge, Profitbutler, Notizen), customer_addresses Tabelle mit CRUD, Adress-Snapshots auf Orders, Shopify-Import Adressen-Deduplizierung
PROJ-146: Kundensperre — Block/Unblock API (Worker sperren, Admins entsperren), roter Banner + Badge, Versand-Guard (403), Import-Flagging in Order-Metadata
PROJ-147: Erweiterte Kundensuche — Collapsible Filter für PLZ (Prefix), Stadt, Land (CountryCombobox), Erstellungsdatum, letzter Auftrag; DB-Indexes auf customer_addresses, Badge-Pills mit Dismiss
PROJ-148: Kunden-Profitbutler — KPI-Cards (Gesamtumsatz, Aufträge, Ø Bestellwert, Erster/Letzter Auftrag, Erstattungen, Retourenquote), Umsatz-pro-Jahr Balkendiagramm, Top-10-Artikel Tabelle
PROJ-136: Pending-Queue-Count Badge im Billkom Cron-Job — zeigt Anzahl ausstehender Rechnungs-Jobs direkt in der Cron-Job-Übersicht
PROJ-144: Erstattungsblock in Auftragsdetails (Erstattet / Offener Betrag)
PROJ-143: Deutsche Post Retouren — DHL Retoure + Internetmarke (umgedrehte Briefmarke) für DP-Versandarten, Popover-Auswahl, Auto-Return-Rules mit return_method
PROJ-142: Country-Code-Normalisierung in allen API-Write-Paths (Kunden, Lieferanten, Produkte, Workspace) und CSV-Import mit Warnungen
PROJ-141: Bestätigungsdialog bei manueller Änderung von Versandstatus und Zahlstatus
PROJ-142: Alle Freitext-Länderfelder durch CountryCombobox ersetzt (Lieferanten, Produkte, Zolldaten, Workflows)
PROJ-142: MultiCountryCombobox Komponente — Multi-Select mit Chips für Länderauswahl (ISO-Codes)
PROJ-141: Auftragsdetail Action-Bar Redesign — klickbare Status-Badges im Header, farbige Aktions-Buttons, Mehr-Menü mit destruktiven Aktionen
PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet
PROJ-140: Bundle-Artikel aus Bestellvorschlag, Einkaufsliste und Wareneingang ausgeschlossen
PROJ-140: Profitbutler zeigt Bundle-Komponentenkosten (FIFO/Lieferanten-EK, Aufschlüsselungstabelle)
PROJ-140: Profitbutler-Kalkulation verwendet Bundle-Komponentenkosten als Einstandspreisbasis
PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet (watchIsBundle-Konditionierung für TabsTrigger und TabsContent)
PROJ-135: Workflow-Bedingungen für Versandstatus, Zahlstatus und Versanddatum (älter als X Tage)
PROJ-135: Neue Workflow-Aktion 'Versandstatus ändern' mit Vorwärts-Validierung (z.B. shipped → completed)
PROJ-135: Status-Scope um 'Versendet' erweitert für Auto-Abschluss-Workflows
PROJ-136: Workflow-Bedingungen 'Rechnung vorhanden' und 'Lieferschein vorhanden'
PROJ-136: Neue Workflow-Aktionen 'Rechnung erstellen' und 'Lieferschein erstellen' über Billkom Job-Queue
Shopify Bestellstatus-Sync Cron Job — automatischer Abgleich von Status, Zahlungsstatus und Tracking alle 15 Minuten
PROJ-134: Financial Status auf Aufträgen (pending/paid/partially_refunded/refunded)
PROJ-134: Shopify Refund API Integration (Erstattung/Preisnachlass direkt aus Flowkom)
PROJ-134: Erstattungs-Dialog im Auftragsdetail mit Shopify-Notify + Gutschrift-Option
PROJ-134: Shopify-Refund im Storno-Flow integriert
PROJ-134: Financial-Status-Badge in Auftragsübersicht + Auftragsdetail
PROJ-134: refund_enabled Toggle in Shopify-Integrations-Einstellungen
PROJ-134: financial_status Mapping beim Shopify-Import + PROJ-131 Sync
PROJ-132: Varianten-Attribut Inline-Zuweisung — Attributwerte direkt in der Kindartikel-Tabelle per Dropdown zuweisen
PROJ-132: Kombinations-Validierung — Generierung blockiert wenn Kinder unvollständige Attributwerte haben
PROJ-132: PATCH /api/products/[id] akzeptiert jetzt variant_attribute_values (JSONB Record) für Inline-Zuweisung von Varianten-Attributwerten
PROJ-131: Temporärer Shopify Order-Sync (Tracking + Status aus Shopify auf Knopfdruck abrufen)
PROJ-100: Verkaufskanal-Logos (Otto, Kaufland, eBay, Amazon, TikTok, Zalando, Temu) in Auftragsübersicht & Detail-Dialog
PROJ-100: DB-konfigurierte Badge-Farben aus Channel-Rules werden jetzt in der Auftragsübersicht angezeigt
PROJ-130: Separates Notiz-Suchfeld in der Auftragsübersicht (notes + import_notes, Trigram-Index)
PROJ-111: eBay-Username-Lookup für FreeScout Connector (eBay-Proxy-Mails umgehen via Magnalister Import-Notizen)
PROJ-78: Versandart-Filter für Produktübersicht (Ist/Ist-nicht-Modus, Keine Versandart, Multi-Select)
PROJ-78: Hersteller-Filter mit Ist/Ist-nicht-Modus und Ohne-Marke-Option (Negierung + Artikel ohne zugewiesene Marke filtern)
PROJ-129: Dokumenten-Kategorien CRUD — Eigene Kategorien erstellen, alle Kategorien bearbeiten/löschen/kopieren, Richtlinien & Normen inline editieren, Preset-Reset (einzeln oder alle), Zusatztexte in DB persistiert, Konformitätserklärung nutzt DB-Kategorien
PROJ-128: Drag & Drop Sortierung für Varianten-Attribute — Werte-Bubbles und Attribut-Karten per DnD sortierbar, Kindartikel-Tabelle sortiert nach Werte-Reihenfolge
PROJ-2: Unsaved-Changes UX — Sticky Banner mit Speichern/Verwerfen, deaktivierter Save-Button ohne Änderungen, Browser-Leave-Guard, Zurück-Button warnt bei offenen Änderungen
PROJ-15: Parent-Child Checkbox-Kaskadierung — Elternartikel-Checkbox selektiert/deselektiert alle Kindvarianten, Indeterminate-State bei Teilauswahl, 'Alle auswählen' kaskadiert ebenfalls
PROJ-92: Profilkarten zeigen jetzt Max Aufträge, Auftragstypen, Scan-Modus, Auto-Flags, Lagerplatz- und Tag-Filter
PROJ-8: Import-Notizen für Kundenaufträge — Shopify note_attributes (z.B. Magnalister eBay-Metadaten) als eigenes Feld importieren und im Detail-Dialog anzeigen
PROJ-120: Firmenzusatz unter Firmenname in Lieferantenliste anzeigen
PROJ-122: Lieferant Quick-Assign-Button in der Massenbearbeitungs-Toolbar
PROJ-122: Inline-Validierung im Spreadsheet mit roten Fehler-Zellen
PROJ-122: Warnung bei 500+ Artikeln im Spreadsheet
PROJ-124: Eltern-Kind Zuordnung & Lösung — Kindartikel vom Elternartikel lösen und bestehende Produkte als Kind zuordnen
Versandverpackungen sortierbar via Pfeil-Buttons in Einstellungen, Sortierung wird im Produkt-Dropdown übernommen
PROJ-123: Varianten-Tab mit VariantTable, VariantToolbar, InheritanceDialog, ProductSlideOver und SpreadsheetView integriert
PROJ-123: Varianten-API gibt jetzt alle für Tabelle und Slide-Over benötigten Felder explizit zurück
PROJ-123: Vererbungs-Dialog — Felder vom Elternartikel auf ausgewählte Kindartikel übertragen (Gruppenauswahl, Vorschau)
PROJ-123: Produkt-Slide-Over — Schnellbearbeitung von Kindartikeln ohne Seitenwechsel (Sheet-Panel, Formular mit react-hook-form)
PROJ-123: VariantAttributeBuilder — onRename-Callback für editierbare Attributnamen (DB-gesicherte Attribute)
PROJ-123: VariantTable — neue read-only Tabelle mit Checkbox-Selektion, dynamischen Attribut-Spalten und Status-Badges
PROJ-123: VariantToolbar — Varianten-spezifische Toolbar mit 'Werte übertragen'-Button über dem BulkActionToolbar
PROJ-123: PATCH /api/products/[id]/variants/attributes — Umbenennung von Variantenattributen inkl. JSONB-Key-Update in allen Kindvarianten
PROJ-122: Tabellen-Editor (Spreadsheet View) mit AG Grid Community
PROJ-122: Spalten-Picker mit Gruppen, Checkboxen und localStorage-Persistierung
PROJ-122: Custom Dropdown-Zelleditor für Referenzfelder (Hersteller, Versandart, etc.)
PROJ-122: Custom Zahlen-Zelleditor mit deutschem Dezimalformat (Komma-Support)
PROJ-122: Bulk-Action Toolbar — BulkActionToolbar-Komponente mit SetFieldDialog (Feld+Wert in 2 Schritten, gruppiert nach Kategorie) und AdjustPriceDialog (5 Modi: absolut, ±%, ±€), inkl. AlertDialog-Bestätigungen für Archivieren/Löschen
PROJ-122: POST /api/products/bulk-action Endpoint für Toolbar-Aktionen (set_field, clear_field, adjust_price, archive, unarchive, delete — mit filter-basierter Auswahl via all_matching)
PROJ-122: PATCH /api/products/bulk Endpoint für Spreadsheet-Speichern (Bulk-Update einzelner Felder pro Produkt, Auth + Rate-Limit + 207 Multi-Status)
PROJ-122: Bulk-Edit Validierungen — bulkUpdateSchema, bulkActionSchema, BULK_EDITABLE_FIELDS, NON_BULK_EDITABLE_FIELDS, validateBulkFieldValue
PROJ-114: Marken direkt aus Tabellenübersicht duplizieren inkl. Logo & Unterschrift
PROJ-8.5: Shopify-Import holt jetzt Produktbeschreibung (body_html) und Gewicht (kg-Konvertierung) mit
Dev-Tools: Neues Cleanup-Target 'Produkte' — löscht alle Produkte, Bestände, Bestandsbuchungen, Wareneingänge und produktbezogene Daten
PROJ-120: Feld 'Nächster Hafen' bei Lieferanten-Stammdaten hinzugefügt
PROJ-85: Lager-Auswahl und Auto-Barcode beim Lagerplatz-Import — Dropdown für Ziel-Lager im Import-Wizard, Barcode wird automatisch aus Name generiert
PROJ-121: Nachträgliche Sendungsnummern an Shopify — Zusatzlabels und Retourenlabels aus Auftragsdetails optional an Shopify syncen, Toggle pro Integration (Default: aus, Multi-Channel-sicher), Override pro Auftrag im Label-Popover, Kundenbenachrichtigungs-Option, Multi-Channel-Warnung
PROJ-119: Produkte vollständig löschen (Hard Delete) — Admins können Produkte endgültig löschen (einzeln + Bulk), Abhängigkeitsprüfung (Bestand, Picklisten, Varianten, Bundles), Bestellpositionen werden automatisch in Freipositionen entkoppelt, 4-Phasen-Bestätigungsdialog
PROJ-2: UVP-Feld (Unverbindliche Preisempfehlung) im Basis-Tab hinzugefügt, inkl. Daten-Hub Synonym-Mapping
PROJ-2: Produktbeschreibung-Feld (HTML/Fließtext) im Sonstiges-Tab hinzugefügt
PROJ-89: Tags von Sonstiges in den Basis-Tab verschoben
Ausführliche Sync-Logs: Strukturierte Per-Item-Details für jeden Import (importiert/übersprungen/fehlgeschlagen mit Bestellnummer und Fehlergrund) (PROJ-118)
Detail-Sheet: Klickbare Sync-Log-Einträge öffnen Seitenleiste mit Admin-Übersicht und aufklappbaren technischen Details (PROJ-118)
Import-Rollback: Einzelne Imports rückgängig machen mit Bestätigungsdialog, Impact-Vorschau und verwaister-Kunden-Bereinigung (PROJ-118)
PROJ-2: ASIN-Feld (Amazon Standard Identification Number) bei Produkten hinzugefügt
PROJ-117: Amazon FBM-Import erhält jetzt automatisch Versandart via Prioritätsauflösung (war vorher NULL)
PROJ-117: Versandarten-Priorität als Deployed markiert
PROJ-117: Info-Banner in Versandarten-Einstellungen (Prioritäts-Erklärung mit Truck-Icon)
PROJ-117: onReorder-Callback in ShippingMethodTable verdrahtet (Cache-Invalidierung nach Drag-and-Drop)
PROJ-117: Neue Versandarten erhalten automatisch sort_order = MAX + 1, landen damit am Ende der Prioritätsliste
PROJ-117: Drag-and-Drop Priorität für Versandarten-Tabelle – Prio-Spalte mit Griffpunkt, optimistisches UI, persistiert via /api/shipping-methods/reorder
PROJ-117: Reorder-API für Versandarten hinzugefügt (PATCH /api/shipping-methods/reorder)
PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
Neuer Tab "Dokumente" in Produktdetailseite (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
18 vordefinierte EU-Produktkategorien mit aktuellen Richtlinien und EN-Normen (Stand 2026)
EG-Konformitätserklärung mit Kategorie-Vorauswahl, Normen-Wizard und PDF-Generierung
Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen, Symbolen und Markdown-Editor
Umkarton-Etikett im Tool-Stack-Format (A4 Querformat, Barcode, Formularfelder)
Hersteller-Stammdaten erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
Hersteller duplizieren und echtes Löschen (inkl. Storage-Cleanup)
Einstellungen: "Marken & Hersteller" → "Produkte" mit Dokumenten-Konfiguration
Varianten-Support: Ein PDF für alle Varianten (Bilder im 3er-Raster, automatischer Seitenumbruch)
Dokumentation: Ausführliche Hilfeseite unter Artikel & Lager → Produktdokumente
PROJ-116: Hard-Delete für Hersteller mit Logo/Signatur-Cleanup
PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
Neuer Tab "Dokumente" in Produktdetailseite
EG-Konformitätserklärung mit 18 EU-Produktkategorien und Normen-Wizard
Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen
Umkarton-Etikett (Ein-Klick PDF)
Hersteller erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
Einstellungen: Marken & Hersteller → Produkte mit Dokumenten-Konfiguration
PROJ-115: Rekursive SKU-Ordner-Suche beim Auto-Match (bis 3 Ebenen tief in Unterordnern)
PROJ-115: Env-Vars Dokumentation, Feature-Index und Implementation Plan
PROJ-115 Tasks 12-16: Cloud-Speicher Settings-Seite, Folder Picker, Dateien-Tab im Produktformular, File Browser mit Sidebar/Grid/List, Lightbox-Vorschau, Upload-Zone
PROJ-115: Dateien-Tab in Produktdetails + Cloud File Browser (Sidebar, Ordner-Kacheln, Thumbnail-Grid, Dateiliste)
PROJ-115: Cloud Folder Picker Dialog (Breadcrumb-Navigation, Ordner-Auswahl per Klick/Doppelklick)
PROJ-115: Cloud-Speicher Einstellungsseite (OneDrive-Verbindung, Basis-Ordner, Ordner-Vorlagen, Bulk Auto-Match)
PROJ-115: TanStack Query Hooks für Cloud Storage (Connections, Files, Folders, Templates, Product-Folder)
PROJ-115: Bulk Auto-Match API (alle Produkte automatisch per Marke + SKU mit Cloud-Ordnern verknüpfen)
PROJ-115: Ordner-Vorlagen API (CRUD + Drag & Drop Sortierung)
PROJ-115: Product-Cloud-Folder API (Verknüpfung, Auto-Match per Marke/SKU, Ordnerstruktur erstellen)
PROJ-115: Cloud File & Folder API Routes (List, Create, Upload, Download, Rename, Move, Delete, Thumbnail, Preview) + get-provider Helper mit Auto-Token-Refresh
PROJ-115: OAuth2 Flow (CSRF-State, Token-Verschlüsselung) + Connection Management API (CRUD, Root-Folder-Update)
PROJ-115: Zod-Validierungsschemas + DB-Row-Types für Cloud Storage (Folder-Templates, Connections, Product-Folder-Links)
PROJ-115: OneDrive Provider (Microsoft Graph API) + Provider Factory für Cloud-Storage-Modul
PROJ-113: LB-PDF neues Header-Layout — Logo, Absenderzeile, Liefer-/Rechnungsanschrift, Bearbeiter, zentrierter Titel
PROJ-113: Billkom PDF-Generator company_overrides & Logo-Fallback (billkom-logos → workspace-logos)
PROJ-113: Billkom Setup-Wizard — Button 'Firmendaten aus Workspace übernehmen' zum Prefill aller Felder
PROJ-113: Billkom Company-Tab Override-UI — OverridableField-Pattern mit Workspace-Werten als Read-Only, Per-Field Override mit Badges, Logo-Override
PROJ-113: Billkom Override-Logik — companyOverridesSchema, company_overrides in UpdateSettingsSchema, workspace_company im GET-Response
PROJ-113: Workspace-Einstellungen mit Tab-Struktur (Firmendaten + Nummernkreise), Logo-Upload, Firmendetails, Steuerdaten, Bankverbindung
PROJ-113 Task 1: DB-Migration — Workspace-Firmenprofil (company_name, Adresse, Bankdaten, USt-ID, Logo-URL), billkom company_overrides JSONB, Storage Bucket workspace-logos mit RLS
PROJ-24: SKU + EAN als Textzeile unter jedem Produktnamen im Bestell-PDF
PROJ-24: Ziellager-Auswahl auf Bestellungen, Firmendaten (Absender) + Lager-Lieferadresse im PDF nebeneinander
PROJ-24: Bestellungssprache pro Lieferant (DE/EN) für PDF-Export, Produktbilder in jeder Position
PROJ-112: Phase 3 complete — Profitbutler Statistik mit Dashboard, Fixkosten, Kanal-Aufschlüsselung, CSV/PDF-Export
PROJ-112: PDF-Export — Server-side PDF-Generierung mit jsPDF/autotable, API-Route /api/profitbutler/stats/export
PROJ-112: CSV-Export — Client-side CSV-Generierung mit deutschem Zahlenformat, UTF-8 BOM, Exportieren-Dropdown in Filterleiste
PROJ-112: Profitbutler Tagesstatistik Cron-Job-Eintrag in Settings-Seite
PROJ-112: Daily Stats Aggregation — Tagesstatistiken vorberechnen mit Backfill-Support, Aggregate-Shortcut in Stats API für schnellere Ladezeiten
PROJ-112: Konfigurierbare Zeiträume — User Preferences API, Period Config Dialog mit Drag-Reihenfolge, Custom-Zeitraum-Eingabe, max 10 Spalten
PROJ-112: Quartal-, Jahres- und Custom-Zeitraum-Parser mit TDD (quarter, year, custom:YYYY-MM-DD:YYYY-MM-DD)
PROJ-112: Kostenberechnungsmodul extrahiert — Pure Functions für Versand, Verpackung, Pick&Pack, Wareneinsatz, Provision, Werbung, MwSt mit 18 Unit-Tests
PROJ-112: Pick & Pack Kosten in Workspace-Standardwerten und Produkt-Overrides — neuer Standardwerte-Tab in Profitbutler-Settings, EUR-Eingabe pro Stück, produktspezifische Überschreibung mit Workspace-Default als Placeholder
PROJ-112: Revenue/Profit Chart mit Recharts — Umsatz als Balken, Gewinn als Linie, 7T/14T/30T/90T Zeitraumwahl, Orders/Invoices View, Dark-Theme-Tooltip
PROJ-112: Fixkosten Settings Tab — Summary Cards, Add/Edit Dialog mit Zod-Validierung, CRUD-Tabelle mit Pause/Resume/Löschen, Kanalzuweisung, Abschreibungsmodi
PROJ-112: Fixed Costs CRUD API — GET/POST Liste & Erstellen, PATCH/DELETE Einzeleintrag, Pause/Resume Toggle
PROJ-112: Profitbutler KPI-Widgets auf Dashboard (admin-only) — Tagesumsatz, Tagesgewinn, Marge mit Link zu /dashboard/profitbutler
PROJ-112: Artikelsuche mit Autocomplete und Multi-Select — debounced Suche gegen /api/products, Produkt-Badges mit Entfernen, Filter Bar Integration
PROJ-112: Kanal-Aufschlüsselung — Collapsible Section mit Kanal-Cards (Umsatz, Anteil, Gewinn, Marge), responsive Grid
PROJ-112: Sellerboard-Tabelle mit aufklappbaren Kostengruppen (Warenkosten, Logistik, Vertrieb, Steuern, Fixkosten), Gewinn/Marge/Bestellungen, formatCents Helper
PROJ-112: Profitbutler Filter Bar — Kanal-Dropdown (Alle Kanäle + Einzelkanäle), Aufträge/Rechnungen-Toggle mit Tabs
PROJ-112: React Query Hook für Stats API — useProfitbutlerStats mit View/Periods/Channel/ProductIds Params
PROJ-112: Profitbutler Stats Page Shell — Server Component mit Admin-Guard, Client Shell mit View/Channel/Period State
PROJ-112: Profitbutler Sidebar-Navigation — Admin-only Nav Item mit TrendingUp Icon, adminOnly-Flag im NavItem Interface
PROJ-112: Stats API Endpoint — /api/profitbutler/stats mit Revenue, Kosten, Gewinn pro Periode, Kanal-Aufschlüsselung, Orders/Invoices-View
PROJ-112: Profitbutler Stats-Berechnungslogik mit TDD (resolvePeriodToDateRange, calculatePeriodStats, calculateGroupedCosts, calculateMarginPct)
PROJ-112: Fixed-Cost-Berechnung mit TDD — calculateDailyFixedCost (distributed/due_date), calculateFixedCostsForPeriod, 12 Unit-Tests
PROJ-112: Stats-Types & Interfaces für Profitbutler Statistik-Modul (PeriodStats, FixedCost, StatsResponse etc.)
PROJ-98: Versand-/Service-Positionen werden in Auftragsdetails immer als letzte Positionen angezeigt
PROJ-98: Shopify shipping_lines als Versandpositionen importieren — Versandkosten kommen bei Shopify nicht in line_items sondern in shipping_lines, werden jetzt mit Shipping Detection verarbeitet
PROJ-53: Reverse Carrier Matching — Shopify tracking_company wird über shopify_carrier_mappings rückwärts auf WMS-Versandart gemappt, damit Retoure-Button und Carrier-Features bei importierten Bestellungen funktionieren
PROJ-53: Shopify Fulfillment-Daten beim Import übernehmen — Tracking-Nummern und shipped_at für bereits versendete Bestellungen als completed shipping_tasks importieren
PROJ-111: FreeScout-Flowkom Connector — Read-only Lookup-API, API-Key-Authentifizierung, Marketplace-URL-Builder, Integration-Registry (freescout + support-Kategorie), DB-Migration
Auftragsstornierung mit Beleg-Aktionen: Rechnung stornieren oder Gutschrift erstellen bei Auftragsstornierung (PROJ-110)
PROJ-110: Erweiterter Stornierungsdialog in Auftragsübersicht — gleiche Cancel-Preview mit Belegaktionen wie im Detaildialog (Rechnungen stornieren/gutschreiben, weitere Belege, Entwurf-Löschung)
PROJ-110: Erweiterter Stornierungsdialog — Rechnungs-Aktionen (Stornieren/Gutschrift/Nichts), Checkbox für weitere Belege, automatische Entwurf-Löschung, Cancel-Preview-API
PROJ-110: Cancel-Route mit optionalen Document Actions — Belege vor Stornierung löschen/stornieren/gutschreiben (void/credit_note/delete), Validierung aller Aktionen vor Ausführung, Audit-Trail mit document_actions
PROJ-110: createFullCreditNote-Funktion — erzeugt vollständige Gutschrift aus Rechnung ohne Stornierung (für versendete Bestellungen)
PROJ-110: Extract voidDocument function into reusable lib (Billkom Phase 3)
Gutschrift-Dialog erweitert: Dual-Modus (Positionen/Betrag) mit Brutto/Netto-Toggle
Verbleibender Rechnungsbetrag wird im Gutschrift-Dialog angezeigt
Übersteigung-Warnung mit Pflicht-Begründung statt Hard-Block
Belegübersicht in Auftrags-Details zeigt Rechnungen, Gutschriften und effektiven Umsatz
Preisnachlass-Feature komplett entfernt (ersetzt durch erweiterte Gutschrift)
PROJ-109: Belegübersicht im Auftragsdetail-Dialog — Rechnungen mit Gutschriften und effektivem Umsatz (brutto), klickbare Belegnummern öffnen DocumentDetailDialog
PROJ-109: Dual-Mode Gutschriftdialog — Umschaltung Positionen/Betrag, Restrechnungsinfo-Box mit Rechnungsbetrag/Gutschriften/Verbleibend, Betragseingabe (brutto/netto) mit Live-Berechnung, Überschreitungs-AlertDialog mit Pflicht-Begründung (min. 10 Zeichen)
PROJ-109: Amount-mode Gutschriften mit Concurrency-Lock, Betragsberechnung (gross/net), Überschreitungsvalidierung und Audit-Trail (exceeding_reason Event)
PROJ-109: Positions-mode Gutschriften mit related_document_id, Überschreitungsvalidierung und exceeding Event-Logging
PROJ-109: useRemainingInvoiceBalance-Hook hinzugefügt — leitet Restbetrag aus useBillkomDocumentsByOrder via calculateRemainingBalance ab
PROJ-109: CreditNoteAmountSchema (Betragsmodus mit gross/net-Refinement) und CreditNotePositionsSchema (Positionsmodus via CreateDocumentSchema.extend) hinzugefügt
Auftragslöschung mit Belegen: Vollständige Löschung inkl. Billkom-Dokumente & Nummern-Rückgabe (PROJ-108)
PROJ-108: Zweistufiger Lösch-Dialog in Auftragsübersicht — optionale Beleglöschung mit Checkbox, Dokumentenliste, GoBD-Warnung, Bestätigungseingabe; Umlaut-Korrekturen
PROJ-108: Zweistufiger Lösch-Dialog in Auftragsdetails — optionale Beleglöschung, Dokumentenliste mit Zahlungsstatus, Bestätigungseingabe bei Beleglöschung (GoBD-Warnung)
PROJ-108: DELETE /api/orders/:id ruft bei includeDocuments=true die RPC delete_order_with_documents auf (atomische Löschung mit Belegen & Nummernkreis-Rückgabe)
PROJ-108: RPC delete_order_with_documents — atomische Auftragslöschung mit Belegen, Nummernkreis-Rückgabe, Quotation-Reset, FOR UPDATE Locks
Shopify-Import: Rechnungsadresse + Lieferanschrift werden jetzt beide importiert (billing_address + shipping_address)
PROJ-107: Steuerprüfung ist jetzt Pflicht vor Rechnungserstellung — bei fehlgeschlagener Prüfung Toast-Fehler statt Dialog-Öffnung; 'Erstellen & Finalisieren' in DocumentFormDialog gesperrt bis Steuer-Szenario ermittelt, Hinweistext unter dem Button
PROJ-107: Billkom-Belegstatus-Badge im Auftragsdetail-Dialog (Entwurf/Rechnungsnummer/Bezahlt/Teilzahlung), ORDER_DETAIL_SELECT um billkom_documents!order_id erweitert
PROJ-107: SKU wird beim Erstellen von Billkom-Belegen aus Auftragsposition in billkom_document_items übernommen (DocumentItemSchema, document-form-dialog, documents API)
PROJ-107: Auftragsdetail-Dialog auf 8 Spalten erweitert (Art.-Nr., Bezeichnung, Menge, Einheit, E.-Preis, MwSt %, Rabatt %, Gesamt) + Summenblock mit Netto/MwSt-Aufschlüsselung pro Steuersatz
PROJ-107: Auto-MwSt im Auftragsformular basierend auf Kundenland (Tax-Preview-Banner, automatische Steuersatz-Setzung, Read-Only MwSt bei aktivem Szenario)
PROJ-107: GET /api/billkom/tax-preview Endpoint + useTaxPreview Hook (vereinfachte Steuer-Vorschau per customer_id, Standard- & Ermäßigter Satz)
PROJ-107: Länder-Freitext durch Combobox-Dropdown ersetzt (34 Länder, Suche nach Name/Code, Warnung bei unbekannten Werten)
PROJ-107: COUNTRY_LIST für Länder-Dropdown-Combobox exportiert (34 Länder mit deutschen Labels)
PROJ-103: DIN 5008 Form B Layout für PDF-Rechnungen (korrekte Abstände, Falz-/Lochmarken, Logo proportional skaliert in fester Box)
PROJ-103: ZUGFeRD-PDF auf Deutsch (locale de-DE), Logo-Einbindung aus Billkom-Settings, Artikelnummer (SKU) in Positionstabelle
PROJ-106: Billkom Positions-Integration & PDF-Overhaul — Einheitliche Positionskette Angebot→Auftrag→Rechnung
PROJ-106: Pixkom-Style PDF-Layout mit Logo, Artikelnummer, dreispaltiger Fußzeile, Zahlungsstatus
PROJ-106: Logo-Upload in Billkom-Einstellungen (Drag & Drop)
PROJ-106: Freiposition-Support in Kundenaufträgen und Angeboten
PROJ-106: Abweichungswarnungen und Teilrechnungen im Beleg-Dialog
PROJ-106: Shopify/Amazon Import mit Netto-Preisen und erweiterten Positionsfeldern
PROJ-106: Rückwärts-Tracking zwischen Angebot, Auftrag und Rechnung
PROJ-104: Produkt-Suche im Angebots-/Proforma-Formular — Artikel direkt aus Produktstamm hinzufügen mit SKU, Preis (Profitbutler VK), product_id-Verknüpfung für Auftragskonvertierung
PROJ-104: "Neuer Auftrag"-Button im Angebote-Tab ausgeblendet
Billkom Phase 3: Angebote & Proforma-Rechnungen (CRUD, Finalisieren, Auftrag erstellen)
Billkom Phase 3: Mahnwesen mit 3 Stufen (Einzel + Batch, pg_cron Überfälligkeitserkennung)
Billkom Phase 3: GoBD-konforme Korrekturbearbeitung mit Concurrent Locking
Mahnwesen-Settings-Tab (Fristen + Gebühren pro Stufe)
Angebote-Tab auf Auftragsseite (nur bei billkom_enabled)
PROJ-21: Auftragspositionen verschiebbar — Reihenfolge per Hoch/Runter-Buttons, persistiert über position-Spalte in DB
PROJ-103: Konfigurierbares Belegnummernformat — Mit/Ohne Jahreszahl, Kurzjahr, Trennzeichen und Stellenanzahl pro Dokumenttyp einstellbar
PROJ-103: Phase-2-Integration in Belege-Tab — BillkomDownloadButtons (PDF/ZUGFeRD/XRechnung) ersetzt Einzel-Download, canCreateInvoice-Guard mit Tooltip, Tax-Preview vor manueller Rechnungserstellung, Preisnachlass-Button + Discount-Dialog für aktive Rechnungen
PROJ-103: Tax-Info-Komponente (Steuer-Szenario-Badge, Warnungen), Download-Buttons (PDF/ZUGFeRD/XRechnung mit Tooltip), Preisnachlass-Dialog (Live-Berechnung, Validierung, useCreateDiscount)
PROJ-103: Kanäle-Tab in Billkom-Einstellungen mit Channel-Config-Cards (Steuerbehandlung, Absenderland, Zahlungsart, Auto-Rechnung, Auto-Bezahlt pro Kanal)
PROJ-103: Job Queue Processor (processJobQueue) mit Batch-Claim, Workspace-Advisory-Lock, paralleler Workspace-Verarbeitung, Tax-Engine-Integration, Duplikatschutz, Auto-Finalisierung, Auto-Paid-Markierung und Cron API Route (POST /api/billkom/queue/process)
PROJ-103: Discount (Preisnachlass) API-Endpoint mit Row-Locking, Teilgutschrift-Erstellung, Betragsvalidierung, Invoice-Status-Update und useCreateDiscount Hook
PROJ-103: Channel Config GET/PUT API Routes (authenticateRequest/authenticateAdmin, rateLimitAsync, Zod-Validierung) und TanStack Query Hooks (useChannelConfigs, useUpdateChannelConfig)
PROJ-103: Download-Endpoint um ZUGFeRD- und XRechnung-Formate erweitert (format Query-Parameter, Status-Prüfung auf finalisierte Belege, buyer_reference-Validierung für XRechnung, TaxResult aus Snapshot)
PROJ-103: E-Invoice Adapter (EInvoiceGenerator) mit dynamic import für factur-x-kit (ZUGFeRD Comfort PDF/A-3) und xrechnung-generator (XRechnung UBL 2.1 XML), Singleton-Export, 7 Tests
PROJ-103: XRechnung UBL 2.1 Mapper (mapToXRechnungInput) für xrechnung-generator Library, cents→decimal Konvertierung, buyer_reference Pflichtvalidierung, Supplier/Customer/Payment/LineItems Mapping, Reverse-Charge Notes, 57 Tests
PROJ-103: ZUGFeRD ComfortProfile Mapper (mapToZugferdInput) mit TotalsCalculatorInputType-Ziel, cents→decimal Konvertierung, Discount-Allowances, Reverse-Charge taxExemptionReason, SEPA-Bankdaten, 41 Tests + Shared Fixtures
E-Invoice Types, Unit Codes & Tax Category Mappings (PROJ-103): BillkomDocumentForInvoice/ItemForInvoice Interfaces, EInvoiceGenerator Interface, INVOICE_TYPE_CODES (380/381/325), UN/ECE Unit Code Map (11 WMS-Einheiten → CEFACT), Tax Category Map (7 Szenarien → ZUGFeRD-Codes S/AE/G/O)
PROJ-102 Billkom Phase 1 als Deployed markiert
Settings: Steuern-Tab (EU-Steuersätze, OSS-Status)
Settings: Nummernkreise-Tab (Präfix, Nächste-Nummer)
Corrective Edit Dialog (GoBD-Warnung)
Tax Preview (Live-Steuervorschau im Formular)
API: /tax-rates und /sequences Endpoints
Bugfixes: 4 kritische + 6 wichtige Fehler behoben (DB-Spaltennamen, Corrective Edit Beträge, Search-Injection, Tax-Kategorie)
PROJ-102: Billkom-Integrationspoints verdrahtet — konditionaler "Belege"-Tab im Auftragsdetail-Dialog (lazy-loaded, billkom_enabled-Flag), Phase-3-Kommentar in Auftragsübersicht
Billkom Document UI Components (PROJ-102): Belege-Tab für Auftragsdetails, Beleg-Detail-Dialog mit Positionen/Zahlungen/Aktionen, Beleg-Formular-Dialog mit dynamischen Positionen und Live-Summenberechnung, Zahlungsbuchungs-Dialog, Stornierungs-Dialog mit Gutschrift-Hinweis
Billkom Settings-Seiten & Setup-Wizard (PROJ-102): Settings-Navigation-Eintrag, Hauptseite mit Tab-Navigation (Unternehmen, Zahlungen, Vorlagen), 3-Schritt-Setup-Wizard mit Firmen- und Bankdaten, Skonto-Konfiguration, Accordion-Vorlagen-Editor für 6 Belegtypen
src/hooks/use-billkom.ts — TanStack Query hooks für alle Billkom-Endpunkte (Settings, Dokumente, Zahlungen, Tax/VIES)
src/components/billkom/status-badge.tsx — BillkomStatusBadge-Komponente mit 7 Status-Konfigurationen (Entwurf, Finalisiert, Teilbezahlt, Bezahlt, Überfällig, Storniert, Umgewandelt)
pdf-generator.ts — Billkom PDF-Generator mit jsPDF + jspdf-autotable; rendert aus Snapshots (customer_snapshot, sender_snapshot, tax_rate_snapshot)
GET /api/billkom/documents/[id]/download — PDF-Download-Endpoint aktiviert, gibt echtes PDF statt 501 zurück
POST /api/billkom/payments — Zahlung an Beleg buchen, DB-Trigger aktualisiert Status
DELETE /api/billkom/payments/[id] — Zahlung löschen (Admin only)
POST /api/billkom/tax/check — Steuervorschau ohne Belegerststellung
POST /api/billkom/tax/vies-validate — USt-IdNr. via EU VIES API validieren mit Caching
Billkom Document Action APIs (PROJ-102): Finalize (Tax Engine + Snapshot + RPC), Void (Admin-only + Auto-Gutschrift), Corrective Edit (GoBD SET LOCAL bypass), Download (501-Platzhalter für Task 13), billkom_apply_corrective_edit SQL-Funktion
PROJ-102: Billkom Settings API (GET/PUT) mit EU-Steuerrate-Seeding (27 Länder)
PROJ-102: Billkom Documents CRUD API (POST, GET Liste mit Cursor-Pagination)
PROJ-102: Billkom Document Detail & PATCH API (Entwurf bearbeiten)
PROJ-102: Billkom Documents by-Order API (GET nach Order-ID)
Billkom Phase 1 DB-Migration (PROJ-102): Komplettes Datenbankschema — 11 Tabellen, 3 ENUMs, 6 Funktionen (inkl. GoBD-Trigger, gap-free Nummernvergabe, atomische Finalisierung), 13 Indexes, RLS-Policies
Billkom Document Lifecycle Helpers (PROJ-102): Pure-Function-Bibliothek für Zeilenposten-Berechnung, Dokumentsummen, Aufbewahrungsfristen (§147 AO), Zahlungszieldaten, Status-Transitionen und Kunden-/Absender-Snapshots
PROJ-102: VIES-Validierungsmodul (vat-validation.ts) mit Cache-Logik, API-Isolation und Override-Validierung
PROJ-102: lookupTaxRate() in tax-engine.ts für Steuerssatz-Lookup aus billkom_tax_rates
Billkom Foundation (PROJ-102): TypeScript-Typen, EU-Länderliste und Konstanten für das Rechnungsmodul — TaxContext, TaxResult, TaxScenario, DocumentTypeAllowed, TaxEngineError, ALLOWED_TRANSITIONS, DOCUMENT_PREFIXES, RETENTION_YEARS
Profitbutler Settings-Restrukturierung (PROJ-105): USt-Sätze und Wechselkurse unter neuer Profitbutler Tab-Page in den Settings zusammengefasst
Billkom Rechnungsmodul Specs (PROJ-102/103/104): Vollständige Feature-Spezifikationen für 3-phasiges Rechnungsmodul — Tax Engine, GoBD-Compliance, E-Rechnung, Angebote, Mahnwesen
Mehrfachauswahl-Operatoren für Workflow-Bedingungen (PROJ-101): IST EINES VON / IST KEINES VON für Versandart, Verkaufskanal und Lieferland — z.B. 'WENN Kanal = Otto UND Versandart ist eines von [Brief, Kompaktbrief, Großbrief] DANN Versandart = DHL Kleinpaket'
Multi-Select UI mit Checkbox-Popover und Chip-Badges im Workflow-Builder
Verkaufskanal-Erkennung (PROJ-100): Tag-basiertes Channel-Mapping pro Shopify-Integration (Otto, Temu, eBay, Kaufland, TikTok, Zalando etc.)
Channel-Rules UI: Drag & Drop Reihenfolge, Preset-Farben, Tag-Vorschläge, Kanal-Badges in Auftragsliste
Verkaufskanal-Filter: Neue Filterleiste in der Auftragsliste nach Verkaufskanal
Workflow-Condition 'Verkaufskanal': Regeln wie 'WENN Kanal = Otto DANN Versandart DHL' möglich
Workflow-Priorität: sort_order für Workflows, Ausführungsreihenfolge steuerbar, first-match-wins bei Konflikten
Service-Artikel & Versandpositions-Erkennung (PROJ-98): inventory_tracking Flag auf Produktebene, automatische Keyword-Erkennung beim Import (Shopify/Amazon), Service-Badge in Produktliste und Aufträgen, ShippingDetectionSection pro Integration, Systemausschlüsse (Picklisten, Wareneingang, Bestandsübersicht, Bestellvorschlag)
PROJ-99: Etikettendruck-Modul (Formate, Vorlagen, Barcode-Druck für Lagerplätze & Produkte)
PROJ-99: Storage-Cleanup für Etiketten-Labels in print-job-result – temporäre Label-PDFs (storage_label, product_label) werden nach erfolgreichem Druck automatisch aus dem Supabase Storage gelöscht
PROJ-99: PDF-Renderer für Etikettendruck – renderLabelPdf() mit dynamischer Skalierung, EAN-13-Validierung, HRI-Text und optionalem Label-Text
Barcode-Adapter für Etikettendruck-Modul (PROJ-99): EAN-13-Validierung mit Prüfziffer, Code128/Code39-Rendering, dynamische Skalierung auf verfügbare Labelgröße, 300-DPI-Auflösung
PROJ-99: Etikettendruck-Modul — label_formats und label_templates Tabellen mit System-Presets (7 Templates, 2 Formate), RLS, label_type Enum-Erweiterung (storage_label, product_label, return_label)
Shopify Metafeld-Sync: Flexibler Builder zum Befüllen von Shopify-Metafeldern mit WMS-Daten (Auftragsnummer, Tracking, Retour-Tracking, Tags, etc.)
Shopify Versandrückmeldung: Trackingnummer + Carrier automatisch an Shopify senden (Fulfillment API)
Carrier-Mapping: WMS-Versandart → Shopify Carrier konfigurierbar (DHL Express, Deutsche Post, etc.)
Retour-Tracking: Auto-Return Trackingnummer als zusätzliche Trackingnummer an Shopify senden
Fulfillment-Toggle pro Integration, Retry-Queue mit Cron, Status-Badge im Auftragsdetail
Produktverwaltung mit Varianten, Bundles und Tags (PROJ-2, 15, 16, 78, 79, 88, 89)
Lagerverwaltung mit 5-stufiger Hierarchie und Standort-Wizard (PROJ-3, 4, 34-36)
Bestandsführung mit Bewegungshistorie und FIFO-Bewertung (PROJ-5, 14, 73, 74)
Wareneingang frei und gegen Bestellung (PROJ-6)
Kundenauftrags-Verwaltung mit Audit-Trail (PROJ-21, 59, 90)
Sammelkommissionierung mit Picklisten-Profilen (PROJ-9, 10, 92)
Versandprozess mit Label-Generierung und Zollinhaltserklärung (PROJ-11, 70)
Lieferanten- und Einkaufsbestellungen mit Kanban-Board (PROJ-18-24, 75, 76, 81)
Shopify-Integration mit Multi-Shop und SKU-Matching (PROJ-7, 8, 50-55)
Amazon SP-API Integration (FBM + FBA) mit Carrier-Mapping (PROJ-60-64, 67-69, 71, 72)
DHL und Deutsche Post Internetmarke Integration (PROJ-12, 27, 40)
Print Broker mit Workstation-Pairing und Job-Queue (PROJ-25, 37-39, 41)
Nachfüllung / Replenishment mit Profilen und Berichten (PROJ-94)
Daten-Hub mit CSV Import/Export und Templates (PROJ-84-87)
Workflow-Engine mit Trigger, Bedingungen und Aktionen (PROJ-56-58, 93)
Einstandspreis und Profitbutler-Integration (PROJ-73, 74, 82, 83)
Team-Verwaltung mit Rollen und PIN für Mobile (PROJ-32, 33, 80)
Sortiernummer pro Lagerplatz für Picking-Routen (PROJ-91)
Performance: Trigram-Indexe, JWT-Claims, Batch-Operationen (PROJ-40-49)
Datenbereinigung mit TTL-Policies (60d Print-Jobs, 90d Sync-Logs) (PROJ-47)
Neue Architektur-Sektion mit Seite "Bestandssynchronisation" — beschreibt Queue-Modell, DB-Trigger, App-Hook-Defense-in-Depth, Safety-Sync und Drift-Diagnose. Mermaid-Diagramm zeigt den Flow Stock-Change/Order-Lifecycle → Queue → Cron → Shopify/Amazon.
Versandarten-Hilfeseite: Vollständige Anleitung mit Priorität, Drag & Drop, Workflows, Fallback-Logik
Neue Hilfeseite: Produktdokumente (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
Dokumentation aller 18 EU-Produktkategorien mit Richtlinien und Normen
Anleitung für Hersteller-Stammdaten, Varianten-Support und FAQ
Shopify-Anbindung: komplette Schritt-für-Schritt-Anleitung für Mandanten (eigene Custom App erstellen, Client-ID/Secret hinterlegen, verbinden) inkl. Bestellstatus-Sync, Zahlungsstatus-Rückmeldung, Produkt-Auto-Import und DSGVO-Compliance-Webhooks
PROJ-614–630: Neue Hilfeseite „Bestandsbewertung & Stichtag“ (artikel-und-lager/bestandsbewertung) — FIFO-Bewertung und Coverage, Stichtags-Rekonstruktion inkl. „heutiger Wissensstand“-Semantik, bezahlter Zulauf mit Zahlungsmodus-Verweis, Bestandswert-Verlaufs-Chart, Stichtags-Vergleich, PDF-Inventurliste mit Festschreibungs-Hinweis, Ladenhüter/Reichweite. Im WMS per HelpLink von der Bestandsbewertungsseite verlinkt.
PROJ-237: Neue Hilfeseite 'Nachlaufkosten' (einkauf/nachlaufkosten) — Was sind Nachlaufkosten (Fracht/Zoll/Sonstige EUR+Fremdwährung), Karten im Kosten-Tab, Vergleichstabelle der drei Verteilmethoden (Volumen/Warenwert/Menge) mit Empfehlungen pro Szenario (Container→Volumen, Versicherung→Warenwert, Handling→Menge), Wechselkurs-Semantik (1 EUR = X Fremdwährung, Quelle api/manual), retroaktive FIFO-Korrektur mit Mermaid-Flowchart (DB-Trigger → calculate_landed_costs → goods_receipt_items + stock_movements), typischer Workflow (Container-Import aus China mit CNY+EUR-Kosten) als Mermaid-Sequenz, FAQ (Division bei Kurs, Verteilmethoden-Wechsel, LB-übergreifende Fracht, Rechnungen), aufklappbare Technik-Details (calculate_landed_costs-RPC, Trigger, purchase_orders/goods_receipt_items/stock_movements).
PROJ-232: Neue Hilfeseite 'Versandinfo-Tags' (einkauf/versandinfo-tags) — Vollständige Incoterms-2020-Referenz (alle 11 Codes EXW/FCA/FAS/FOB/CFR/CIF/CPT/CIP/DAP/DPU/DDP mit Kosten/Risikoübergang/Use-Case), Transportart-Tabelle (Schiff/Luft/Zug/LKW mit Laufzeiten aus Asien), Händler-Entscheidungsvergleich FOB vs. CIF vs. DDP, Mermaid-Flowchart für den Tag-Setzen-Workflow beim LB-Anlegen, Gantt-Diagramm für Laufzeitvergleich, aufklappbare technische Details (DB-Spalten `incoterm`/`transport_mode`, Zod-Schemas, Audit Trail), FAQ zu rechtlicher Relevanz und Incoterms-2010-Altbegriffen (DAT→DPU, DDU→DAP). Neuer Top-Level-Bereich 'Einkauf' im Sidebar-Meta.
PROJ-223: Dokuseite 'Bestellungen' überarbeitet — alte Filterleisten-Beschreibung ersetzt durch drei klar getrennte Abschnitte: Unified Search mit Scope-Dropdown-Tabelle (Überall/Auftrag+Kunde/Artikel/Notiz/Externe Nr.) inkl. konkreten Beispielen (Amazon-Nr. findet externe Bestellnr., eBay-Nr. findet Notiz, SKU/EAN/ASIN/FNSKU findet Artikel), kompakte Status-Pipeline-Tabs, Filter-Drawer mit sekundären Filtern und Aktive-Filter-Chipleiste mit prominentem 'Alle zurücksetzen'-Button.
PROJ-177: Neue Dokuseite 'Amazon FBA-Bestand' (integrationen/amazon-fba-bestand) — Mermaid-Flowchart des FBA-Stock-Sync-Pfads (SP-API → pullFbaInventory → sync_amazon_fba_stock RPC → public.stock + stock_movements), Erklärung von FBA-POOL als virtueller Sammel-Location, read-only Warehouse-Semantik, Bewertung/Bestellvorschlag-Effekte, Tabelle der bekannten Einschränkungen (Doppelzählung, Cost-Approximation, Retouren-Semantik, Unmapped SKUs) mit Verweis auf PROJ-178, technische Referenz (RPC-Signaturen, Movement-Type, Code-Pfade).
PROJ-172: Neuer Abschnitt 'Nächtlicher automatischer Refresh' auf der Amazon-Angebote-verwalten-Doku. Enthält Mermaid-Flowchart des Cron-Pfads (Scheduler → Integrations-Loop → advanceListingsJob → per-MP-Isolation → Cross-MP-Propagation → finishLog), Vergleichstabelle der Amazon-Cron-Zeiten (Listings 02:00, FBA-Inventory 03:15), Opt-Out-Erklärung, Anleitung für manuelles Testen (Cron-Jobs-Tab-Trigger + 'Jetzt starten'-Button pro Integration), aufklappbare Technik-Details zu 'Warum kein pg_cron?' und 'Warum kein wöchentlicher Force-Full?'.
Amazon-Angebote verwalten: Neuer Abschnitt 'FBA-Bestand' mit Mermaid-Flow, Ereignis-Tabelle und Technik-Details zum Trigger-basierten Sync (PROJ-171).
PROJ-170: Neue Dokuseite 'Amazon-Angebote verwalten' — Mermaid-Workflow-Flowchart (Filter → Selektion → Bulk-Aktion), FBA/FBM-Vergleichstabelle, Filter-Übersicht, Beispiel-Workflow '50 unzugeordnete FBA-DE-Angebote auf einmal mappen', Spalten-Konfiguration, CSV-Export, aufklappbare Technik-Details (API-Endpoints, Indizes, Selektions-Modell).
Amazon-Integration: Vollständige Dokumentation ersetzt den Stub — Mermaid-Flowchart, FBM/FBA-Vergleichstabelle, Filter-Übersicht, Status-Mapping Amazon → Flowkom, FAQ (PROJ-167)
Shopify-Integration: Vollständige Dokumentation (Verbindung, Import, Fulfillment, Erstattungen, Fehlerbehebung)
Bestellungen: Zahlstatus-Erklärung und Erstattungs-Anleitung ergänzt
FreeScout-Integration Doku überarbeitet: Matching-Logik mit Mermaid-Flowchart, eBay-Username-Lookup, Carrier-Erkennung, Deeplinks, marktplatzspezifische Fehlerbehebung
Cloud-Speicher Dokumentation: Übersichtsseite (Funktionen, unterstützte Anbieter, Ordnerstruktur) + ausführliche OneDrive-Einrichtungsanleitung (Azure App-Registrierung, Berechtigungen, Env-Vars, Fehlerbehebung)
FreeScout-Integration: Ausführliche Einrichtungsanleitung (Flowkom + FreeScout Modul), Sidebar-Funktionen, Fehlerbehebung, Sicherheitsübersicht
Druckvorlagen-Dokumentation (PROJ-99): Etikettenvorlagen, Etikettenformate, Druckflow, Barcode-Typen, Layout-Erklärung, FAQ
Service-Artikel-Dokumentation (PROJ-98): Versandpositions-Erkennung und inventory_tracking Flag
Automatische Versionierung mit Bump-Script
Drucker-Dokumentation (Einrichtung, Fehlerbehebung)
Nachfüllung komplett dokumentiert (5 Seiten: Übersicht, Profile, Bericht, Mobile, Prozess)
Picklisten-Dokumentation erweitert (Profile, Mobile Picking, Prozessdetails)
Tags-Dokumentation
Sortiernummer-Dokumentation
Flowkom Mobile Dokumentation (5 Seiten: Übersicht, Einrichtung, Bedienung, Einstellungen, Fehlerbehebung)
Erste Schritte Guide (Workspace einrichten, Benutzer anlegen, erste Bestellung)
Artikel und Lager Dokumentation (Produkte, Lagerplätze, Bestände, Systemlagerplätze)
Aufträge und Versand Dokumentation (Bestellungen, Picklisten, Versand, Retouren)
Daten-Hub Dokumentation (CSV Import/Export, Vorlagen, Feldreferenz)
Einstellungen Dokumentation (13 Seiten)
Integrationen Dokumentation (Shopify, Amazon)
Neue Seite 'Bestellvorschlag': Bedienung und Rechenweg verständlich erklärt, inkl. Retourenquote und Mindestbestellmengen.
Neue Seite 'Einstandspreis & FIFO': von der Beispielrechnung beim Wareneingang über Wechselkurse und Frachtverteilung bis FIFO-Bewertung und Festschreiben — komplette Referenz.
Amazon-Custom Personalisierung: neue Hilfeseite (Aktivieren, FBM-only, Anzeige im Auftrag, kein Cron noetig). Amazon Verkaeufer-Bestellnummer: Abschnitt zum Suchen der Nummer ergaenzt.
Shopify-Doku überarbeitet: kopierfertiger Rechte-Block (alle 10 exakten Scopes) für die eigene Shopify-App inkl. Erklärtabelle, neue Sektion „Produkt-Push (Flowkom → Shopify)“ mit Bildergalerie/Varianten-Bildern und „Bilder nachträglich übertragen“, plus Korrekturen (Re-Autorisierungs-Hinweis, kanal-scharfe Kundenbenachrichtigung).
Flowkom Webv1.105.003
v1.272.004Latest
  • Shopify „Bilder übertragen“: Bilder werden jetzt erst neu angelegt und die alten danach entfernt — bei einem kurzen Shopify-Fehler bleibt das Produkt bebildert statt bildlos (PROJ-643 QA-Fix)
v1.272.003
  • eBay: Bearbeiten einer laufenden Auktion behaelt jetzt korrekt das Auktionsformat (Update haette sonst ein Festpreis-Payload gesendet und waere von eBay abgelehnt worden)
v1.272.002
  • eBay: Eigene Mengen je Angebot/Variante (Auffuellmenge + Mindestmenge mit automatischem Auffuellen, Checkbox Restbestand abverkaufen, Ueberverkaufsschutz)
  • eBay: Auktionen im Lister (Laufzeit 1/3/5/7/10 Tage, Startpreis, optional Mindestpreis; genau eine Variante; manuelles Neu-Einstellen nach Auktionsende)
  • eBay: Out-of-Stock-Control wird jetzt echt im eBay-Konto geprueft und kann per Klick aktiviert werden (Menge 0 nur bei verifiziertem Status)
  • eBay: Bestands-Push schliesst Auktionen aus und reserviert je laufender Auktion eine Einheit
v1.270.0012026-07-15
  • eBay-Lister: ausverkaufte Angebote lassen sich wieder bearbeiten (Bestandspruefung gilt nur beim Ersteinstellen); Varianten-Veroeffentlichung fasst kein bestehendes Einzel-Angebot mehr an; Theme-Designer meldet unvollstaendige Logo-URLs frueh statt beim Speichern zu scheitern
v1.270.000
  • Kaufland W9 Belegabgleich (PROJ-642): Kaufland-seitige Erstattungen aus dem Bookings-Report automatisch verbuchen inkl. Billkom-Gutschrift (Voll + Teil), 3-facher Doppelbuchungs-Schutz
v1.269.0052026-07-15
  • PROJ-644: Fehler im Festschreibungs-Hinweis der PDF-Inventurliste behoben. Bei sehr großer Wareneingangs-Historie zeigte der Hinweis fälschlich „100 % nicht festgeschrieben“, weil die interne Datenbankabfrage an einer URL-Längengrenze scheiterte und still als „nicht festgeschrieben“ gewertet wurde. Die Abfrage wird jetzt in kleinere Blöcke aufgeteilt und meldet Fehler laut statt sie zu verschlucken.
v1.269.0042026-07-15
  • eBay-Lister: Sprach-Header auch auf Lese-Calls der eBay-Inventory-API (Angebots-Recovery/Lagerstandort) — behebt den verbliebenen Accept-Language-Fehler beim Veroeffentlichen
v1.269.0032026-07-15
  • eBay-Lister: verwaiste Angebote aus gescheiterten Veroeffentlichungs-Versuchen werden automatisch uebernommen und aktualisiert (statt 'Offer entity already exists'); ohne verfuegbaren Bestand erscheint vorab eine klare Meldung statt eines eBay-Fehlers
v1.269.0022026-07-15
  • eBay-Lister: Veroeffentlichen scheiterte mit eBay-Fehler 25709 (Accept-Language) — alle Lister-Calls senden jetzt die Sprach-Header Content-Language + Accept-Language de-DE (auch publish/withdraw)
v1.269.000
  • Shopify-Push überträgt jetzt die Produktbild-Galerie mit — Titelbild zuerst, bei Varianten-Produkten bekommt jede Variante automatisch das Bild ihres Kind-Artikels (PROJ-643)
  • Neue Aktion „Bilder übertragen“ auf der Shopify-Karte im Plattformen-Tab: ersetzt die Shopify-Produktbilder bereits gelisteter Artikel durch die aktuelle Flowkom-Galerie (PROJ-643)
  • Shopify-Push-Dialog zeigt vorab, welche Bilder mit übertragen werden (Thumbnail-Vorschau + Zähler, Hinweis bei Artikeln ohne Bilder) (PROJ-643)
v1.268.0012026-07-15
  • eBay-Lister: Veroeffentlichungs-Fehler zeigen jetzt die echte Ursache (eBay-Meldungen, abgelaufene Verbindung, Rate-Limit) statt einer generischen Meldung; fehlt der eBay-Lagerstandort, wird er automatisch mit der Adresse aus dem Firmenprofil angelegt
v1.268.0002026-07-15
  • eBay Theme-Designer: professionelle Angebotsvorlagen per Konfigurator (Layout, Farben, Schriften, Logo, eBay-Links) mit Live-Vorschau — statt HTML von Hand (PROJ-631 W9c)
  • eBay Themes: neue CSS-Bildergalerie mit klickbaren Thumbnails aus den Flowkom-Produktbildern ({{galerie}}-Platzhalter) (PROJ-631 W9c)
v1.267.001
  • Kaufland-Direktanbindung komplett (PROJ-642 W1-W8): Bestellimport, Versandbestätigung, Bestands-Push, Storno/Refund-Push (gated), Listings-Inventur + Zuordnung, Lister (EAN-Attach + Produktdaten-Anlage), Retouren + Tickets, Multi-Storefront DE/AT/CZ/SK/PL/FR/IT
  • Gemeinsame Produkttexte am Artikel (Bulletpoints + Marketing-Beschreibung) als Quelle für Kaufland/eBay/Otto/Shopify-Lister
  • Bestandsübertragung (Otto + Kaufland): Sperr- und inaktive Lagerplätze zählen nicht mehr als verfügbar
v1.261.0002026-07-15
  • eBay-Lister: MwSt-Satz je Angebot (Default 19 %) und optionaler Streichpreis werden an eBay übertragen (PROJ-631 W9b)
  • eBay-Lister: Kategorievorschläge zeigen den vollen Kategoriepfad + neuer Kategoriebaum-Browser zum Durchklicken (PROJ-631 W9b)
  • eBay-Lister: Fehlgeschlagenes Veröffentlichen zeigt jetzt eine vollständige Fehlerliste mit Sprung zum betroffenen Schritt (PROJ-631 W9b)
  • eBay-Lister: Lagerstandort-Schlüssel wird automatisch vorbelegt — kein kryptisches Pflichtfeld mehr (PROJ-631 W9b)
v1.260.0002026-07-15
  • eBay: Design-Themes für Angebotsbeschreibungen — Verwaltung mit Live-Vorschau in den Integrations-Einstellungen, Platzhalter (Titel/Beschreibung/Merkmale/Bilder) werden beim Veröffentlichen zu HTML gerendert (PROJ-631 W9)
  • eBay: Angebots-Vorlagen — im Lister als Vorlage speichern, Standard-Vorlage pro Integration wird bei neuen Angeboten automatisch angewandt, inkl. Preisregel VK + X % (PROJ-631 W9)
  • eBay: Theme auf bestehende Angebote anwenden — gedrosselter Bulk-Re-Render mit Tages-Limit-Schutz (PROJ-631 W9)
v1.259.007
  • eBay-Integrationsseite: Hinweis, dass Angebote direkt am Produkt erstellt werden (Produktdetail -> Plattformen -> eBay), statt des veralteten Platzhalters. Design-Vorlagen/Themes als kommende Ausbaustufe ausgewiesen.
v1.259.006
  • eBay-Listings-Sync: hängende „Abgleich läuft…"-Zombies heilen sich jetzt selbst (abgebrochener Lauf durch Deploy/Neustart wird als fehlgeschlagen erkannt statt ewig „läuft…" zu zeigen; Manual-Sync räumt Alt-Zombies vor dem Start auf).
v1.259.005
  • eBay-Listings-Sync: GetMyeBaySelling wird zur Bestandsquelle, wenn der eBay-Feed-Report leer bleibt (bestehende Angebote aus Web/Trading/magnalister erscheinen nicht im LMS-Report). Behebt "0 Angebote abgerufen" trotz aktiver eBay-Angebote.
v1.259.004
  • eBay-Lister: Freitext-Werte bei Merkmalen, eigene Merkmale hinzufügen, und Entwurf speichern (Formularstand geht beim Abbrechen nicht mehr verloren)
v1.259.003
  • eBay-Sync-Diagnose: bei 0 abgerufenen Angeboten zeigt die UI jetzt, ob eBay über die Angebotsliste sehr wohl Angebote meldet (Feed-Report leer) — macht die 0-Ursache eindeutig
v1.259.002
  • eBay Token-Refresh: kein scope mehr im Refresh-Request (behebt invalid_scope/‚exceeds granted‘, das nach der Taxonomy-Scope-Erweiterung Sync + Lister lahmlegte)
v1.259.001
  • eBay-Angebots-Sync: 1h-Drossel greift nur noch nach einem ERFOLGREICHEN Lauf — nach einem Fehlschlag kann sofort erneut synchronisiert werden
v1.259.000
  • Kaufland-Direktanbindung W0 (PROJ-642): Verkäuferkonto per API-Schlüssel verbinden (HMAC-signierte Seller-API), geführtes Onboarding, Marktplatz-Auswahl (DE/AT/CZ/SK/PL/FR/IT)
v1.258.003
  • eBay-Listings-Sync: Report-Download gzip-robust gemacht (Fehler ‚incorrect header check‘ behoben — Report wird jetzt egal ob gzip oder unkomprimiert gelesen)
v1.258.002
  • eBay-Lister: Kategorie-Suche + Artikelmerkmale — fehlenden Taxonomy-Scope ergänzt (erfordert Neu-Verbinden der Integration) + Fehler statt stiller ‚Keine Kategorie gefunden‘ anzeigen
v1.258.001
  • eBay-Listings-Sync: HTTP-406-Fehler beim Report-Download behoben (Binär-Download schickt Accept: Wildcard statt application/json) — Angebote werden jetzt tatsächlich abgerufen
v1.258.0002026-07-14
  • Otto-Lister: Titel-Attribute (Modellbezeichnung, Set-Typ, Set-Info, Besondere Merkmale) prominent im Formular + GPSR-Vorlagen mit Schnellauswahl (PROJ-641 W7)
  • Otto-Lister: Kategorie-/Marken-Auswahl scrollt jetzt mit dem Mausrad (PROJ-641 W7)
v1.257.002
  • eBay-Bestellimport: Inbetriebnahme-Checkliste + magnalister-Gate entfernt (schlichter Toggle wie Amazon/Shopify)
  • eBay-Listings-Sync: Ergebnis/Status/Fehler des letzten Abgleichs sichtbar (statt stiller 0) — macht diagnostizierbar, warum keine Angebote abgerufen werden
v1.257.000
  • PROJ-631 W8a: eBay-Lister Foundation — Produkte aus Flowkom als eBay-Angebote listen/aktualisieren/beenden (Inventory/Metadata/Account APIs, unsigniert). Mehrstufiger Lister-Dialog (Kategorie/Merkmale/Inhalt/Richtlinien), hartes Preflight, Varianten-Familien. Default-safe (kein Auto-Publish, reversibel via withdraw), Live-Gates am Brixkom-Piloten offen
v1.256.0002026-07-14
  • Otto-Integration (Abschluss 360-Grad-Serie): Otto-Badge in der Auftragsliste statt Manuell, Einzel-Bestand-Push im Plattformen-Tab, FreeScout-Link zum OTTO Partner Connect, Doku komplett (PROJ-641 W6)
v1.255.0002026-07-14
  • Otto-Lister komplett: alle Kategorie-Attribute (Gruppen, Empfehlungen, Mehrfachauswahl), Entwurf speichern + Jetzt listen, Versandprofil & Bearbeitungszeit (Artikel werden auf otto.de sichtbar), otto.de-Status live am Produkt, Preis-Push (PROJ-641 W5)
v1.254.000
  • PROJ-631 W7b: eBay Erstattungs-/Storno-Push an eBay (signierter Geldpfad, default AUS) — Push-Jobs-Zustandsmaschine mit at-most-once-Garantie, issueRefund + Verkäufer-Storno + Käufer-Storno approve/reject, Cron-Drain, Dead-Letter-UI
  • Alle 6 eBay-Crons im Einstellungen→Cron-Jobs-Tab sichtbar (eigene eBay-Kategorie, Health-Dot + letzter-Lauf-Anzeige)
  • Otto-Integration: kompletter Lebenszyklus — Storno wird an Otto gemeldet, Otto-Teil-Stornos und Adressänderungen erreichen offene Aufträge, Erstattungs-Belege (Storno-/Service-/Teilerstattungen) werden automatisch verbucht (PROJ-641 W4)
v1.253.0002026-07-13
  • Otto-Integration: Geldpfad gehärtet — Versandbestätigung idempotent (kein Doppel-POST mehr), Retouren-Annahme verbucht die Erstattung jetzt in Flowkom (Auftrag/Gutschrift/Profitbutler), Import-Cursor-Fix, Kunden-Dedupe-Schutz (PROJ-641 W3)
v1.252.0002026-07-13
  • Otto-Integration: UX-Unterseiten nach Haus-Muster — Artikelzuordnung und Retouren auf eigenen Unterseiten, Bestellvorschau als Dialog, Detailseite nur noch kompakte Karten (PROJ-641 W2)
v1.251.000
  • Otto-Lister: durchsuchbare Kategorie-Auswahl über den vollen Otto-Katalog (14.000+ Kategorien, gecacht), USt-Option 'Keine (Differenzbesteuerung)', Hersteller/Vertreiber-Auswahl beim Wirtschaftsakteur
  • Otto-Produktlister funktionsfähig: Kategorienauswahl war leer (falsches API-Feld), Publish hing dauerhaft auf 'Verarbeitung läuft' (Prozess-ID wurde nie gelesen), GPSR-Rollen verletzten Otto-Pflichtregel, Kategorien/Marken luden nur Seite 1
  • Otto-Karte im Plattformen-Tab zeigte 'Produkt nicht gefunden' (products.ean existiert nicht — heißt barcode); Query-Fehler werden nicht mehr als 404 maskiert
  • Otto-Ablehnungsgründe werden jetzt aus der echten API-Antwort extrahiert und angezeigt
v1.250.000
  • Otto: Cronjobs (Bestellimport/Versandbestaetigung/Bestands-Push) im Cron-Jobs-Tab registriert; Otto-Karte im Plattformen-Tab zeigt Fehler-/Getrennt-Zustaende ehrlich an statt sich still auszublenden
  • Otto-UX ganzheitlich: Plattformen-Tab im Stil der uebrigen Plattformen (Otto-Badge, Bei-Otto-listen-Zeile, Listing-Tabelle), Artikelzuordnung als paginierter Listings-Manager mit Suche/Sortierung/Mehrfachauswahl/Bulk-Zuordnung (Amazon-/eBay-Muster)
v1.249.001
  • PPC Butler: Auto-Sync-Hinweis mandantentauglich formuliert (automatisch stündlich statt Cron-Jargon)
v1.249.000
  • Otto: Retourenlabel automatisch beim Versand erzeugen — konfigurierbar pro Integration (Schalter + Retouren-Versanddienstleister, aktuell DHL; GLS/Hermes vorbereitet)
  • Otto-Produktlister: Artikel direkt aus Flowkom bei Otto listen (Kategorie/Marke/Pflicht-Attribute/Preis/USt/GPSR, asynchroner Publish-Status mit Ablehnungsgrund, Bestandssync-Schalter je Listing)
v1.248.001
  • eBay-Direktanbindung W7a (PROJ-631): Käufer-Stornoanfragen werden erkannt und angezeigt. Ein Hintergrund-Job liest offene Käufer-Stornoanträge bei eBay und zeigt sie direkt am betroffenen Auftrag an (plus Benachrichtigung) — Flowkom storniert oder erstattet dabei nichts automatisch. Pro Integration ein-/ausschaltbar (Standard AUS). Zusätzlich das technische Fundament für die kommende automatische Storno-/Erstattungs-Abwicklung (eBay-Digital-Signaturen, gegen eBays offiziellen Test-Vektor abgesichert).
v1.247.000
  • Otto-Marktplatz: Retouren direkt in Flowkom. Eingehende Ruecksendungen pruefen und annehmen (Otto erstattet daraufhin den Kunden) oder mit Grund ablehnen — inklusive Retour-Tracking und Link zum Flowkom-Auftrag. Kein Gang ins Otto-Portal mehr noetig.
v1.246.006
  • Otto-Marktplatz: Bestellquelle-Schalter (Magnalister/Direkt) entfernt — die Direktanbindung ist eigenstaendig; der Doppel-Import-Schutz laeuft automatisch im Hintergrund. Zudem drei Korrekturen: Bestandsuebertragung griff trotz aktiviertem Schalter nicht; Versandbestaetigung beruecksichtigt jetzt auch manuell versendete Bestellungen (z.B. Dropshipping); Retourenlabel mit nicht unterstuetztem Carrier wird sauber gemeldet statt falsch uebertragen.
v1.246.005
  • Otto-Marktplatz: ueberarbeitete Integrationsseite. Klarer Verbindungs-Status, gefuehrtes Einrichtungs-Onboarding und aufgeraeumte Bereiche (Bestellimport, Versandbestaetigung, Bestandsuebertragung, Artikelzuordnung) — auf dem Niveau der Amazon-/Shopify-Integration. Neue Hilfeseite.
v1.246.004
  • Manuelle Picklisten-Fixes PROJ-637 (Nachfuelllager-Fallback) + PROJ-638 (ausgebuchte Pickliste in Scanner-App) auf Status Deployed gesetzt; adversarialer QA-Pass ueber beide Diffs: 0 Defekte.
v1.246.003
  • Manuelle Pickliste (PROJ-638): Eine bereits ausgebuchte manuelle Pickliste (z. B. „FBA-Anlieferung") blieb in der Scanner-App faelschlich als „zu picken" sichtbar, wenn der Picker einzelne Positionen bewusst nicht gepickt hatte. Jetzt gilt: sobald eine manuelle Pickliste ueber „Ausbuchen & Abschliessen" ausgebucht ist, verschwindet sie aus der App — unabhaengig davon, ob alle Positionen gepickt wurden. Kein App-Update noetig, wirkt sofort nach dem naechsten Aktualisieren der Picklisten-Liste.
v1.246.002
  • Manuelle Pickliste (PROJ-637): Beim manuellen Erstellen einer Pickliste mit den Optionen „Wenn möglich Stückzahl von einem Lagerplatz picken" + „Nachfülllager einbeziehen" wurde ein Artikel unnötig über Picklager UND Nachfülllager verteilt, obwohl das Nachfülllager die Menge allein decken konnte. Jetzt gilt: Deckt das Picklager die benötigte Menge nicht vollständig ab, wird direkt komplett aus dem Nachfülllager gepickt — man muss nicht mehr aus zwei Lagerplätzen kommissionieren, wenn ein einzelner reicht. Reicht das Picklager (auch über mehrere Pick-Plätze), bleibt es weiterhin bevorzugt; das Sperrlager wird nie automatisch vorgezogen.
v1.246.001
  • eBay-Direktanbindung W6 (PROJ-631): automatische Versandbestätigung. Sobald eine übernommene eBay-Bestellung in Flowkom als versendet gilt, meldet ein Hintergrund-Job die Trackingnummer + den Versanddienstleister an eBay — der Käufer bekommt die eBay-native Versandbenachrichtigung. Der Versanddienstleister wird automatisch erkannt (DHL, DHL Express, Deutsche Post, DPD, GLS, Hermes) und lässt sich pro Versandart überschreiben, falls die Erkennung daneben liegt. Absicherungen: doppelte Bestätigungen sind ausgeschlossen (Flowkom prüft vor jeder Meldung den aktuellen Stand bei eBay), eine Bestellung ohne erkennbare Tracking-Daten wird erst gemeldet, sobald die Nummer vorliegt, und wiederholt scheiternde Bestätigungen erzeugen eine Fehler-Benachrichtigung. Pro Integration ein-/ausschaltbar (Standard AUS).
v1.245.000
  • Otto-Marktplatz: Grundlage fuer natives Produkt-Listing. Otto-Kategorien und -Marken sind jetzt abrufbar — das Fundament fuer den spaeteren Listing-Assistenten, mit dem Artikel direkt aus Flowkom bei Otto eingestellt werden.
v1.244.000
  • Otto-Marktplatz: Bestandsuebertragung (Lager -> Otto). Der verfuegbare Lagerbestand der zugeordneten Artikel wird an Otto uebertragen — Transit- und FBA-Bestaende ausgeschlossen, offene Reservierungen abgezogen. Standardmaessig aus; nur im Direkt-Modus.
v1.243.000
  • Otto-Marktplatz: Versandbestaetigung. Versendete Otto-Bestellungen werden mit Trackingnummer und Retourenlabel automatisch an Otto gemeldet. Standardmaessig aus; manuell oder automatisch pro Verbindung.
v1.242.000
  • eBay-Direktanbindung W5 (PROJ-631): automatischer Bestands-Push WMS → eBay. Sobald sich der verfügbare Bestand eines übernommenen Artikels ändert (Bestellung, Wareneingang, CSV-/JTL-Import, manueller Anstoß), überträgt Flowkom die neue Menge automatisch an das eBay-Angebot. Die verfügbare Menge = Lagerbestand minus offene Kommissionierungen (Bundles korrekt heruntergerechnet), niemals unter 0. Pro Angebot doppelt abzusichern (Schalter an der Integration UND am Listing); mit Tages-Änderungsbudget gegen das eBay-Limit von 250 Revisionen pro Angebot/Tag, einem Schutz gegen versehentliches Beenden eines Angebots bei Menge 0 (nur mit bestätigter eBay-Bestandsverwaltung) und einem täglichen Sicherheits-Abgleich. Externer Scheduler ruft den 5-Minuten-Push-Job auf.
v1.241.000
  • Otto-Marktplatz: Direkter Bestellimport. Otto-Bestellungen koennen jetzt direkt in Flowkom importiert werden — als Alternative zum Weg ueber Magnalister. Mit Doppel-Import-Schutz (keine Bestellung landet doppelt), korrekter Netto-/Brutto-/Steuer-Ermittlung und Storno-Erkennung. Standardmaessig aus; pro Otto-Verbindung aktivierbar.
v1.240.000
  • Otto-Marktplatz: Artikel manuell zuordnen. In der Otto-Integration laesst sich jeder Otto-Artikel manuell einem Flowkom-Artikel zuordnen (oder die Zuordnung loesen) — mit Filter "nur nicht zugeordnete" und Suche, fuer SKUs, die die automatische Zuordnung nicht trifft.
v1.239.001
  • Sprachauswahl aufgeräumt (PROJ-636): Die Sprache-Karte in den Konto-Einstellungen zeigt jetzt nur noch „Sprache“ + Beta-Badge + Dropdown (langer Erklärtext entfernt). Alle Sprachen — auch Türkisch — sind als Beta gekennzeichnet.
v1.239.000
  • Sprachauswahl als Dropdown + mehr Sprachen (Beta, PROJ-636): Die Sprachauswahl in den Konto-Einstellungen ist jetzt ein Dropdown mit Deutsch, English, Español, Français, Italiano, Nederlands und Türkçe. Vollständig übersetzt sind aktuell Deutsch und Türkisch; die übrigen Sprachen sind als „· in Arbeit“ markiert und erscheinen bis zur Fertigstellung überwiegend auf Deutsch (Beta-Hinweis in der Oberfläche).
v1.238.000
  • eBay-Direktanbindung W4 (PROJ-631): Listing-Adoption — bestehende aktive eBay-Festpreis-Angebote per Klick unter die neue Bestandsverwaltung (Inventory API) bringen. Voraussetzung für den späteren automatischen Bestands-Push. Mit Eligibility-Vorprüfung (nur Festpreis + aktiv + SKU auf Listing und jeder Variante) samt konkreter Fix-Anleitung bei Blockern, Aktivierung der eBay Business Policies, familienweiter Übernahme pro Angebot und mehrschichtigem Schutz gegen versehentliche Doppel-Übernahme (die Migration ist endgültig). Nicht übernommene Angebote erhalten noch keinen Bestands-Push (folgt).
v1.237.000
  • Produktverwaltung & Brainflow auf Türkisch (PROJ-634/635): Die komplette Produktverwaltung (Liste, Kanban, Tabelle, Filter, Detailseite, Anlegen/Bearbeiten, Varianten, Bundle) und das Brainflow-Notizmodul sind jetzt auf Türkisch verfügbar — umschaltbar pro User in den Konto-Einstellungen. Eingegebene Inhalte (Produkttitel, Notizen, Tags, SKU/EAN) bleiben unverändert. Weitere Module und Sprachen (z.B. Englisch) folgen schrittweise auf demselben Fundament. Hinweis: türkische Erstübersetzung, fachlicher Feinschliff folgt.
v1.236.000
  • Mehrsprachigkeit — Fundament (PROJ-634): Flowkom kann jetzt pro User in einer anderen Sprache angezeigt werden. Neuer Sprachumschalter in den Konto-Einstellungen (Deutsch/Türkçe), die Wahl gilt nur für dich und folgt dir über Geräte. Deutsch bleibt Standard — für bestehende Nutzer ändert sich nichts.
v1.235.000
  • Status & Notiz beim Produkt anlegen (PROJ-633): Im „Neues Produkt“-Popup lassen sich jetzt der Kanban-Status (Board-Spalte) und eine erste Notiz direkt setzen — statt sie nachträglich per Board-Drag bzw. Notizen-Tab zu ergänzen. Beim Anlegen ist die erste Board-Spalte vorausgewählt; das Status-Feld erscheint auch im Bearbeiten-Popup.
v1.234.010
  • eBay Adoption-UI (W4): Übernehmen-Aktion pro Zeile + Bulk (Inventory API), Eligibility-Badges pro Listing, Business-Policies-Opt-in-Banner, irreversibler Bestätigungs-Dialog
v1.234.001
  • eBay-Direktanbindung W3 (PROJ-631): Direkter Bestellimport — eBay-Bestellungen laufen jetzt direkt (ohne magnalister-Umweg) in Flowkom ein, mit automatischer Artikel-Zuordnung, Kunden-Dedupe, korrekter Steuer-/Rabatt-/Total-Übernahme, konfigurierbaren Filtern + Vorschau, nächtlichem Import-Cron + manuellem Import, und Doppel-Import-Schutz gegen dieselben eBay-Bestellungen, die parallel via Shopify laufen; Cutover-Checkliste (magnalister-Abgleich abschalten) in der eBay-Integration
v1.233.000
  • eBay-Direktanbindung W2 (PROJ-631): Angebots-Inventur — bestehende eBay-Angebote (auch magnalister-erstellte) werden read-only eingelesen, automatisch per SKU den Flowkom-Produkten zugeordnet und in einer Angebots-Verwaltung gepflegt; Fundament für Angebots-Übernahme + Bestands-Sync
v1.232.000
  • eBay-Direktanbindung W1 (PROJ-631): Produktbild-Galerie — mehrere Bilder pro Artikel mit Drag&Drop-Sortierung, Titelbild-Auswahl und clientseitiger Kompression; Fundament für den späteren eBay-Lister
v1.231.001
  • eBay-Direktanbindung W0 (PROJ-631): OAuth-Verbindung fürs eBay-Verkäuferkonto (Ein-Klick-Consent, verschlüsselter Refresh-Token, Re-Connect bei Ablauf), eBay-Integrations-Detailseite, Account-Löschungs-Endpoint (Pflicht für eBay-Production-Keys) und eBay-REST-Client-Fundament
  • eBay ist im Integrations-Dialog wählbar, sobald die Instanz ein eBay-Keyset trägt (env-gated)
v1.230.0022026-07-11
  • PROJ-630: Hilfe-Link auf der Bestandsbewertung — das Fragezeichen in der Kontrollzeile öffnet die neue Doku-Seite „Bestandsbewertung & Stichtag“ (Stichtag, Zulauf, Verlaufs-Chart, Vergleich, PDF-Inventurliste).
v1.230.0002026-07-11
  • PROJ-630: PDF-Inventurliste mit Festschreibungs-Hinweis. Die Bestandsbewertung lässt sich jetzt als druckbare PDF-Inventurliste exportieren — live oder zu jedem Stichtag (z. B. Monatsultimo für die Buchhaltung). Das PDF enthält den Summen-Block inklusive bezahltem Zulauf, alle Artikel mit Menge, Einstandspreis und Wert sowie einen Hinweis, welcher Anteil des Lagerwerts noch nicht durch kostenfestgeschriebene Bestellungen gedeckt ist (diese Kosten können sich rückwirkend ändern).
v1.229.0002026-07-11
  • PROJ-629: Zahlungsstatus-Verlauf an der Lieferantenbestellung. Im Verlauf-Tab der Bestellung gibt es jetzt eine zweite Sektion, die jede Änderung des Zahlungsstatus (bezahlt / anbezahlt / unbezahlt) mit Zeitpunkt und Nutzer zeigt — automatische Änderungen sind als solche markiert. Damit ist jederzeit nachvollziehbar, warum die Stichtags-Bestandsbewertung eine Bestellung zu einem Datum als bezahlt oder unbezahlt zählt.
v1.228.0012026-07-11
  • Nachfüllung: Mitarbeiter-Zuweisung in der Übersicht funktionierte nicht (Klick entfernte bestehende Zuweisungen) — repariert
  • Nachfüllung: Aktivieren/Deaktivieren eines Profils schaltete die Nachfüllbedarf-Benachrichtigung still ab — Einstellung bleibt jetzt erhalten
  • Nachfüllung mobil: nach fehlgeschlagenem Platzieren blieb der gescannte Ziel-Platz erhalten (Retry buchte sonst auf den Standard-Platz); Ziel-Platz lässt sich vor dem Platzieren neu scannen; Überspringen-Dialog behält den Grund bei Fehlern
  • Nachfüllung: Benachrichtigungs-Drossel gegen doppelte Meldungen bei überlappenden Prüfläufen gehärtet
v1.228.0002026-07-11
  • Nachfüllung: Nachfüllbedarf-Benachrichtigung — pro Profil aktivierbar (Default aus), prüft einmal täglich ab 7 Uhr und meldet Artikel unter dem Schwellenwert mit exakter Artikel-/Positions-Zahl
  • Nachfüllung: Überspringen mit optionalem Grund (mobil erfassbar, im Auftrags-Detail sichtbar)
  • Nachfüllung: Mitarbeiter-Zuweisung direkt in der Übersicht, Profil-Duplizieren, Vorschau im mobilen Erstellen-Dialog (Artikel/Positionen + Wagen-Check)
  • Nachfüllung Einzel-Modus (mobil): Ziel-Lagerplatz-Scan war unerreichbar — jetzt wie im Sammel-Modus Menge → Ziel scannen → platzieren
  • Nachfüllung mobil: echte Umlaute, Uhrzeit in der Auftragsliste, Storno-Dialog erklärt die automatische Rückbuchung
v1.227.0002026-07-11
  • PROJ-628: Stichtags-Vergleich. Neue aufklappbare Karte in der Bestandsbewertung: zwei Stichtage wählen (Schnellwahl über Ultimo-Chips, als Vergleichsseite geht auch die Live-Ansicht) und vergleichen — Lagerwert-, Einheiten- und Artikel-Deltas auf einen Blick plus die 50 größten Wert-Veränderungen pro Artikel, inklusive neu aufgebauter und komplett abgebauter Artikel. Beantwortet direkt Fragen wie „was hat sich im Juni verändert?“.
v1.226.0022026-07-11
  • Nachfüllung W2 (PROJ-627): Picklisten-Reservierungen werden respektiert — weder Erstellung noch Einsammeln/Einlagern buchen reservierten Bestand weg
  • Nachfüllung: Einlagerungs-Ziel muss im Lager des Auftrags liegen und aktiv sein; inaktive Plätze zählen nicht mehr als Quelle/Pick-Bestand
  • Nachfüllung: Vorschau zählt exakt die Positionen, die die Erstellung anlegt (eine gemeinsame Rechenlogik); Bundle-Bedarf fließt in die Komponenten
  • Nachfüllung: NF-Nummern numerisch fortlaufend (Duplikat-Falle ab NF-…-10000), Zuweisung wird beim Scannen nicht mehr überschrieben
  • Nachfüll-Profile: echtes Admin-Gate + FBA-/read-only-Läger sind als Profil-Lager gesperrt
v1.226.0002026-07-11
  • PROJ-626: Bestandswert-Verlauf. Neue aufklappbare Chart-Karte in der Bestandsbewertung zeigt den Lagerwert zu den letzten 12 Monatsultimos — Kapitalbindung als Trend statt Einzelwert. Ein Klick auf einen Datenpunkt springt direkt in die Stichtags-Ansicht dieses Ultimos. Der Verlauf wird erst beim Aufklappen berechnet (rückwirkend aus der Lagerbewegungs-Historie, kein Snapshot nötig).
v1.225.0002026-07-11
  • Nachfüllung W1 (PROJ-627): Storno/Überspringen buchen eingesammelte Ware transaktional vom Wagen auf den Quellplatz zurück (neue RPCs)
  • Nachfüllung: Einzel-Modus über Mobile-Web repariert (platziert direkt aus 'pending'; der frühere Sammel-Schritt scheiterte serverseitig)
  • Nachfüllung: Einlagern ist auf die eingesammelte Menge der Position gekappt (kein Wegbuchen fremden Wagen-Bestands); Teilmengen bleiben sichtbar
  • Nachfüllung: Tag-Filter/Bedarfs-/Bestandsabfragen paginiert + fehler-laut (vorher stille Caps ab ~400 Artikeln)
  • Nachfüllung: Schwellwert mindestens 1 (0 war funktionslos und zugleich Formular-Default)
  • Nachfüllung: Quellplatz-Scan akzeptiert den Lagerplatz-Barcode (umbenannte Plätze, PROJ-585)
v1.224.0002026-07-11
  • PROJ-625: Stichtag-Bedienung deutlich schneller. Im Stichtag-Kalender der Bestandsbewertung gibt es jetzt Schnellwahl-Chips (letzter und vorletzter Monatsultimo, letztes Quartalsende, 31.12. des Vorjahres) — ein Klick statt Kalender-Navigation. Der gewählte Stichtag steht außerdem in der URL: Ansichten lassen sich verlinken, neu laden und z.B. dem Steuerberater schicken. Und die Zulauf-Zeile ist jetzt aufklappbar und zeigt, welche Lieferantenbestellungen mit wie vielen Stück und welchem Wert im Zulauf stecken — in der Live-Ansicht genauso wie zu jedem Stichtag.
v1.223.0002026-07-11
  • PROJ-622: Zahlungserfassung für Lieferantenbestellungen pro Mandant einstellbar. Neuer Bereich Einstellungen → Allgemein → Einkauf: Modus Status-Tag (Zahlungsstatus wird wie bisher von Hand am Auftrag gesetzt; Einzelzahlungen sind gesperrt, damit die Automatik den gesetzten Status nie überschreibt) oder Modus Einzelzahlungen (Zahlungen mit Datum/Betrag erfassen, Status wird automatisch berechnet und ist nur noch lesbar). Die Migration erkennt automatisch, welche Mandanten bereits Einzelzahlungen nutzen. Zusätzlich wird jeder Wechsel des Zahlungsstatus jetzt mit Zeitstempel historisiert — der Stichtags-Zulauf der Bestandsbewertung rechnet damit künftig tagesgenau, auch wenn nur der Status-Tag gepflegt wird (bezahlt → wieder unbezahlt wird zum jeweiligen Stichtag korrekt abgebildet).
v1.222.0002026-07-11
  • PROJ-621: Daten-Hub — Import und Export laufen jetzt als Hintergrund-Jobs mit Fortschrittsanzeige („12.000 von 48.000 Zeilen“): große Dateien brechen nicht mehr mit „Bad Gateway“ ab, der Status ist jederzeit in der Job-Historie sichtbar, hängengebliebene Jobs werden ehrlich als fehlgeschlagen markiert.
  • PROJ-621: Daten-Hub — Kundenstamm ist jetzt importier- und exportierbar (inkl. Rechnungs-/Lieferadresse, USt-IdNr.; deutsche ERP-Spaltennamen werden automatisch zugeordnet); die Kundenverwaltung hat eigene Import-/Export-Buttons.
  • PROJ-621: Daten-Hub — Excel-Dateien (.xlsx/.xls) können direkt importiert werden, ohne Umweg über CSV.
  • PROJ-621: Daten-Hub — Importe lassen sich pro Job rückgängig machen: neu angelegte Zeilen werden gelöscht, bereits verwendete Zeilen (z.B. Artikel mit Bestand) bleiben geschützt und werden gemeldet.
  • PROJ-621: Daten-Hub — Onboarding-Checkliste „Erste Schritte“ führt neue Mandanten in der richtigen Reihenfolge durch den Erstimport (Artikel → Lagerplätze → Bestände → Lieferanten → Kunden).
  • PROJ-624: Die „Nachfüllung“ lässt sich pro Mandant ein- und ausschalten (Einstellungen → Lager & Versand → Nachfüll-Profile). Standardmäßig aus; wer bereits Nachfüll-Profile angelegt hat, behält den Menüpunkt. Angelegte Profile bleiben beim Ausschalten erhalten.
  • PROJ-621: Daten-Hub — QA-Härtung: Import-Rollback ist auf Stammdaten beschränkt (Aufträge sind ausgenommen, deren Löschung bleibt dem geprüften Lösch-Flow der Auftragsverwaltung vorbehalten).
  • Hilfe-Links: vier Links in die Dokumentation führten auf nicht existierende Seiten (Umlaut-Pfade) — korrigiert; die fehlende 2FA-Hilfeseite wurde in der Dokumentation ergänzt.
  • PROJ-621: Daten-Hub — bei Fehlern lassen sich überall nur die kaputten Zeilen als CSV herunterladen (fixen, nur diese erneut hochladen); der Zeichensatz wird angezeigt und ist manuell umstellbar; das Spalten-Mapping zeigt Beispielwerte; nach einem gelungenen Import wird angeboten, das Mapping als Vorlage zu speichern.
v1.221.0082026-07-11
  • PROJ-623: Die Breadcrumb oben zeigt jetzt in allen Bereichen die volle Struktur (z. B. „Dashboard → Billkom“ statt nur „Dashboard“); neue Module tauchen automatisch auf, statt still verschluckt zu werden.
v1.220.0002026-07-10
  • PROJ-620: Stichtags-Zulauf zeigt jetzt auch Bestellungen, deren Bezahlung nur über den Status-Tag gepflegt ist. Das tagesgenaue Bezahlt-Gate aus dem Stichtags-Zulauf prüfte gegen das Zahlungs-Ledger — das in der Praxis leer ist (es wird nur bezahlt/anbezahlt/unbezahlt am Auftrag gesetzt), wodurch der Zulauf zum Stichtag immer leer blieb. Neu: Hat eine Bestellung erfasste Zahlungen, bleibt die Rechnung tagesgenau; hat sie keine, entscheidet der heutige Bezahlt-Status.
v1.219.0022026-07-10
  • Workflows: Klartext-Zusammenfassung nennt jetzt auch deaktivierte (aber referenzierte) Versandarten beim Namen statt „…"
v1.219.0002026-07-10
  • Workflows: Zeiteingabe in deiner Zeitzone — Uhrzeiten werden lokal eingegeben und angezeigt (UTC-Umrechnung inkl. Wochentagen passiert automatisch)
  • Workflows: Duplizieren per Klick (Kopie startet deaktiviert) und drei Starter-Vorlagen (Versand-Abschluss, Rechnung nach Versand, Unbezahlt-Meldung)
v1.218.0002026-07-10
  • PROJ-619: Stichtags-Zulauf in der Bestandsbewertung. Die Stichtags-Bestandsbewertung zeigt jetzt auch die zum Stichtag voll bezahlte, noch nicht eingetroffene Ware aus Lieferantenbestellungen — als eigene Zulauf-Zeile plus Gesamt inkl. Zulauf, exakt wie in der Live-Ansicht. Rekonstruiert wird tagesgenau aus der Bestellstatus-Historie, dem Zahlungs-Ledger (Zahlungsdatum bis zum Stichtag, währungsbewusst) und den Wareneingangs-Zeitpunkten; Preise und Kurse fließen mit heutigem Stand ein. Fällt die Zulauf-Berechnung aus, bleibt die restliche Stichtagsbewertung unberührt.
v1.217.0002026-07-10
  • Workflows: Klartext-Zusammenfassung — jeder Workflow erklärt sich als deutscher Satz („Wenn …, dann …"), live im Editor und als Untertitel in der Workflow-Liste
  • Workflows: Editor mit klarer WANN→WENN→DANN-Gliederung und gruppiertem, durchsuchbarem Feld-Dropdown mit Einheiten (EUR/g/Tage)
v1.216.0002026-07-10
  • Workflows: neuer Trigger „Bei Statuswechsel" — Workflows laufen automatisch, sobald ein Auftrag auf einen gewählten Status wechselt (z.B. versendet → Folgeaktionen), statt auf den nächtlichen Zeitplan zu warten; Verarbeitung i.d.R. binnen 15 Minuten
v1.215.0002026-07-10
  • Workflows: Dry-Run-Vorschau im Editor — „Treffer ermitteln" zeigt, wie viele Aufträge der Workflow AKTUELL treffen würde (inkl. Beispiel-Auftragsnummern), ohne irgendetwas zu ändern; funktioniert auch für ungespeicherte Änderungen
  • Workflows: „Auftrag testen" — Auftragsnummer eingeben und pro Bedingung sehen, warum ein Auftrag (nicht) getroffen wird, inkl. Hinweis wenn der Status außerhalb des gewählten Bereichs liegt
v1.214.0012026-07-10
  • Workflows: neue Bedingung „Bestelldatum ÄLTER ALS X Tage" — z.B. für Erinnerungs- oder Aufräum-Workflows auf liegengebliebene Aufträge
  • Workflows: neue Aktion „Benachrichtigung senden" — erzeugt pro Lauf eine Meldung in der Glocke mit der Anzahl getroffener Aufträge (aktualisiert sich statt zu spammen)
v1.213.0022026-07-10
  • Print Agent: Kopplungscode zeigt die WMS-Domain statt Server-Interna (z.B. web.flowkom.de-483921); die Verbindung wird beim Koppeln automatisch ermittelt (neue Route /api/print/broker-info)
v1.213.0012026-07-10
  • Workflows: Fehlschlag-Benachrichtigungen — scheiterte ein zeitgesteuerter Workflow (inkl. Timeout/Claim-Fehler), erscheint eine workspace-weite Fehler-Meldung; der nächste Erfolgslauf (auch manuell) quittiert sie automatisch
  • Workflows: Due-Check-Catch-up — ein verpasster Scheduler-Tick holt den Tageslauf jetzt nach (überfällig seit letztem Soll-Termin statt ±15-Minuten-Fenster); neue/aktivierte Workflows starten erst mit ihrem nächsten Termin
  • Workflows: Cron-Status partial statt error bei Einzel-Workflow-Fehlern (kein Doppel-Alarm; cron_last_execution-CHECK erweitert)
  • Workflows: Zeitplan feuerte bisher bis zu 15 Minuten VOR dem konfigurierten Termin — jetzt nie vor dem Termin
v1.212.0032026-07-10
  • Bestandssync: Artikel-Zuordnungen werden nur noch entkoppelt, wenn die Shopify-Variante nachweislich gelöscht ist (Positiv-Probe) — generische 404-Antworten bei Location-Problemen können keine Zuordnungen mehr kappen
v1.212.002
  • Workstation-Verbindungs-Badge zeigte fälschlich „Offline“ trotz aktivem Print-Agent (Schwellen-Konflikt: Badge verlangte Heartbeat < 30 s, Server schreibt aber nur alle 180 s) — Schwelle auf 4 Min angeglichen (PROJ-616)
v1.212.0002026-07-10
  • PROJ-614: Stichtags-Bestandsbewertung. Die Profitbutler-Bestandsbewertung kann den Warenbestandswert jetzt zu einem beliebigen vergangenen Stichtag anzeigen (z.B. 31.05.2026) — rekonstruiert aus dem Lagerbewegungs-Ledger, ohne Snapshot-System. Neuer Stichtag-Datepicker auf der Bestandsbewertungs-Seite (leer = Live wie bisher), gleiche Ansicht mit Gesamtwert, Artikel-Liste und Lager-Aufschlüsselung zum Stichtag, Hinweis-Banner erklärt die Kostenbasis (heutiger Wissensstand, FIFO-Schichten historisch exakt). Zulauf- und Absatz-Kennzahlen bleiben der Live-Ansicht vorbehalten; CSV-Export trägt den Stichtag im Dateinamen. Technisch: neue SECURITY-DEFINER-RPC stock_quantities_at_date (workspace-gesichert, DST-sichere Berlin-Tagesgrenze), Bewertungs-Engine aus der API-Route extrahiert — Live- und Stichtag-Pfad teilen exakt dieselbe FIFO+Kaskaden-Logik.
v1.211.0032026-07-10
  • Bestandssync: Mehrere Lager auf derselben Shopify-Location werden jetzt summiert (ein set-Call pro Produkt und Location) — vorher überschrieb das zuletzt gepushte Lager den Bestand der übrigen (Vorfall 09.07.: leeres Zweitlager nullte alle Shopify-Bestände)
  • Bestandssync: Ein 404 wegen deaktivierter Shopify-Location entkoppelt keine Artikel-Zuordnungen mehr (vorher wurden Mappings fälschlich als 'im Shop gelöscht' markiert)
v1.210.000
  • PROJ-613: Daten-Hub — Import-Vorlagen funktionieren jetzt end-to-end: gespeicherte Vorlagen erscheinen im Import-Assistenten, und „Verwenden“ in der Vorlagen-Liste öffnet den Assistenten mit vorgewählter Tabelle und wendet die Vorlage nach dem CSV-Upload automatisch an.
  • PROJ-611: Workflows — Intervall-Trigger nutzbar (alle 15–720 Minuten); die Option war wählbar, wurde beim Speichern aber immer abgelehnt.
  • PROJ-611: Workflows — Verlaufs-Dialoge zeigen übersprungene Aufträge mit Begründung, 'Jetzt ausführen' verlinkt direkt zu den Details, Dark Mode im gesamten Modul.
  • PROJ-613: Daten-Hub Export — große Exporte (über 10.000 Zeilen) werden nicht mehr still abgeschnitten; CSVs enthalten jetzt alle Zeilen und öffnen in Excel mit korrekten Umlauten (UTF-8-BOM).
  • PROJ-613: Daten-Hub Import — CSV-Dateien aus JTL/Wawi/Excel (ANSI/Windows-1252) werden korrekt erkannt (keine zerstörten Umlaute mehr), deutsche/englische Zahlenformate (1.234,56 / 1,234.56) werden richtig geparst, und der Lagerplatz-Import prüft das Ziel-Lager gegen den eigenen Workspace (Sicherheits-Fix).
  • PROJ-613: Daten-Hub — der generische „Lagerbestände“-Import (scheiterte immer und umging die Bestandsbuchung) wurde entfernt; die Bestandsseite nutzt jetzt den korrekten Pfad „Lagerbestand — Initialbefüllung“.
  • PROJ-611: Workflow-Engine — Statuswechsel-Aktionen können einen während des Laufs versendeten Auftrag nicht mehr überschreiben; 'Versendet'-Übergänge setzen jetzt das Versanddatum.
  • PROJ-611: Workflow-Bedingungen 'Auftragswert' und 'Gesamtgewicht' greifen jetzt wie beschriftet (EUR bzw. Gramm) — vorher wurde gegen Cent bzw. Kilogramm verglichen, die Regeln matchten faktisch nie.
  • PROJ-611: Automatische Rechnung bei Versand — der Auslöser war seit jeher wirkungslos (falscher Ereignis-Schlüssel); Kanäle mit aktivierter Auto-Rechnung erhalten Belege jetzt direkt beim Versand statt erst über den 18:00-Fallback.
  • PROJ-611: Workflows liefen bei Überlappung doppelt — jetzt echter Lauf-Lock mit Meldung 'Workflow läuft bereits'; ein transienter Datenbankfehler kann nicht mehr alle aktiven Workflows deaktivieren.
  • PROJ-611: Nächtliche Bereinigung der Workflow-Historie schlug ab einer bestimmten Datenmenge still fehl (löschte nichts); abgearbeitete Billkom-Queue-Jobs werden nach 30 Tagen entfernt.
  • PROJ-611: Workflow-Verwaltung — Drag-&-Drop-Reihenfolge sprang zurück, Aktiv-Schalter erklärt Sperrgrund, Uhrzeiten als UTC gekennzeichnet inkl. Live-Umrechnung.
  • PROJ-613: Daten-Hub — robustere Duplikat- und Referenz-Prüfung bei großen Importen (kein stilles Verschlucken von Fehlern mehr).
  • PROJ-611: Workflows-Modul komplett saniert — Engine-Härtung (Locking, Einheiten, Scan-Vorfilter für Tag-/Kanal-Bedingungen), typscharfe Validierung, echte Admin-Gates, Performance-Indizes.
v1.209.006
  • PROJ-612: Auftragssuche — QA-Feinschliff: Verkaeufer-Bestellnummer-Suche im Rollback-Modus gegen URL-Limit abgesichert; Hilfe-Link am Personalisierungs-Schalter ergaenzt.
v1.209.005
  • PROJ-612: Auftragssuche/Anzeige — Robustheits-Nachtrag: die Suche im Notfall-Rollback-Modus lief in einen Fehler und ist wieder stabil; zudem wird eine manuell eingetragene Verkäufer-Bestellnummer nicht mehr durch ein spätes Nachladen überschrieben.
v1.209.002
  • PROJ-612: Amazon Verkäufer-Bestellnummer (SellerOrderId) — zwei Folge-Bugfixes zu PROJ-609. (A) Im Auftragsdetail wurde die Verkäufer-Bestellnummer beim Öffnen über die Kundenauftrags-Liste erst nach einem Neuladen der Seite angezeigt — jetzt erscheint sie sofort. (B) Die Suche nach der Verkäufer-Bestellnummer (Bereich Überall bzw. Auftrag/Kunde) fand nichts — die Nummer ist jetzt suchbar.
v1.209.000
  • PROJ-610: Amazon-Custom Personalisierung beim FBM-Import abholen (Gravur-Text/Font/Farbe je Oberfläche) — Anzeige nur im Kundenauftrag-Detail, opt-in Toggle (Default AUS), FBM-only. Neue Tabelle order_line_item_customizations + privater Bucket, SSRF-sicherer ZIP-Download, Reconcile-Cron gegen URL-TTL.
v1.208.004
  • PROJ-609: Verkäufer-Bestellnummer-Sync ist jetzt ein eigenständiger Cronjob (Piggyback zurückgenommen) — im Cron-Jobs-Tab gelistet und vom Betreiber selbst im externen Scheduler zu planen (empfohlen stündlich) bzw. per „Ausführen“ manuell startbar.
v1.208.003
  • PROJ-609: Verkäufer-Bestellnummer-Pull läuft jetzt automatisch — huckepack am „Amazon Bestellstatus-Sync“-Cron (self-gedrosselt ~1×/Stunde, gleiches Muster wie der Finanzereignisse-Reconcile). Es ist KEIN eigener Eintrag im externen Scheduler mehr nötig; der Job bleibt in der Cron-Jobs-Übersicht sichtbar und per „Ausführen“ manuell startbar. „An Amazon senden“ (Push) ist davon unberührt.
v1.208.002
  • PROJ-609: Verkäufer-Bestellnummer-Sync (Pull) in der Cron-Jobs-Übersicht sichtbar gemacht — der Cron `amazon-seller-order-sync` war als Endpoint registriert, fehlte aber in der Job-Liste der Einstellungen → jetzt in der Amazon-Gruppe sichtbar + per „Ausführen“ manuell startbar (empfohlener Takt stündlich).
v1.208.000
  • PROJ-609: Amazon Verkäufer-Bestellnummer (SellerOrderId) — pro Amazon-Integration ein Modus (Aus/Von Amazon holen/An Amazon senden). Pull-Cron liest die von Amazon vergebene Verkäufer-Bestellnummer per getOrder (ohne RDT) in ein neues Auftragsfeld; Push überträgt eine im Auftrag gesetzte Flowkom-Nummer per OrderAcknowledgement-Feed (MerchantOrderID) an Amazon (nur FBM). Neues Feld orders.amazon_seller_order_number (+ Herkunft manuell/amazon) mit Inline-Edit im Auftragsdetail, Verlaufs-Eintrag und RadioGroup in der Integrations-Einstellung. Fehler 18025 (bereits bestätigt) wird still übersprungen, nicht als Fehler gemeldet.
v1.207.026
  • PROJ-607 Kanal-scharfe Kundenbenachrichtigung (QA-Folge zu PROJ-605): Rest-Leak fuer Shopify-Alt-Auftraege vor Maerz 2026 (sales_channel=NULL wurde als Webshop behandelt) per einmaligem Backfill aus den Bestell-Tags geschlossen; Fail-safe bei mehreren gleichnamigen Kanal-Regeln (nur senden, wenn ALLE erlauben); UI-Guard fuer manuell 'Webshop' benannte Regeln.
v1.207.024
  • PROJ-605 Kanal-scharfe Kundenbenachrichtigung (Shopify): Ein 'Kundenbenachrichtigung'-Schalter pro Verkaufskanal steuert, ob Shopify die Versand-/Erstattungs-/Retouren-Mail an den Kunden schickt. Marktplaetze (Otto/Kaufland/eBay) sind per Default stumm — behebt die Otto-Anlage-9-Beschwerde (automatische Mails an verschluesselte Relay-Adressen). Webshop-Kunden bekommen weiter ihre Bestaetigungen.
v1.207.013
  • PROJ-603 QA-Nachtrag: Orchestrator-Test schließt die Drift-Lücke (Revert des Anreicherungs-Aufrufs wird jetzt rot); Status Deployed.
v1.207.012
  • Manuelle Pickliste ausbuchen: Crash »violates check constraint picklist_items_check_quantity_required« bei Positionen mit 0 gepickten Einheiten behoben (die Ausbuchung rollte komplett zurück, nichts wurde ausgebucht) + manuelle Picklisten ziehen Bestand jetzt zuerst vom Picklager statt vom Nachfüllplatz (PROJ-604).
v1.207.011
  • Sellerboard-Sub-Tab im Produktdetail zeigte für jeden Artikel „EK fehlt · FIFO —“, obwohl der EK in Sellerboard hinterlegt war (PROJ-603) — EK-Anreicherung in gemeinsame Lib gezogen, beide Read-Pfade nutzen sie.
v1.207.010
  • PROJ-602: FreeScout-KI-Endpoint nutzt max_completion_tokens statt max_tokens (gpt-5.4-mini lehnte max_tokens mit HTTP 400 ab → Connected-Modus-Entwürfe schlugen fehl)
v1.207.0092026-07-08
  • freescout-ai-assist v0.1.0 veröffentlicht — kostenloses, öffentliches FreeScout-KI-Modul (MIT, Repo erorplex/freescout-ai-assist): standalone KI-Antwortentwürfe mit eigenem Schlüssel (BYOK, Claude/OpenAI) plus optionale Erdung über den Flowkom-Endpoint (PROJ-600). Auto-Update in die FreeScout-Instanzen der Nutzer verdrahtet. Feature-Status PROJ-600 (Provider) + PROJ-601 (Modul) auf Deployed gesetzt.
v1.207.0082026-07-08
  • FreeScout→KI Kontext-Provider (/api/freescout/ai-draft): erdet KI-Antwortentwürfe im Helpdesk mit einem PII-minimierten Fakten-Sheet + Brainflow-SOPs über den eigenen LLM-Schlüssel des Mandanten (BYOK). Standard AUS, strikt isoliert — rohe Handelsdaten und der Schlüssel verlassen Flowkom nie.
v1.207.0032026-07-08
  • FreeScout-Modul-Links (Brainflow-Import + „In Flowkom öffnen“) zeigten auf der Kundeninstanz auf die falsche Flowkom-Instanz — die Basis-URL wird jetzt aus dem Request abgeleitet (X-Forwarded-Host) und stimmt automatisch pro Instanz.
v1.207.0022026-07-08
  • Dashboard-Personalisierung: Reihenfolge/Groesse/Einstellungen von aktuell ausgeblendeten Widgets (z. B. Brainflow bei deaktiviertem Modul) gehen beim Speichern nicht mehr verloren.
  • Brainflow-Widget zaehlt "zuletzt bearbeitet" auch in aktiven/eingeschraenkten Workspaces korrekt.
  • Escape im Dashboard-Bearbeiten-Modus schliesst nur das offene Dialogfeld, verwirft nicht mehr die ganzen ungespeicherten Aenderungen.
  • "Braucht Aufmerksamkeit"-Kachel zeigt bei einem Ladefehler jetzt eine Fehlermeldung statt faelschlich "Alles ruhig".
  • Produkte-Kachel: Einzelartikel-Zahl bei Artikeln mit mehreren Typ-Kennzeichen korrigiert.
v1.207.0002026-07-08
  • Dashboard-Widgets zeigen jetzt echte Informationsdichte je Kachelgroesse (Mini/Standard/Breit/XXL) statt nur zu skalieren — jedes Widget rendert pro Groesse den sinnvollen Inhalt (Mini = eine Kennzahl, Breit = Aufschluesselung/Sparkline, XXL = Tabelle/GuV/Verlauf).
  • Kachelgroesse per bewusstem Dropdown-Picker waehlen (statt Blind-Klick-Wechsel).
  • Dezente (i)-Info-Einblendung bei erklaerungsbeduerftigen Kacheln.
  • Neues konfigurierbares Brainflow-Widget: Zuletzt bearbeitet, Suche, Aufgaben aus einer Sammlung und Schnell-Notiz — pro Nutzer im Bearbeiten-Modus einrichtbar.
  • Versandkosten-Kachel entfernt (zeigte kalkulierte Soll-Tarife, bei FBA ueberzeichnet; steht bereits in der Profitbutler-Kanal-GuV).
v1.206.0002026-07-08
  • Dashboard personalisierbar: eigene Abschnitte mit Ueberschriften anlegen, ein-/ausklappen und alles frei sortieren.
  • Dashboard-Kacheln in vier Groessen (Mini/Standard/Breit/XXL) — unwichtigere Infos kompakt statt fett.
  • Profitbutler als einzelne KPI-Kacheln (Umsatz/Gewinn/Marge) aufs Dashboard nehmbar, zusaetzlich zur grossen Uebersicht.
  • Dashboard-'Anpassen' ist jetzt ein dezenter Stift.
v1.205.0042026-07-08
  • Kundenauftrags- und Kundenverwaltungs-Suche: Mehrwort-Namenssuche (z.B. 'Philipp Ziegler') lieferte alle Treffer des ersten Wortes statt der echten Kombination — der gesuchte Kunde landete auf Seite 2. Ursache: der bool_and ueber die Namensfelder ignorierte NULL-Werte (99,9 % der Kunden ohne Firmenfeld), wodurch das Mehrwort-UND still zu ODER kollabierte. Fix: NULL-sichere COALESCE-Vergleiche in search_orders + search_customers; live gegen Produktion verifiziert (418 -> 2 Treffer, Einzelwortsuche unveraendert).
v1.205.0032026-07-08
  • Dashboard: 'Gestern'-Zeitraum ueberall (Profitbutler-Cockpit + 'Heute versendet'-Popup).
  • Dashboard: Profitbutler-Kacheln (Umsatz/Gewinn/Marge) per Klick mit Vorwochen-/Vormonatsvergleich (Umsatz + Bestellungen).
  • Dashboard-Widget 'Sellerboard' zeigte dauerhaft 'Keine Sellerboard-Daten' trotz vorhandener Daten — behoben.
  • Dashboard-Widget 'Integrationen' zeigt jetzt aktive Verbindungen getrennt von angebundenen (vorher wurden alle als 'aktiv' gezaehlt).
v1.205.000
  • FreeScout-Brainflow-Import: interne Ticket-Notizen optional mitnehmen (Toggle im FreeScout-Modul)
  • Dashboard-Personalisierung: Widgets ein/aus, Reihenfolge per Drag & Drop, Größe normal/breit, Inline-Bearbeiten-Modus + Widget-Katalog (PROJ-589)
v1.204.003
  • Dashboard „Heute versendet“/Drill-down: FBA-Sendungen werden jetzt korrekt gezählt (echte ~13.000/Monat statt fälschlich 163) (PROJ-591)
v1.204.002
  • Brainflow-Editor: Dark Mode jetzt korrekt – der Editor-Inhalt bleibt nicht mehr weiß im dunklen Modus (PROJ-592)
v1.204.000
  • FreeScout-Import: Zielseite wird automatisch zur Brainflow-Sammlung mit konfigurierbaren Ticket-Spalten (Ticket-Link, Nr, Kunde, Postfach, Kanal, Datum)
v1.203.000
  • FreeScout-Brainflow-Import (PROJ-588): E-Mails/Tickets aus FreeScout mit einem Klick als Brainflow-Seite in Flowkom sichern — die Seite gehört dem eingeloggten Nutzer, öffnet sich im neuen Tab; ein-/ausschaltbar und nur nutzbar, wenn Brainflow im Workspace aktiv ist
v1.202.0002026-07-07
  • Dashboard-Detailansichten: Klick auf die Kachel Heute versendet zeigt die Aufschluesselung nach FBM/FBA, Versandart und Lager (mit Zeitraum-Umschalter); Klick auf Offene Auftraege zeigt Alter und Verkaufskanal. Neue Braucht-Aufmerksamkeit-Zeile mit Direktspruengen (Versandfehler, Ueberverkaeufe, unbezahlt seit ueber 3 Tagen, offene Picklisten, ASIN-Konflikte) erscheint nur, wenn es etwas zu tun gibt (PROJ-587)
v1.201.0002026-07-07
  • Dark Mode fuer die gesamte App: umschaltbar zwischen Hell, Dunkel und System (oben rechts neben der Glocke sowie in Einstellungen -> Konto). Standard bleibt Hell; die Wahl gilt pro Nutzer und wird auf allen Geraeten uebernommen. Kuratierte dunkle Optik mit guter Lesbarkeit, alle Flaechen durchgaengig unterstuetzt (PROJ-586)
v1.200.0012026-07-07
  • Batch-Nachfüllung nutzt nur noch einen aktiven Nachfüllwagen und meldet einen klaren Fehler statt einen kaputten Auftrag anzulegen, wenn der Wagen deaktiviert wurde (QA-Nachtrag zu PROJ-585).
v1.200.0002026-07-07
  • System-Lagerplätze (Wareneingangsplatz, Nachfüllwagen, Sperrlagerplatz, FBA-POOL) sind jetzt umbenennbar und deaktivierbar: bei mehreren Lagern tragen sie automatisch den Lagernamen als Zusatz (z.B. "Wareneingangsplatz (Westheim)") und lassen sich über das Zeilen-Menü umbenennen; Deaktivieren ist nur bei leerem Platz möglich, hartes Löschen bleibt gesperrt. Barcode und Funktion bleiben dabei stabil — gedruckte Etiketten und die Bestandslogik sind vom Umbenennen nicht betroffen (PROJ-585).
v1.199.0002026-07-07
  • Dashboard: Die Profitbutler-Kacheln (Umsatz/Gewinn/Marge) zeigen jetzt echte Zahlen aus dem Profitbutler-Modul statt einer festen Pauschale — Netto-Umsatz, echter Gewinn nach Wareneinsatz/Gebühren/Werbung/Versand/Fixkosten und eine variable Marge. Neu: Zeitraum-Umschalter (Heute/Diese Woche/Dieser Monat/Vormonat), Trend gegen die Vorperiode, Ist/Schätzung-Kennzeichnung und eine aufklappbare Gewinn-Aufschlüsselung mit Kanal-Split (PROJ-584)
v1.198.0042026-07-07
  • Lieferantenbestellungen → Zahlungen: der Geldpfad heilt jetzt einen zwischenzeitlich veralteten Zahlungsstatus auch beim idempotenten Wiederholen und beim Löschen; die Oberfläche zeigt bei einem hinterlegten (aber nicht bestätigten) Statuspull eine Warnung statt eines harten Fehlers — verhindert eine doppelt erfasste Zahlung beim erneuten Speichern (PROJ-583)
v1.198.0022026-07-07
  • Kundenaufträge: der Überverkäufe-Filter (offene Aufträge, deren Positionen der verfügbare Bestand nicht deckt) ist jetzt auch als Schalter im Filter-Menü verfügbar — nicht mehr nur über die Dashboard-Kachel (PROJ-582)
v1.198.0002026-07-07
  • Lieferantenbestellungen: neuer Schalter „Festgeschriebene ausblenden" (standardmäßig an) blendet abgewickelte Bestellungen aus Liste, Kanban und den Zählern aus, damit die Übersicht schlank bleibt (PROJ-581)
  • LB-Detail: die doppelte „Positionen"-Tab entfernt — die Positionen stehen bereits auf dem „Details"-Tab (PROJ-581)
v1.197.0032026-07-07
  • Produkte: QA-Nachlese — Typloch im Vollständigkeits-Speicherpfad geschlossen, veralteter Tab-Kommentar entfernt, Tab-Trenner umbruch-sicher (PROJ-578)
v1.197.0022026-07-07
  • Überverkäufe-Kachel: Klick filtert die Auftragsliste jetzt zuverlässig (Deep-Link-Sync beim Client-Navigieren, PROJ-580 QA)
  • Lieferschein-Autodruck wirkt jetzt auch im Stapeldruck (Profil-Schalter wurde im Batch-Pfad nicht durchgereicht, PROJ-580 QA)
v1.197.0012026-07-07
  • Lieferschein automatisch drucken: neuer Schalter im Picklisten-Profil — beim Versand wird der Billkom-Lieferschein erstellt und am Dokumentendrucker der Workstation mitgedruckt (PROJ-580)
  • Packflächen-Karte im Dashboard: aktive Stationen, Durchsatz, versandbereite Aufträge und Versandschluss-Countdown je Versandart mit Detail-Dialog (PROJ-580)
  • Versandschluss (Cutoff-Zeit) pro Versandart konfigurierbar (PROJ-580)
  • Überverkauf-Filter: Dashboard-Kachel + Filter in den Kundenaufträgen zeigen offene Aufträge, deren Bestand nicht verfügbar ist (PROJ-580)
v1.196.0022026-07-07
  • Produkte: Tab-Leiste der Detailseite bricht bei Platzmangel in eine zweite Zeile um statt horizontal zu scrollen — alle Tabs immer sichtbar (PROJ-578)
v1.196.0002026-07-07
  • Neue Hilfe-Seite Einkauf → Lieferantenbestellungen (Statuswege, Kanban, Detail-Tabs, Festschreiben, FAQ) + Hilfe-Button auf der LB-Übersicht (PROJ-574 W8)
  • LB-Zahlungen: Doppelklick beim Erfassen erzeugt keine doppelte Zahlung mehr (Idempotenz-Token) und Währungen ohne Nachkommastellen (JPY/HUF) werden korrekt verrechnet (PROJ-574 W8)
  • LB-Zahlungen: schlägt die Zahlstatus-Neuberechnung fehl, meldet Flowkom das ehrlich statt einen veralteten Status stehen zu lassen (PROJ-574 W8)
  • Einstandskosten festschreiben ist jetzt Admins vorbehalten (wie das Entsperren) (PROJ-574 W8)
  • Rate-Limits auf Zahlungs-/Notiz-/Kosten-Endpunkten; Notizen-Badge lädt nur noch die Anzahl statt aller Notizen (PROJ-574 W8)
v1.195.0012026-07-07
  • Sellerboard-Import: SKU-Zuordnungs-Ladepfad auf Keyset-Paginierung umgestellt — laedt den kompletten Bestand auch dann vollstaendig, wenn die Datenbank-Antwort unter der Seitengroesse gedeckelt wird (schliesst die letzte stille Truncation-Luecke im gestrigen Haertungs-Fix).
v1.195.0002026-07-07
  • Lieferanten-Detailseite: Kennzahlen (offene Bestellungen, Einkaufsvolumen 12 Monate, Ø-Lieferzeit Ist vs. zugesagt), Bestellhistorie mit Deep-Links und vollständige Stammdaten-Karte (PROJ-574 W7)
  • Lieferanten-Detailseite: Zuordnungen mit Suche + Seiten und neuem Produkt-zuordnen-Dialog (PROJ-574 W7)
  • Lieferanten-Formular in Tabs (Stammdaten/Kontakt/Adresse/Bank/Sonstiges) mit Nächste-Nummer-Hinweis, Duplikat- und Währungswechsel-Warnung (PROJ-574 W7)
  • Bevorzugter Lieferant wird atomar über eine DB-Funktion gewechselt — kein Zwischenzustand ohne Standard-Lieferant mehr, Fehler werden gemeldet (PROJ-574 W7)
  • Lieferantennummern-Vergabe mit Kollisions-Retry + Nummernkreis-Formular gegen Race abgesichert; Unique-Fehler nennen jetzt die echte Ursache (Nummer vs. Name) (PROJ-574 W7)
  • Lieferanten-Suche läuft serverseitig — Lieferanten jenseits der ersten 500 sind wieder auffindbar, Kappung wird angezeigt (PROJ-574 W7)
  • Bulk-Produktaktionen melden Lieferanten-Sync-Fehler als Warnungen in der Antwort statt sie still zu verschlucken (PROJ-574 W7)
v1.194.0002026-07-07
  • Bestellvorschlag: Reichweite-Spalte (reicht bis TT.MM., rot bei Engpass vor Liefereintreffen) und Lieferzeit des Lieferanten fließt in den Prognose-Horizont ein (PROJ-574 W6)
  • Bestellvorschlag: Mengen direkt in der Tabelle anpassbar (Inline-Override mit MOQ-Hinweis), Bulk-Add übernimmt die angepassten Mengen (PROJ-574 W6)
  • Lieferantenbestellung: Wareneingänge-Tab im Detail zeigt alle gebuchten Wareneingänge mit Positionen und Lagerplätzen (PROJ-574 W5)
  • Bestellvorschlag: Einheiten offener Kundenaufträge werden vom verfügbaren Bestand abgezogen (Doppelzählung behoben) — neue RPC calculate_supplier_open_units (PROJ-574 W6)
  • LB-Artikel-Picker zeigte nach LB-Wechsel Produkte/EK-Preise des vorherigen Lieferanten — Cache jetzt pro Lieferant + Server-Validierung der Lieferanten-Zugehörigkeit (PROJ-574 W5)
  • LB-Detail: kein Vollbild-Spinner/Tab-Reset mehr nach Änderungen, Mengen-/Preis-Eingaben verlieren beim Speichern nicht mehr den Fokus, Kosten-Tab parst deutsche Beträge korrekt und rollt bei Fehlern zurück (PROJ-574 W5)
  • LB-Detail: stornierte/abgeschlossene/festgeschriebene Bestellungen sind nicht mehr editierbar; Schließen mit ungespeicherter Eingabe fragt nach (PROJ-574 W5)
  • Bestellvorschlag-Tabelle mit Pagination (50 Zeilen/Seite) und Erklärtexten an den Parametern (PROJ-574 W6)
  • LB-Detail: echter Lagerbestand im Artikel-Picker, Deep-Link ?detail= bleibt in der URL (F5-fest), Lager-Auswahl ohne FBA-Lager, Bestelldatum-Edit erhält die Uhrzeit (PROJ-574 W5)
v1.193.0092026-07-07
  • Sellerboard-Import: Report-Tage werden jetzt tag-atomar ersetzt (Delete+Insert in einer DB-Transaktion) — ein Abbruch mitten im Import kann keinen halb geschriebenen Tag mehr hinterlassen.
  • Sellerboard-Import: SKU-Zuordnungs-Ladepfad paginiert + meldet DB-Fehler laut, statt bestehende (auch manuelle) Zuordnungen jenseits der 10k-Zeilen-Decke still zu übergehen.
v1.193.008
  • Versand-Ansicht: „In Arbeit“-Lock-Query gechunkt (batchedIn) — 414-Schutz bei großen Picklisten (PROJ-577)
v1.193.007
  • Versand Multi-Station: „Nächster Auftrag“-Zuteilung (atomar, picklisten-scoped) + „In Arbeit“-Transparenz + Picklisten-Fortschritt (PROJ-568 Welle 2)
  • PDF-Ausgabe im Einzelversand + Chrome-Popup-Blocker-Fallback auf der Etiketten-Seite (PROJ-568)
  • Stapeldruck-Rate-Limit-Deckel entfernt, Retourenlabel nie mehr in der Sammel-PDF (PROJ-568)
  • Picklisten-Artikel-Filter greift jetzt bei Erstellung + Vorschau; batchedIn im Erstellungs-/Packtisch-Pfad (PROJ-568)
  • Auto-Retoure: Doppelkauf-Fenster (DP/DHL) geschlossen, DHL-Retoure immer PDF (PROJ-568)
  • populate_picklist Claim-first: parallele Picklisten-Erstellung kann Aufträge nicht mehr doppelt verplanen (PROJ-568)
v1.192.0012026-07-07
  • „Failed to find Server Action“ nach jedem Coolify-Deploy behoben: stabiler Server-Actions-Verschlüsselungs-Key über alle Builds hinweg (NEXT_SERVER_ACTIONS_ENCRYPTION_KEY als Build-Variable); neuer /api/health-Endpoint für einen sauberen Healthcheck ohne Datenbankabhängigkeit (PROJ-576)
v1.192.0002026-07-07
  • Kanban-Sortierung: vordefiniert (Neueste/Titel/SKU) oder eigene Reihenfolge per Drag-and-Drop, pro Benutzer gespeichert; beim ersten Verschieben wechselt die Ansicht automatisch auf „Eigene Reihenfolge“, Varianten-Familien wandern als Block, zurücksetzbar (PROJ-571 W5)
v1.191.0002026-07-07
  • Vollständigkeits-Check pro Artikel: konfigurierbare Pflichtfelder, Badge + Fortschritt zeigen, was noch fehlt (PROJ-571 W4)
  • Produkt „Bearbeiten“ öffnet jetzt immer die Detailseite; der Dialog ist nur noch fürs Anlegen und Duplizieren da (Duplizieren übernimmt das Bild, aber keine eindeutigen Codes wie EAN/FNSKU/ASIN); breite Tab-Leiste jetzt horizontal scrollbar (PROJ-571 W4)
v1.190.0032026-07-07
  • Produktliste bei großen Katalogen: Bestände und Lieferantendaten werden jetzt vollständig und gechunkt geladen (kein stilles Abschneiden mehr), Fehler werden ehrlich gemeldet (PROJ-571 W3)
v1.190.0022026-07-07
  • Artikel-Datenmodell abgesichert: Eltern-Artikel mit Varianten und Bundles mit Komponenten lassen sich nicht mehr in einen widersprüchlichen Zustand versetzen (DB-Schutz); Varianten-Kombinationen werden serverseitig geprüft; Barcode-Pflege gelockert (8–50 Zeichen mit sanftem EAN-Hinweis) (PROJ-571 W2)
v1.190.0012026-07-07
  • Produktformular: Eingaben gehen beim Wechsel der Kanban-Spalte nicht mehr verloren; Attribut-Änderungen an Varianten aktivieren jetzt Speichern; „Verwerfen“ setzt das komplette Formular zurück; fehlgeschlagene Teil-Speicherungen (Bild, Bundle, Varianten) melden sich ehrlich statt still zu scheitern; Validierungsfehler springen automatisch zum betroffenen Tab (PROJ-571 W1)
v1.190.0002026-07-07
  • Lieferantenbestellungen: Kanban mit Drag & Drop (Status per Ziehen wechseln, erlaubte Ziele werden hervorgehoben) und neuer Überfällig-Tab mit Server-Zähler (PROJ-574 W4)
  • Lieferantenbestellungen: Kanban zeigt jetzt alle Bestellungen ehrlich (statusgruppiert mit Mehr-laden statt hartem 100er-Limit), Spalten-Zähler stimmen mit der Realität überein, Tabellen-Spalten Lager und Erhalten-Prozent funktionieren, Sortierung läuft serverseitig (PROJ-574 W4)
v1.189.0002026-07-07
  • Lieferantenbestellungen: Statuswechsel laufen jetzt atomar in der Datenbank — kein Doppelklick-/Parallel-Race mehr (eine stornierte Bestellung kann nicht mehr gleichzeitig genehmigt werden), Reaktivierung räumt Storno-/Genehmigungsfelder auf, Ablehnungsgrund erscheint konsistent in Status und Verlauf (PROJ-574 W3)
  • Lieferantenbestellungen: Positionen sind pro Bestellung eindeutig (Datenbank-Constraint), festgeschriebene Bestellungen blockieren Positionsänderungen, Artikel anderer Workspaces sind nicht mehr anhängbar (PROJ-574 W3)
v1.188.0002026-07-07
  • Lieferantenbestellungen: Suche und Status-Zähler laufen jetzt über eine schnelle Datenbank-Suche (ein Statement statt bis zu 12 Roundtrips), Zähler sind exakt, die Liste flackert beim Tippen nicht mehr und API-Fehler zeigen einen ehrlichen Fehlerzustand mit Retry (PROJ-574 W2)
v1.187.0002026-07-07
  • Einkaufsliste → Bestellungen: läuft jetzt in einer Transaktion — Doppelklick erzeugt keine doppelten Bestellungen mehr, bei Fehlern bleibt die Einkaufsliste vollständig erhalten, fehlende Einkaufspreise brechen mit klarer Artikel-Liste ab statt still 0,00 € zu buchen (PROJ-574 W1)
  • Bestellvorschlag: Mindestbestellmenge wirkt als Mindestmenge statt Verpackungseinheit (kein Aufrunden aufs Vielfache mehr) und frisch erstellte Entwurfs-Bestellungen zählen als Zulauf — keine doppelten Vorschläge mehr (PROJ-574 W1)
v1.186.0002026-07-07
  • Lieferantenbestellungen: Festschreibungs-Schutz jetzt auch auf Datenbank-Ebene — festgeschriebene Kosten können nicht mehr per Direktzugriff überschrieben oder neu berechnet werden (PROJ-574 W0)
v1.185.0082026-07-07
  • Lager: Phantom-Split strukturell zu — positive Umlagerungs-/Korrektur-Buchungen auf einen Lagerplatz, der nicht zum angegebenen Lager gehört, werden jetzt von der Datenbank abgelehnt.
  • Daten-Hub: CSV-Import von Lagerplätzen überschreibt bei bestehenden Plätzen Barcode und Hierarchie nicht mehr mit leeren Werten; System-Lagerplätze werden übersprungen; Sortiernummern werden fortlaufend statt doppelt vergeben.
  • Lagerplatz-Suche: Scans finden Plätze jetzt server-seitig über Name ODER Barcode, lagerscharf und auch jenseits von 1000 Plätzen (vorher stilles Limit).
  • Lagerplatz-Wizard: Sortiernummern-Overrides werden bei Bereichs-Änderung zurückgesetzt, die Start-Sortiernummer aktualisiert sich nach jedem Lauf, und eine Namens-Kollision zeigt eine klare Meldung statt eines rohen Fehlers.
  • Lager: das automatisch erstellte Amazon-FBA-Lager zählt nicht mehr als „erstes Lager“ — das erste echte Lager wird wieder automatisch Standard.
  • Buchungen: Idempotenz-Schutz jetzt auch serverseitig — wird derselbe Idempotency-Key mit anderen Buchungsdaten wiederverwendet, antwortet der Server mit einem klaren Fehler statt einer veralteten Erfolgsantwort.
v1.185.0042026-07-07
  • Benachrichtigungen QA-Nachtrag: „Weitere laden“ erscheint jetzt auch, wenn der aktive Reiter auf der ersten Seite leer ist (ältere Meldungen bleiben erreichbar); Doppelklick auf „Als behoben markieren“/„Entfernen“ verwechselt keine Zeilen mehr; keine doppelten Einträge beim Nachladen.
  • Cron-Fehler-Auto-Erledigung: quittiert keine Meldung mehr, die ein parallel fehlgeschlagener Lauf im selben Moment neu geöffnet hat.
  • Instanz-Überwachung (Betreiber): zeigt bei einem Abruf-Fehler ehrlich „nicht erreichbar“ statt fälschlich „alles gesund“; Cross-Workspace-Sicht nur noch für Admins.
v1.185.003
  • Lager-Sanierung QA-Nachtrag: Beim Scannen eines Lagerplatz-Barcodes, der in mehreren Lagern existiert, erscheint jetzt eine klare Meldung statt „Verbindung fehlgeschlagen“
  • Lager-Sanierung QA-Nachtrag: Beim Wareneingang lässt sich die Lager-Wahl wieder ändern (Menge auf 0 gibt den Lagerplatz frei, erneuter Klick wählt ab)
  • Lager-Sanierung QA-Nachtrag: Der Doppelbuchungs-Schutz greift nur noch für den identischen Wiederholungs-Klick — geänderte Mengen werden immer neu gebucht
v1.185.0012026-07-07
  • PPC-Butler: Sync-Fortschritts-Migration nach Timestamp-Kollision mit einer parallelen Migration erneut angewendet (Prod hatte die Spalte still übersprungen).
v1.185.0002026-07-07
  • Betreiber-Zugang auf Kundeninstanzen: eine Server-Allowlist (OPERATOR_EMAILS) schaltet dem Betreiber dort Cron-Jobs, Logs und eine neue Instanz-Überwachung (Cron-Status + offene Fehler über alle Workspaces) frei — Mandanten sehen davon nichts.
  • Cron-Fehler-Meldungen auf Kundeninstanzen erklären jetzt die Selbstheilung statt auf (dort gesperrte) Logs zu verweisen.
v1.184.0072026-07-07
  • PPC-Butler: 'Lagerbestand verfügbar' zieht Reservierungen jetzt wirklich ab (pushte seit PROJ-217 still den Gesamtbestand).
  • PPC-Butler: Der Produkt-Tab zeigt bei aktiver Varianten-Familien-Aggregation den echten Familienwert (vorher per-SKU-Wert ≠ gepushter Wert).
  • PPC-Butler: Sync-Fortschrittsbalken zeigt echte Zwischenstände; Zombie-Bereinigung killt keine legitimen langen Läufe mehr (kein Doppel-Sync).
  • PPC-Butler: Deaktivierte Marktplätze bleiben sichtbar und sind wieder aktivierbar (vorher unrettbar verschwunden).
  • PPC-Butler: Familie umbenennen macht sie nicht mehr dauerhaft 'manuell'; Mitglieder-Änderungen können die Familie nicht mehr leeren.
  • PPC-Butler: Vorschau und Produkt-Tab zeigen exakt das, was der Sync pushen würde (datenOk-Formel-Parität).
  • PPC-Butler: Ländernamen an allen Marktplatz-Auswahlfeldern, vollständige Quellen-Labels im Produkt-Tab, SKU-Filter für die Mapping-Vorschau, Hinweis bei ungespeicherten Änderungen, 'Letzter Auto-Sync'-Anzeige mit Warnung wenn der Cron-Scheduler steht.
v1.184.0012026-07-07
  • PPC-Butler: Kind-Artikel direkt am Elternartikel verwalten — neue Karte im PPC-Butler-Tab pusht manuelle Variablen-Werte pro Kind einzeln oder mit 'Alle setzen' für alle Varianten auf einmal (pro Marktplatz).
v1.183.0012026-07-07
  • PPC-Butler: Der Produkt-Tab (Profitbutler → PPC-Butler) lädt deutlich schneller — DB-Abfragen, Butler-Discovery und Live-Berechnungen laufen jetzt parallel statt nacheinander.
v1.183.0002026-07-07
  • Benachrichtigungen: Cron-Fehler-Meldungen erledigen sich automatisch, sobald derselbe Cron wieder erfolgreich durchläuft („Erledigt von System — Lauf wieder erfolgreich“); schlägt er erneut fehl, öffnet sich die Meldung von selbst wieder.
  • Produktliste: Suche und Filter durchsuchen jetzt den gesamten Katalog direkt in der Datenbank (auch bei zehntausenden Artikeln); Schalter unter Einstellungen → Produkte → Produktliste
v1.182.000
  • Produkt-Aufgaben: Auf jeder Kanban-Karte lassen sich Aufgaben mit optionaler Person festhalten und direkt abhaken (mit Rückgängig); dazu Aufgaben-Filter, Bereich im Produktdetail und optionale Tabellen-Spalte
  • Karten-Dichte: Schalter Kompakt / Standard / Detailliert fürs Produkt-Kanban (pro Person gespeichert); Detailliert zeigt Tags, Aufgaben und einen Fortschrittsbalken; Artikel lassen sich direkt von der Karte aus einer Person zuweisen
v1.181.002
  • DP-Portokatalog (QA-Fix, vor dem ersten Cron-Lauf): Live-Katalog wirkt nur noch als Preis-Override und deaktiviert nie Produkte — Live-Probe bewies, dass Accounts ohne Vertragsprodukte eine leere Antwort bekommen; die alte Logik hätte den DP-Versand lahmgelegt (PROJ-560)
v1.181.0002026-07-07
  • Benachrichtigungen: Glocke mit Vorschau-Popover — offene Fehler und neue Aktionen direkt im Header sehen, ohne die Arbeitsfläche zu verlassen.
  • Benachrichtigungsseite modernisiert: „Weitere laden“ für ältere Meldungen, sprechende Link-Beschriftungen („Auftrag öffnen“ statt „Log anzeigen“), relative Zeitstempel, Mobile-Layout.
  • Benachrichtigungen: „Alle als gelesen markieren“ funktioniert jetzt auch bei sehr vielen Meldungen zuverlässig (414-/max-rows-Schutz).
  • Offene (nie quittierte) Fehler-Meldungen werden erst nach 90 statt 30 Tagen aufgeräumt — übersehene Fehler verschwinden nicht mehr still.
  • Die „X neue Shopify-Produkte gefunden“-Aktion wird nach dem Import automatisch aufgelöst.
  • Als gelesen markieren wirkt nur noch auf den Reiter, den man tatsächlich ansieht (tab-scoped Auto-Read).
  • Cron-Fehler-Meldungen verlinken auf Kundeninstanzen nicht mehr auf die (dort gesperrte) Cron-Jobs-Seite.
  • Produkt-Kanban: „Rückgängig“ nach dem Verschieben einer Variantenfamilie lässt Varianten, die schon vorher in der Zielspalte lagen, jetzt unangetastet
  • Produkt-Filter verstehen Variantenfamilien: Fortschritts- und Bestands-Filter zählen die Varianten mit (Elternartikel erscheint, sobald eine Variante passt; Bestand = Summe der Varianten)
  • Produkt-Kanban: Spalten-Zähler zählt Artikel statt Karten; Artikel mit gelöschter Spalte landen sichtbar in „Kein Status“; Spalten laden anfangs 50 Karten + „weitere anzeigen“
  • Produktliste: ehrlicher Hinweis, wenn mehr Artikel existieren als geladen; flüssigere Suche; echte Namen statt E-Mail-Kürzel
v1.180.001
  • Doku: PROJ-560 auf Deployed, PROJ-553-Follow-ups W3.2b/W3.3b als nachgeliefert dokumentiert
v1.180.000
  • Versand-UX-Feinschliff: Fehlereintrag-Löschen und Tracking-Löschen fragen jetzt sauber nach (kein Sofort-Löschen/Browser-Popup mehr), DHL-Fehlerprotokoll in den Einstellungen zeigt nur noch offene Fehler, Label-Formatlisten aus einer Quelle (abweichende Maßangaben korrigiert), Umlaut-Texte in der DP-Karte, Hinweis bei gekappter Fehlerliste (PROJ-553 W3.3b — Abschluss der Sanierung)
v1.179.000
  • Versand-Route konsolidiert: Bundle-Daten in einer statt drei Abfragen, Label + Zolldokument laden parallel hoch, Zoll-Korrekturen schreiben parallel — nochmal ~100–300ms weniger pro Versand (PROJ-553 W3.2b)
v1.178.000
  • Deutsche Post: Portokatalog aktualisiert sich jetzt live aus der Internetmarke-API (Preise + Verfügbarkeit, täglicher Abgleich) — bei der nächsten Portoerhöhung laufen Briefkäufe weiter statt mit veralteten Preisen zu scheitern; Benachrichtigung bei Preisänderungen und abgeschalteten Produkten inkl. Warnung, wenn eine Versandart betroffen ist (PROJ-560)
v1.177.014
  • Lager-Sanierung: Ein leeres Mengenfeld bucht beim Zubuchen/Abbuchen/Umlagern nicht mehr stillschweigend 1 Stück, sondern verlangt eine gültige Menge
  • Lager-Sanierung: Buchungen am Bildschirm sind gegen Doppelbuchung abgesichert (erneuter Klick nach Verbindungsabbruch bucht nicht doppelt)
  • Lager-Sanierung: Ein Wareneingang bucht nur noch in ein Lager — gemischte Lager werden mit klarem Hinweis abgelehnt
  • Lager-Sanierung: Bestandsbewertung lädt auch bei großen Katalogen zuverlässig (kein Abbruch mehr ab ~400 Artikeln)
  • Lager-Sanierung: „Im Zulauf“ zeigt wieder alle offenen Lieferantenbestellungen; der Bewegungstyp-Filter kennt jetzt alle Buchungsarten
  • Lager-Sanierung: Bestand-Panels zeigen deutsche Statusbezeichnungen; der defekte Link im Zulauf führt jetzt korrekt zur Lieferantenbestellung; Fokus-Sprung bei der Abbuchung behoben; Korrektur-Dialog mit durchsuchbarer Artikelauswahl
  • Lager-Sanierung: Freigabe, Stornierung und Löschen von Lieferantenbestellungen sowie die Geräteverwaltung sind jetzt echten Admins vorbehalten
  • Lager-Sanierung: Nachfüll-Workflow repariert (Einlagern und Batch-Nachfüllung funktionieren wieder); Lagerplatz-Scan und Bestandsimport arbeiten lagerscharf; System-/Nachfüllplätze werden nicht mehr als Pickquelle verwendet
v1.177.002
  • Amazon: In Seller Central erstattete Fremdwährungs-Refunds (UK/SE/PL …) werden jetzt automatisch über den Order-Wechselkurs in EUR gebucht (inkl. Gutschrift); ohne verwertbaren Kurs weiterhin Archiv + Benachrichtigung (PROJ-559)
v1.177.001
  • PROJ-553 DHL/Deutsche-Post-Sanierung abgeschlossen — Doku-Status auf Deployed, Merge-Protokoll + Follow-ups (W3.2b/W3.3b) dokumentiert
v1.177.0002026-07-06
  • Produktverwaltung: Tags-Massenbearbeitung (PROJ-532) — Tags im „Feld setzen“-Dialog mehrfach hinzufügen/entfernen
  • Massenbearbeitung: „Alle X Ergebnisse auswählen“ bearbeitet jetzt garantiert exakt die sichtbar gefilterte Menge (expliziter ID-Pfad statt Server-Filter)
  • Massenbearbeitung: Lieferanten-Felder und Standardverpackung werden korrekt geschrieben; Klickziele für Checkbox/Aufklappen ganzflächig; Kopf-Checkbox wählt die aktuelle Seite
  • Tabellen-Editor: Rückgängig entfernt Einträge wieder aus der Änderungsliste; Speichern läuft in 500er-Chunks
v1.176.000
  • Versand-Korrektur-Modal zeigt jetzt die technischen Details (Original-Carrier-Fehler + Code) — kein Korrigieren mehr ins Blaue (PROJ-553 W3.3)
  • Zusatz-/Retourenlabel: Fehler kommen deutsch gemappt mit Handlungshinweis, nach 10s erscheint ein Langsam-Hinweis, und bei Netzfehlern wird nicht mehr blind zum Retry geraten (PROJ-553 W3.3)
  • Etikettenliste druckt an der gewählten Workstation statt an der ersten aktiven Zuweisung (PROJ-553 W3.3)
  • Scanner: Fehlscans geben jetzt ein akustisches Signal + Screenreader-Ansage; Icon-Buttons haben zugängliche Labels; Umlaut-Texte korrigiert (PROJ-553 W3.3)
v1.175.000
  • Versand-Dialog: EU-Sendungen sparen den Zoll-Prüf-Roundtrip (~150–400ms pro Paket) und Sperren+Auftragsdetails laden parallel — spürbar schnelleres Öffnen (PROJ-553 W3.2)
  • Label-Upload: kein Storage-Bucket-Check mehr pro Upload (1–3 gesparte Roundtrips pro Versand, PROJ-553 W3.2)
v1.174.000
  • Datenschutz: Label-PDFs (mit Empfängeradresse) werden jetzt altersbasiert nach 60 Tagen aus dem Storage geräumt — vorher lebten Download-only-/Retouren-/Zoll-PDFs ohne Druckjob unbegrenzt (PROJ-553 W3.1)
  • Datenschutz: dhl_error_log hält jetzt die versprochene 90-Tage-Retention für gelöste Einträge ein (PROJ-553 W3.1)
  • Logs: DHL/DP-Fehlerantworten landen nicht mehr als volle Dumps in den Container-Logs (mögliches Adress-Echo gekappt, PROJ-553 W3.1)
v1.173.000
  • Amazon-Versandbestätigung: Tracking-Auswahl filtert jetzt auf Outbound-Labels (neueste zuerst) — Retouren-/Zusatzlabel-Nummern und SHIP-Platzhalter gehen nie mehr als Versand-Tracking an Amazon (flag-gated mit Escape-Hatch, PROJ-553 W2.4)
v1.172.000
  • Rechte: Tracking-Löschung auf versendeten Aufträgen und das Leeren der kompletten Fehlerqueue sind jetzt Admin-only; Retoure-Standorte-Endpoint mit Rate-Limit (PROJ-553 W2.3)
  • Versand-Lock: Verwaiste Sperren (Browser-Crash) laufen nach 30 Minuten ab und werden übernommen — Aufträge bleiben nicht mehr dauerhaft blockiert (PROJ-553 W2.3)
  • Manuelles Tracking setzt jetzt den Versender — der Shopify-Catchup-Sweep übersieht diese Aufträge nicht mehr (PROJ-553 W2.3)
v1.171.000
  • DHL: Länder-Mapping deckt jetzt alle ISO-Länder ab (vorher ~52) — Ziele wie Moldau, Ägypten oder Kasachstan sind nicht mehr dauerhaft unversendbar (PROJ-553 W2.2)
  • Zoll (CN23): Ursprungsland pro Position aus den Artikeldaten statt pauschal Absenderland — Packer-Korrekturen wirken jetzt; Zollwert-Klemme hebt echte Kleinpreise nicht mehr an (PROJ-553 W2.2)
  • DHL-Retoure: Konfigurierte Retoure-Empfänger-IDs (Versandart/Einstellungen) werden endlich genutzt statt immer des ersten Live-API-Standorts — spart zudem den Locations-Call pro Retoure (PROJ-553 W2.2)
  • DHL: Verbindungstest nutzt Berlin-Zeit fürs Versanddatum; Referenznummern-Mindestlänge auch mit Marktplatz-Nummer garantiert; Nicht-EU-Zusatzlabels bekommen eine klare Meldung statt roher DHL-Fehler (PROJ-553 W2.2)
v1.170.000
  • Versand-Dialog: Doppelklick/Auto-Ship-Race kann keinen zweiten Versand mehr auslösen (Re-Entrancy-Guard + Timer-Cancel, PROJ-553 W1.5)
  • Versand-Dialog: Während des Label-Kaufs nicht mehr schließbar (ESC/Außenklick/X) — Schließen entsperrte den Auftrag, obwohl der Kauf weiterlief (PROJ-553 W1.5)
  • Fehler-Cockpit/Korrektur: Erfolgs-Feedback mit Tracking erscheint wieder (Response-Shape-Fix) und Server-Warnungen werden als Toast angezeigt (PROJ-553 W1.5)
  • Etikettenliste: Carrier-Filter und Suche brechen bei großem Datenbestand nicht mehr mit einem Serverfehler ab (PostgREST-URL-Limit; Filter läuft jetzt komplett in SQL, PROJ-553 W2.1)
  • Versandhistorie: Suche und Versandart-Filter laufen serverseitig mit echter Pagination — ältere Sendungen jenseits der 10.000 neuesten sind wieder auffindbar; der Versandart-Filter wirkt wieder (Param-Mismatch, PROJ-553 W2.1)
  • Fehler-Cockpit/Etikettenliste: API-Fehler zeigen einen roten Fehlerzustand mit Neu-laden statt eines falschen grünen Keine-Fehler-Zustands (PROJ-553 W2.1)
  • Versand-Listen: Seitenwechsel ohne Voll-Spinner (keepPreviousData) und zu breite Suchen werden ehrlich mit Verfeinerungs-Hinweis gekappt (PROJ-553 W2.1)
v1.169.000
  • Einstellungen: Der fehlerhafte Label-Retry in den DHL/DP-Karten wurde stillgelegt (kaufte Labels mit falschem Gewicht/Produkt, ohne Zoll) — Retry läuft jetzt ausschließlich über das Fehler-Cockpit, die Fehlerlisten verlinken direkt dorthin (PROJ-553 W1.4)
v1.168.001
  • Amazon-Integration Härtung (PROJ-558, Phasen A–H): PII-Retention-Cron (30 Tage, Toggle default AUS, Dry-Run-Vorschau), Versandbestätigung ohne Falsch-Bestätigungen (Result-Verifikation, Plausibilitätsgate, nur Outbound-Tracking), FBA-Pull-Guard gegen Bestands-Komplett-Nullung, Refund-Push positionsgenau verteilt mit Doppel-Refund-Schutz (Claim + feed_id-Sofort-Persist), Finance-Events Claim-first (nie Doppel-Buchung) inkl. Promotions in der Erstattungs-Summe, Lease-Lock-Tabelle statt Session-Locks, Credentials nie mehr im Browser, ehrliche Fehler-Notifications (Auth, Dead-Letter, Carrier-Mapping)
  • Amazon: Rabatte flossen nicht in importierte Positionen, Pending-Orders wurden mit 0 € importiert, Cursor advancte über gescheiterte Bestellungen, 'Alle N auswählen' mutierte still nur 200 Listings, Non-EUR-Erstattungen wären falsch ausgezahlt worden (jetzt geblockt mit Handlungsanweisung)
v1.168.000
  • Versand: Bestandsabbuchung ist jetzt idempotent — ein erneuter Versand-Durchlauf desselben Auftrags bucht den Bestand nie mehr doppelt ab (PROJ-553 W1.3)
  • Versand: Scheitert das Auftragsstatus-Update, wird es sofort wiederholt und ein ehrlicher Warnhinweis zurückgegeben statt still zu schlucken (PROJ-553 W1.3)
v1.167.000
  • DHL/DP: Kauf-Anker — voucherId/Sendungsnummer + Preis werden SOFORT nach dem Kauf gespeichert; Fehler beim PDF-Abruf führen nie mehr zu verlorenen (bezahlten) Marken, der Retry lädt das PDF nach statt neu zu kaufen (PROJ-553 W1.2)
  • Versand: Atomarer Ship-Claim — Doppelklick/Doppel-Tab kann keinen zweiten Label-Kauf mehr auslösen (DB-Unique-Index + Claim-RPC, PROJ-553 W1.2)
  • Auto-Retoure: Duplikat-Guard — erneuter Versand-Durchlauf kauft keine weitere Retouren-Marke mehr (PROJ-553 W1.2)
  • Versand: Duplikat-Guards prüfen jetzt Carrier + Label-Typ — fremde Label-Zeilen (z.B. FBA-Import) werden nicht mehr als existierendes DHL-Label fehlinterpretiert (PROJ-553 W1.2)
v1.166.000
  • DHL/DP: Kein automatischer Retry mehr auf Kauf-Requests — verhindert Doppel-Sendungen/Doppelabbuchungen bei Timeouts (PROJ-553 W1.1)
  • DHL: API-Timeout von 10s auf 60s angehoben (env-konfigurierbar), übersteht DHL-Latenz-Incidents (PROJ-553 W1.1)
  • Deutsche Post: Internationale Postleitzahlen (GB/PL/NL/PT) werden nicht mehr auf 5 Zeichen gestutzt (PROJ-553 W1.1)
  • Deutsche Post: Ungültiger Portokasse-Token wird bei 401 sofort verworfen statt ~50min weiter benutzt (PROJ-553 W1.1)
  • DHL: 4xx-Fehler werden wieder korrekt als Validierungsfehler statt als "nicht erreichbar" gemeldet (PROJ-553 W1.1)
v1.165.006
  • Print Agent: Broadcast-Aufweck-Kanal — Server weckt den Agent nach jedem Druckjob sofort per Push (PROJ-549)
  • Print Agent: Download-Button in den Drucker-Einstellungen lädt den neuesten Installer (PROJ-544)
  • Print Agent: Ein-Code-Kopplung — Kopplungscode enthält die Server-Adresse, kein URL-Eintippen mehr (PROJ-548)
  • Kopplungs-Dialog erkennt den Kopplungserfolg jetzt automatisch (Toast + Auto-Schließen, PROJ-540)
  • Druckjob-Reparatur läuft workstation-scharf im Hot Path statt am unzuverlässigen Tages-Cron (PROJ-537)
  • Print-Agent-Download: Release-Abruf auf github.com-Web-Redirect umgestellt (API-Rate-Limit auf dem Server behoben)
v1.165.004
  • Billkom Archiv-Backfill (PROJ-557): ein Beleg mit fehlerhafter PDF-Erzeugung blockierte den gesamten Nacharchivierungs-Lauf nicht mehr — der Backfill überspringt ihn und arbeitet die übrigen Belege weiter ab
  • Billkom Sammel-ZIP (PROJ-557): Absturz-Schutz beim ZIP-Export (Client-Abbruch großer Exporte), Speicher-Deckelung gegen OOM und sichtbare Fehler-Einträge im ZIP statt stillem Verschlucken
v1.165.001
  • Pan-EU-FBA (PROJ-554): Warenabgangsland aus dem Amazon-Versandbericht; USt-Auswertung weist Verkäufe aus ausländischen FBA-Lagern an Kunden im selben Land korrekt als 'Lokal im Lagerland' aus (lokale Voranmeldung statt OSS)
v1.164.001
  • Shopify UI (PROJ-541): Checkbox in der Bestell-Vorschau reagiert wieder auf Direktklick, Produkt-Import zeigt Fehlergründe sichtbar im Dialog statt nur in der Konsole
v1.164.000
  • Shopify Produkt-Crons saniert (PROJ-540): 15-Min-Import lädt nur noch Änderungen statt Vollkatalog, Retry bei Rate-Limits, gelöscht-Markierung nur nach vollständigem Abgleich, Duplikat-SKU blockiert den Auto-Import nicht mehr, importierte Produkte sind sofort im Bestandssync (Mapping-Anlage), Varianten-Familien werden beim Import nicht mehr zerrissen
v1.163.001
  • Build-Fix: fehlende archiver-Dependency aus dem Billkom-Sammel-ZIP (PROJ-551) nachgezogen — Produktions-Build war gebrochen
v1.163.000
  • Shopify DSGVO-Pflicht-Webhooks (PROJ-543): HMAC-verifizierter Endpoint für customers/data_request, customers/redact und shop/redact mit Admin-Benachrichtigung
  • Destruktive Shopify-Aktionen (Verbindung trennen, Integration löschen, Import-Reset) nur noch für Admins
v1.162.001
  • Zeilen-basierter Status-Sync-Lock pro Integration
  • Shopify Bestellstatus-Sync skaliert (PROJ-538): 1 API-Call pro 250 Aufträge statt pro Auftrag (Sekunden statt Minuten), Zeitbudget mit ehrlichem Exit, bezahlt→ausstehend-Downgrades werden geblockt, Erstattungen nach Versand werden 60 Tage weiter erkannt, dauerhafte 404-Aufträge erzeugen keine Fehlerläufe mehr, Split-Payment-Erstattungen und Währung aus Shopify
v1.161.001
  • Zeilen-basierter Import-Lock pro Integration (Cron und manueller Import laufen nie mehr parallel)
  • Shopify Order-Import korrigiert (PROJ-542): Import-Cursor verliert keine Bestellungen mehr bei abgebrochener Übertragung (Überlappungsfenster), Rabatte werden als Positionsrabatt übernommen, historische Erstattungen setzen total_refunded, Duplikat-Prüfung skaliert, Steuersatz je Artikel-Kategorie und Bestelldatum, Versandkosten-Positionen auch ohne Detection-Konfiguration
v1.160.003
  • Shopify Versandbestätigung gehärtet (PROJ-536): bereits erfüllte Aufträge werden erkannt/übernommen statt auf 'failed' zu kippen, Retry-Warteschlange ohne Endlosschleifen, interne Pseudo-Sendungsnummern (SHIP-/ADR-) werden nie mehr gepusht, Tracking-URL-Platzhalter {{number}} wird ersetzt, Shopify-Drosselung (THROTTLED) wird korrekt als Fehler behandelt, alle offenen Fulfillment Orders (Split-Bestände) werden bestätigt
v1.159.000
  • Profitbutler Live-BWA (PROJ-553): neuer Tab mit monatlicher betriebswirtschaftlicher Auswertung (Netto-Umsatz, Rohertrag, Deckungsbeitrag, Betriebsergebnis je Monat + Jahressumme), laufender Monat tagesaktuell
v1.158.000
  • Billkom Sammel-ZIP für den Steuerberater (PROJ-551): alle Belege eines Zeitraums als ZIP mit MANIFEST, Monats-Picker in der Belegzentrale
  • USt-Auswertung gruppiert (PROJ-551): Summen-Kacheln Inland (USt-VA) / OSS (EU-Fernverkäufe) / Steuerfrei mit Sektions-Tabellen, deutschen Ländernamen und Pan-EU-FBA-Hinweis
v1.157.000
  • Billkom Skonto-Snapshot (PROJ-552): Skonto aus den Einstellungen wird beim Finalisieren GoBD-fest am Beleg gespeichert und erscheint auf der PDF und in den Zahlungsbedingungen der E-Rechnung
v1.154.000
  • Billkom Archiv-Trilogie (PROJ-550): Original-Download aus dem GoBD-Archiv (byte-identisch zum SHA-256), Entwurfs-PDF-Vorschau mit ENTWURF-Wasserzeichen, automatischer Archiv-Backfill aller Bestandsbelege
v1.153.0002026-07-06
  • Profitbutler: Fixkosten-Tab zeigt normalisierte Monatslast (≈ €/Monat) je Eintrag
  • Profitbutler: Fixkosten-Einträge duplizieren
  • Profitbutler: Direktlink Fixkosten verwalten aus der GuV-Tabelle
  • Profitbutler: Einrichtungs-Check warnt bei Fixkosten-Einträgen, die still nicht wirken (verwaister Kanal, fehlender Stichtag-Wochentag, Alt-Pause)
v1.152.0002026-07-06
  • Profitbutler: Betrag ändern ab Datum — Mieterhöhungen & Co. beenden den alten Fixkosten-Eintrag und legen automatisch einen Nachfolger an, vergangene Auswertungen bleiben unverändert
  • Profitbutler: GuV zeigt Deckungsbeitrag (vor Fixkosten) und Fixkostendeckung in Prozent
  • Profitbutler: Einmalkosten (z.B. Messe, Anschaffung) — am Stichtag gebucht oder über einen Zeitraum verteilt
  • Profitbutler: neue Hilfeseite zu Fixkosten (inkl. Hinweis: Beträge netto erfassen)
v1.151.0002026-07-06
  • Profitbutler: Fixkosten fair auf Verkaufskanäle verteilt — kanalspezifische Kosten zu 100% ihrem Kanal, allgemeine anteilig nach Umsatz; Kanal-GuV zeigt neue Zeile Fixkosten (anteilig)
  • Profitbutler: GuV-Zeile Fixkosten zeigt beim Aufklappen jeden Eintrag einzeln
  • Profitbutler: Chart-Gewinnlinie enthält jetzt die tagesgenauen Fixkosten (passt zur Heute-Kachel)
  • Billkom-Belegzentrale: eigene Modul-Seite mit Belegübersicht, Filtern, Suche und Offene-Posten-Liste inkl. KPI-Kacheln (PROJ-545)
  • Profitbutler: Kanal-Auswahl im Fixkosten-Dialog zeigte bei vielen Bestellungen nur einen Teil der Kanäle
  • Profitbutler: Pausieren einer Fixkostenposition verfälschte rückwirkend die Historie — Pause wirkt jetzt ab dem Pausen-Tag
  • Profitbutler: Stichtag-Fixkosten ohne Pflichtfeld (z.B. Wochentag) zählten still 0 € — jetzt Validierung in Dialog und API
  • Profitbutler: Monatssummen-Karte zählte abgelaufene Fixkosten-Einträge mit
  • Profitbutler: Rundungsverlust bei verteilten Fixkosten behoben — voller Monat ergibt exakt den konfigurierten Betrag
v1.150.002
  • Billkom: 0-€-Rechnungen (Gratis-Ersatzlieferungen) gehen bei Auto-Bezahlt wieder auf 'bezahlt' — der neue Zahlungs-CHECK hätte sie blockiert (PROJ-530-Folgefix)
v1.150
  • Billkom: Reverse-Charge für EU-B2B — USt-IdNr. am Kunden mit VIES-Prüfung, 0 % nur bei frisch validierter ID (PROJ-534)
v1.148.001
  • Mobile-App-Update: Content-Disposition-Header im Device-APK-Download über den buildApkFilename-Sanitizer (konsistent zur Settings-Download-Route, Defense-in-Depth) — byte-identischer Dateiname für normale Versionen
  • Session-Cleanup Mobile-Update-System: INDEX-Status PROJ-525/530/533 auf Deployed, package-lock-Versionsdrift bereinigt
v1.148.0002026-07-06
  • Produkte: Tags per Massenbearbeitung setzen — im Dialog 'Feld setzen' lassen sich Tags jetzt fuer die gesamte Auswahl hinzufuegen oder entfernen.
  • Produkte: Bulk-Aktion 'Wiederherstellen' — steht die Filterleiste auf Archiviert, bietet die Massenleiste das Wiederherstellen an.
  • Produktfilter: Artikeltyp-Filter (Bestandsgefuehrt / Service-Artikel) in die Filterleiste integriert.
  • Produkte: 'Alle Ergebnisse auswaehlen' bearbeitet jetzt garantiert exakt die sichtbar gefilterte Menge (vorher konnten Tags-/Bestands-/Aktiv-Filter serverseitig ignoriert werden — inkl. archivierter Artikel).
  • Produkte: 'Feld setzen' mit Einkaufspreis (Lieferant) / Standard-Lieferant funktioniert jetzt (vorher Serverfehler); Standard-Lieferant hat eine Ja/Nein-Eingabe.
  • Produkte: Standardverpackung per Massenbearbeitung aktualisiert jetzt auch die Verpackungs-Verknuepfung (Profitbutler/EK-Export sehen die Aenderung).
  • Produkte: Klick neben die Checkbox oder den Aufklapp-Pfeil oeffnet nicht mehr versehentlich den Artikel — die ganze Zelle ist jetzt Klickflaeche.
  • Produkte: Kopf-Checkbox waehlt die aktuelle Seite (statt aller Seiten), Auswahl-Zaehler sind konsistent inkl. Varianten.
  • Produkte: Massenaktionen mit vielen Artikeln laufen stabil (Batch-Verarbeitung, kein URL-Limit-Fehler; Loeschen ist nicht mehr auf 100 begrenzt).
  • Produkte: Bulk-Archivieren ueberspringt Eltern-Artikel mit Varianten sauber statt mit Fehler abzubrechen.
  • Tabellen-Editor: Rueckgaengig raeumt die Aenderungsliste auf; Speichern grosser Mengen laeuft in 500er-Schritten mit Fortschritt; Teil-Fehler werden gemeldet statt verschluckt.
  • Varianten-Tab: Loesch-Bestaetigung zeigt die korrekte Anzahl (vorher 'undefined').
  • Produkte: defekter 'EK-Preis'-Button aus der Massenleiste entfernt (war seit der EK-Konsolidierung funktionslos; EK-Pflege ueber Feld setzen/Tabellen-Editor). Doppelte Status-/Artikeltyp-Filter ueber der Tabelle entfernt — die Filterleiste ist die eine Quelle.
v1.147.0042026-07-05
  • PROJ-527: Manuelle Auftragsanlage — Rabatt in Euro (pro Position %/€-Umschalter + Gesamtrabatt proportional verteilt) und Versandkosten-Schnellfeld (als Freiposition).
v1.147.0032026-07-05
  • PROJ-528: Positionsrabatte (order_line_items.discount_percent) werden jetzt in allen Umsatz-Auswertungen angewandt — order_total-Trigger, Profitbutler-Engine, die 4 Auswertungs-RPCs und die Kundenstatistik rechneten bisher unrabattiert; einheitliche Zeilen-Rundung wie Auftragsdetail/Billkom, SQL/TS byte-identisch.
v1.147.0012026-07-05
  • Billkom-Modul-Schalter (Einstellungen → Allgemein) steuert jetzt EIN Flag: er blendet den Billkom-Bereich in den Einstellungen UND die Beleg-Aktionen in den Aufträgen gemeinsam ein/aus (vorher gingen die zwei auseinander)
v1.147.0002026-07-06
  • Mobile-App-Update-Endpoint: die Scanner-App kann neue Versionen über den Flowkom-Server finden und laden (GitHub-Release-Proxy, PROJ-530)
v1.146.0022026-07-06
  • Doppelbuchungs-Schutz: Idempotency-Key-Dedup für Bestandsbuchungen, Umlagerungen und Wareneingänge der Scanner-App (PROJ-526)
v1.146.0012026-07-06
  • Mobile-API-Kontrakt: mode/barcode in Replenishment-Responses + is_system/barcode im Lagerplatz-Inhalt (Scanner-App PROJ-525)
v1.146.0002026-07-05
  • Dev-Tools komplett entfernt (Sicherheit): Einstellungs-Seite, API und die dev_cleanup-Datenbankfunktion — Massenloeschung von Workspace-Daten ist damit auch technisch nicht mehr moeglich
v1.146
  • Billkom: Beleg-Archivierung mit SHA-256-Hash beim Finalisieren (GoBD-Nachweis), Storno-PDFs mit Wasserzeichen weiter abrufbar (PROJ-530)
  • Billkom: §19 Kleinunternehmerregelung als Schalter, OSS-Schwelle prüft jetzt auch das Vorjahr, Territorien (Nordirland/Monaco/Kanaren) korrekt (PROJ-530)
  • Billkom: Steuersatz-Pflege in den Einstellungen + Einrichtungs-Check-Banner für fehlende Pflichtangaben (PROJ-530)
  • Billkom: E-Rechnung referenziert bei Gutschriften die Ursprungsrechnung (BT-25); PDF bricht lange Belege sauber um (PROJ-530)
  • Billkom: Sammelmahnung repariert (Nummernvergabe vorab, GoBD-konform finalisiert) + finalized_at-Backfill für Alt-Belege (PROJ-530)
  • Billkom: Belegdatum/Leistungsdatum/Nummernkreis-Jahr einheitlich Europe/Berlin; Queue-Zombies mit ausgeschöpften Versuchen gehen ehrlich auf failed (PROJ-530)
  • Billkom: Korrekturbearbeitung klemmt Restbetrag bei 0 und leitet den Zahlstatus neu ab (PROJ-530)
v1.145.0002026-07-05
  • Billkom als Modul schaltbar: Toggle 'Billkom (Rechnungsmodul)' in Einstellungen -> Allgemein (bestehende Workspaces bleiben aktiv, neue starten ohne Billkom)
  • Einstellungen-Navigation final: Allgemein, Workflows, Tags, Produkte, Integrationen, Profitbutler, Billkom, Team und Konto direkt im Hauptmenue; Gruppen nur noch fachlich - 'Lager & Versand', 'Drucker & Scanner' (inkl. mobile Geraete) und 'System'
v1.144.0042026-07-05
  • Einstellungen-Navigation ueberarbeitet (v2 nach Feedback): kurze stabile Gruppen-Zeile (Betrieb / Kommissionierung / Drucken / Daten & Workflows / Module / System / Konto) + Seiten der Gruppe als Pill-Leiste — kein Zeilen-Springen mehr, volle Inhaltsbreite
v1.144.0012026-07-05
  • Sicherheit: PostgREST-Filter-Injection in den Picklisten-Ausschluss-Filtern (Verkaufskanal/Lieferland) geschlossen — Zeichensatz-Validierung + Laufzeit-Schutz, kein Ausbruch aus dem not.in()-Filter mehr moeglich
v1.143.0002026-07-05
  • Picklisten-Profile: Ausschluss-Filter Verkaufskanal + Lieferland ('alles ausser ...') — Auftraege ohne Kanal/Land bleiben drin, eigene 'ohne ...'-Chips in der Profil-Liste
v1.142.0002026-07-05
  • Boxen-Picking: Picklisten-PDF zeigt Box-Ziele (Box-Spalte in Pick-Positionen, Auftraege Box-sortiert, Wagen-Zeile im Kopf)
  • Boxen-Picking: Wagen-Barcode (WGN-Code) — Barcode-Dialog in den Wagen-Einstellungen zum Aufkleben; Scan im Versand oeffnet die offene Pickliste des Wagens direkt (auch Picklisten-Nummer scannbar)
v1.141.0032026-07-05
  • Profitbutler Kanal-GuV: Die Abzugszeile „Erstattungen (USt-korrigiert)“ bei aktivem Retouren-Schalter zeigte ein doppeltes Minus (im Text und am Betrag) — Darstellung jetzt konsistent zu den übrigen Kostenzeilen
v1.141.0002026-07-05
  • Boxen-Picking (Boxenkommissionierung): Boxenwagen als Stammdaten (Einstellungen → Boxen-Picking), Picklisten-Profil-Modus 'Boxen-Picking' mit Wagen-Auswahl und Sammelbox-Option
  • Boxen-Picking: deterministische Box-Vergabe beim Erstellen (aelteste Auftraege zuerst, 1-Artikel-Auftraege gebuendelt in die Sammelbox, Sammelpakete = eine Box)
  • Boxen-Picking: Versand-Ansicht sortiert nach Box (Sammelbox als 'S'), Box-Spalte im Picklisten-Detail
v1.140.0002026-07-05
  • Picklisten-Profile: Catch-All-Schalter — ein Profil nimmt jeden offenen Auftrag, ohne einzelne Filter zu pflegen (Zahlungsstatus, Lagerbereich und Mengenbegrenzung gelten weiterhin)
  • Picklisten-Profile: neue Filter Verkaufskanal, Lieferland und Artikel (enthaelt-Semantik)
  • Picklisten-Profile: 'Warum? Details anzeigen' am Hinweis 'X von Y Auftraegen passen zu keinem Profil' — zeigt pro Auftrag den Grund je Profil, gruppiert nach Ablehnungs-Muster
v1.139.0022026-07-05
  • Hilfe-Links im Einkauf: Bestellvorschlag, LB-Kosten-Tab und Produkt-Einstandspreis-Karte verlinken direkt auf die passenden neuen Doku-Seiten.
  • Aufräumen: ungenutzter Alt-Endpoint zum Komplett-Überschreiben von Lieferantenbestellungen entfernt (kein Funktionsverlust — Positionen und Metadaten haben eigene, modernere Wege).
v1.139.0002026-07-05
  • Profitbutler: Einrichtungs-Check — das Dashboard warnt jetzt, wenn der Gewinn mit unvollständigen Stammdaten gerechnet wird (Lieferländer ohne Versandkosten-Satz, Artikel ohne Standard-Versandart oder ohne Einkaufspreis); der Hinweis zeigt die konkreten Lücken mit Beispiel-Artikeln und verschwindet automatisch, sobald alles gepflegt ist
v1.138.0002026-07-05
  • Profitbutler: Der Schalter „Retouren einrechnen“ funktioniert jetzt auch im Dashboard — KPI-Kacheln und Kanal-Tabelle zeigen auf Wunsch den Gewinn nach Retouren (USt-korrigiert abgezogen), die aufklappbare Kanal-GuV weist den Abzug als eigene Zeile aus; die Einstellung gilt gemeinsam für Dashboard, Artikel- und Regionen-Tab
v1.137.000
  • Picklisten-Profile: Dialog in 3 Tabs (Filter | Kommissionierung | Versand & Druck) - deutlich uebersichtlicher, Scan-Modus semantisch unter Kommissionierung
  • Picklisten-Profile: Starter-Vorlagen (Alle bezahlten Auftraege / One-Scan Express / Stapeldruck ohne Scan) + Profil duplizieren
  • Picklisten-Profile: Verhalten-Badges in der Liste (Stapeldruck / Auto-Versand / inkl. unbezahlt / Fehler: weiter)
  • Picklisten-Profile: Live-Vorschau reagiert jetzt zuverlaessig auf Filter-Aenderungen beim Anlegen
  • Picklisten-Profile: echte Umlaute statt ae/oe/ue in allen Texten
v1.136.000
  • Stapeldruck: identische Auftraege per Ein-Klick versenden - Picklisten-Profil-Schalter, Versand-Ansicht gruppiert nach Artikel x Menge, Batch-Druck je Gruppe ueber den bestehenden Versandweg (ohne Scan), Packliste je Gruppe
  • PDF-Ausgabe ohne Drucker: Pseudo-Workstation "PDF-Ausgabe (im Tab oeffnen)" - Labels als Sammel-PDF, Zolldokumente als zweite Datei
  • Separate Stapelversand-Seite entfernt - Funktion lebt jetzt integriert im Versand (Profil-gesteuert)
v1.135.0002026-07-05
  • Profitbutler: Datenbasis-Badge auf allen Auswertungsflächen — Dashboard, Artikel, Regionen und Produkt-Auswertung zeigen jetzt oben, ob mit echten Amazon-Kosten (Sellerboard) oder kalkulierten Kosten (Soll) gerechnet wird; ein Klick erklärt die Datenbasis, die Abdeckung, die Einkaufspreis-Herkunft und warum Artikel/Regionen bewusst kalkulatorisch bleiben
v1.134.0022026-07-05
  • Profitbutler-Einstandspreis: Umstellung von Lebenszeit-Durchschnitt auf echtes FIFO über den Restbestand — eine einheitliche EK-Methode für Profitbutler, Produktseite, Bestandsbewertung und Sellerboard-Export.
v1.134.0012026-07-05
  • Einstandspreis: Bei Fremdwährungs-Lieferantenbestellungen wurde der Warenwert mit einem veralteten Kursfeld (1,0) statt dem gepflegten Kurs umgerechnet — USD-Preise landeten 1:1 als EUR im Einstandspreis. Kursauflösung korrigiert und alle betroffenen Bestellungen neu berechnet.
v1.134.0002026-07-05
  • Bestellvorschlag: Neue Spalte Retouren zeigt die Retourenquote des Analysezeitraums pro Artikel (Vorgänge ÷ Aufträge, farbcodiert ab 10 %/25 %).
  • Bestellvorschlag: Filter 'Nur mit Vorschlag' und Summenzeile mit der gesamten vorgeschlagenen Menge.
  • Bestellvorschlag: Datenabruf-Fehler führen jetzt zu einer klaren Fehlermeldung statt still zu einem viel zu hohen Vorschlag (Bestand wurde als 0 gewertet).
  • Bestellvorschlag: Bei Lieferanten mit sehr vielen Artikeln wurden Bestände/Zulauf/Einkaufsliste durch technische Limits still abgeschnitten — alle Abfragen laufen jetzt gestückelt und vollständig.
v1.133.0052026-07-05
  • Sellerboard Ist-Kosten-Toggle: Beschreibung stellt klar, dass Einkaufspreise immer aus Flowkom kommen (manueller EK → FIFO → Lieferanten-EK, nie Sellerboard-EK) und der Versand im Ist-Modus nur für FBM-Aufträge zählt
v1.133.0032026-07-05
  • Profitbutler Kanal-Tabelle: jede Zeile (inkl. Amazon-Marktplätze) klappt zur Berechnungs-Aufstellung auf — Umsatz, Stornos, Waren, Versand, Verpackung, Pick&Pack, Amazon-Gebühren, Werbung, USt = Gewinn, jede Kostenzeile mit Herkunfts-Kennzeichnung (Ist aus Sellerboard / Soll-Modell / Mischung mit Tage-Verteilung); Erstattungen als nachrichtliche Zeile mit Hinweis zum Sellerboard-Vergleich
v1.133.0022026-07-05
  • Profitbutler Ist-Kosten: FBA-Auslandsaufträge buchten Phantom-Versandkosten der Produkt-Standard-Versandart (FR/IT erschienen fälschlich defizitär, obwohl Sellerboard Gewinn zeigt) — Versand zählt im Ist-Modus jetzt nur noch für echte FBM-Aufträge; FR/IT nach Neuberechnung positiv und konsistent zur Sellerboard-GuV
v1.133.0002026-07-05
  • Profitbutler: Echte Amazon-Kosten (Sellerboard) per Schalter — ersetzt Soll-Provision durch echte Amazon-Gebühren (inkl. FBA-Fulfillment) und Soll-Werbung durch echte Ads-Kosten je Tag und Marktplatz; Verpackung/Pick&Pack zählen nur noch für FBM; Badge „Amazon: Ist-Kosten“ zeigt die Abdeckung, Tage ohne Sellerboard-Daten bleiben ehrlich auf Soll; vollständig abschaltbar (automatische Neuberechnung der letzten ~90 Tage beim Umschalten)
v1.132.0032026-07-04
  • Profitbutler Versand-Tab: Mitarbeiter-Zeile „Ohne Zuordnung“ heißt jetzt „Manuell erfasst (z. B. Dropship)“ — es sind ausschließlich von Hand eingetragene Trackingnummern; Fußnote erklärt FBA-Zählung und Manuell-erfasst-Semantik
v1.132.0022026-07-04
  • Profitbutler Versand-Tab: FBA-Kachel zählte massiv zu wenig (shipped_at ist für FBA ein Import-Artefakt — jetzt Zählung über Bestelldatum, nicht storniert; Jahr: 53.161 statt 15.096)
  • Profitbutler Versand-Tab: Ø Sendungen/Tag rechnet jetzt ab der ersten Sendung im Zeitraum (Versand-Go-live 01.04.2026) statt über die volle Periodenlänge — Kachel weist „seit …“ aus
v1.132.0002026-07-04
  • Profitbutler: Perioden-Vergleich (vs. Vorperiode / vs. Vorjahr) in Artikel- und Regionen-Tab — Delta-Anzeigen unter Umsatz/Gewinn, Steiger/Faller-Sortierung per „Δ Umsatz“-Spalte
v1.131.0002026-07-04
  • Bestandsbewertung: Ladenhüter-Auswertung — neue Spalten Absatz/Tag (alle Kanäle, Fenster wählbar), Reichweite und Letzter Verkauf; Schalter „Nur Ladenhüter“ mit gebundenem Kapital
v1.130.0002026-07-04
  • Profitbutler: Schalter „Retouren einrechnen“ in Artikel- und Regionen-Tab — Gewinn/Marge wahlweise nach Retouren (USt-korrigierter Netto-Abzug)
v1.129.0002026-07-04
  • Profitbutler: neuer Tab „Versand“ — Sendungen je Versandart (DHL Paket, Kleinpaket, Briefe, FBA, Zusatz-/Retouren-Labels, manuelles Tracking) und je Mitarbeiter (Sendungen, aktive Tage, Ø/Tag), rückwirkend auswertbar
v1.128.0002026-07-04
  • Profitbutler/Versandarten: Versandkosten für alle Lieferländer konfigurierbar (16→40 Länder, u.a. Österreich/Schweiz ergänzt) + Fallback-Satz „Übrige Länder“ — unkonfigurierte Länder rechneten still mit 0 € Versand (Gewinn überzeichnet)
v1.127.0022026-07-04
  • Profitbutler: Retouren-Quote in % — Artikel- und Regionen-Tab zeigen unter dem Retouren-Betrag jetzt die Quote (Retouren ÷ Brutto-Umsatz, z.B. „149× · 2,9 %“)
  • Profitbutler: Benutzerdefinierter Zeitraum — Zeitraum-Auswahl in Artikel- und Regionen-Tab um „Benutzerdefiniert…“ (Von/Bis-Datum) erweitert; wirkt auch auf Ausklappen/Drilldown
v1.126.0022026-07-04
  • PROJ-499 Kundensuche deutlich schneller — Die Suche in der Kundenverwaltung dauerte bei großem Kundenstamm mehrere Sekunden. Ursache war (wie bei der Auftragssuche) die zeilenweise Rechteprüfung über zehntausende Kunden, nicht die Datenmenge. Neue Datenbank-Funktion (search_customers) übernimmt Suche und alle Filter in einer optimierten Abfrage — erwartete Antwortzeit im Bereich von Millisekunden statt Sekunden. Umschaltbar per Feature-Flag mit automatischem Rückfall auf den bisherigen Pfad.
v1.126.0012026-07-04
  • PROJ-500 Kundenstatistik & -bestellliste bei Vielbestellern vollständig — Der Profitbutler-Tab und die Bestellliste der Kundendetailseite lasen alle Kundenbestellungen ungecappt und trafen still die PostgREST-Zeilengrenze (10.000): Umsatz, Bestellzahl und Retouren-Quote waren bei sehr aktiven Kunden zu niedrig, das Datum der letzten Bestellung teils falsch, und die Top-Artikel blieben ab ~400 Bestellungen ganz leer (URL-Limit). Jetzt sauber paginiert und gebündelt — vollständige, korrekte Zahlen. Reiner Robustheits-Fix, keine Migration.
v1.126.0002026-07-04
  • PROJ-498 Profitbutler Retouren sauber: artikelscharfe Attribution + Retouren-Spalten — Bugfix: eine 30-EUR-Auftrags-Erstattung erschien voll auf einem 12-EUR-Artikel (Produktdetail-Retouren + Retouren-Tab buchten den vollen Auftragsbetrag pro Artikel), und ~90 % der Erstattungen (Amazon-Pull, Teilerstattungen) fehlten in der Artikel-Sicht komplett. Jetzt wird der Erstattungsbetrag anteilig nach Positionswert auf die Artikel verteilt und pro Artikel auf dessen Warenwert gekappt. Neu: sortierbare Spalte 'Retouren' im Artikel-Tab (artikelscharf) und im Regionen-Tab (je Lieferland); Artikel lassen sich aus dem Artikel-Tab direkt in neuem Tab oeffnen (Titel-Link + Breakdown-Link). Teilerstattungen schreiben ab jetzt die betroffenen Artikel + den Verkaufskanal mit; Bestandsdaten wurden per Migration nachgezogen (Kanalfilter der Retourenauswertung erfasst jetzt alle Eintraege).
v1.125.0022026-07-04
  • PROJ-497 Profitbutler: Netto-Umsaetze klar ausweisen (netto primaer) — durchgaengig war unklar, ob eine Umsatzzahl brutto oder netto ist. Jetzt zeigt der Profitbutler in allen Uebersichten (KPI-Kacheln, Artikel-Tab + Ausklappen, Kanal-Aufschluesselung, Regionen, Produktdetail-Auswertung) netto als grosse Primaerzahl mit Label 'netto' und brutto klein darunter (nur wenn USt > 0); Marge wird auf Netto-Basis gerechnet. Ausnahme wie vom Nutzer gewuenscht: die GuV/Preiskalkulations-Aufstellung bleibt brutto (dort wird die USt explizit als eigene Zeile abgezogen), das Umsatz-Chart bleibt brutto (Tooltip/Titel klar mit '(brutto)' gelabelt). Netto ist ueberall aus der bereits vorhandenen USt ableitbar (kein Re-Backfill): KPI = Umsatz minus USt-Kosten; Kanaele/Regionen aus den Tagesaggregaten bzw. echtem Beleg-Netto (subtotal_net) in der Rechnungen-Ansicht; Artikel/Regionen-RPCs um revenue_net erweitert. Adversariale Multi-Agent-Review (2 Runs, 7 bestaetigte Findings alle gefixt: u.a. Rechnungen-Kanaltabelle labelte brutto als netto, Artikel-Spalte sortierte nach brutto, Produktdetail-Regionen blieben brutto). Volle Testsuite gruen, live auf Produktion verifiziert (Regionen-RPCs liefern revenue_net, DE 98.135,92 EUR brutto -> 82.885,45 EUR netto).
v1.124.0022026-07-04
  • PROJ-496: Artikel-Auswertung Ausklappen deutlich schneller — Kanal-/Regionen-Aufschluesselung via SQL-Aggregation (RPC) statt Transfer tausender Positionen
v1.124.001
  • Brainflow: Seiten lassen sich jetzt auch zwischen zwei Geschwister einsortieren (nicht nur an Anfang/Ende der Liste)
  • Brainflow: Verschieben einer Seite unter eine Papierkorb-Seite wird verhindert (schützt vor unbeabsichtigtem Löschen)
v1.124.0002026-07-04
  • PROJ-495: Profitbutler-Tab Artikel - Zeilen ausklappbar mit Aufschluesselung nach Verkaufskanal (Amazon-Marktplaetze gruppiert) und Lieferland je Artikel, plus Link zum Produktdetail
v1.123.0022026-07-04
  • PROJ-494: Produkt-Auswertung (Profitbutler-Subtab) artikelscharf + skalierbar — Timeout/500 bei Top-Artikeln behoben (datumsbegrenzte Join-Query statt Alle-Zeiten-Batch-Kaskade); Umsatz/Kosten jetzt nur aus den Positionen des Artikels, echte Kanal-Kosten, Fixkosten = 0 bei Produktfilter, UI-Fußnote
v1.123.000
  • Profitbutler Regionen-Tab: Gewinn + Marge pro Lieferland (neue Regionen-Tagesaggregate, gleiche Kosten-Engine wie Kanal-Tabelle) (PROJ-490)
  • Profitbutler KPI-Kacheln: Vergleich zur Vorperiode — ▲/▼ x % Umsatz-Delta pro Zeitraum (PROJ-492)
  • Profitbutler: neuer Tab 'Artikel' — sortierbare Top/Flop-Liste über alle Kanäle (Einheiten, Umsatz, Gewinn, Marge, Anteil) mit Suche + Filtern (PROJ-493)
  • Regionen-Top-Artikel: Service-Artikel (Versandpositionen) werden nicht mehr angezeigt (PROJ-491)
v1.122.000
  • Brainflow mobil: Seitenbaum, Suche und Papierkorb als einblendbare Navigation (Sheet) auf kleinen Bildschirmen
  • Brainflow: Seiten im Baum per Drag & Drop verschachteln und umsortieren
  • Brainflow: Papierkorb-Seiten werden nach 30 Tagen automatisch endgültig gelöscht
  • Brainflow: Hilfeseiten in der Dokumentation ergänzt (Editor-Hilfe-Symbol)
v1.121.001
  • Brainflow: Inline-Suche in der Seitenleiste (Titel-Treffer oben, Inhalts-Treffer mit Vorschau darunter, ⌘K) statt Such-Dialog; Seitenleiste einklappbar und in der Breite verstellbar
v1.121.000
  • Produkt-Auswertung (Profitbutler im Artikel): neue Sektion 'Auswertung nach Region' — Einheiten, Umsatz und Gewinn des Artikels pro Lieferland (Flagge, Anteils-Balken, farbcodierte Marge, Zeitraum-Tabs) (PROJ-484)
  • Produkt-Auswertung: KPI-Kacheln (Umsatz/Gewinn/Marge/Bestellungen je Zeitraum) über dem Chart wie auf der Profitbutler-Hauptseite (PROJ-484)
v1.120.000
  • Brainflow privates Freigabemodell (PROJ-483): Neue Seiten sind privat, Zugriff wird explizit freigegeben — an Personen, „Alle Admins" oder „Alle Mitglieder", mit Lesen/Bearbeiten; neuer Teilen-Dialog zeigt effektive Freigaben inkl. Vererbung
  • Brainflow: Ansichts-Typ nachträglich wechselbar (In Tabelle/Board/Zeitleiste umwandeln); Datums-Zeiträume aus der Zeitleiste wurden in Tabelle/Panel leer angezeigt; ⌘K-Suchfeld, kompaktere Toolbar, dezenter Sammlungs-Toggle
v1.119.001
  • Profitbutler: Umsatz-Chart mit gestapelten Balken nach Verkaufskanal — Top-3-Kanäle farblich (Amazon kumuliert, Otto, eBay) + Sonstige, Legende & Multi-Serien-Tooltip; Wachstum/Stagnation pro Marktplatz auf einen Blick (PROJ-482)
v1.119.000
  • Brainflow PM-Views (PROJ-481): Sammlungen mit benannten Ansichten — Kanban-Board (Drag & Drop nach Status/Auswahl) und Zeitleiste (Balken verschieben/dehnen, Zoom, Heute-Linie, Ungeplant-Liste); Datums-Felder optional mit Start/Ende
v1.118.000
  • Brainflow Berechtigungen pro Seite (PROJ-480): Seiten einschränkbar auf Personen oder „Alle Admins" mit Lesen/Schreiben, Vererbung auf Unterseiten, Teilen-Dialog, Read-only-Modus
v1.117.001
  • Brainflow: URL-Property rendert Links nur noch bei http(s)-Schema (XSS-Absicherung des optimistischen UI)
v1.117.000
  • Brainflow Sammlungen & Properties (PROJ-479): Seiten als Sammlung markierbar — eigene Felder (Auswahl, Status, Datum, URL, Text, Zahl u.a.) für Unterseiten, filterbare/sortierbare Tabelle mit Inline-Bearbeitung, Property-Panel auf Unterseiten
v1.116.002
  • Brainflow: Kontextmenü im Seitenbaum öffnete oben links statt am Button (Anker-Verlust bei group-hover) — gefixt
v1.116.001
  • Brainflow (PROJ-476): Neues Notizen- & Wiki-Modul — Seitenbaum mit Unterseiten, Notion-artiger Block-Editor (Slash-Befehle, Bilder, Autosave), Volltextsuche, Papierkorb; per Workspace-Schalter aktivierbar (Einstellungen → Allgemein)
v1.115.004
  • Profitbutler: Kanal-Aufschluesselung zeigt Amazon kumuliert als aufklappbare Sammelzeile mit den einzelnen Marktplaetzen (PROJ-478)
v1.115.003
  • Profitbutler: Umsaetze jetzt korrekt BRUTTO (vorher netto mit faelschlichem USt-Abzug - Gewinn war ~16% vom Umsatz zu niedrig); USt exakt pro Position mit laenderspezifischen Steuersaetzen; Rechnungen-Ansicht repariert (PROJ-477)
v1.115.000
  • Profitbutler: Uebersichtlicheres Dashboard - KPI-Kacheln (Heute/Gestern/7T/30T), Kanal-Aufschluesselung als Tabelle mit echten Margen und Anteils-Balken, praezisere Zeitraum-Labels (PROJ-475)
v1.114.002
  • Profitbutler: Neuer Tab Regionen - Umsatz, Bestellungen, Einheiten und Top-Artikel pro Lieferland mit Zeitraum- und Kanal-Filter (PROJ-474)
v1.113.008
  • Profitbutler: Umsätze/Chart/Kanäle zeigen wieder alle Bestellungen (stiller 10.000-Zeilen-Cap behoben, ~45% fehlender Umsatz in 30/90-Tage-Ansichten) und die Kanal-Aufschlüsselung rechnet mit echten Margen statt Pauschalfaktor (PROJ-473)
v1.113.006
  • Profitbutler: Tagesaggregation rechnet jetzt ein rollierendes 21-Tage-Fenster neu — nachträglich importierte Amazon-Bestellungen fehlen nicht mehr in den Statistiken (PROJ-472)
v1.113.0042026-07-03
  • Interne Aufraeumung: ungenutzte Lint-Direktive in der Logs-Seite entfernt (kein sichtbares Verhalten).
v1.113.0022026-07-03
  • Team-Verwaltung: Hinweis ergaenzt, dass die Rollentrennung zwischen Admin und Mitarbeiter noch nicht vollstaendig durchgesetzt ist — Mitarbeiter-Zugaenge nur an vertrauenswuerdige Personen vergeben.
v1.113.000
  • PPC-Butler Varianten-Familien: Sellerboard-Kennzahlen optional umsatzgewichtet über Varianten-Familien aggregiert (Opt-in-Toggle + Modus 'Alle Sellerboard-Quellen' / 'Pro Mapping wählbar') — behebt Phantom-Margen durch Sellerboards Werbekosten-Attribution auf die beworbene Variante.
  • Varianten-Familien-Verwaltung in der PPC-Butler-Integration: Auto-Familien aus Eltern/Kind-Artikeln, bearbeiten/auflösen/manuell anlegen, Reset auf Flowkom-Stand (pro Familie + global), 30d-Familien-Marge sichtbar.
v1.112.0002026-07-03
  • Logs-Bereich (Einstellungen) ist jetzt nur noch auf der Betreiber-Instanz sichtbar — auf Kundeninstanzen sind Tab, Seite und alle Log-APIs deaktiviert (Betreiber-Interna, u.a. systemweite Cleanup-Protokolle).
  • Manuelles Ausführen von Cron-Jobs ist jetzt auf die Betreiber-Instanz beschränkt und erfordert eine echte Admin-Rolle.
v1.111.001
  • PPC-Butler Mapping-Dialog: Datenquellen-Liste scrollt jetzt korrekt (Popover im Dialog).
v1.111.000
  • PPC-Butler Mapping-Dialog: Datenquellen-Auswahl mit Suchfeld; jede Quelle trägt die Daten-Herkunft im Namen (Flowkom / Sellerboard / kombiniert); aufklappbare Formel-Beispiele mit Erklärung (Sicherheitspuffer, Deckel, Korridor, …); echte Umlaute in allen PPC-Butler-Texten.
v1.110.000
  • Sellerboard-Import robuster: kurzzeitige Abruf-Fehler der Report-Links werden automatisch wiederholt; die Import-Meldung zeigt das Ergebnis je Quelle (EU/USA) ehrlich an.
v1.109.000
  • Sellerboard SKU-Zuordnung: Auto-Zuordnen kann jetzt zusätzlich über die ASIN mappen (nur eindeutige Treffer) — für Konten, deren Sellerboard-SKUs von den Flowkom-SKUs abweichen. Die Karte erklärt jetzt die Match-Reihenfolge.
v1.108.000
  • Sellerboard-Einstellungen: Report-URLs werden maskiert angezeigt (Zugriffs-Tokens nicht mehr im Klartext, Auge-Symbol zum Einblenden); EU- und USA-Quelle in einer Karte — Speichern/Importieren gilt sichtbar für beide.
v1.107.000
  • Sellerboard USA: Der US-Account (eigener Report-Link) lässt sich als zweite Quelle an der bestehenden Sellerboard-Integration hinterlegen (Einstellungen → Sellerboard USA). US-Daten fließen in USD in den Sellerboard-Tab (Amazon.us-Filter zeigt $), in den EK-Vergleich und als PPC-Butler-Datenquelle; eigener „EK-Export USA"-Button schreibt den Flowkom-EK mit ECB-Tageskurs in USD.
  • Integration hinzufügen: Sellerboard und PPC Butler zeigen „Bereits verbunden" statt eines Fehlers, wenn schon eine Verbindung existiert.
v1.106.000
  • PPC-Butler: „Alle Marktplätze (Gesamt)" als Datenquelle — Sellerboard-Kennzahlen (TACoS, ACoS, Marge, Umsatz, …) über alle Marktplätze aggregiert an jedes Butler-Profil pushen. Neue oberste Option im Datenquelle-Marktplatz-Auswahlfeld des Mapping-Dialogs.
v1.105.1692026-07-03
  • Zeitgesteuerte Workflows (Fallback-Rechnungen, Versendete→abgeschlossen, FBA-Tag) laufen wieder: Order-Scan mit Condition-Vorfilterung statt 64k-Full-Scan (Timeout-Kill an der 300s-Grenze behoben), Cron-Timeout mit echtem Abbruch statt Hintergrund-Zombie
v1.105.167
  • PPC-Butler Multi-Marktplatz: Sellerboard-Datenquelle vom Ziel-Profil entkoppelt — pro Mapping optional wählbar, aus welchem Marktplatz die Sellerboard-Zahlen kommen (z.B. DE-TACoS ins FR-Butler-Profil pushen). Standard = gleiches Land wie das Ziel-Profil (unverändertes Verhalten). Neuer editierbarer „Datenquelle-Marktplatz"-Auswahl im Mapping-Dialog.
v1.105.161
  • PPC-Butler Produkt-Detail: Marktplatz-Subtabs (DE/FR/…) erscheinen jetzt für jeden aktiven Marktplatz — vorher wurde ein Tab nur bei einem marktplatz-eigenen Amazon-Listing gezeigt, wodurch FR bei Produkten mit geteilter EU-ASIN (nur DE-Listing) fehlte, obwohl der Sync FR bereits bedient. (PROJ-460)
v1.105.160
  • PPC-Butler Marktplatz-Discovery reparariert: Profile werden korrekt über GET /Groups + GET /Groups/{id} (Feld countryCode) statt dem leeren POST /Groups/search abgerufen; und die aktiven Marktplätze kommen jetzt aus der Datenbank statt aus der Live-Discovery — dadurch verschwand das bereits aktive DE-Profil nicht mehr und die Variablen-/Mappings-Liste lädt wieder (statt ewig zu hängen). Gegen das echte Konto verifiziert (FR + DE). (PROJ-460)
v1.105.159
  • PPC-Butler Marktplatz-Discovery: "nicht erreichbar: e.map is not a function" behoben — die Profiles-Service-Antwort (Groups/search) ist ein Envelope-Objekt statt Array; Parsing jetzt tolerant (Array/items/groups) mit Diagnose-Fehlermeldung bei unbekanntem Format. (PROJ-460)
v1.105.157
  • PPC-Butler KPI-Voll-Katalog (Teil 2 von 2): 17 neue Mapping-Datenquellen — Bestand-Split (FBA/FBM/je Lager einzeln), kompletter Sellerboard-Katalog je Marktplatz und Zeitfenster (Absatz, Velocity, Umsatz, Organic-Anteil, Conversion-Rate, Sessions, Retouren-Quote, Werbekosten, Amazon-Gebühren, Netto-Gewinn, ROI, Auszahlung) und Lagerreichweite/Days-of-Supply (gesamt + FBA). Gruppiertes Quellen-Dropdown, Lager-Auswahl, Sellerboard-Staleness-Alarm. (PROJ-460)
v1.105.148
  • PPC-Butler Multi-Marktplatz-Steuerung (Teil 1 von 2): eine Butler-Verbindung steuert jetzt N Amazon-Marktplatz-Profile statt nur DE. Auto-Discovery der Butler-Profile, pro Marktplatz ein eigenes/unabhängiges Mapping-Set (mit „Von-Marktplatz-kopieren"-Button), Sync-Loop je Marktplatz an das jeweilige Profil mit der Landes-ASIN, und Marktplatz-Subtabs (DE/FR/…) im Produkt-Detail. Baut auf Sellerboard-Profitdaten (12 Marktplätze). (PROJ-459)
v1.105.128
  • Shopify: Zahlungsstatus-Rückmeldung (mark-as-paid) — wird ein unbezahlt importierter Shopify-Auftrag (Vorkasse/Rechnung/Überweisung) in Flowkom manuell auf „Bezahlt“ gesetzt, meldet Flowkom den Zahlungseingang via orderMarkAsPaid an Shopify zurück. Pro Shopify-Integration ein-/ausschaltbar (Default aus); bereits bezahlte Aufträge werden übersprungen, Fehler erzeugen eine Benachrichtigung, der lokale Bezahlt-Status bleibt immer erhalten. (PROJ-458)
v1.105.124
  • Security-Härtung: anon/public-EXECUTE von den Auftragssuche-RPCs (jetzt SECURITY DEFINER) entfernt — nur eingeloggte Nutzer + Service-Role dürfen ausführen (Konsistenz mit dem Multi-Tenant-Isolations-Baseline).
v1.105.123
  • Kundenaufträge-Suche scharf geschaltet: der schnelle Such-RPC (PROJ-455) ist jetzt Default — Suche & Statistik laden in ~0,1–0,3 s statt 4–10 s. Sofort-Rollback per ENV USE_ORDER_SEARCH_RPC=false möglich.
v1.105.122
  • Kundenaufträge-Suche & -Statistik: Performance-Fix der Such-RPCs (SECURITY DEFINER + jit=off statt per-Zeilen-RLS) — search_orders 1,2–5 s → 60–260 ms, get_order_stats 2,2 s → ~130 ms unter echter Auth, an Production gemessen. Reine SQL-Migration, additiv/dormant hinter Flag USE_ORDER_SEARCH_RPC; Aktivierung des Live-Gewinns ist ein separater Ops-Schritt.
v1.105.120
  • Shopify-Verbinden/Credentials: echte Fehlerursache wird angezeigt (z.B. fehlender Service-Role-/Encryption-Key) statt generischer Meldungen — Onboarding-Diagnose statt Rätselraten.
v1.105.119
  • Dev-Tools-Cleanup bekommt ein Rate-Limit (10/min pro User) — schützt den destruktiven Workspace-Reset (PROJ-452) vor versehentlichen/automatisierten Loops.
v1.105.118
  • Sicherheit: Dev-Tools-Cleanup (dev_cleanup) ist jetzt strikt workspace-sicher — löscht ausschließlich Daten des eigenen Workspace (vorher TRUNCATE über ALLE Mandanten). Kunden können ihren eigenen Workspace zurücksetzen (prod-404-Sperre entfernt), nur Admins, empirisch 2-Mandanten-bewiesen.
v1.105.117
  • Integrationen: Legacy-Shopify-Connect-Karte entfernt — Shopify wird nur noch über "Integration hinzufügen" mit eigenen App-Credentials verbunden (Legacy-env-OAuth-Karte + toter Cron-Link raus; DHL/Post/Cloud unverändert).
v1.105.116
  • Workspace-Erstellen-Seite: Abmelden-Ausweg (Sackgassen-Bugfix). Beim ersten Login (User angelegt, noch kein Workspace) landet man auf der Workspace-Erstellen-Seite, die ihr eigenes Vollbild-Layout ohne Sidebar rendert -> es gab kein Logout, man sass fest (z.B. falsches Konto). Fix: dezenter Abmelden-Button mit dem etablierten signOut-Pattern (-> /login). Eine Datei, kein DB-/API-Touch, 2 jsdom-Render-Tests (PROJ-450)
v1.105.115
  • Operator-Deployment-Flag + Cron-Tab als Operator-only (Security, Multi-Tenant): GET /api/settings/cron gab das deployment-weite CRON_SECRET an jeden Workspace-Admin zurueck und der Cron-Jobs-Tab war fuer alle sichtbar -> auf der geteilten Kunden-Instanz konnte ein Kunden-Admin das Secret auslesen und damit alle Cron-Endpoints (die ueber alle Workspaces auffaechern) triggern = Cross-Tenant-Exposure. Fix per Deployment-Flag NEXT_PUBLIC_OPERATOR_DEPLOYMENT (secure-by-default): cron_secret nur auf Operator-Deployment ausgegeben, Cron-Tab + Page sonst gesperrt. Gleicher Code auf beiden Deployments, nur der env-Wert unterscheidet (Pixkom Live=true als Build-Variable, Kunden-Instanz unset). Erster Konsument des Operator-Schalters fuer 'erst intern testen'-Features. 7 Vitest-Specs, kein DB-/Schema-Touch (PROJ-449)
v1.105.114
  • authenticated-IDOR auf SECURITY-DEFINER-Helfern geschlossen (Abschluss Multi-Tenant-Härtung PROJ-444–448): anon war zu, aber ~25 DEFINER-Fns, die eingeloggte Nutzer ausführen dürfen, vertrauten einem mitgegebenen workspace_id/Entity-UUID ohne is_workspace_member-Guard → ein Member von Mandant A mit Kenntnis von B's UUIDs konnte fremde Daten mutieren (FBA-Stock, Workflows, Varianten, Kanban, Nummernkreise), minimal lesen oder stören. Fix: 11 user-erreichbare Fns mit in-body is_workspace_member-Guard (service_role/Cron + legitimer Member passieren, fremder Member 42501), 14 admin-/trigger-only Fns von authenticated/anon/public revoked. Dry-Run + Live-Endzustand gegen die echte Kunden-DB verifiziert (Guard-Set 11 geguarded, REVOKE-Set authenticated=0). Reine SQL-Migration, kein App-Code-Change (PROJ-448)
v1.105.112
  • anon EXECUTE deny-by-default auf public SECURITY-DEFINER-Funktionen (Abschluss der Multi-Tenant-Härtung PROJ-444–447): zweite Ebene geschlossen — jede verbleibende anon-ausführbare DEFINER-Funktion OHNE workspace_id-Param, die Mandanten-Daten per client-id mutiert/liest (Pickliste löschen/abschließen/ausbuchen, Varianten-Attribute, Produkt-Cascade-Move, Workflow-Ausführung, Replenishment, Sync-Locks u.a.), für anon/public gesperrt. Allowlist nur für intentional-anon (RLS/Auth-Helper, Print-Broker/Workstation-Token, Workspace-Einladung annehmen). Empirisch gegen die echte Kunden-DB verifiziert (16 Funktionen revoked, Allowlist erhalten) → anon-Vektor auf DEFINER-RPCs vollständig zu (PROJ-447)
v1.105.111
  • anon/PUBLIC aus workspace-gescopten SECURITY-DEFINER-RPCs ausgesperrt (vom Live-Go-Live-Gate gefunden): diese Supabase default-granted anon EXECUTE auf Funktionen → mit dem öffentlichen anon-Key konnte jeder Ausgeloggte workspace-RPCs direkt per PostgREST aufrufen (DEFINER umgeht RLS), inkl. dev_cleanup=TRUNCATE-aller-Mandanten (CRITICAL) und der auth.uid()-Guard-Bypass-RPCs. Grants-only-Migration: dev_cleanup→service_role-only, anon/public REVOKE auf alle workspace-DEFINER-RPCs, RLS-Helper + Workstation-Token unangetastet. Empirisch gegen die echte DB verifiziert (PROJ-446)
v1.105.110
  • Billkom-Finalization-RPCs (billkom_finalize_document + billkom_apply_corrective_edit) gegen Cross-Tenant-IDOR + anon-Pfad abgesichert: waren SECURITY DEFINER mit Default-PUBLIC-EXECUTE und client-geliefertem workspace_id ohne Guard → Member von A (oder ausgeloggter anon) konnte fremde GoBD-Belege finalisieren/korrektur-editieren. 5 Caller-Routen auf Service-Role-Admin-Client umgestellt (GoBD-SQL unangetastet) + REVOKE authenticated/anon/public (PROJ-445)
v1.105.109
  • Multi-Tenant-Workspace-Isolation gehärtet (vor 2. Mandant in geteilter Supabase-DB): 4 Cross-Tenant-Defekte im RLS-umgehenden Service-Role/SECURITY-DEFINER-Pfad geschlossen — billkom_reset_all gedroppt (Global-GoBD-Wipe), dev-tools/cleanup in Prod 404 + Admin-Gate, is_workspace_member-Guards auf update_purchase_order_costs & create_purchase_order_from_csv, Amazon-Versandbestätigungs-Preview workspace-scoped. Plus Defense-in-Depth: sync_log_orders INSERT-Policy, REVOKE auf 3 service-role-only DEFINER-RPCs, accepted-Gate auf 3 Policies, profitbutler-Aggregat-Cron über alle Workspaces (PROJ-444)
v1.105.107
  • Varianten-Liste im Elternartikel zeigt jetzt das Bild jedes Kind-Artikels (PROJ-443)
v1.105.106
  • Produkt-Foto-Upload aktiviert jetzt den Speichern-Button (Bild-Änderung wird als ungespeicherte Änderung erkannt; PROJ-442)
v1.105.105
  • Shopify-Push: verbotene " / "-Zeichenfolge in Varianten-Attributnamen wird jetzt blockiert (klare Fehlermeldung statt rohem Shopify-Fehler; PROJ-441)
v1.105.1032026-06-28
  • PPC Butler: Läuft die Verbindung ab (der Zugang gilt ~30 Tage), gibt es jetzt einen „Erneut anmelden"-Button — einmal das PPC-Butler-Passwort eingeben und die Verbindung ist erneuert. Deine Variablen-Zuordnungen bleiben dabei erhalten (kein Trennen und neu Einrichten mehr nötig).
  • PPC Butler: Schlägt ein Sync fehl, bekommen Admins jetzt eine Benachrichtigung in der Glocke mit direktem Link zur Integration — vorher blieb ein Ausfall unbemerkt.
  • PPC Butler: Ein abgelaufener Zugang wird jetzt klar als „Anmeldung abgelaufen" mit Reconnect-Hinweis angezeigt, statt einer irreführenden „nicht erreichbar"-Meldung.
v1.105.1002026-06-27
  • Amazon-Erstattungen: Der zusätzliche Nachlauf-Abgleich (fängt spät oder rückdatiert gebuchte Erstattungen) läuft jetzt automatisch im bestehenden Erstattungs-Cron mit — keine zusätzliche Cron-Einrichtung nötig.
v1.105.0962026-06-26
  • PROJ-438: Amazon-Erstattungen — der automatische Abruf von Erstattungen aus Amazon hing bei großen Konten dauerhaft 2–4 Tage hinterher und konnte einzelne Erstattungen ganz übersehen. Behoben: Erstattungen werden jetzt zuverlässig und zeitnah in Flowkom übernommen; ein zusätzlicher Nachlauf-Abgleich fängt auch solche, die Amazon verspätet oder rückdatiert bucht.
v1.105.0942026-06-25
  • PROJ-437 (zurückgenommen): Der Versuch, die Auftragssuche standardmäßig auf den schnellen Pfad umzustellen, führte zu einem Ladeproblem auf der Kundenaufträge-Seite und wurde umgehend zurückgerollt. Kein bleibender Effekt — die Suche läuft wie zuvor. Die Beschleunigung wird in einer separaten Session sauber nachgezogen (mit Test auf App-Ebene, nicht nur in der Datenbank).
v1.105.0922026-06-23
  • PROJ-436: Auftragssuche-Hotfix — nach Aktivierung des schnellen Such-Pfads warf die Suche bei jedem Aufruf einen Fehler (ein versehentliches Sonderzeichen in einem Code-Kommentar brach die Such-Funktion zur Laufzeit) und war bei sehr kurzen/breiten Suchbegriffen extrem langsam (bis ~90 s). Beides behoben: Suche läuft wieder fehlerfrei und schnell, breite Begriffe wieder im Sekundenbruchteil-Bereich. Direkt auf Production eingespielt und live verifiziert.
v1.105.0902026-06-22
  • PROJ-435: Auftragssuche-Performance vorbereitet — der schnelle Such-/Statistik-Pfad (RPC) wurde um die Sendungsnummer-Suche erweitert und damit aktivierungsreif gemacht (auf echten Produktionsdaten gemessen: Liste laden 4× schneller, Auftrags-Statistiken 16 Abfragen → 1, Suche ~7× schneller). Sofort live: die Auftragsliste cached kurz (30 s), spart unnötige Nachladevorgänge. Die volle Beschleunigung wird per Schalter scharf geschaltet (separater Betriebsschritt, sofort rückrollbar).
v1.105.0862026-06-21
  • PROJ-434: Kundenaufträge lassen sich jetzt über die Sendungsnummer (Tracking-Nr.) finden — neuer Suchbereich „Nur Sendungsnr.“ und zusätzlich in „Überall suchen“ integriert. Volle Nummer einfügen oder scannen findet den zugehörigen Auftrag (deckt Versand-Tracking, Retouren und manuell hinterlegtes Tracking ab).
v1.105.0782026-06-18
  • PROJ-433: Beim Ausbuchen einer manuellen Pickliste mit vielen Positionen ließ sich der Bestätigungs-Dialog nicht abschließen — die Schaltflächen „Abbrechen“ und „Ausbuchen & Abschließen“ lagen außerhalb des sichtbaren Bereichs und waren nicht erreichbar. Der Dialog hat jetzt eine Maximalhöhe und scrollt, sodass die Buttons bei beliebig vielen Positionen immer erreichbar bleiben.
v1.105.0742026-06-17
  • PROJ-432: Im Produktdetail unter „Plattformen“ gibt es jetzt pro Plattform (Amazon, Shopify) einen Button „Bestand übertragen“. Ein Klick übergibt den aktuellen Bestand dieses Artikels sofort an die Sync-Warteschlange der jeweiligen Plattform — praktisch direkt nach dem Verknüpfen eines neuen Listings, damit der Marktplatz nicht erst auf den nächsten automatischen Bestandsabgleich warten muss.
v1.105.0582026-06-16
  • PROJ-429: In der Fortschritts-Matrix von Eltern-Artikeln gibt es jetzt pro Verkaufskanal (Amazon, eBay, Kaufland, …) eine „Alle auswählen"-Checkbox direkt im Spaltenkopf. Ein Klick hakt alle Varianten dieses Kanals auf einmal ab oder entfernt alle — die Checkbox zeigt, ob alle, einige (Minus-Symbol) oder keine Variante gesetzt sind. Diese Sammel-Funktion gab es bereits, war aber als reine Spaltenüberschrift praktisch unsichtbar. Nebenbei: die „Alle auswählen"-Häkchen in Artikel-, Auftrags- und Amazon-Listen zeigen bei Teilauswahl jetzt korrekt ein Minus statt eines vollen Hakens.
v1.105.0572026-06-16
  • PROJ-421: Die Lieferantenbestellung-PDF zeigt jetzt die Zolltarifnummer (TARIC/HS-Code) jedes Artikels — direkt neben SKU und EAN (z. B. „SKU: 100071-001 | EAN: 4270003831161 | HS Code: 8714990000"). Die Beschriftung folgt der PDF-Sprache (deutsch „Zolltarifnr.", englisch „HS Code"); bei Artikeln ohne hinterlegte Zolltarifnummer bleibt die Zeile unverändert. Die Nummer wird am Artikel über die bestehende TARIC-Auswahl gepflegt.
v1.105.0562026-06-16
  • PROJ-428 (QA-Followup): Daten-Hub-Marke-Export gehärtet — Sortieren nach dem Feld „Marke" brach den Export ab (Fehler statt Datei); jetzt wird in DB-Reihenfolge exportiert. Außerdem treffen exakte Marke-Filter mit Sonderzeichen wie _ oder % jetzt nur noch die wirklich passende Marke statt fälschlich weitere.
v1.105.0552026-06-16
  • PROJ-428: Im Daten-Hub lässt sich die Marke eines Artikels jetzt exportieren und filtern. Bisher lieferte das Feld „Firma / Marke" beim Export überall leere Werte und der Filter „Marke = …" fand nichts — es zeigte auf ein falsches, leeres Feld statt auf die echte Marke. Neu gibt es ein eigenes Exportfeld „Marke" (das alte Feld heißt jetzt klarer „Firma"), und der Marke-Filter findet die passenden Artikel zuverlässig.
v1.105.0542026-06-16
  • Teilerstattung / Retoure: Bei Bestellungen mit mehreren Artikeln lassen sich jetzt einzelne zurückgesendete Artikel positionsgenau erstatten. Der Auftrag bleibt bestehen, und es wird eine Teilgutschrift über genau die gewählten Artikel (inkl. korrektem Steuersatz pro Position) erstellt.
  • Stornierung mit Teilbetrag: Wird beim Stornieren nur ein Teilbetrag erstattet, entsteht jetzt korrekt eine Teilgutschrift über genau diesen Betrag — vorher wurde fälschlich eine Vollgutschrift über den kompletten Auftragswert erstellt.
v1.105.0432026-06-15
  • PROJ-426: Beim Sellerboard-EK-Export lässt sich das Datum „Kostenperiode ab“ jetzt frei wählen (Standard: heute) und gilt für alle exportierten Artikel. Nach dem Export zeigt eine Meldung, wie viele Artikel einen Einkaufspreis bekommen haben und wie viele übersprungen wurden; ein separater „Diagnose“-Download nennt pro Artikel den Grund. Die hochzuladende Datei bleibt unverändert ein einzelnes Tabellenblatt.
  • PROJ-426: Der Sellerboard-Einkaufspreis-Export schreibt jetzt für deutlich mehr Artikel den Flowkom-Einkaufspreis. Bisher wurde über die Hälfte der Artikel beim Export übersprungen und behielt den alten Preis — betroffen war jeder Artikel, dessen Sellerboard-Zeile keinen ausdrücklichen Marktplatz enthält (z.B. Artikel 200268). Diese Zeilen werden jetzt korrekt mit dem FIFO-Einkaufspreis befüllt.
v1.105.0422026-06-15
  • Shopify-Bestellstatus-Sync: Das manuelle „Jetzt ausführen" in den Cron-Job-Einstellungen meldete bei vielen offenen Bestellungen den Fehler „Bad Gateway". Ursache: Der Sync arbeitet jede offene Bestellung einzeln ab und lief bei großem Rückstau länger als das Server-Timeout. Er startet jetzt im Hintergrund und das Ergebnis erscheint kurz darauf unter „Letzte Ausführung" — keine Fehlermeldung mehr. Der automatische (geplante) Sync war nicht betroffen.
v1.105.0402026-06-15
  • PROJ-424: Picklisten erscheinen wieder zuverlässig in der mobilen Scanner-App. Durch ein technisches Limit (zu lange Datenbank-Anfrage-URL bei vielen Picklisten/Bestellungen) lieferte die Picklisten-Abfrage ab einer bestimmten Menge gar keine offenen Picklisten mehr — die mobile Kommissionierungsliste war komplett leer. Behoben durch Aufteilen der Abfragen in kleine Pakete; die Liste bleibt vollständig, unabhängig von der Datenmenge.
v1.105.0382026-06-15
  • PROJ-423: Im Storno-Dialog erscheint der Haken „Ware wird zurückgesendet“ nur noch bei bereits versendeten Aufträgen. Vorher war er auch bei nie versendeten Aufträgen anwählbar und konnte einen Storno fälschlich als physische Rücksendung in die Profitbutler-Retourenauswertung buchen. Zusätzlich serverseitig abgesichert (API-Endpoint + Amazon-Erstattungs-Import), sodass eine Voll-Erstattung auf einem nie versendeten Auftrag nicht mehr als Rücksendung gezählt wird.
v1.105.0302026-06-10
  • Lieferantenbestellung: Der Hinweis „Keine Artikelmaße — Fracht nach Volumen" verschwindet jetzt korrekt, sobald für die Artikel Maße hinterlegt sind. Bisher blieb der Hinweis stehen und die Einstand-Vorschau rechnete fälschlich nach Menge, weil die Artikelmaße nicht ans Detail-Overlay geladen wurden — der tatsächlich gespeicherte Einstandspreis war dabei bereits korrekt nach Volumen berechnet.
v1.105.0292026-06-10
  • PROJ-417: Bestellungen zusammenfassen (Sammelpaket) — Mehrere offene Bestellungen desselben Empfängers zu einem Paket bündeln: ein Label, eine Tracking-Nr.; Mitglieder bleiben eigenständig und werden je Kanal (Amazon/eBay/Shopify) mit eindeutiger Tracking-Nr. bestätigt. Hinter Feature-Flag (per Einstellungen schaltbar).
v1.105.0062026-06-10
  • Admins können die Lieferadresse eines bereits abgeschlossenen oder stornierten Auftrags nachträglich korrigieren — als bewusster, protokollierter Override mit Warnhinweis. Die Änderung erscheint in der Auftragshistorie als Admin-Override samt optionalem Grund; normale Mitarbeiter bleiben für abgeschlossene Aufträge weiterhin gesperrt.
v1.105.0032026-06-09
  • DHL-Retourenlabel: Lieferadressen mit Hausnummer-Zusatz nach einem Leerzeichen (z. B. „Am Spottberg 8 B“ oder „Hauptstraße 12 a“) werden jetzt korrekt erkannt. Vorher schlug die Retourenlabel-Erstellung bei solchen Adressen mit „keine erkennbare Hausnummer“ fehl, obwohl das normale Versandlabel problemlos lief.
v1.105.000
  • PROJ-416: Sellerboard-Profitabilität (TACoS, echter ACoS, Marge, Gewinn/Stück × 7/14/30/60d+Lifetime) als 20 neue PPC-Butler-Produktvariablen — 1:1 aus sellerboard_daily pro Artikel (FBM+FBA summiert), marktplatz-getrennt, über den bestehenden täglichen PPC-Butler-Sync.
v1.104.0062026-06-04
  • Abschluss-Fixes EK-Export/Profitbutler: Retouren-Auswertung zeigt Top-Artikel-Namen wieder an (falscher Spaltenname behoben), und die Artikel-Auflösung im EK-Export ist bei sehr großen Katalogen robust (Paginierung statt stillem Abschneiden). Der Export trägt jetzt zuverlässig den Flowkom-FIFO-Einstandspreis für alle passenden Artikel ein.
v1.104.0052026-06-04
  • EK-Export für Sellerboard: Bei vielen Artikeln wurde der Flowkom-Einkaufspreis gar nicht übernommen — exportiert wurde überall der alte Sellerboard-Preis. Ursache war ein technisches Limit bei der internen Preis-Abfrage über sehr viele Artikel auf einmal. Behoben; der Export trägt jetzt für alle Artikel den korrekten Flowkom-FIFO-Einstandspreis ein.
v1.104.0042026-06-04
  • EK-Export für Sellerboard: (1) Die Datei wird jetzt als Excel (.xlsx) erzeugt — direkt in Sellerboard hochladbar. (2) Artikel, die nur als Basis-SKU im Einkaufspreise-Report stehen (ohne Tagesverkäufe), bekamen fälschlich den alten Sellerboard-Einkaufspreis statt des Flowkom-FIFO-Preises — jetzt werden alle Report-SKUs korrekt dem Flowkom-Artikel zugeordnet. (3) Das Gültig-ab-Datum (CostPeriodStartDate) wird beim Preis-Update automatisch auf heute gesetzt.
v1.104.0022026-06-04
  • Sellerboard-SKU-Zuordnung: zugeordnete Artikel zeigten in der Tabelle "??" statt SKU und Name. Ursache war ein falscher Spaltenname beim Laden der Artikeldaten — behoben, jetzt werden SKU und Artikelname korrekt angezeigt.
v1.104.0002026-06-04
  • Profitbutler → Sellerboard: neuer Button "EK-Export für Sellerboard". Erzeugt eine CSV im Sellerboard-Einkaufspreise-Format aus den Flowkom-FIFO-Einstandspreisen, die direkt in Sellerboard hochladbar ist. Bei FBM-Artikeln werden die Verpackungskosten auf den EK aufgeschlagen, und das passende Sellerboard-Versandprofil wird je nach Flowkom-Versandart des Artikels eingetragen (Zuordnung einmalig in den Sellerboard-Einstellungen pflegbar). Andere Sellerboard-Einstellungen (MwSt., Kategorie etc.) bleiben unberührt.
v1.103.0052026-06-04
  • Produktdetail → Bestand: Der pauschale Hinweis "Amazon-FBA-Bestand entdeckt" wurde entfernt. Bestand im eigenen Lager und parallel bei Amazon ist der Normalfall und keine Doppelzählung.
v1.103.0042026-06-04
  • Amazon-FBA-Bestand wurde im Produktdetail zu hoch angezeigt (Amazons Brutto-Menge inkl. noch nicht eingelagerter Anlieferungen). Jetzt zählt nur verkäufliche Ware (verfügbar + reserviert), plus eine klare Aufschlüsselung FBA-Verfügbar / FBA-Reserviert / FBA-Eingang.
v1.103.0032026-06-04
  • Sellerboard-Produktliste: die EK/FIFO-Zeile pro Artikel brach bei Artikeln mit beiden Werten um, sodass "FIFO" optisch nach unten rutschte. Wird jetzt sauber in einer Zeile dargestellt.
v1.103.0012026-06-04
  • Sellerboard-Einkaufspreise: Artikel mit Fremdwährungs-Marktplatz (z.B. GBP) werden nicht mehr fälschlich als "Preis veraltet" markiert - der Vergleich mit dem EUR-FIFO-Preis greift nur noch bei EUR-Einkaufspreisen, und beim Zusammenfassen mehrerer Marktplätze wird der EUR-Wert bevorzugt.
v1.103.0002026-06-04
  • Profitbutler → Sellerboard: Einkaufspreise aus Sellerboard werden jetzt importiert und je Artikel direkt in der Produktliste angezeigt - daneben der Flowkom-FIFO-Einstandspreis. So sieht man auf einen Blick, ob bei einem Artikel in Sellerboard kein Einkaufspreis hinterlegt ist (rotes "EK fehlt") und ob der Sellerboard-Preis noch aktuell ist (Hinweis bei Abweichung über 15%). Dafür wird in den Einstellungen der Sellerboard-Integration eine zweite Report-URL ("Einkaufspreise") hinterlegt, die der bestehende tägliche Import automatisch mit abholt.
v1.102.0202026-06-04
  • Festgeschriebene Lieferantenbestellungen tragen jetzt einen grünen „Festgeschrieben“-Badge (Schloss-Symbol) auf den Kanban-Karten, in der Listenansicht und in der Bestelltabelle — auf einen Blick erkennbar, welche LBs gegen rückwirkende Einstandskosten-Änderungen gesperrt sind.
v1.102.0192026-06-04
  • Lieferantenbestellung festschreiben: Einstandskosten einer LB lassen sich manuell einfrieren (nur bei abgeschlossenem Wareneingang). Festgeschriebene LBs werden bei späteren Maß-/Verpackungsänderungen nicht mehr rückwirkend neu berechnet — keine FIFO-/Margen-Drift. Kosten-Tab ist dann gesperrt; Entsperren nur durch Admins.
  • Frachtkosten-Verteilung ohne Artikelmaße: Vorschau und Wareneingang verteilen die Fracht jetzt einheitlich nach Menge (vorher wich die Vorschau ab). Pro Position erscheint der Hinweis „Keine Artikelmaße — Fracht nach Menge verteilt“.
  • Nachträglich gepflegte Artikelmaße aktualisieren wieder rückwirkend die Einstandskosten bereits eingegangener Bestellungen (interner Neuberechnungs-Trigger war seit der flexiblen Kostenstruktur defekt und brach das Speichern der Maße ab).
v1.102.0062026-06-04
  • PPC Butler Sync zeigt jetzt im Cronjob-Bereich die letzte Ausführung an. Bisher blieb der Zeitstempel leer, wenn keine Verbindung auf automatischen Sync gestellt war - jetzt wird bei jedem Lauf (auch manuell über den Ausführen-Button) ein Ausführungs-Eintrag pro Workspace mit PPC-Butler-Verbindung geschrieben.
v1.102.0052026-06-04
  • PROJ-359 Amazon-Erstattungen/Stornos: Wenn eine an Amazon gemeldete Erstattung oder Stornierung fehlschlägt, erscheint das jetzt als Fehler-Benachrichtigung mit Auftragsnummer und Direkt-Link — vorher blieb so ein Fehlschlag still und nur im selten geöffneten Auftrag sichtbar (führte zu einer Kundenbeschwerde, weil eine Erstattung nicht bei Amazon ankam). Zusätzlich behoben: ein interner Fehler, durch den der automatische Wiederholungsversuch solcher Meldungen immer scheiterte.
v1.102.0032026-06-03
  • DHL-Zollinhaltserklärung bei Auslandssendungen: Der Warenwert pro Position wurde bei Menge > 1 zu hoch berechnet (Menge doppelt gezählt — z.B. 74,52 € statt 24,84 €). Jetzt wird der korrekte Stückwert an DHL übermittelt.
v1.102.0022026-06-04
  • Ein fehlgeschlagener Hintergrund-Job (Bestandssync / Produktimport) erzeugte zwei Fehler-Benachrichtigungen statt einer. Jetzt erscheint genau eine Meldung pro Job.
v1.102.0012026-06-03
  • Die Benachrichtigung über neue Shopify-Produkte nennt jetzt direkt die gefundenen Produkte (Name + SKU) statt nur einer Anzahl. "Jetzt importieren" öffnet außerdem den Import-Dialog direkt, statt nur auf die Integrationsseite weiterzuleiten.
v1.102.0002026-06-03
  • Pro Cronjob gibt es jetzt einen Schalter "Bei Fehler benachrichtigen" (Standard: an). Schlägt ein Hintergrund-Job fehl, erscheint automatisch eine Fehler-Benachrichtigung mit Link zu den Cron-Einstellungen — und du kannst einzelne Jobs gezielt stummschalten. Mehrfaches Fehlschlagen erzeugt nur eine Meldung (kein Spam).
v1.101.0002026-06-03
  • Fehler-Benachrichtigungen lassen sich jetzt workspace-weit bestätigen: Setzt ein Admin einen Fehler auf "behoben", sehen alle anderen Admins, wer ihn wann erledigt hat. Der Systemstatus-Tab trennt jetzt klar zwischen "Offen" und "Erledigt".
  • Fehlgeschlagene Bestandssyncs erzeugen jetzt automatisch eine Fehler-Benachrichtigung (mit Link zur Integration) — vorher war so ein Fehler stumm und nur in den Einstellungen sichtbar. Der Glocken-Zähler bleibt rot, bis ein Admin den Fehler aktiv erledigt hat.
v1.100.0152026-06-03
  • Shopify-Integration in den Einstellungen lässt sich wieder öffnen — sie stürzte mit "Application error" ab, wenn der letzte Bestandssync fehlgeschlagen war. Fehlermeldungen aus dem Bestandssync werden jetzt zuverlässig als Text angezeigt.
v1.100.0142026-06-03
  • Versandfehler beheben: Das Etikett wird beim "Korrigieren & Erneut versenden" jetzt direkt an die gewählte Versandstation gedruckt — kein Umweg mehr über den Tab "Etiketten".
  • Versandfehler-Eintrag zeigt jetzt aufklappbar die Auftragspositionen (Bild, Name, SKU, EAN, Menge) — schnelle Prüfung, ohne den Auftrag zu öffnen.
  • Versandstation-Auswahl ist jetzt in allen Versand-Tabs sichtbar (Versand, Versandhistorie, Etiketten, Versandfehler).
  • Englische DHL-Adressfehler ("Please enter a house number") werden jetzt korrekt als Hausnummer-/Adressfehler angezeigt statt als generischer "Adresse prüfen"-Hinweis.
v1.100.0122026-06-03
  • PROJ-351 DHL Kleinpaket: DHL hat den bisherigen Produktcode für das nationale Kleinpaket (ehemals "Warenpost") zum 03.06. abgeschaltet, wodurch keine Kleinpaket-Etiketten mehr erstellt werden konnten — fälschlich angezeigt als "Adresse prüfen", obwohl die Adresse korrekt war. Der neue DHL-Code Kleinpaket (V62KP) ist jetzt hinterlegt und im Versandart-Dropdown wählbar. Zusätzlich zeigt das System bei künftigen Produktcode-Problemen eine klare Meldung ("DHL-Produktcode ungültig") statt eines irreführenden Adress-Hinweises.
v1.100.0112026-06-02
  • PROJ-350 TikTok-Versandbestätigung: Bei TikTok-Shop-Aufträgen wurde das Tracking teils nicht an Shopify/TikTok übertragen, obwohl versendet wurde. Ursache: TikTok hält die Versandfreigabe (Fulfillment Order) nach dem Import kurz zurück und gibt sie erst Minuten später frei — der Versand-Push lief zu früh und wurde fälschlich als endgültig fehlgeschlagen abgelegt, ohne erneuten Versuch. Künftig wird in diesem Fall automatisch über einen längeren Zeitraum (bis zu ~2 Stunden) erneut versucht, sodass das Tracking zuverlässig nachgereicht wird. Der betroffene Auftrag wurde manuell nachgesendet.
v1.100.0092026-06-02
  • PROJ-349 Gratis-Aufträge (z.B. TikTok-Free-Samples): In der Auftragsliste wurde fälschlich ein Betrag angezeigt (z.B. 58,80 €), obwohl der Auftrag kostenlos ist — die Detailansicht zeigte bereits korrekt 0 €. Ursache: Beim Import behielten die Positionen ihre regulären Verkaufspreise, obwohl der Gesamtbetrag des Auftrags 0 € war. Künftig werden kostenlose Aufträge mit 0 € importiert, sodass Liste, Detailansicht, Dashboard-Umsatz und Profitbutler einheitlich 0 € zeigen. Der bereits betroffene Auftrag wurde korrigiert.
v1.100.0082026-06-02
  • PROJ-348 Cleanup — Legacy Einmal-Aktivierungscode-Pfad entfernt (Folge zu PROJ-343, nachdem alle Scanner auf App v1.8.14 laufen): Routen /api/mobile/activate + /api/mobile/codes, Zod-Schemas activateDeviceSchema/generateCodeSchema, Tabelle device_activations (inkl. RLS + Indizes) und FK-Spalte mobile_devices.activation_id gelöscht. /api/mobile/reconnect (dauerhafter Geräte-Code + PIN) bleibt der einzige Pairing-Pfad — kein Funktionsverlust.
v1.100.0052026-06-02
  • PROJ-345 2FA: Dashboard-Hinweis verschwindet jetzt wirklich, sobald 2FA aktiv ist. Der erste Anlauf in 1.100.003 hatte nur die Aktualisierung beim Wechsel zwischen Seiten gefixt — die eigentliche Ursache war, dass die Prüfung "hat dieser Nutzer 2FA?" intern stumm fehlschlug und der Server jeden für "kein 2FA" hielt. Jetzt wird die offizielle Supabase-MFA-API genutzt; der Hinweis verschwindet zuverlässig, und auch in der Team-Verwaltung wird das "2FA aktiv"-Badge korrekt angezeigt.
v1.100.0042026-06-02
  • PROJ-345 2FA: "2FA zurücksetzen" ist im Team-Dropdown jetzt immer sichtbar (außer beim eigenen Account) — bei Mitarbeitern ohne aktives 2FA grau/disabled mit Tooltip "Kein 2FA aktiv". Damit findest du im Notfall (z. B. Handy weg) die Funktion sofort, auch ohne vorher gewusst zu haben, dass es sie gibt.
v1.100.0032026-06-02
  • PROJ-345 2FA-Live-Test-Fixes — (A) Der QR-Code zur 2FA-Einrichtung zeigt in der Authenticator-App jetzt "Flowkom" als erkennbaren Account-Namen (mit der eigenen E-Mail) statt der internen Adresse "localhost:3000:3000". (B) Der Dashboard-Hinweis "Sichere deinen Account mit Zwei-Faktor-Authentifizierung" verschwindet jetzt sofort, sobald 2FA aktiviert wurde — vorher blieb er bis zum nächsten Seiten-Neuladen stehen.
v1.100.0002026-06-01
  • PROJ-345 Zwei-Faktor-Authentifizierung (TOTP) — Optionales 2FA über Authenticator-Apps (Google Authenticator, Authy, 1Password, MS Authenticator). Jeder Nutzer aktiviert/deaktiviert 2FA selbst in den Konto-Einstellungen (Setup-Wizard mit Passwort-Bestätigung, QR-Code und Verifikation). Beim Login wird danach ein 6-stelliger Code abgefragt. Workspace-Admins sehen pro Teammitglied, ob 2FA aktiv ist, und können es bei Geräteverlust zurücksetzen. Ein dezenter Dashboard-Hinweis bewirbt 2FA für Nutzer ohne aktivierten Faktor und lässt sich dauerhaft ausblenden.
v1.99.0012026-06-01
  • PROJ-343 Web-UI — Geräteverwaltung (Einstellungen → Geräte): echte Online/Offline-Spalte (statt nur is_active) via Heartbeat/last_seen_at mit 30s-Live-Refresh, Button „Gerät hinzufügen“ (zeigt den dauerhaften Geräte-Code sofort zum Notieren/Aufkleben), durchgängiges Rebranding „Reconnect-Code“ → „Geräte-Code“, Bestätigungsdialog beim Neu-Generieren. Einmal-Aktivierungscodes komplett aus dem Pairing-Flow entfernt (nur noch ein Code pro Gerät).
v1.99.0002026-06-01
  • PROJ-343 Backend — Mobile-Geräte dauerhafte Kopplung: maschinenlesbare Auth-Codes (SESSION_EXPIRED vs DEVICE_UNPAIRED) auf den 401-Antworten von login/workers/refresh/heartbeat/auth-helper (deutsche error-Strings unverändert, code nur additiv), sodass die App ein abgelaufenes PIN-Login nicht mehr mit einem echten Geräte-Unpair verwechselt. Neuer Admin-Endpoint POST /api/mobile/devices (Gerät mit Namen anlegen → dauerhafter Geräte-Code = bestehender reconnect_code, läuft nie ab). Neuer leichter POST /api/mobile/heartbeat (Device-Token) für echtes Online/Offline via last_seen_at. Migration paired_at (additiv/idempotent), gesetzt in reconnect/activate. 14 neue Vitest-Specs.
v1.98.0282026-06-02
  • PROJ-347 Billkom-Belege im Auftrags-Verlauf — Rechnungen, Gutschriften/Teilgutschriften, Rechnungs-Zahlungen und Stornos erscheinen jetzt im Verlauf eines Auftrags (bisher nur in der Billkom-eigenen Beleg-Historie). 4 neue Verlauf-Eintragstypen, die an den bestehenden Billkom-Stellen mitgeschrieben werden (nur bei order-verknüpften Belegen). Backfill-Migration trägt Rechnungen & Gutschriften für bestehende Aufträge nach. Bewusst minimal (kein Read-Time-Merge, keine Flags). Adversarialer QA-Pass: 0 Bugs, Build clean. PR #355, v1.98.028.
v1.98.0262026-06-01
  • PROJ-346 Verlauf: Amazon-Refund & „Auftrag erstellt" sinnvoll dokumentiert. Automatisch über Amazon Financial Events erstattete Aufträge zeigten im Auftrags-Verlauf „Unbekanntes Ereignis" statt der Erstattung; auch Zahlungsstatus- und Prioritätswechsel waren betroffen (die Timeline-Komponente hatte eine veraltete Event-Typ-Kopie). Jetzt korrekt mit Betrag und Status dokumentiert. Zusätzlich schreibt der Amazon-Import (FBM/FBA) jetzt — wie Shopify-Import und manuelle Anlage — ein „Auftrag erstellt"-Event; eine Backfill-Migration trägt es für bestehende Amazon-Aufträge nach. PR #354, v1.98.024.
v1.98.0212026-06-01
  • PROJ-344 Dokumente bei Vaterartikeln — Konformitätserklärung & Bedienungsanleitung listen jetzt die aktiven Varianten (EAN, Name, Bild) statt des Parents. Greift in beiden Pfaden „Speichern & PDF“ und beim Download; einfache Produkte bleiben unverändert.
v1.98.0162026-06-01
  • PROJ-338 Cleanup: ungenutzten recoverten Matcher-Code nach dem Mapping-Refactor entfernt (kein Codemüll).
v1.98.0152026-06-01
  • Wartung: Feature-Status im internen Index abgeglichen — PROJ-339 (Pickliste-Fix), PROJ-338, PROJ-207 und PROJ-290 auf Deployed gesetzt; PROJ-330 als Reverted markiert (Teil der zurückgesetzten Profit-Saga). Keine funktionale Änderung.
v1.98.014
  • Deutsche Post Versand: PDF-Label-Download wiederholt jetzt transiente Fehler automatisch (konsistent zum Rest des DP-Clients). Aufräumarbeiten nach dem DP-Internetmarke-Incident vom 01.06.2026. (PROJ-341)
v1.98.013
  • Adressetikett: interne Robustheit beim Versandbestätigungs-Push an Shopify (M2E-Bridge) — kein leerer Tracking-Wert mehr bei Briefsendungen ohne Tracking. (PROJ-342)
v1.98.012
  • Adressetikett: Bei internationalen Sendungen (z.B. UK) wird im Versandprozess nicht mehr fälschlich nach Zolldaten gefragt — Briefmarken-Adresslabels brauchen keine Zollpapiere. (PROJ-342)
v1.98.011
  • Adressetikett: Layout auf Querformat umgestellt (passt besser auf das 62-mm-Endlosetikett) und der leere Briefmarken-Kasten wurde entfernt. (PROJ-342)
v1.98.010
  • Adressetikett-Versandart meldet an die Verkaufskanäle jetzt Carrier „Deutsche Post" (Amazon zusätzlich Versandart „Brief") statt einer internen Pseudo-Nummer — ohne echte Trackingnummer, da Briefe unverfolgt sind. (PROJ-342)
v1.98.009
  • Neue Versandart "Adressetikett": druckt beim Versenden nur die Empfängeradresse auf ein Briefmarken-Etikett (Deutsche-Post-Adresszonen-Layout, aber ohne Frankierung) mit freiem Feld zum Aufkleben einer echten Briefmarke. Wird lokal als PDF erzeugt — keine Deutsche-Post-API, kein Porto, kein Tracking — und druckt über die bestehende Druck-Pipeline auf dem Brother QL 600 / 62mm-Endlosetikett. (PROJ-342)
v1.98.003
  • Deutsche Post Versand: HTTP-5xx-Fehler werden jetzt als vorübergehende DP-Serverstörung behandelt (statt fälschlich als "Zugangsdaten ungültig") und automatisch wiederholt. Hintergrund: offizieller DP-Internetmarke-Incident am 01.06.2026 (Timeouts + HTTP 500). (PROJ-341)
v1.98.002
  • Deutsche Post Versand: Timeout 15s→60s (env-konfigurierbar). DP-Internetmarke-Label-/PDF-Backend antwortete zeitweise >15s (kein Ausfall, Gateway 145ms) → reihenweise "Deutsche Post nicht erreichbar"-Timeouts. Langsame-aber-erfolgreiche Label-Calls laufen jetzt durch. (PROJ-340)
v1.98.0012026-06-01
  • PROJ-339 Pickliste „Befüllen“-Crash behoben — profilbasierte Picklisten-Erstellung scheiterte mit Constraint-Verletzung (picklist_items_check_quantity_required), wenn ein voll reservierter Lagerplatz vor einem Platz mit Restbestand sortierte. Allokation überspringt jetzt Plätze ohne verfügbaren Bestand und pickt vom nächsten Platz. Logik in getestete Funktion allocateProductPickPositions extrahiert (5 neue Tests).
v1.98.0002026-06-01
  • PROJ-338 Sellerboard-Spiegel — Live-Feedback: Integration umbenennbar; Produkt-Zuordnungs-Dialog verbreitert + Produktfotos; Coverage-Badge korrigiert (heute-endende Zeiträume gelten bei T-1-lückenlosen Daten als vollständig); Flowkom-Produktbilder in Sellerboard-Tabelle, Produktdetail-Tab und Mapping.
v1.97.0002026-05-31
  • PROJ-338 Profitbutler-Sellerboard-Spiegel (v1): neue Sellerboard-Tab unter Profitbutler + Sub-Tab in der Produktdetailansicht, die Sellerboards täglichen 30-Tage-CSV-Report 1:1 spiegelt (kein Nachbau, kein EK-Swap). Eigenes, von Amazon entkoppeltes SKU→Artikel-Mapping mit Auto-Zuordnen. Täglicher Auto-Import + manueller Trigger. Kacheln (Heute/Gestern/7T/30T) geben Zeitraum & Summen vor, Produkttabelle mit FBM/FBA-Trennung und voller GuV per „Mehr“. Strikt isoliert vom bestehenden Profit-Stats-Layer. (PPC-Butler-Push von Profit/TACOS folgt als Schritt 2.)
v1.91.0222026-05-31
  • Profit-Daten-Thema (PROJ-330 Amazon-Kosten/Ads + PROJ-331–337 Sellerboard) auf den Stand vor PROJ-330 zurückgesetzt — Ansatz war zu komplex/fehleranfällig. Code = pre-330, DB-Objekte via Down-Migration entfernt (kein History-Bruch). Basis-Profitbutler + PPC-Butler unberührt. Live-Profit wird als PROJ-338 neu & vereinfacht aufgebaut.
v1.91.0202026-05-31
  • PROJ-337: FBM-Gewinn nutzt echte Versandkosten je Lieferland (shipping_method_country_costs) + Verpackung statt Sellerboards Pauschal-Versand (Swap, kein Doppelzählen). Nur FBM; fehlt ein Versandsatz, bleibt Sellerboards Versand. Prod-verifiziert.
v1.91.0192026-05-31
  • PROJ-336: Profitbutler Amazon-GuV jetzt Sellerboard-treu (1:1) mit Flowkoms FIFO-Einstandspreisen. Umsatz + Kosten kommen aus derselben Sellerboard-Periode (kein Coverage-Mismatch mehr), EK aus Flowkom-FIFO via EK-Swap auf NetProfit. Behebt überhöhte Gewinne (z.B. 100068-FBA 67,8% → 7,5%). Inkl. 72-Spalten-Parser, amazon_listings-Matching, täglicher Import-Cron, Coverage-Badge (T-1), Kacheln auf Suche skopen. Live für Pixkom.
  • PROJ-336 Post-Merge: #328 amazon_fees als Residual (drift-fest gegen neue Sellerboard-Gebührenspalten), #329 resolveProductCosts chunkt .in() (URL-Cap bei vielen Produkten → sonst kein Flowkom-EK), #330 EK = Stückpreis×Einheiten (überhöhter Gewinn, vom User entdeckt), #331 Coverage bis T-1 + Period-Kacheln auf gesuchte SKUs skopen.
v1.91.0002026-05-30
  • PROJ-335 Profitbutler — Period-KPI-Kacheln auf echte Amazon-Kosten (schließt QA-Finding LOW-2). Die Kacheln (Heute/Gestern/Aktueller Monat) zeigten Gewinn/Deckungsbeitrag/Werbung auf Soll-Basis, das Grid (PROJ-332/333) aber echte Amazon-Kosten. Lösung: client-seitige Kachel-Korrektur (applyAmazonRealToTile, pure+getestet) + ein additives /stats-Feld (amazonNetRevenue) — kein In-Place-Mutieren, daher Legacy-GuV + PDF-Export byte-identisch. Ersetzt den Amazon-Soll-Anteil (Netto-Basis) durch Ist (provision+fba+amazon_fees_combined). Gate-Fix type IN (amazon,sellerboard) damit Sellerboard-Workspaces das Overlay bekommen. v1-Grenzen dokumentiert (prev_month bleibt Soll wegen 35d-Retention, mit Ist/Soll-Marker). Design + adversariale Review via Multi-Agent-Workflows, berechtigte Findings eingearbeitet. 39 Vitest-Specs grün. PR #325, v1.91.000.
v1.90.0002026-05-30
  • PROJ-333 Profitbutler — Kanal-Aufschlüsselung im Produkt-Ausklappen. Das Ausklappen zeigt zusätzlich zur GuV des Gesamtprodukts eine Aufschlüsselung nach Verkaufskanal: Amazon-FBM, Amazon-FBA, Otto, Kaufland, eBay, Webshop, Flowkom (+ Sammelbuckets). Neuer PLPGSQL-RPC profitbutler_by_product_channel_aggregate; Umsatz/USt/Einheiten exakt pro Kanal, Amazon-Ist-Kosten umsatzanteilig per Largest-Remainder pro Bucket (Σ Kanäle == Produkt-Total Cent-exakt), FBA-Buckets nur auf FBA-Zeile, Nicht-Amazon=Soll. Pro-ratierte Amazon-Zeilen tragen Ist-(anteilig)-Badge. Gemeinsame profitCents()-Funktion. Lazy expand_channels, Default-Pfad byte-identisch. Design + adversariale Review via Multi-Agent-Workflows. 58 Vitest-Specs grün. PR #323, v1.90.000.
v1.89.0852026-05-30
  • PROJ-332 Profitbutler — Amazon-Gebühren kombiniert (Sellerboard-Parität) + GuV-Ausklappansicht. Bugfix: Sellerboards kombinierte AmazonFees-Spalte (Referral+FBA+Closing) wurde komplett als referral_fee (=Provision) verbucht → bei billigen FBA-Artikeln erschien die FBA-Fulfillment-Gebühr als ~97% Provision, FBA blieb 0 (Live: SKU 100072 Schrader Ventilkappen, -404€ Provision bei 417€ Umsatz). Fix: neuer cost_type amazon_fees_combined; by-product-API summiert provision+fba+combined zur einen Amazon-Geb.-Headline (Gewinn/Marge unverändert korrekt); Produktraster ersetzt Provision+FBA durch eine Amazon-Geb.-Spalte; Ausklappen zeigt Sellerboard-Style GuV-Zeilen pro Produkt statt Marktplatz-Subzeilen. Single-Source-Guard in refresh_amazon_sku_costs_daily verhindert sp_finance-Doppelzählung. Idempotente Migration konvertiert Altdaten. PR #322, v1.89.085.
v1.89.0782026-05-29
  • PROJ-330 Status-Update auf Deployed nach Final-QA. INDEX-Eintrag von 'In Review' auf 'Deployed' mit Versions-Historie v1.89.017→v1.89.077 (Initial-PR #293 Phase A+B+C Backend+UI, PROJ-234 Migration PR #298, 15 Hotfix-PRs #297–#313 inkl. Reverse-Proxy-Callback-Whitelist, Sponsored Display Ads, Refund-Cost-Types parallel zu PROJ-189, Marketplace-Tagging + Backfill, vollständige Profit-Formel + COG/VAT/Refunds, IDOR-Hardening aller SECURITY DEFINER RPCs via is_workspace_member(), by-product RPC ersetzt orders+line_items-Fetch wegen PostgREST-10k-Cap, Period-Tiles RPC umgeht 10k-Cap, attributedSalesSameSku7d Column-Name-Fix, integrations_check_status DELETE-Disconnect + status='error'-Branch, 4 neue Cron-Endpoints in trigger-Whitelist + LONG_RUNNING). Spec-Header von 'In Progress (Phase A foundation)' auf 'Deployed' mit Versions-Tabelle. Live-tested via Pixkom (17.889 Orders/Monat) — Sellerboard-Parität verifiziert: SKU 100068 26.303€ vs Sellerboard 25.724€ (+2,2% innerhalb Settlement-Toleranz). 141/141 Vitest grün, PROJ-189-Files byte-identisch (Isolation-Garantie eingehalten). Reine Doku, kein Code-Touch.
v1.89.0682026-05-28
  • PROJ-330 Hotfix #10 (#304, Squash 1c9ac8f9): Sellerboard-Produktliste war seit Tag 1 LEER — drei zusammenhaengende Bugs gleichzeitig. (1) by-product route las .select('product_id, quantity, unit_price, order_id'). Die Spalte order_line_items.unit_price EXISTIERT NICHT — Schema hat gross_price_per_unit (BIGINT, Cents) und price_per_unit (integer). undefined * 100 = NaN, revenue immer NaN, kein Produkt aggregiert. Live-Probe via Supabase Management-API zeigte das eindeutig. (2) PostgREST cappt orders fetch auf 10k (Pixkom hat 17.889 Orders/Monat). (3) .in('order_id', 10k_uuids) URL > 300kb wird abgelehnt. Alle drei in einem fix: neue RPC profitbutler_by_product_aggregate macht SQL-side JOIN orders+line_items+products mit GROUP BY product_id, ORDER BY revenue DESC, LIMIT 200. Nutzt COALESCE(gross_price_per_unit, price_per_unit) fuer korrekte Cents. Live-Probe Top-1: SKU 100068 26.303 EUR / 5.915 Einheiten / 5.799 Bestellungen — matched Sellerboard 25.724 EUR. by-product/route.ts ersetzt 80 Zeilen orders+line_items+aggregate Code durch einen RPC-Call.
v1.89.0672026-05-28
  • PROJ-330 Hotfix #9 (#303, Squash 10fd5c8f): drei Live-Bugs aus dem User-Test gesammelt. (A) profitbutler_period_quick_aggregate RPC multiplizierte mit *100 obwohl orders.order_total ein BIGINT (bereits Cents) ist — Werte waren 100x zu hoch (74.660 € statt 746 € im Produkt-Detail). Live-Probe via Supabase Management-API zeigte data_type=bigint. (B) Channel-Dropdown zeigte nur Amazon-Marketplaces — Otto, eBay, Kaufland, Tiktok, Temu fehlten. Root Cause: .from('orders').select('sales_channel').limit(10000) wird vom PostgREST db-max-rows=10000 gecappt; bei 30k+ amazon_de Orders dominieren die alle anderen Channels. Neue RPC profitbutler_workspace_channels macht GROUP BY auf SQL-Ebene — kein Cap. (C) resolvePeriodToDateRange returnte fuer today/yesterday/month/30d/etc. {from: 00:00, to: 00:00}. Orders mit created_at > 00:00 (also alle realen Orders) fielen aus dem Range raus. Helper endOfDayUTC eingefuehrt (23:59:59.999), alle period cases nutzen ihn jetzt fuer to. Auch Custom-Ranges. prev_month war schon korrekt.
v1.89.0662026-05-28
  • PROJ-330 Hotfix #8 (#302, Squash e32ffcfe): Amazon Ads API v3 lehnt mit 400 ab — 'configuration columns includes invalid values: (salesSameSku7d)'. Spec-MVP hatte den Namen aus context7-Doku-Auszuegen uebernommen, der war aber nicht aktuell. Korrekter Name in Amazons Live-Allow-Liste ist attributedSalesSameSku7d (Live-Probe 2026-05-28 ueber Supabase Management-API gegen cron_last_execution.summary.errors[]). Alle 12 Profile (DE/FR/IT/ES/NL/BE/PL/SE/UK/IE/AE/SA) liefen in den identischen Fehler — 12 errors bei 1 Integration. SP_ADVERTISED_PRODUCT_COLUMNS umbenannt + SpAdReportRow Typ angepasst. Mapper liest die Spalte ueberhaupt nicht (advertised-product.ts nutzt nur cost/date/asin/sku/clicks/impressions/sales7d/purchases7d), war also funktional unbroken.
v1.89.0652026-05-28
  • PROJ-330 Hotfix #7 (#301, Squash fa745d17): Ads-Spend-Cron schrieb in summary.errors nur eine Counter-Zahl (z.B. errors: 3) — UI rendert aber result.errors als Array von Strings. Im Cron-Jobs-Panel war nur ein roter 'Fehler'-Status sichtbar ohne Detail. Cron-Route sammelt jetzt die echten Error-Messages pro Integration in summary.errors[] (string[]). Plus reports_completed + reports_failed Counter fuer mehr Diagnose. Beim naechsten manuellen Trigger sind die echten Fehler-Texte im Detail-Panel sichtbar.
v1.89.0642026-05-28
  • PROJ-330 Hotfix #6 (#300, Squash 15b967a9): Workspaces mit >10k Orders/Periode bekamen in der neuen Sellerboard-UI gekappte Werte (z.B. Aktueller Monat 57k EUR statt 100k+, Bestellungen exakt 10.000). Root Cause: Supabase PostgREST cappt server-side mit db-max-rows=10000, egal welcher .limit() im Code steht (siehe Memory feedback_postgrest_max_rows, gleicher Mechanismus wie PROJ-300). Fix in 3 Schritten: (1) Neue SECURITY DEFINER RPC profitbutler_period_quick_aggregate macht SUM(order_total) + COUNT(*) auf SQL-Ebene → kein Row-Cap. Returnt revenue + order_count + cancelled in EUR-Cents. (2) Neuer Endpoint /api/profitbutler/period-tiles ruft die RPC parallel pro Period. (3) Overview-Tab + Product-Overview-Komponenten nutzen RPC-Werte fuer revenue/orderCount/units in den Kacheln, Fallback auf /stats wenn RPC noch nicht geladen ist. Refunds/ads/profit kommen weiter vom /stats-Endpoint (50k Limit, bei den meisten Workspaces nicht erreicht). Zweiter Bug: Sub-Tabs Lagerbewertung + Retouren-Auswertung waren in der neuen UI nicht erreichbar — der ProfitbutlerNav (Top-Level-Links) wurde nicht im Shell gerendert. Jetzt oberhalb der Kacheln/Grafik-Tabs eingebunden, Sub-Routes returns + inventory-valuation wieder klickbar.
v1.89.0632026-05-28
  • PROJ-330 Hotfix #5 (#299, Squash ace60aea): Settings → Cron-Jobs → 'Ausfuehren' fuer alle 4 PROJ-330 Crons (amazon-cost-events-pull, amazon-storage-fees-pull, amazon-sku-costs-aggregate, amazon-ads-spend-pull) warf 'Invalid endpoint. Must be one of: ...' weil die generische /api/cron/trigger-Route eine statische Whitelist hat (PROJ-47). Whitelist + Handler-Imports erweitert. Die 3 langlaufenden (cost-events-pull, storage-fees-pull, ads-spend-pull) zusaetzlich als LONG_RUNNING_ENDPOINTS markiert — Trigger laeuft Fire-and-Forget gegen Coolify-Timeout (>60s). sku-costs-aggregate bleibt synchron weil es nur ein RPC-Aufruf pro Workspace ist.
v1.89.0622026-05-28
  • PROJ-234 Migration (#298, Squash fbd21cda) — Profitbutler-Auswertungs-Tab im Produkt-Detail auf die PROJ-330 Sellerboard-UI umgestellt. Bisher zeigte der Tab den Legacy ProfitbutlerSellerboard (tabular HEUTE/GESTERN/7T/MONAT/30T). Jetzt rendert er hinter dem workspace-Beta-Flag dieselben klickbaren Period-Tiles + ProductGrid wie die Hauptseite, aber pre-filtered auf den einen productId. Neue Komponente ProfitbutlerProductOverview: 4 Period-Tiles mit lokalem (nicht URL-) Period-State, ProductGrid mit expand_marketplaces=true fuer Drilldown auf Marketplace-Sub-Zeilen, Hinweis-Banner wenn amazonReal.hasData=false (linkt zu Cron-Jobs). Branch-Logik in profitbutler-product-stats.tsx: Beta-aktive Workspaces bekommen die neue UI, alle anderen die Legacy unveraendert.
v1.89.0612026-05-28
  • PROJ-330 Hotfix #4 nach Production-Live-Test (#297, Squash 233db3e6): integrations_check_status erlaubt nur ('active', 'inactive', 'error', 'setup') — die disconnect-Route setzte status='disconnected' und die callback-Route setzte status='auth_failed' bei OAuth-Reject. Beides illegal → DB warf 'new row violates check constraint integrations_check_status'. Plus: Connect-Route blockierte mit 409 wenn eine alte status='setup'-Row vom abgebrochenen OAuth-Versuch existierte. User sass im Loop fest (loeschen ging nicht wegen DB-Error, neu verbinden ging nicht wegen 409). Fixes: (1) Disconnect-Route macht jetzt DELETE statt UPDATE — Button heisst sowieso 'Verbindung löschen', semantisch wirklich loeschen. (2) Connect-Route reused existing 'setup'-Row mit UPDATE (Credentials + Metadata) statt 409 — integration_id bleibt gleich, OAuth-Flow startet neu mit den neuen Werten. (3) Callback nutzt jetzt status='error' + last_error mit voller Amazon-Antwort statt status='auth_failed'.
v1.89.0602026-05-28
  • PROJ-330 Hotfix #3 nach Production-Live-Test (#296, Squash 3067ffea): 5 Folge-Bugs aus dem ersten User-Test gesammelt und in einem PR gefixt. (A) Amazon-OAuth redirect_uri zeigte http://0.0.0.0:3000/api/integrations/amazon-ads/callback statt der Production-URL, weil im Coolify-Container req.url die interne Container-URL zurueckgibt. Connect + Callback lesen jetzt x-forwarded-host + x-forwarded-proto vom Reverse-Proxy (gleiches Pattern wie shopify-oauth/route.ts). (B) Detail-Seite /dashboard/settings/integrations/[id] zeigte 'Integration-Typ nicht unterstuetzt' fuer amazon_ads, weil der Type-Switch keinen Branch hatte. Branch nachgezogen rendert AmazonAdsConnectionCard. (C) Heute = Letzter Monat = exakt gleiche Werte (1.478 EUR), weil 'prev_month' kein gueltiger PeriodKey in resolvePeriodToDateRange war und in den default-fallback (today, today) fiel. Case fuer prev_month: {from: startOfMonth(lastDayOfPrev), to: lastDayOfPrev}. (D) Alle Period-Kacheln zeigten '0 Bestellungen / 0 Einheiten' weil das UI-Mapping falsche Feldnamen nutzte (ordersCount statt orderCount, refunds.total statt refunds.totalAmount, units und costs.contribution existieren gar nicht in PeriodStats). Mapping korrigiert plus contribution wird jetzt berechnet als revenue minus (goods+shipping+packaging+pickPack+provision+ads). (E) by-product-Endpoint zeigte 'Keine Produkte gefunden' trotz 57k EUR Umsatz weil .in('status', ['paid','shipped','completed']) zu strikt war waehrend die Stats-API .neq('status', 'cancelled') nutzt. by-product auf gleichen Filter umgestellt — Tabelle und Kacheln zeigen jetzt konsistent dieselbe Order-Basis.
v1.89.0592026-05-28
  • PROJ-330 Hotfix #2 nach Production-Live-Test (#295, Squash f0c9517a): Amazon-Advertising-Connect-Submit warf db_error weil mein Insert in /api/integrations/amazon-ads/connect die NOT NULL Felder integrations.name + integrations.category nicht gesetzt hatte. Plus created_by Spalte, die in integrations gar nicht existiert. Fix: name = 'Amazon Advertising (EU/NA/FE)' aus Region, category = 'marketplace' aus INTEGRATION_REGISTRY, created_by entfernt. Plus Error-Response um message/details/code erweitert + Toast im Connect-Dialog zeigt die echten DB-Fehler-Details fuer 10 Sekunden statt nur 'db_error'.
v1.89.0582026-05-28
  • PROJ-330 Hotfix nach Production-Live-Test (#294, Squash 2d490094): Klick auf 'Integration hinzufuegen → Amazon Advertising' im Integrationen-Hub warf Validierungsfehler weil der generische Add-Integration-Dialog amazon_ads wie jeden anderen Typ behandelte (Name eingeben → POST /api/integrations → Detail-Seite). Amazon-Ads braucht aber den OAuth-with-Credentials-Flow (ClientID + Secret + Region eingeben → /api/integrations/amazon-ads/connect → OAuth-Redirect zu Amazon). Branch zu AmazonAdsConnectDialog nachgezogen, analog zu PROJ-328 PPC-Butler-Branch: neuer State showAmazonAdsConnect in add-integration-dialog.tsx, handleSelectType routet bei amazon_ads zum Custom-Dialog statt zu Step 2.
v1.89.0572026-05-28
  • PROJ-330 Echte Amazon-Kosten pro SKU (Sellerboard-Parität) — Phase A + B + C komplett. Phase A: separate SP-API-Pipeline neben PROJ-189 für ShipmentEvent + ServiceFeeEvent (RefundList + AdjustmentList werden bewusst ignoriert), FBA-Storage-Fees-Cron monatlich, Aggregate-Cron stündlich. Zwei neue Tabellen amazon_sku_cost_events (raw, append-only, Hash-Idempotenz, 21 cost_types) + amazon_sku_costs_daily (rolling 35d). RPC refresh_amazon_sku_costs_daily mit self-healing SKU-Mapping über amazon_listings. Phase B: komplett neue Integration type='amazon_ads' mit separater OAuth pro Workspace (LwA-Credentials werden im Connect-Dialog eingegeben, keine globalen Env-Vars), Reports v3 Lifecycle für spAdvertisedProduct, sync-runner mit Token-Refresh + cursor-driven Backfill. Phase C: additives amazonReal-Feld in /api/profitbutler/stats (Response byte-identisch für Nicht-Opt-In Workspaces), neuer paginierter /api/profitbutler/stats/by-product Endpoint (per-product real-costs aus amazon_sku_costs_daily, kein Pro-Rata), Sellerboard-artige UI mit 4 klickbaren Period-Tiles + Filter-Bar + Product-Grid mit Marketplace-Sub-Zeilen + Checkbox-Selektion + Source-Badges (Ist/Soll/Mix). Beta-UI hinter workspaces.profitbutler_new_ui_enabled-Toggle (default false, Legacy bleibt aktiv). Settings-Toggle cost_events_pull_enabled (default false) hängt am AmazonTogglesBlock. Strikte Isolation der PROJ-189 Refund-Pipeline garantiert (finance-events-pull.ts / finance-events-filter.ts / finance-events-dedup.ts byte-identisch, SHA-256-Baseline in features/PROJ-330-isolation-baseline.md). QA-Audit vor Merge fand 6 Bugs (0 Critical/High, 2 Medium, 4 Low), alle gefixt. 168/168 Vitest grün, TS clean. Default-State nach Deploy: kein SP-API-Polling, keine UI-Änderung, kein Ads-Cron — alles bleibt safe bis User die Toggles aktiviert. Deployed via PR #293 Squash 65a04462.
v1.89.0152026-05-28
  • Picklisten-Erstellungs-Dialog von max-w-lg (512px) auf max-w-2xl (672px) verbreitert. Im Manuell-Tab erzwangen Suchfeld+Mengen-Input und die Optionen-Checkboxen vorher seitliches Scrollen.
v1.89.0142026-05-27
  • PROJ-329 Cleanup nach QA-Audit — BUG-6 (Medium): POST /api/products/[id]/resolve-asin-conflict gibt jetzt 410 Gone mit code: 'stale_conflict_marker' wenn der Konflikt-Marker auf ein nicht mehr existentes Listing oder ein Listing ohne valide ASIN zeigt (statt eines unspezifischen 500). Echte non-PGRST116-Server-Fehler bleiben 500. BUG-7 (Low): Banner-Auflösung im Produkt-Form-Dialog schließt den Dialog nicht mehr versehentlich — neue Prop onAsinConflictResolved in ProductFormContent + dedizierte handleAsinConflictResolved-Callback im ProductFormDialog (triggert nur Parent-Refetch ohne onOpenChange(false)). Backwards-kompatibel via Fallback auf onSuccess. Plus Status-Updates: PROJ-329 INDEX-Eintrag und Spec auf Deployed, BUG-4 (Slide-Over hat kein Banner) und BUG-5 (Client-Side-Filter unter 2k Produkten) explizit als bewusste Out-of-Scope-Entscheidungen dokumentiert. 11/11 + 24/24 PROJ-329-Tests grün, +3 neue/aktualisierte Vitest-Specs für die 410- und 500-Branches.
v1.89.0122026-05-27
  • PROJ-328 Final-Cleanup nach Post-Deploy-Audit (0 Critical/High/Medium Bugs, 58/58 Vitest, TS+ESLint+Build clean). Code-Fix LOW-3: cleanup-sync-logs/route.ts erweitert um ppc_butler_sync_logs mit 90 Tage Retention (analog amazon_sync_log) — ohne den Fix wäre die Tabelle bei stündlichem Auto-Sync unbounded gewachsen. Doku: Spec PROJ-328 finalisiert mit Versions-Tabelle aller 12 deployed v1.89.000 → v1.89.012, INDEX-Eintrag kompakt überarbeitet. LOW-4 (settings .strict()-Mass-Assignment) bewusst out-of-scope — pre-existing PROJ-50-Issue, nicht durch PROJ-328 eingeführt. Phase 1 vollständig deployed; Phase 2 (Margin/ACOS/Preis-Mappings) gated auf Profitbutler-Vollständigkeit.
v1.89.0112026-05-27
  • PROJ-328 PPC-Butler-Sub-Tab im Produktdetail — neuer Sub-Tab unter Profitbutler (nur sichtbar wenn PPC-Butler-Integration im Workspace existiert). Zeigt pro ASIN alle PPC-Butler-Variablen mit Mapping-Status. Gemappte Variablen sind read-only mit 'Auto-Sync'-Badge + Source-Kind + live-berechnetem Wert. Ungemappte Variablen haben Number-Input + Push-Button für manuellen Push pro Produkt. Architektur: neue lokale Tabelle ppc_butler_product_variable_values (UNIQUE integration_id+product_id+variable_name) als Audit-Trail, weil PPC Butler keinen GET-Endpoint hat. sync-runner upsertet alle erfolgreichen Auto-Sync-Pushes in Chunks à 500. Manueller Override gemappter Variablen via API gesperrt (HTTP 409 managed_by_mapping). Tab erscheint via /api/integrations?type=ppc_butler&limit=1-Auto-Detect.
v1.89.0102026-05-27
  • PROJ-328 Automatischer Sync — Phase-2-Item nachgereicht. Neuer Endpoint /api/cron/ppc-butler-sync mit authenticateCron-Auth iteriert über alle PPC-Butler-Integrationen mit settings.auto_sync_enabled=true UND status=active und triggert pro Verbindung Fire-and-Forget runSync(). acquireSyncLock verhindert Doppelläufe bei überlappenden Triggern (Lock-Konflikte werden als 'skipped: Sync already running' geloggt). Toggle 'Automatischer Sync' im PPC-Butler-Detail-Header (PATCH /api/integrations/[id] mit gemergten settings, optimistic UI mit Rollback). Eintrag in /dashboard/settings/cron-jobs mit neuer Kategorie 'PPC Butler' (Target-Icon), Manual-Trigger-Button und Health-Indikator. Trigger-Intervall liegt komplett im externen Scheduler (Coolify/all-inkl), Empfehlung stündlich (0 * * * *). Pattern identisch zu Shopify Order-Import.
v1.89.0092026-05-27
  • PROJ-328 Bundle-Stock-Expansion — Live-Bug: Bundle-Artikel (products.is_bundle=true) bekamen 0 oder nur den FBA-Anteil gepusht. Beispiele: B0GV48K6KS (Holzherz 10 Stk) → erwartet 28 (1 Komp × qty=10, Komp-FBM 280), war 0. B0BGKG4LZ7 (Clipper) → erwartet 1081 (2 Komp × qty=1, Komp-FBM 960/1043, MIN=960 + 121 FBA), war 121. Fix in computeStockTotal: lädt products.is_bundle, bei Bundles bundle_items, summiert Komponenten-Stock, Bundle-FBM = MIN(comp_stock / comp_qty) — Pattern übernommen aus PROJ-184 / amazon/inventory-push.ts. FBA bleibt unverändert per ASIN (Bundle hat eigene ASIN mit eigenem FBA-Listing). Defensive: Bundle ohne bundle_items → 0, qty=0 → 1 normalisiert. 4 neue Vitest-Specs mit Live-Vorfall-Werten verifiziert.
v1.89.0082026-05-27
  • PROJ-328 Sync-Performance-Fix — Live-Sync mit 555 ASINs schlug fehl mit "Berechnungsfehler: stock-Query: TypeError: fetch failed". Root Cause: .in('product_id', [555 UUIDs]) erzeugt eine URL >22 KB die Cloudflare/Coolify mit Connection-Reset abbricht (typischer 8 KB Proxy-Cap). Fix: neuer chunkedIn<TRow>-Helper in mapping-engine.ts, zerlegt .in()-Calls in 100er-Chunks (~4500 Byte URL pro Request) und merged die Ergebnisse. Alle 5 .in()-Aufrufe in den compute-Funktionen umgestellt (computeStockTotal 2x, computeStockAvailable, computeInboundStock, computeDaysToRestock, computeTagBoost). Verifiziert via direkter DB-Probe gegen ppc_butler_sync_logs.per_variable_results.
v1.89.0072026-05-27
  • PROJ-328 Sync-Fix — Live-Sync auf Production schlug fehl mit "column products.deleted_at does not exist". Spec-Annahme war falsch: Flowkom hat kein deleted_at-Soft-Delete auf products, sondern den archived-Boolean. Fix: sync-runner und preview/route nutzen jetzt .eq('archived', false). Plus: preview select 'name' → 'title' (Spalte heißt 'title' auf products). Verifiziert via direkter DB-Probe gegen Production (ppc_butler_sync_logs.error_message).
  • PROJ-328 Note — Die zwei vorherigen RLS-Hotfixes (v1.89.004 + v1.89.005) waren überflüssig: Service-Role-Bypass funktioniert auf Production einwandfrei (verifiziert via direkter Management-API). Der ursprüngliche "row-level security policy"-Fehler beim Connect war vermutlich ein vorübergehender Coolify-Pod-Bug. Die User-Client-Pfade bleiben als Defense-in-Depth bestehen — funktional identisch zum vorherigen Admin-Client-Pfad, kein Rollback notwendig.
v1.89.0062026-05-27
  • PROJ-328 Status-Update nach Merge — Spec auf Deployed, INDEX-Eintrag mit Hotfix-Historie (v1.89.004 + v1.89.005). Reine Doku, kein Code-Touch. Deployed via PR #283.
v1.89.0052026-05-27
  • PROJ-328 RLS-Hotfix #2 — Folgefehler nach v1.89.004: Connect ging durch, aber Variablen-Discovery scheiterte mit "Cannot coerce the result to a single JSON object" (PostgREST PGRST116). Root Cause: credentials-store.ts machte intern weiter den integrations-Lookup mit createAdminClient — bei kaputtem Service-Role-Bypass landete der Read im RLS-Filter, .single() fand 0 Rows. Fix: readPpcButlerCredentials, writePpcButlerCredentials und ensureValidAccessToken akzeptieren jetzt optional einen SupabaseClient (Default bleibt Admin-Client für Backward-Compat von sync-runner). PpcButlerClient bekommt opts.supabase und reicht ihn an ensureValidAccessToken inkl. Token-Refresh-Writes durch. variables/route.ts konstruiert den Client jetzt mit supabase: userDb. .single() → .maybeSingle() für sprechende Fehlermeldung statt PGRST116-Cryptic. 54/54 Vitest grün, TS clean.
v1.89.0042026-05-27
  • PROJ-328 RLS-Hotfix #1 — Live-Bug auf Coolify-Preview-Deployment: Connect-Endpoint scheiterte mit "new row violates row-level security policy for table integrations". Root Cause: alle PPC-Butler-Routes nutzten createAdminClient (Service-Role), aber SUPABASE_SERVICE_ROLE_KEY liefert auf dem Deployment offenbar keinen RLS-Bypass mehr — der Insert wurde als authenticated-User-Context behandelt und scheiterte an der is_workspace_admin-Policy. Fix: alle 8 User-facing Routes (connect, variables, mappings GET/POST, mapping PATCH/DELETE, preview, sync trigger, sync GET, sync-logs) umgestellt auf den User-Supabase-Client aus authenticateRequest/authenticateSettingsAdmin. Bestehende RLS-Policies (is_workspace_member/is_workspace_admin) greifen sauber. Neue Migration ppc_butler_sync_logs_member_insert erlaubt member-INSERT auf Sync-Logs für Lock-Erwerb über User-Client; UPDATE bleibt service-role-only (Status-Übergänge gehören dem Fire-and-Forget-Backend, nicht der UI). acquireSyncLock akzeptiert jetzt optional einen SupabaseClient-Parameter. sync-runner.ts + credentials-store.ts (Token-Refresh-Writes) bleiben Service-Role als Background-Pfad. 54/54 Vitest grün, TS clean.
v1.89.0022026-05-27
  • PROJ-328 QA — Audit-Report ergänzt 'QA Test Results'-Sektion in der Spec. 18/18 Acceptance Criteria PASS gegen Code verifiziert (Connection-Setup 7/7, Variable Discovery 4/4, Mapping-Konfiguration 3/3, Datenfilter & ASIN-Resolution 6/6, Sync-Ausführung 6/6, Cognito-Token-Lifecycle 3/3, Sicherheit & RLS 3/3, Integration-Registry 3/3). 16/16 Edge Cases PASS (alle im Code-Pfad behandelt, jeweils mit Datei-Referenz). Security-Audit 8/8 PASS — Cognito-Passwort wird NIE persistiert (grep über alle credentials_encrypted-Schreibstellen bestätigt), Refresh-Token AES-verschlüsselt via src/lib/crypto.ts, RLS auf ppc_butler_variable_mappings + ppc_butler_sync_logs aktiv via is_workspace_member() (PROJ-415-Pattern), Workspace-Isolation auf allen 9 API-Routes, Rate-Limits auf allen Endpoints (Werte dokumentiert), Zod .strict() auf allen POST/PATCH-Schemas (Mass-Assignment-Schutz), kein PII in Sync-Logs, Audit-Log für Connect/Sync/Mapping-CRUD. Tests: 54/54 Vitest grün (4 Files: client/cognito-srp/formula-parser/mapping-engine), TypeScript clean (0 Findings für PPC-Butler-Files), ESLint clean (0 Errors, 0 Warnings), Production-Build erfolgreich (8 PPC-Butler-Routen kompiliert). Performance-Check statisch: 10-Slot-Semaphor implementiert, 401-Retry-Once nicht in Endlosschleife (token401Retried-Flag), Polling-Cap 5 Min im Frontend, PostgREST-10k-Cap beachtet. 0 Critical/High/Medium Bugs gefunden. 2 Low-Findings dokumentiert für Folge-Ticket (LOW-1: integrations.last_sync_at wird vom Sync-Runner nicht aktualisiert — UX-Fallback via History-Endpoint deckt das ab; LOW-2: stock_available zählt Sperrlager mit — semantisch unklar, bewusste Phase-2-Entscheidung). Production-Ready: YES.
v1.89.0012026-05-27
  • PROJ-328 Frontend — PPC Butler UI komplett. Dedizierter PpcButlerConnectDialog mit Cognito-Username + Passwort + Profile-ID, ruft direkt POST /connect (Cognito-Login + Profile-Validierung + verschlüsseltes Speichern in einem Schritt) statt des generischen Empty-Insert-Flows — sonst hätte die Partial-Unique-Constraint die zweite Anfrage blockiert. AddIntegrationDialog fängt ppc_butler ab und öffnet diesen Dialog. PpcButlerIntegrationDetail rendert im generischen /dashboard/settings/integrations/[id] (analog Shopify/Amazon/Freescout): Header mit Profile-ID, auth_failed-Badge bei Token-Expiry, 'Verbindung trennen' mit Confirm-Dialog. Variablen-Tabelle mit Live-Discovery (GET /variables), Mapping-Status-Badges (gemappt / nicht gemappt / verwaist), Refresh-Button, per-Zeile Mapping-Bearbeiten + -Entfernen. PpcButlerMappingDialog mit Datenquelle-Dropdown (5 MVP-Quellen), bedingten Tag-Boost-Feldern (Tag-Combobox via /api/tags, Boost-Wert + Default-Wert), Formel-Textarea mit clientseitiger Live-Syntax-Validierung (parseFormula aus @/lib/ppc-butler/formula-parser — kein Server-Roundtrip beim Tippen), Vorschau-Button (POST /preview, 5-Zeilen-Tabelle SKU/ASIN/Rohwert/Endwert mit Formel-Fehler-Badge), Aktiv-Toggle. PpcButlerSyncPanel mit großem 'Jetzt syncen'-Button (disabled während Lauf), Live-Progress-Panel mit Progress-Bar + Zählern + Per-Variable-Liste, Polling alle 2s, Timeout nach 5 Min, picks laufende Syncs nach Page-Reload auf. Sync-Historie mit Drill-Down-Toggle pro Lauf. Shadcn-Komponenten ausschließlich, keine neuen npm-Dependencies. Toasts via sonner für alle CRUD-Aktionen. Icon 'target' + 'headphones' zu integration-card.tsx ICON_MAP hinzugefügt.
v1.89.085-proj3342026-05-30
  • PROJ-334 Security: IDOR-Guard für profitbutler_by_product_aggregate. Die PROJ-330-VAT-Migration entfernte versehentlich den is_workspace_member()-Guard (zurück auf LANGUAGE sql). SECURITY DEFINER + grant authenticated + WHERE auf den vom Aufrufer übergebenen p_workspace_id => jeder eingeloggte User konnte per direktem PostgREST .rpc()-Call Umsatz/Gewinn fremder Workspaces lesen (Cross-Tenant-IDOR, live seit PROJ-330). Fix: RPC identisch als plpgsql mit is_workspace_member()-Guard (ERRCODE 42501) neu angelegt, verhaltensgleich für legitime Aufrufer. Gefunden im QA von PROJ-333. PR #324.
v1.89.0002026-05-27
  • PROJ-328 Backend — PPC Butler Integration Phase 1. Neuer Integration-Typ ppc_butler (category=marketplace), 4 DB-Migrationen (CHECK-Constraint-Erweiterung, ppc_butler_variable_mappings, ppc_butler_sync_logs, Partial-Unique-Index für eine Connection pro Workspace). Cognito-SRP-Auth via amazon-cognito-identity-js mit Node-Polyfills, PpcButlerClient-Wrapper mit Token-Refresh + 401-Retry + 404-Skip + Rate-Limiting (max 10 parallel), eigene Mini-Formel-Parser-Implementierung (Recursive-Descent, Whitelist MAX/MIN/ROUND + 4 Operatoren, ~150 LoC TypeScript, kein eval/Function-Constructor, ~120 Vitest-Specs grün), 5 deklarative Datenquellen (stock_total/stock_available/inbound_stock/days_to_restock/tag_boost) via Mapping-Engine. Sync-Runner orchestriert kompletten Lauf mit Per-Variable-Fehler-Isolation, Sync-Lock via Partial-Unique-Index auf (integration_id) WHERE status='running' (race-free DB-Lock, überlebt Pod-Restarts), Zombie-Cleanup (>30min auf failed setzen). 8 API-Routes unter /api/integrations/ppc-butler/ (connect, [id]/variables, [id]/mappings, [id]/mappings/[mappingId], [id]/mappings/[mappingId]/preview, [id]/sync, [id]/sync/[logId], [id]/sync-logs). Refresh-Token AES-verschlüsselt in integrations.credentials_encrypted, Passwort wird sofort nach SRP verworfen. RLS auf allen neuen Tabellen via is_workspace_member().
v1.88.0412026-05-27
  • PROJ-329 QA — QA-Audit ergänzt 'QA Test Results'-Sektion in der Spec mit 7 dokumentierten Bugs (3 Medium, 4 Low) und Production-Ready-Empfehlung. 3 davon direkt gefixt: BUG-1 ProductSlideOver schrieb ASIN-Edits ohne asin_source='manual'-Stamping (Variant-Quick-Edit hätte Konflikt-Marker fälschlich getriggert), BUG-2 CSV-Import setzte asin_source nicht auf 'import' (Spec-AC war nicht implementiert), BUG-3 Trigger-Pre-Condition prüfte nur length(NEW.asin)=10, jetzt vollständiges Regex ^[A-Z0-9]{10}$ als Defense-in-Depth gegen lower-case oder Junk-ASINs. 2 neue Vitest-Specs (34/34 grün). Verbleibende Lows als Follow-Up dokumentiert (Slide-Over Badge/Banner, Client-Side-Filter bei > 2k Produkten, 500 statt 4xx bei stale Marker, Banner-onResolved schließt Dialog). Keine Critical/High-Findings — Sicherheit (Workspace-Guard, RLS, Rate-Limit, .strict() POST-Schema) solide, Cross-Feature-Impact (PROJ-67/54/328) ohne Behavior-Wechsel.
v1.88.0402026-05-27
  • PROJ-329 Frontend — Source-Badge + Konflikt-Banner im ASIN-Feld des Produkt-Detail-Formulars. Badge 'Auto aus Listing' bzw. 'Import' erscheint direkt unter dem ASIN-Input, sobald products.asin_source IN ('listing_auto','import') — bei 'manual' und NULL bleibt das Feld bewusst rauscharm. Konflikt-Banner (amber Alert mit AlertTriangle + zwei Buttons) wird sichtbar wenn products.asin_conflict_listing_id gesetzt ist. Banner fetched die Listing-ASIN best-effort aus amazon_listings für eine sprechende Meldung ('… abweichende ASIN: B08...'); fällt der Fetch aus (Permissions/Listing fehlt) bleibt der Übernehmen-Button trotzdem nutzbar weil das Backend selbst gegen das Listing resolved. Beide Buttons rufen POST /api/products/[id]/resolve-asin-conflict mit action accept_listing / keep_manual, zeigen Loading-Spinner und Toast-Feedback, triggern danach Product-Refresh. Gelbes Warndreieck mit Tooltip 'ASIN-Konflikt vorhanden' neben dem Produkt-Titel im Kanban und in der Produkt-Tabelle (stopPropagation gegen Card-Click). Optionaler Filter 'Nur ASIN-Konflikt' in der Filterleiste — als Boolean-Toggle direkt im Filter-Popover-Stage-1 implementiert (kein Stage 2), eigener Filter-Chip mit X-Removal, URL-Param ?asin_conflict=1 für Deeplink. ProductFilters-Type und Filter-Pipeline um has_asin_conflict erweitert (filterByAsinConflict, getActiveFilterCount). Product-Interface in src/lib/validations/product.ts um asin_source und asin_conflict_listing_id ergänzt — bestehender select('*') in Detail-Page und Listings-API lädt die Felder automatisch.
v1.88.0392026-05-27
  • PROJ-329 Backend — Auto-ASIN-Pflege auf Produktebene. Neuer PL/pgSQL-Trigger sync_asin_from_listing() (SECURITY DEFINER) auf amazon_listings, fired AFTER INSERT OR UPDATE OF flowkom_product_id, asin. Befüllt products.asin aus dem gemappten Listing wenn das Produkt noch keine ASIN hat (asin_source='listing_auto'), respektiert manuelle ASINs (kein Overwrite — stattdessen Konflikt-Marker products.asin_conflict_listing_id), idempotent bei mehrfacher Trigger-Feuerung, mit Workspace-Konsistenz-Check (RAISE EXCEPTION bei Mismatch). Zwei neue Spalten: asin_source TEXT CHECK ('manual','listing_auto','import') und asin_conflict_listing_id UUID FK ON DELETE SET NULL, plus Partial-Index. Backfill via DO-Block (DISTINCT ON sorted by created_at ASC — erstes Listing gewinnt bei Mehrfach-Marketplace-Mapping, Edge Case 2), reentrant, RAISE NOTICE loggt n_filled/n_conflicts. PATCH /api/products/[id] akzeptiert nun asin (Zod /^[A-Z0-9]{10}$/) und stempelt asin_source='manual' + cleart Konflikt-Marker. POST /api/products macht dasselbe beim manuellen Anlegen. Neuer Endpoint POST /api/products/[id]/resolve-asin-conflict mit Body { action: 'accept_listing'|'keep_manual' } für die Konflikt-Auflösung (Auth + Rate-Limit 60/min). Produkt-Form Edit-Pfad (direkter supabase-Update aus dem Browser) stempelt source='manual' + cleart Marker nur bei tatsächlicher ASIN-Änderung. 32 neue Vitest-Specs (22 Trigger-Semantik + Migration-File-Strukturchecks, 10 API-Route-Branches). Folge: Frontend (ASIN-Badge + Konflikt-Banner) und QA via /frontend bzw. /qa.
v1.88.0362026-05-27
  • PROJ-325: Dashboard-Widget für offene manuelle Picklisten. Neuer fünfter KPI-Tile auf der allgemeinen Dashboard-Übersicht (sichtbar für alle Workspace-Member, nicht admin-only — Picking/Writeoff sind operative Themen). Zeigt Counter aller Picklisten mit `writeoff_reason IS NOT NULL AND written_off_at IS NULL`. Visual Emphasis (border-red-300 / bg-red-50/30 / red-700-Text + AlertTriangle-Icon rot) sobald `count > 0 UND die älteste offene Ausbuchung > 24h alt` ist — verhindert dass vergessene Ausbuchungen tagelang im Backlog liegen. Klick auf die Card navigiert auf `/dashboard/outbound/picklists?pending_writeoff=true` (gefilterte Ansicht aus PROJ-325 Task 7). Bei Count = 0 zeigt die Card 'Keine offenen Ausbuchungen' statt eines Datums. Fetch läuft parallel im bestehenden `Promise.all`-Block der Dashboard-Page (Server Component, kein zusätzlicher Roundtrip).
v1.88.0242026-05-26
  • Manuelle Pickliste — Bestandsausbuchung (PROJ-325). Manuelle Picklisten haben jetzt einen expliziten Ausbuchen-Flow mit Pflicht-Grund (FBA, Muster, Defekt, Sonstiges), Teilmengen-Unterstützung und prominenten Anti-Vergess-Badges in Liste, Detail und Versand-Screen.
v1.88.0122026-05-26
  • Doku-Cleanup — PROJ-326 INDEX-Status auf Deployed gesetzt + Deployment-Metadata (v1.88.011, PR #277) und QA-Hardening-Details dokumentiert. Kein Code-Touch. PR #278.
v1.88.0112026-05-26
  • PROJ-326 Post-QA-Haertung — QA-Skill fand 5 weitere Bugs am Splitter, alle gefixt: BUG-1 (No-Space-Fallback fuer Hauptstr.5 / Falkensteiner Str.30A — ~2.4% aller DE-Auftraege waren betroffen), BUG-2 silent-fail (Strasse des 17. Juni 10 wurde am ersten Match an Strasse des zerschnitten, Rest landete als falsche Hausnummer auf dem Label — Fix: \s aus House-CharClass entfernt damit lazy backtracking nur die letzte zusammenhaengende Digit-Sequence am Ende matched), BUG-4 (Pre-Flight-Length-Check ADDRESS_HOUSE_TOO_LONG statt silent truncation auf 10 Zeichen), BUG-6 (Newline/CR-Sanitisierung Defense-in-Depth), BUG-7 (\w durch [a-zA-Z] ersetzt da Underscore unrealistisch). BUG-3 (internationale Adressen mit Hausnummer am Anfang wie '5 rue ...') als bewusste Limitation dokumentiert; DHL Retoure ist DE-only und Pre-Flight-Error gibt jetzt klaren Hinweis. Plus 8 neue Vitest-Specs (Total 39/39 PASS). Teil von PR #277.
v1.88.0102026-05-26
  • PROJ-326 DHL Retoure scheitert bei Adressen mit Hausnummer-Range — Live-Vorfall Pixkom: Order 44331 (Augustastr. 2-4, Aachen, Otto-via-Shopify) konnte kein Retourenlabel erzeugen, DHL antwortete 'Please add your data in the field Number'. Root Cause: simple Regex in createDhlReturnLabel kannte nur Ziffern + optional 1 Buchstabe, scheiterte an Bindestrich-Ranges, Slashes, Mehrfach-Buchstaben. Bei Nicht-Match wurde leeres addressHouse an die DHL Retoure API geschickt, die es als Pflichtfeld verlangt. Fix: neue Helper-Funktion splitGermanStreetAddress() in src/lib/shipping-address-parser.ts mit robusterer Regex, plus Pre-Flight-DhlValidationError mit lesbarem Hinweis statt kryptischem DHL-Fehler. Plus 12 Vitest-Specs, alle PASS. PR #277.
v1.88.0092026-05-25
  • Doku-Cleanup — PROJ-323 und PROJ-324 INDEX-Status auf Deployed gesetzt + Deployment-Metadata (v1.88.008, PR #274) und QA-Hardening-Details (BUG-1/2/3 + 25 Vitest-Specs) im Feature-Eintrag dokumentiert. Kein Code-Touch. PR #275.
v1.88.0082026-05-25
  • PROJ-324 Post-QA-Haertung — drei Low-Bugs vor Merge gefixt: BUG-1 (Spec-Drift) PROJ-186 speichert fuer manuelle Auftraege sales_channel="flowkom", Helper lieferte 43383-FL statt versprochenes 43383-MA; Sonderbehandlung im Helper bringt das Verhalten in Einklang mit Spec. BUG-2 (Truncation) bei langen WMS-Order-Nummern + Amazon-OrderIDs (zusammen > 35 chars) schnitt das padEnd-Safety-Net die letzte Ziffer der Amazon-ID ab; jetzt wird gezielt am external_order_number-Rand getrimmt, baseRef bleibt intakt. BUG-3 (Defense-in-Depth) channel_name in /api/integrations/[id]/channel-rules erlaubte Steuerzeichen, Newlines und fuehrende/trailing Whitespace im Admin-Input — zwei refine-Constraints in beiden Schemas (POST + PUT) blocken das, Unicode/Umlaute bleiben erlaubt. Plus 25 Vitest-Specs fuer buildDhlRefNo (Acceptance-Criteria, Channel-Code-Ableitung, Fallback, Sonderzeichen, Truncation) verhindern silent Regressions. Alle 25 PASS. Teil von PR #274.
v1.88.0072026-05-25
  • PROJ-324 DHL-Etikettenreferenz mit Verkaufskanal — bisheriges refNo-Format orderNumber.padEnd(8,"0") produzierte fuer kurze WMS-Bestellnummern Trailing-Nullen (43383 -> 43383000), optisch verwirrend und ohne Kanal-Info. Neues Format {orderNumber}-{channelCode}[-{externalOrderNumber}] integriert den sales_channel (PROJ-100) und die Marktplatz-Bestellnummer direkt aufs Etikett: Otto via Shopify wird zu 43383-OT-cbn4xsjwks, Kaufland zu 43383-KA-..., Amazon (alle Marktplaetze) zu 43383-AM-206-1234567-1234567, Shopify direkt zu 43383-WE-..., manuell zu 43383-MA (exakt 8 Zeichen, kein Padding noetig). Channel-Code = erste 2 Buchstaben des sales_channel uppercased (amazon_de -> AM); neue Marktplaetze (eBay, mirakl, ...) brauchen 0 Code-Aufwand sobald eine Channel-Rule existiert. Neue exportierte Helper-Funktion buildDhlRefNo() in src/lib/dhl.ts, eingesetzt in den drei Aufrufern shipping/ship, shipping/[id]/additional-label und settings/dhl/retry-label. Die padEnd(8,"0").substring(0,35)-Sicherung in createDhlShipment bleibt als Schutznetz erhalten. PR #274.
v1.88.0062026-05-25
  • PROJ-323 DHL Label-Nachdruck als PDF — der „PDF Download"-Button im Reprint-Popover (Auftragsdetail, PROJ-70) loeste bei zugewiesenem Drucker einen ungewollten Druckauftrag aus statt das PDF zu liefern; Toast meldete „Kein Label zum Herunterladen verfuegbar". Root Cause: Popover schickte den Request bei action="reprint" immer an /api/shipping/[id]/reprint ohne print-Flag, dort wurde aufgrund Drucker-Zuweisung ein Print-Job angelegt und keine shipping_label_url zurueckgegeben. Der dedizierte /download-Endpoint existiert seit afb663f5 (2026-02-21), wurde vom spaeter angelegten Popover aber nie aufgerufen. Fix routet PDF-Klick fuer reprint jetzt auf /download (Body nur document_type), Direktdruck-Pfad und additional/return-Label-Pfade unveraendert. Eine Datei, keine API/DB-Aenderung. PR #274.
v1.88.0042026-05-24
  • PROJ-320 BUG-1 Closeout — Letzter offener QA-Befund nachgereicht: "Nachdrucken"-Button in der Versand-Card der Auftragsdetailseite wird jetzt nur angezeigt wenn `shipping_label_url` gesetzt ist. Tasks ohne PDF (manuelles Tracking aus PROJ-320, non-DHL Zusatz-/Retoure-Labels) zeigten den Button vorher, Backend lieferte beim Klick einen kontrollierten 400 "Kein Label gespeichert". Spec erlaubt explizit beides, war daher non-blocking — Sauberkeits-Cleanup damit keine Dead-End-Clicks moeglich sind.
v1.88.002
  • PROJ-321 — Parent-Fortschritt: Editierbare Child-Matrix unter dem Aggregat-Block. Zeilen = Child-SKUs (sticky erste Spalte mit SKU + Variant-Attributen), Spalten = Optionen einer Checkbox-Gruppe. Spalten-Header-Klick = Mehrheits-Toggle (alle setzen wenn nicht alle gesetzt; alle entfernen wenn alle gesetzt). Pure Helpers in src/lib/products/checkbox-matrix-helpers.ts (14 Vitest-Tests). Neuer Endpoint POST /api/products/checkbox-bulk-toggle (Auth + Rate-Limit 10/min + Workspace-Scope + Group/Option-Validation) ersetzt N parallele PATCHes durch einen atomaren Server-Loop. Cell-Checkboxes sind während Spalten-Toggle disabled (Race-Schutz Single-Cell ↔ Bulk). QA-Skill fand 3 Low-Findings, alle vor Merge gefixt: BUG-1 (Rate-Limit → dedizierter Bulk-Endpoint), BUG-2 (Race-Condition → cell-disable), BUG-3 (Toast-Wording „Updates" → „Child-Updates" gemäß Spec). Auslöser: Live-Pain-Point auf Parent-SKU 200154 (Pflege musste bisher Child-für-Child erfolgen). PR #272.
v1.86.0522026-05-23
  • PROJ-322 — FBA Defense-in-Depth-Filter ignoriert Geister-Einträge mit quantity_available=0. Behebt Live-Vorfall Pixkom: 4 FBM-SKUs (100076 mit 325 Westheim, 100069 mit 108, 8092551 mit 515, 80947421 mit 433) waren dauerhaft vom Amazon-FBM-Push ausgeschlossen, weil der nächtliche FBA-Pull stale amazon_fba_inventory-Einträge mit qty=0 erzeugt und der PROJ-249-Filter sie als FBA klassifiziert. Code-Fix in loadFbaListingIdSet() filtert per .gt('quantity_available', 0) — PROJ-249-Schutz für echten FBA-Bestand bleibt vollständig. Sekundärfix in fba-zero-out.ts: gleicher Filter, sonst hätte Admin-Zero-Out-Button nach diesem Fix echte FBM-Bestände bei ehemaligen FBA-SKUs auf 0 gesetzt. Plus Migration für DB-Cleanup bestehender Geister + Vitest-Spec. Sofort-Fix vor Deploy: 4 Geister-Einträge manuell gelöscht + Produkte in amazon_inventory_dirty_queue enqueued — Cron-Tick 20:58 UTC pushte alle 4 SKUs mit korrekten Mengen an Amazon.
v1.86.0492026-05-18
  • PROJ-320 QA-Closeout — Drei Findings aus dem `/qa`-Skill auf dem PROJ-320-Branch behoben vor Merge. (BUG-2 High) Shopify-Carrier-Mapping-Regression in `src/lib/shopify/fulfillment.ts`: vor PROJ-320 fiel `triggerShopifyFulfillment` ueber `!shippingTask?.tracking_number` auf `manual_tracking_carrier`-Override zurueck (keine Task existierte). Nach PROJ-320 existiert die Task immer → Override schlug nicht mehr an → Shopify-Bestaetigungsmails fuer Dropshipper-Aufträge (z.B. DHL-Versandart, Hermes-Tracking) zeigten Tracking-Link zum falschen Carrier. Fix: neue Pure-Function `shouldUseManualCarrierOverride` erkennt Manual-Tasks ueber `shipping_label_url IS NULL`-Marker und triggert Override weiterhin korrekt. 5 neue Vitest-Specs sichern die Regel ab. (BUG-4 Low) `/api/shipping/history` zeigte fuer Manual-Tracking-Tasks den Carrier der `shipping_method` statt des manuell eingetragenen Carriers — Auswahl nutzt jetzt `manual_tracking_carrier` mit Label-Lookup ueber `MANUAL_TRACKING_CARRIERS`. (BUG-3 Low) Doppelte UI-Darstellung in der Auftragsdetailseite: manuelle Trackingnummer erschien sowohl als neuer `shipping_tasks`-Card als auch in der `ManualTrackingSection` — Card wird jetzt aus dem Render-Loop gefiltert (`renderedTasks`), bleibt aber in `visibleTasks` damit der Action-Bar-primaryTask die Buttons enabled. BUG-1 (Reprint-Button-Guard) ist non-blocking weil das Reprint-Backend bei `shipping_label_url IS NULL` bereits einen sauberen 400 "Kein Label gespeichert" zurueckliefert — Spec erlaubt explizit beides.
v1.86.0482026-05-18
  • PROJ-320 — Manuelles Tracking erzeugt jetzt eine begleitende `shipping_task`, damit Retoure- und Zusatz-Etikett-Buttons im Auftragsdetail sofort verfuegbar sind. Bisher setzte PROJ-209 nur `orders.manual_tracking_number`/`status='shipped'` und legte keine `shipping_tasks`-Zeile an. Die Label-Action-Bar und die `additional-label`/`return-label`-Endpoints sind aber hart an `shipping_tasks.id` als Pivot gekoppelt -> „+ Etikett“ disabled, „Retoure“ gar nicht gerendert. Live-Vorfall Pixkom 2026-05-18 Auftrag 36317 (Dropshipper-Versand mit DHL-Tracking) fuehrte zu Quick-Fix per DB-Insert + dieser strukturellen Loesung. POST/PATCH/DELETE-Handler in `manual-tracking/route.ts` rufen jetzt einen neuen Helper `src/lib/shipping/manual-tracking-task.ts` auf, der eine `shipping_task` mit `label_type='outbound'`, `status='completed'`, `shipping_label_url=null` schreibt/updated/loescht. Idempotent ueber `(order_id, tracking_number)`. Schutz vor Antasten echter DHL/DP-Tasks via `shipping_label_url IS NULL`-Filter in PATCH/DELETE. Plus Backfill-Migration fuer 52 Bestands-Orders auf Pixkom mit `manual_tracking_number` ohne entsprechende Task. 11 Vitest-Specs gruen, TS+Lint clean.
v1.86.0472026-05-15
  • PROJ-319 QA-Closeout — Vier Findings aus dem `/qa`-Skill nach Merge nachgereicht: (BUG-3 Critical) Backup-Tabelle `picklist_profiles_filters_backup_proj319` wurde ohne RLS angelegt, anon-key konnte SELECT/INSERT/DELETE über alle Workspaces — Sofort-`ENABLE ROW LEVEL SECURITY` auf Production direkt + idempotente Folge-Migration im Repo; (BUG-2 Medium) `overrides.tag_filters` im Picklisten-POST war `z.any()`, ungültiger Payload wäre stillschweigend zu undefined geworden — jetzt `tagFiltersInputSchema` (akzeptiert beide Formen) + striktes location-filters-Schema; (BUG-5 Medium) Form-Dialog Preview-Count ignorierte `tag_filters`/`max_orders`/`location_filters`, lieferte daher andere Zahl als die Saved-Profile-Card — Preview-Fetch sendet jetzt alle Filter-Dimensionen mit; (BUG-4 Low) gelöschte Tags hinterließen tote ID-Verweise in JSONB-`tag_filters`, UI zeigte 6-char-Substring statt Tag-Namen — neuer BEFORE-DELETE-Trigger `trg_cleanup_tag_filters_on_delete` auf `tags` filtert die gelöschte ID aus `picklist_profiles` (neue + Legacy-Form) UND `replenishment_profiles`, leere Buckets werden zusammengefaltet, end-to-end gegen Staging verifiziert. Plus Lessons-Learned-Section in der Spec für künftige Migrationen (Backup-Tabellen IMMER mit RLS anlegen, Parity-Checks als `RAISE EXCEPTION` statt `NOTICE`, `/qa`-Skill VOR dem Merge fahren).
v1.86.0452026-05-15
  • PROJ-319: Picklisten-Tag-Filter Schema-Split — `tag_filters` JSONB aufgeteilt in zwei semantisch klare Konzepte: `must_have` (Einschluss, AND/OR-Toggle) und `must_not_have` (Ausschluss, immer AND). Behebt einen Live-Bug bei Pixkom, wo alle drei Standard-Profile (One-Scan, Multi, DHL Paket) `logic="OR"` mit reinen `HAS_NOT`-Regeln kombiniert hatten — strukturell wirkungslos (`HAS_NOT(A) ∨ HAS_NOT(B)` ist nur false wenn beide Tags). PL-2026-0240/0237/0236 hatten dadurch je 1-2 Aufträge mit Personalisierte-Artikel-Tag obwohl ausgeschlossen. Root Cause war nicht der Helper-Code (boole'sch korrekt), sondern dass das Schema HAS und HAS_NOT als gleichwertige Operatoren mit globalem Logic-Toggle modellierte — die Kombination HAS_NOT+OR ist damit strukturell unmöglich geworden. Migration backfillt deterministisch (4 Profile, kein Mixed-Fall im Bestand), Helper hat Read-Fallback für eine Release-Phase. UI: zwei klar getrennte Sektionen 'Aufträge müssen diese Tags haben' und 'Aufträge dürfen diese Tags NICHT haben'. Sofort-Daten-Hotfix der 3 betroffenen Pixkom-Profile von OR auf AND auf Production am 2026-05-15 vor Implementierung deployed. PR #267, Production-Migration verifiziert (alle 4 Profile sauber im neuen Schema), 23 Vitest-Specs grün, Independent-Code-Review clean.
v1.86.0432026-05-15
  • PROJ-318 QA-Closeout: PGRST116-Guard in Auto-Match + Create-Structure — bei zwei aktiven use_for_products-Connections liefern beide Routen jetzt eine klare Fehlermeldung statt der irreführenden 'Keine Cloud-Verbindung'-Antwort. Spec + INDEX auf Deployed gesetzt. PR #265.
v1.86.0412026-05-14
  • PROJ-318: Produkt-Cloud-Folder Polish — Verknüpfung-lösen-Button im Dateien-Tab, Connection-Filter auf use_for_products in Auto-Match + Create-Structure (Multi-Provider-Setup hat zuvor nicht-deterministisch die falsche Cloud gewählt), SKU-Token-Boundary-Match statt startsWith, neuer Create-Dialog mit editierbarem Pfad + Name + Dedupe.
v1.86.0312026-05-14
  • PROJ-292/298 QA-Doku-Drift Fix: INDEX-Eintrag von PROJ-292 sagte fälschlich auto_reconcile_fba-Toggle, Code nutzt seit Anfang den auto_import_fba-Toggle (bewusst, get-active-integrations.ts:14-15). Plus probe-reports.ts + route.ts Header-Kommentare PROJ-297→PROJ-298 (ID-Race-Artefakt, INDEX-Eintrag war schon retagged). Reine Doku-Korrekturen, kein Verhaltensänderung. PR #264.
v1.86.0302026-05-14
  • Cleanup-Pass: INDEX-Status PROJ-292/293/298/299/300 auf Deployed gesetzt + Detail-Texte um Live-Befund und PR-Referenzen ergänzt. Kein Code-Change, nur Dokumentation. PR #262.
v1.86.0292026-05-14
  • PROJ-317 Kostenlose Ersatzlieferung sofort als bezahlt anlegen — Neuer Switch „Sofort als bezahlt markieren“ (Default an) im Replacement-Modus des OrderFormDialog; POST /api/orders/[id]/replacement akzeptiert mark_as_paid: boolean und setzt financial_status beim Insert auf 'paid' oder 'pending'. Spart einen manuellen Klick pro Ersatzanlage, Order erscheint direkt auf der Standard-Pickliste (PROJ-210-Filter status='open' AND financial_status='paid'). Nur im Replacement-Modus sichtbar, Edit/Normal-Anlage unverändert. Keine Migration. Deployed via PR #259.
v1.86.0252026-05-14
  • PROJ-316 QA-Polish: drei mechanische Defense-in-Depth-Fixes aus dem QA-Audit auf PROJ-315/316. (1) WorkstationAssignmentForm.handleSave löschte alle Rows der Workstation im jeweiligen entityKind-Table und konnte parallele Edits aus einer anderen Admin-Session überschreiben — Delete ist jetzt auf die im Form sichtbaren entity_ids gescoped (analog zum API-PUT-Handler). (2) /api/etiketten/print 23503-Branch differenziert via insertError.details zwischen printer_id- und workstation_id-FK-Verstoß, neuer Response-Code 'workstation_missing' mit angepasstem Toast-Text. (3) PDF-Magic-Byte-Check ('%PDF') vor dem Storage-Upload verhindert dass authentifizierte User die labels-Bucket mit Nicht-PDFs füllen, 415 bei Verstoß.
v1.86.0242026-05-12
  • PROJ-316 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0232026-05-12
  • PROJ-316: Etikettendruck — Server-side Upload + Print-Job-Endpoint (Folgefix PROJ-315). Mit PROJ-315 wurde der 'An Drucker senden'-Pfad zum ersten Mal end-to-end erreichbar und brach sofort am Browser-Upload mit 'new row violates row-level security policy': der labels-Bucket hat auf Production keine INSERT-Policy für authenticated Users, alle anderen Schreibpfade laufen serverseitig mit service_role (DHL/DP-Label-Upload, Print-Broker-Test-PDF, Cleanup-Cron). Neue Route POST /api/etiketten/print (multipart/form-data) übernimmt Auth + Rate-Limit + Workstation-Ownership-Check + Drucker-Zuweisungs-Lookup + service-role Upload + print_jobs.insert in einem Roundtrip; bei FK-23503 zwischen Lookup und Insert wird der hochgeladene Blob best-effort wieder entfernt. Frontend ersetzt drei inline supabase-Calls durch einen fetch.
v1.86.0222026-05-09
  • PROJ-315 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0212026-05-08
  • PROJ-315: Drucker-Zuweisung für Etiketten-Typen pro Workstation. Neue Tabelle label_type_printer_assignments (Workstation × label_type → Primär+Fallback-Drucker) symmetrisch zur bestehenden shipping_method_printer_assignments. Workstation-Detail-Drawer bekommt zwei Sektionen 'Versandarten' + 'Etiketten' — der bestehende Form-Component wurde via entityKind-Pattern generalisiert. Print-Label-Dialog macht jetzt einen Lookup auf die neue Tabelle vor print_jobs.insert und schreibt printer_id mit; ohne Zuweisung erscheint ein Toast mit Hinweis auf Settings statt eines hängenden Print-Jobs. Behebt strukturelle Lücke aus PROJ-99/304/306/312/314 (der gesamte 'An Drucker senden'-Pfad im Etikettendruck-Modul hatte zuvor keinen Drucker).
v1.86.0172026-05-08
  • PROJ-314 (UX-Polish PROJ-99/306): Etikettenformat-Default und Workstation-Memory im Druck-Dialog. (1) Etikettenformate können jetzt als Standard markiert werden (analog zu Vorlagen aus PROJ-306) — Print-Dialog wählt das Workspace-Default oder System-Default automatisch vor; System-Default ist jetzt 50×30mm statt 38×19mm. (2) Beim Submit werden Action (download/print) und Workstation-ID pro Workspace im localStorage gemerkt und beim nächsten Mount vorausgewählt. Stale Workstation-IDs (gelöscht/deaktiviert) fallen automatisch auf die erste verfügbare zurück. Plus: Format-Helpers reichen DB-Fehler jetzt mit Code/Details/Hint im Toast durch (analog PROJ-309).
v1.86.0162026-05-08
  • PROJ-313 INDEX-Status auf Deployed gesetzt (Bookkeeping).
v1.86.0152026-05-08
  • PROJ-313: FX-Auto-Seed Race-Condition + Server-side Dedupe (Folgefix PROJ-310). LB-10081 zeigte zwei identische USD-FX-Zeilen mit duplicate-key-violation beim Save. Auto-Create-Effect aus PROJ-310 lief beim Mount mit fxRates=[] parallel zum noch laufenden Fetch — Race produzierte Duplikat-State. Fix: Effect bailt waehrend loading, funktionale Dedupe in setState, plus server-side FX-Dedupe in der PATCH-Route als Defense-in-Depth gegen kuenftige Frontend-Bugs.
v1.86.0132026-05-08
  • PROJ-312 (UX-Polish PROJ-306): Etikett-Text-Hierarchie verbessert. Artikelname / Lagerplatzname werden jetzt als Primärzeile in voller Schriftgröße gerendert; SKU, Marke und FNSKU als Sekundärinfos in ~70 % der Größe darunter. Vor SKU steht „Art. Nr.: " und vor FNSKU „FNSKU: ", damit beim Lesen sofort klar ist was die Nummer bedeutet. Marke bleibt ohne Prefix. Auto-Fit-Algorithmus schrumpft die Basis-Schriftgröße global bis alles ins Höhenbudget passt — sekundäre Zeilen folgen proportional.
v1.86.0112026-05-08
  • PROJ-310 (Architektur-Lücke aus PROJ-301): Sidebar-Summen und Landed-Cost-Preview von LBs lasen die Lieferanten-Währung aus der Legacy-Spalte `purchase_orders.exchange_rate`, während die Cost-Lines bereits auf `purchase_order_fx_rates` umgestellt waren. Bei LBs mit Lieferant-Währung ≠ EUR aber EUR-only Cost-Lines (z.B. LB-10081 Ningbo Delin USD) gab es keinen passenden FX-Eintrag und der Default 1.0 produzierte stille 1:1-Konvertierungen (8.335 USD ≈ 8.335 €). Fix: alle Konvertierungs-Pfade lesen jetzt `purchase_order_fx_rates[supplierCurrency]` mit Legacy-Fallback, der FX-Block im Kosten-Tab erscheint sobald die Lieferanten-Währung ≠ EUR ist, der Auto-Create-Effekt seedet die FX-Row beim Mount, und ohne belastbaren Kurs zeigt die Sidebar einen „Kurs fehlt"-Chip statt einer falschen EUR-Zahl. Migration `20260508170000_proj310_backfill_supplier_fx.sql` schreibt für alle bestehenden Fremdwährungs-LBs ohne FX-Row einen Eintrag aus `po.exchange_rate` nach (idempotent, ON CONFLICT DO NOTHING).
v1.86.0082026-05-08
  • PROJ-311 (Folgefix PROJ-309): RLS-Policies für `label_templates` und `label_formats` auf das einheitliche `is_workspace_member()`-Pattern umgestellt. Beim Anlegen einer neuen Etikettenvorlage scheiterte INSERT mit `42501 new row violates row-level security policy` weil PROJ-99 (Etikettendruck-Modul) als einzige im Projekt noch das alte `(auth.jwt()->>"workspace_id")::uuid`-Pattern nutzte — bei JWTs ohne Custom-Claim (ältere Sessions, Multi-Workspace) lieferte der Check NULL und blockierte. Migration droppt idempotent alle 8 alten Policies (SELECT/INSERT/UPDATE/DELETE pro Tabelle × 2) und erstellt sie identisch zur PROJ-415-Sammelmigration neu. Kein Datenmodell-Touch, reversibel.
v1.86.0062026-05-08
  • PROJ-309 (Folgefix PROJ-306): Beim Anlegen einer neuen Etikettenvorlage erschien nur der generische Toast „Fehler beim Erstellen: Ein unerwarteter Fehler ist aufgetreten." — der echte DB-Fehler (RLS/CHECK/Unique) wurde unterdrückt. Root Cause: PostgrestError aus supabase-js v2 ist nicht instanceof Error, deshalb fiel der Catch immer in den Fallback-Text. Fix: alle drei Helper (create/update/delete) wrappen den Postgrest-Fehler in ein echtes Error-Objekt mit kombinierter Message inkl. Code/Details/Hint; Form-Dialog hat zusätzlich einen Defense-in-Depth-Branch und console.error für F12-Diagnose. Toast-Duration 8 s → 12 s.
v1.86.0052026-05-07
  • PROJ-308: Amazon Shipment-Confirmation-Cron filterte mit `status='shipped'` und schloss FBM-Orders permanent aus, die durch Workflow-Auto-Progression (PROJ-217) bereits auf `status='completed'` gewechselt hatten bevor der Cron sie confirmen konnte. Production-Audit fand 13 stuck Orders (FBM, shipped_at NOT NULL, amazon_confirmation_sent_at NULL, status=completed). Fix: `confirmShipments` und `dryRunShipments` filtern jetzt auf `status IN ('shipped','completed')`. Stuck Orders werden nach Deploy automatisch vom nächsten 5-Min-Cron-Lauf aufgepickt und confirmt — kein Daten-Backfill nötig.
v1.86.0042026-05-07
  • PROJ-306: Hermes-Carrier-Wert auf SP-API XSD-Enum "Hermes Logistik Gruppe" korrigiert — DEFAULT_CARRIER_MAP, CARRIER_FALLBACK_MAP und MANUAL_TRACKING_CARRIERS mappten bisher auf "Hermes" (kein gültiger Enum-Wert), was bei Workspaces mit Hermes-Versandart denselben Amazon-Fehler 25 wie PROJ-303 produziert hätte. label/shopify-Werte unverändert.
  • PROJ-306: Save-Button im Amazon-Versandart-Mapping-Block blockiert jetzt korrekt bei leerer Carrier-Auswahl — hasInvalidCarrier short-circuited bisher bei leerem amazonCarrier (falsy), User konnte mit incomplete-Row speichern und bekam generischen Zod-400-Toast. hasIncompleteCarrier prüft jetzt explizit auf leer wenn flowkomMethod gesetzt ist. CarrierCombobox bekommt required-Prop und markiert leere Zeilen rot.
v1.86.0032026-05-08
  • PROJ-306: Etikettenvorlagen — Multi-Field, Marke, Default-Vorlage. Vorlagen können jetzt mehrere Text-Felder gleichzeitig anzeigen (z.B. Name + SKU + Marke), die Marke ist als neue Feld-Option dazugekommen (Lookup gegen `manufacturers.brand_name`), und Vorlagen können als "Standard" für ihre Kategorie markiert werden — im Druck-Dialog automatisch vorausgewählt (Workspace-Default vor System-Default). Plus Bug-Fix: Toast bei Anlege-Fehler reicht jetzt die DB-Fehlermeldung durch (vorher anonym „Fehler beim Erstellen:"). DB-CHECK-Constraints für Whitelist-Werte hinzu, damit ungültige Enum-Werte nicht mehr silent in der DB landen. Migration backfilled bestehende Single-Field-Vorlagen verlustfrei ins neue Multi-Field-Format.
v1.86.0022026-05-08
  • PROJ-304: Etikettendruck-Layout deutlich aufgewertet — EAN-13-Barcode nutzt jetzt die volle Etikettenbreite (vorher ~⅓ der Breite wegen festem Aspect-Ratio-Lock 1.44:1, der EAN-Standard erlaubt explizit verkürzte Bars), die numerische EAN-Nummer ist immer eingebrannt direkt unter dem Barcode (alle Typen: EAN-13 / Code 128 / Code 39 via jsbarcode `displayValue:true`), und der Produktname steht klein darunter. Bei EAN-13 mit klassischer Guard-Bar-Anordnung und Lead-Digit links im Quiet Zone (Online-Generator-Look). PDF-Embedding stretcht das Bild auf volle `printableArea.width` — jsbarcode rendert intern mit Integer-Modulbreite und trifft die Ziel-mm sonst nie exakt; Modul-Verhältnisse bleiben proportional, Scanner lesen ohne Probleme.
v1.86.0002026-05-08
  • PROJ-303: Amazon Carrier + Versandart Mapping. Behebt strukturell den Live-Bug 2026-05-07 (17+ FBM-Orders dauerhaft mit Amazon-Fehler 25 weil Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` einen ungültigen CarrierCode-Enum-Wert produzierte — der Hotfix #240 mit Commit-Tag PROJ-301 hatte das Symptom bereits behoben). Neues Mapping-Feld `amazon_method_overrides` parallel zum legacy `carrier_overrides` (Backward-Compat 1 Release), 3-Spalten-Settings-UI: Flowkom Versandart | Amazon Transportdienst (Combobox aus AMAZON_CARRIER_CODES-Whitelist mit ~63 SP-API-XSD-Enum-Werten, ungültige Werte rot mit Save-Block) | Amazon Versandart (Freitext, leer = Element weglassen). Resolver `resolveCarrierAndMethodForOrder` nutzt neue Map zuerst, fällt auf Legacy-Pfad zurück (PROJ-293-Manual-Tracking-Verhalten unverändert). Idempotente Backfill-Migration kopiert bestehende `carrier_overrides`-Daten als `{carrier: <wert>, method: ""}` ins neue Schema, skippt Workspaces ohne Daten. KEIN DEFAULT_SHIPPING_METHOD_MAP (vermeidet stillen Behavior-Change bei live-only-Testing). 13 Vitest-Specs grün (10 resolveCarrierAndMethodForOrder + 3 buildShipmentConfirmationXml), TS+Lint clean, Staging+Production-Migration ohne Fehler durchgelaufen. SP-API-Doku-Recherche bestätigt: CarrierCode = strikter XSD-Enum, ShippingMethod = Freitext. INDEX wurde von PROJ-301 auf PROJ-303 retagged nach Race mit PROJ-301 (LB Flexible Kostenstruktur, #233) und PROJ-302 (LB-Kanban Cost-Pills, #237) — Hotfix-Commit-Tag bleibt PROJ-301 per Memory-Regel.
v1.85.0112026-05-08
  • PROJ-301 Hotfix: Workspace-Setting `carrier_overrides["DHL Paket"]="Paket"` aus allen Amazon-Workspaces entfernt + 17 Stuck FBM-Orders (Fehler 25, attempts >= 10) auf attempts=0 zurückgesetzt. Live-Bug 2026-05-07: Amazon lehnte jeden Shipment-Confirmation-Feed mit Error 25 ab weil 'Paket' kein gültiger XSD-Enum-Wert für CarrierCode ist. Idempotente Migration, Cron picked die freigegebenen Orders direkt nach Deploy auf und confirmed sie sauber mit `<CarrierCode>DHL</CarrierCode>` (DEFAULT_CARRIER_MAP-Fallback). Strukturelle Lösung folgt in PROJ-303.
v1.85.0102026-05-08
  • LB-Kanban Cost-Pills farbig differenziert: Fracht amber, Zoll rose, Sonstige blue (light + dark mode). Bessere Visual-Scan auf einen Blick welcher Typ Kosten erfasst ist. Reine Tailwind-Class-Erweiterung, kein API/Logik-Touch.
v1.85.0082026-05-08
  • PROJ-302: LB-Kanban Cost-Presence-Pills. Drei kleine Pills auf den LB-Kanban-Karten (Truck/Landmark/Package für Fracht/Zoll/Sonstige) zeigen auf einen Blick, ob für eine Lieferantenbestellung Kostenpositionen erfasst wurden. Pills nur sichtbar wenn `purchase_order_costs`-Zeilen vom jeweiligen Typ existieren — bei leeren LBs bleibt die Card unverändert kompakt. Tooltip beim Hover zeigt den EUR-aggregierten Betrag pro Typ (FX-konvertiert via `convertCostLineToEur`, de-DE-Format mit Komma-Dezimaltrennung und Euro-Symbol). Visueller Stil parallel zu IncotermBadge/TransportModeBadge (shadcn `Badge variant=outline`, kompaktes 3x3-Icon). Approach: separater Endpoint `GET /api/purchase-orders/cost-summary?ids=...` (cap 200, RLS-isoliert über bestehende Policy auf `purchase_order_costs`) plus dedicated TanStack-Query-Hook, der nur im Kanban-Modus aktiv ist — der bestehende `/api/purchase-orders`-Listen-Endpoint (mit der PROJ-294-Search-RPC) bleibt unangetastet, kein Migrations-/Schema-Risiko. 12 neue Vitest-Specs (7 Endpoint-Boundary inkl. ID-Cap, malformed-UUIDs, FX-Konvertierung + 5 Component-Render mit Umlaute-Check), Lint+Build clean.
v1.85.0042026-05-07
  • PROJ-301: Cursor sprang aus dem Beschreibung-Feld wenn man bei Kostenpositionen tippte. Description-Input war controlled (value+onChange), jeder Tastenanschlag feuerte ein API-Save, dessen Response State replaced und den Cursor rauswarf — selbe Wurzel wie der German-Decimal-Bug in PROJ-301. Auf uncontrolled defaultValue+onBlur umgestellt (selbes Pattern wie Amount/Rate), no-op-Guard verhindert unnötige Saves, Composite-Key rehydriert externe Updates korrekt.
v1.85.0032026-05-07
  • PROJ-301: Lieferantenbestellung — Flexible Kostenstruktur mit Multi-Currency. Ablöse der vier festen Kosten-Slots (`freight_cost`/`customs_cost`/`other_costs_eur`/`other_costs_foreign`) auf `purchase_orders` durch zwei neue Tabellen `purchase_order_costs` (N Zeilen pro LB mit Typ Frachtkosten/Zollkosten/Sonstige + Beschreibung + Betrag + Währung + Verteilung) und `purchase_order_fx_rates` (ein Kurs pro genutzter Fremdwährung pro LB, 'Kurs abrufen' gegen EZB/Frankfurter API). Frachtkosten in Fremdwährung sind jetzt erfassbar (vorher nur EUR), jede Position hat eigene Verteilung (Volumen/Warenwert/Menge), Beschreibung Pflicht bei Typ=Sonstige. RPC `calculate_landed_costs` komplett neu geschrieben — iteriert Cost-Lines, FX-konvertiert in EUR, aggregiert pro Allocation-Method UND pro Typ → `goods_receipt_items.{freight,customs,other}_allocation_eur` bleiben für Profitbutler-Reporting befüllt. Auto-Recalc-Trigger auf beiden neuen Tabellen + Advisory-Lock gegen Doppelberechnung sichern rückwirkende Einstandspreis-Synchronität bei jeder Korrektur (auch für Wareneingänge die Wochen zurückliegen). Migration backfillt Bestand atomar inkl. Parity-Check (Toleranz 0,01 €) gegen vorherige `landed_cost_eur` — Drift bricht Migration ab. UI-Tab-Rewrite: shadcn-Table mit Inline-Edit, Empty-State, Live-EUR-Summe + per-Typ-Aufschlüsselung mit FX-Konvertierungs-Hinweis. Deutsche Decimal-Eingabe (Komma) korrekt geparst via defaultValue+onBlur. Details-Sidebar 'Summen' synchronisiert via geteiltem TanStack-Query-Cache — Edits propagieren sofort in beide Views. Branch + Migration tragen Tag PROJ-299 (initial-Race), INDEX wurde nach zweiter Race retagged auf PROJ-301. Alte Spalten erst per Folge-Migration nach 1 Woche stabilem Rollout gedroppt (PROJ-302 geplant).
v1.84.0592026-05-07
  • PROJ-300 FBA Reconciler — PostgREST 10k-Cap + neuere Orders zuerst. PROJ-292-Reconciler-Query hatte kein .order() und kein explizites .limit() — bei 18.184 FBA-Orders der letzten 30 Tage wurden die 10k ältesten verarbeitet, neue Orders wie K-27444 (1.5.) wurden nie angefasst. Fix: .is('shipped_at',null) als Filter, .order('created_at', desc), .limit(10000) explizit. Plus cap_hit + oldest_processed im sync-log-Detail für Backlog-Tracking. Live-Run nach Deploy: candidate_orders 8.195 (statt vorher 10.000 Cap). PR #234.
v1.84.0582026-05-07
  • PROJ-299 FBA Enrichment Dual-Report-Pull (_INVOICING + _GENERAL). Behebt Pixkom-Live-Befund: 12.956 versandte FBA-Orders ohne shipped_at, 15.466 Customers ohne Email-Feld. fetchFbaEnrichment ruft jetzt PII-Report (_INVOICING mit RDT, ~38% Coverage) + Generic-Report (_GENERAL ohne RDT, 100% Coverage) parallel auf, mergt via mergeEnrichmentResults() mit PII-Priorität pro Feld. Trifft alle bestehenden Caller (PROJ-175 Erst-Import, PROJ-250 Tracking, PROJ-292 Reconciler) ohne Signatur-Änderung. 12 neue Vitest-Specs. Live-Run nach Deploy: 19.229 Adress-Rows, 5.100 Customers enriched (Anonymisierungs-Aliase, echte Käufer-Emails liefert Amazon für FBA seit Feb 2026 strukturell nicht mehr, GitHub Disc. #5129). PR #232.
v1.84.0572026-05-07
  • PROJ-295 Hotfix: storage-locations Workspace-Scope via warehouses!inner-Join. Initialer Endpoint /api/mobile/storage-locations/[id]/contents filterte direkt mit .eq('workspace_id', ...) auf storage_locations — die Tabelle hat aber keine workspace_id-Spalte (siehe Migration 20260316110000_proj94_system_locations.sql, Workspace-Scope läuft über das verknüpfte Warehouse). Supabase-Error landete im catch-Block → 500 → Mobile zeigte 'Lagerplatz konnte nicht geladen werden' im Plusbuchung-Modul. Fix: warehouses!inner(workspace_id) Join + .eq('warehouses.workspace_id', ...) — gleicher Pattern wie data-hub/export-builder.ts mit dokumentiertem WAREHOUSE_SCOPED_TABLES-Set.
v1.84.0562026-05-07
  • PROJ-298 CLI-Wrapper für Reports-Probe + RDT-Scopes-Option. Authentifiziert sich direkt über SUPABASE_SERVICE_ROLE_KEY + Amazon-Credentials aus .env.local. Bonus: probeReport() bekommt rdtScopes-Parameter (Default ['buyerInfo','shippingAddress']). Live-Befund 7-Tage-EU-Probe (3923 versandte FBA-Orders): _GENERAL ohne RDT = buyer-email 100%, tracking 100%, PLZ/Stadt/Land 100%; mit RDT = InvalidInput. Name/Strasse strukturell redigiert für non-EU/non-invoicing. PR #230.
v1.84.0552026-05-07
  • PROJ-298 Amazon SP-API Reports Diagnose-Probe — Admin-Endpoint /api/admin/amazon/probe-reports zur Diagnose der FBA-Coverage-Lücke (heute 38% via _INVOICING, Hypothese aus PROJ-292-Research: _GENERAL deckt NA+EU+JP statt nur EU+invoicing-eligible). Pullt einen oder mehrere Reports parallel, parsed das TSV/CSV und gibt zurück: pro Report Field-Coverage-Statistik (welche Spalten zu wieviel Prozent befüllt sind), Sample-Rows (erste N), Order-ID-Sets, paarweiser Cross-Report-Diff (inBoth, onlyInA, onlyInB). Zusätzlich ein PII-Coverage-Block der nur die für Customer-Enrichment relevanten Felder hervorhebt (buyer-email, buyer-name, recipient-name, ship-address-1, tracking-number etc.). Workspace-Admin-only via authenticateSettingsAdmin. Reines Diagnose-Werkzeug ohne Production-Code-Pfad und ohne Schema-Change. Ergebnis entscheidet ob _GENERAL in einer Folge-PR in fetchFbaEnrichment() mit aufgenommen wird. PR #229.
v1.84.0532026-05-07
  • PROJ-295: Neuer Mobile-Endpoint /api/mobile/storage-locations/[id]/contents — liefert Artikel + Bestand pro Lagerplatz, sortiert nach Menge desc, gefiltert auf nicht-archivierte Artikel im Mapper. FBA-Lagerplätze (warehouses.is_read_only) geben 403 mit klarer deutscher Fehlermeldung. Pure mapper + Route mit Zod-UUID-Validation + workspace-scoped Queries. 5 Vitest-Tests grün. Companion zu PROJ-291. Wird in Mobile-Komponenten ProductLocationsList (jetzt mit onSelect-Erweiterung) und neuer LocationContentsList genutzt — siehe Mobile-Eintrag 1.8.4.
v1.84.0522026-05-07
  • PROJ-294: INDEX und Spec-Header auf Deployed gesetzt — Code aus PR #224 ist live (Migration verifiziert via pg_proc/pg_indexes auf Production), Coolify-Deploy durch. Flag USE_ORDER_SEARCH_RPC bleibt per Default false, Code-Pfad in der API bytegleich zu vorher. Aktivierung des RPC-Pfads (Coolify-ENV-Flip + Vorher/Nachher-Vergleich via pg_stat_statements_reset) ist Phase 6 aus dem Spec und steht noch aus.
v1.84.0512026-05-07
  • PROJ-294: Kundenaufträge Search- & Stats-RPC ausgeliefert. Hinter ENV-Flag USE_ORDER_SEARCH_RPC (Default false) - Code-Pfad ist byte-identisch zu vorher solange Flag aus. Migration legt search_orders (UNION ALL über order/external/customer/notes/articles + Top-K-Push-Down via filtered_ids → top_k_ids → join) und get_order_stats (FILTER-Aggregation in einer Query) plus drei Composite-Indizes (workspace_id+status/source/-+created_at DESC). API: src/lib/orders/{search-rpc,enrich}.ts kapseln RPC-Calls + N+1-Enrichments (tags/replacements/return-label/tracking). Frontend: useOrderStats lazy nach erstem Orders-Payload (statsEnabled-State) - spart parallelen Cold-Cache-Burst beim Mount. QA-Skill identifizierte 4 Bugs vor Merge (DoS-Length-Cap, Multi-Word email-Drift, NULL-Sort-Ordering, count(*) OVER blockierte Top-K) — alle gefixt. Auf Staging smoke-getestet, EXPLAIN bestätigt. Echtes Speed-Win wird erst gemessen wenn USE_ORDER_SEARCH_RPC=true auf Coolify gesetzt wird (Sofort-Rollback per ENV-Toggle). PR #224. Erwartet: Search 2-4s → 80-300ms.
v1.84.0492026-05-07
  • PROJ-292 Hotfix: amazon_sync_log.job_type CHECK-Constraint um 'fba_reconcile' erweitern. Der TS-Type wurde in PR #221 erweitert, der DB-CHECK aber nicht — jeder startLog-INSERT warf 23514 (check_violation), wurde im Fire-and-Forget-Catch silent geloggt. Folge: keine sync_log-Row, keine cron_last_execution, manuelle UI-Trigger zeigten 'im Hintergrund gestartet' und nichts passierte. Migration droppt + recreated den Constraint inkl. 'fba_reconcile' (idempotent). PR #226.
v1.84.0472026-05-06
  • PROJ-296 Picklisten-Profil löschen — `picklists.profile_id` von `NOT NULL REFERENCES … ON DELETE RESTRICT` auf nullable + `ON DELETE SET NULL` umgestellt. Der Profil-Delete in den Einstellungen warf bisher `update or delete on table picklist_profiles violates foreign key constraint picklists_profile_id_fkey`, sobald irgendeine Pickliste (auch alte completed/cancelled) auf das Profil zeigte. Picklisten bleiben nach Profil-Delete erhalten, verlieren nur den Profil-Pointer; UI rendert bereits `profile?.name ?? '—'` / `?? 'Unbekanntes Profil'`. Auskommentierter „aktive Picklisten blocken"-Vorab-Check (TODO seit PROJ-9) entfernt — DB übernimmt das Cleanup atomar. Side-effect: Manual-Picklist-Pfad (PROJ-92) kann jetzt tatsächlich `profile_id: null` schreiben — der Code wollte das schon, der NOT-NULL-Constraint hätte die Inserts aber rejected. Ein-File-Migration, ein-Block-Code-Cleanup.
v1.84.0462026-05-06
  • PROJ-293 Amazon FBM-Versandbestätigung — manual_tracking_carrier hat Vorrang. Live-Bug bei Order 028-7305969-0416335 / Flowkom 28676: trotz manual_tracking_carrier='dhl' landete der Auftrag bei Amazon mit <CarrierCode>Other</CarrierCode> und <ShippingMethod>Dropshipping - Sascha Hörr</ShippingMethod>. Root Cause: resolveAmazonCarrierCode() returnt für unbekannte Versandarten den String 'Other' (truthy), der ||-Fallback auf den manuellen Carrier griff strukturell nie. Fix: neuer Helper resolveCarrierAndMethodForOrder() priorisiert manual_tracking_carrier über alle anderen Quellen (Pro-Order-Override schlägt Workspace-Konfig). Zusätzlich: <ShippingMethod> wird bei manueller Versendung komplett weggelassen (XSD-optional), weil ohne Pro-Carrier-Versandart-Auswahl in der UI kein gültiger Amazon-Wert vorhanden ist. Saubere Vorbereitung für PROJ-294 (UI-Auswahl). Pickliste-/DHL-Label-Pfad bleibt unverändert. 9 neue Vitest-Tests (Manual-Prio, Workspace-Override, Live-Reproduktion 28676, ShippingMethod-Drop, XML-Escape). 9/9 grün. PR #222.
v1.84.0452026-05-06
  • PROJ-292 QA-Findings - Guest- und IBA-Generic-Schutz im FBA-Reconciler. BUG-1 (DSGVO-relevant): 'Amazon Gastbestellungen'-Customer ist ein geteilter Fallback-Datensatz für FBA-Orders ohne Surrogate; eine echte Käufer-Email darauf zu schreiben kontaminierte alle anderen Orders auf dem Guest. Fix: kompletter Skip aller Customer-Updates wenn last_name='Amazon Gastbestellungen'. BUG-2: Business-Customer (PROJ-261-Dedupe via 'amazon-business:'-Surrogate) darf nicht mit IBA-Generic-Namen aus dem Report überschrieben werden ('Amazon Business EU SARL' pro Marketplace identisch). Fix: Skip wenn amazon_buyer_email mit 'amazon-business'-Präfix beginnt ODER der Report-Name dem IBA-Pattern entspricht; letzteres gilt auch defense-in-depth für Consumer-Customers, die in seltenen Multi-Item-Cases einen IBA-Namen sehen könnten. 5 neue Vitest-Tests (Guest-Skip, Business-Skip, Consumer-IBA-Filter, leerer Marketplace-Set, Multi-Run-Idempotenz). 12/12 Tests grün. Folgepatch im PR #221.
v1.84.0422026-05-06
  • PROJ-291: Neuer Mobile-Endpoint /api/mobile/products/[id]/locations für die Wareneingang-Erweiterung der Mobile-App. Liefert Bestände pro Lagerplatz (Menge desc), filtert FBA-Pool serverseitig via warehouses.is_read_only, Sperrlager bleiben drin (UI-Markierung downstream). Standard authenticateRequest()-Auth, Zod-UUID-Validation, defensiver Null-Join-Filter im Mapper, 5 Vitest-Tests. Branch + Commit-Tag historisch PROJ-290 (ID-Race mit Cost-Breakdown-PR #219), INDEX-Eintrag retagged auf PROJ-291.
v1.84.0412026-05-06
  • PROJ-290: Cost-Breakdown Route parallelisiert. /api/products/[id]/cost-breakdown bündelt die drei unabhängigen Queries (goods_receipt_items + Joins, stock-Total, stock_movements FIFO-Walk) in Promise.all statt sie sequentiell zu awaiten — der Spinner im Produktdetail-Tab 'Lieferant & Kosten' wartet jetzt nur noch auf die langsamste Einzel-Query statt auf die Summe. Kein DB-Migration: der existierende Partial-Index idx_stock_movements_fifo aus PROJ-73 deckt den Walk bereits optimal ab. PR #219.
v1.84.0402026-05-04
  • PROJ-289: Status auf Deployed. Coolify zieht v1.84.039. Bestellvorschlag rechnet ab sofort konsistent mit Total-Inventory (Hauptlager + FBA-Pool). Reine FBA-Artikel werden jetzt korrekt nachbestellt, Backwards-Rekonstruktion driftet nicht mehr durch FBA-Movements im Hauptlager-Stand.
v1.84.0392026-05-04
  • PROJ-289: Bestellvorschlag rechnet ab sofort mit Total-Inventory. current_stock umfasst Hauptlager + FBA-Pool, Sperrlager bleibt raus (Discriminator warehouses.is_read_only aus PROJ-177). Behebt drei stille Bugs aus PROJ-251/PROJ-287: reine FBA-Artikel mit leerem Hauptlager bekamen mit Toggle 'Nur Tage mit Bestand' Vorschlag 0 obwohl sie sich verkauften, Backwards-Rekonstruktion startete bei Hauptlager-Stand und zog FBA-Movements mit ab (Drift), und FBA-Demand wurde zwar gezaehlt aber FBA-Bestand nicht abgezogen. Response erweitert um fba_stock fuers UI-Breakdown. Keine DB-Migration. PR #218.
v1.84.0382026-05-02
  • PROJ-288: Status auf Deployed. Coolify zieht v1.84.037 — naechster LB-PDF-Download zeigt Titel zweizeilig statt Ellipsis-Cut, Lieferantenbeschreibung erscheint klein/grau unter SKU/EAN sofern hinterlegt.
v1.84.0372026-05-02
  • PROJ-288: LB-PDF Produkt-Cell. Produkttitel wrappt zweizeilig statt hartem Ellipsis-Cut bei 28/35 Zeichen, Lieferantenbeschreibung (supplier_products.supplier_product_description) erscheint klein/grau als optionale 3. Zeile unter SKU/EAN. Bestehende Spalte 'Lief.-Art.-Nr.' bleibt rechts. Live-Lookup zur PDF-Zeit, keine DB-Migration. Dynamische rowHeight pro Item, alternierender Hintergrund und Page-Break-Check ziehen die echte Hoehe. PR #217.
v1.84.0362026-05-02
  • PROJ-287: Status auf Deployed. Production-RPC `calculate_supplier_order_consumption` live, SKU 100147 = 44 Einheiten / 30 Tage = 1,47/Tag (statt 20,17 vor PR #216). Bestellvorschlag rechnet jetzt strukturell auftragsbasiert — Lagerbuchungen können den Vorschlag nicht mehr vergiften.
v1.84.0352026-05-02
  • PROJ-287 QA: Status auf In Review geflippt. Statische QA über Code, Schema und 17/17 Unit-Tests. 9/9 Acceptance Criteria erfüllt (1× Live-Messung SKU 100147 steht nach Deploy aus), 6 Edge Cases abgedeckt, Security-Audit pass, 0 Bugs. Implementation-Audit-Note dokumentiert die saubere Abweichung von der Spec (SQL-RPC statt JS-Bundle-Expansion). Ready to merge.
v1.84.0342026-05-02
  • PROJ-287: Bestellvorschlag auftragsbasiert. Tagesverbrauch wird aus order_line_items + orders berechnet statt aus stock_movements (PROJ-274 wird abgelöst). Behebt Live-Vorfall SKU 100147 — eine einzelne PROJ-177-Drift-Reset-Zeile (-442 Einheiten am 09.04.) hatte den Vorschlag auf 20,17 Einheiten/Tag aufgeblasen, obwohl real nur 45 Bestellungen in 30 Tagen liefen (~1,5/Tag). Stornos und Voll-Refunds zählen nicht, Bundle-Verkäufe schlagen via Komponenten-Expansion durch, Datum über created_at. Neue SECURITY-INVOKER RPC calculate_supplier_order_consumption mit UNION ALL über direkte und Bundle-Komponenten-Sales. Frontend, Schema und Toggles unverändert. PR #216.
v1.84.0322026-05-01
  • PROJ-286 Hotfix: Migration-Schema-DROP defensiv für CONSTRAINT + INDEX. uq_isq_workspace_product war auf Staging als CONSTRAINT angelegt (mit backing index), auf Production nur als plain UNIQUE INDEX. Plain `DROP INDEX` warf auf Staging SQLSTATE 2BP01 (cannot drop because constraint requires it). Fix: defensive IF-EXISTS-CONSTRAINT-DROP vor dem INDEX-DROP, sodass die Migration in beiden Environments idempotent läuft. Migrate-Job auf PR #214 nach diesem Hotfix grün, Production-Migration sauber durchgelaufen, Drift-Heal hat 85 Items enqueued, Cron 17:24:36 pushed 84 Pixkom + 1 MagFlip (0 failures) mit isolierten Spuren — Bug verifiziert behoben.
v1.84.0312026-05-01
  • PROJ-286: Inventory-Sync-Queue jetzt integration-scoped — Multi-Shop-Crosstalk-Bug behoben. `inventory_sync_queue` war workspace-scoped (`UNIQUE(workspace_id, product_id)`); bei zwei aktiven Shopify-Integrationen pro Workspace löschte jede Integration die Queue-Einträge auch für die andere Integration mit. Bei asymmetrischen Mappings (Produkt nur bei einem Shop gemappt) klaute die Integration ohne Mapping der mit Mapping den Queue-Eintrag → stiller Drift, weil der gemappte Shop den korrigierten Wert nie pushte. Live-Vorfall 2026-05-01: SKU 200266, Pixkom-Workspace mit MagFlip+Pixkom-Shop, 4 offene Amazon-FBM-Reservierungen → erwartet 940, Shopify zeigte 944. Fix: Queue bekommt `integration_id NOT NULL` (ON DELETE CASCADE), neuer Unique-Key (workspace_id, integration_id, product_id), `mark_product_dirty` macht Fan-out auf alle aktiv-gemappten Shopify-Integrationen — RPC-Vertrag bleibt, alle 6 App-Aufrufer unverändert. Drift-Heal-SQL füllt Queue mit aktuellen Reservierungen pro gemappter Integration neu auf. Branch trägt Tag PROJ-285 wegen ID-Race mit dem parallel gemergten LB-PUT-Smart-Diff-Feature; INDEX und Migration sind auf PROJ-286 retagged.
v1.84.0272026-05-01
  • PROJ-276: INDEX-Status der TARIC-Code-Anzeige in LB-Positionen von 'In Review' auf 'Deployed' gezogen. Reiner Bookkeeping-Refresh — das Feature ist seit v1.84.018 (PR #200, 2026-04-30) live, der Status-Spiegel hatte die echte Lage nur noch nicht abgebildet.
v1.84.0262026-04-30
  • PROJ-284: Einkaufsliste → LB-Erstellung Redirect-404. Nach erfolgreicher PO-Erstellung aus der Einkaufsliste landete der User auf einem weißen 404-Screen. Root Cause: shopping-list/page.tsx pushed auf /dashboard/purchase-orders/orders/<id>, aber dieser Pfad existiert nicht — kein [id]/page.tsx unter orders/, die LB-Detail-Ansicht ist ein client-state-getriebenes Fullscreen-Overlay auf der Listen-Page. Fix: Redirect umgestellt auf /dashboard/purchase-orders/orders?detail=<uuid>; orders/page.tsx liest beim Mount detail-Param (plus optional edit=1), validiert UUID, öffnet das bestehende Detail-Overlay und stripped die Query-Params via router.replace damit das Schließen des Overlays nicht sofort wieder dasselbe öffnet. Funktioniert jetzt auch als universeller Deep-Link für Bookmarks und externe Tools.
v1.84.0252026-04-30
  • PROJ-283: Einkaufsliste 'Alle löschen'-Button. Toolbar-Button neben 'Produkt hinzufuegen' mit Trash-Icon, leert die komplette Einkaufsliste workspace-weit nach Confirm-Dialog. Neuer DELETE-Endpoint /api/shopping-list/items (rate-limited 10/min, optional ?supplier_id=<uuid> für lieferantenscharfes Leeren) gibt deleted-Count zurück, damit der Toast die exakte Anzahl entfernter Artikel zeigt. Confirm-Dialog ist destructive-styled (rot) und nennt Anzahl Artikel und Lieferanten beim Namen. Button erscheint nur wenn die Liste nicht leer ist.
v1.84.0242026-04-30
  • PROJ-282: Bestellvorschlag berücksichtigt Einkaufslisten-Mengen. Analog zum bestehenden 'Im-Zulauf-Bestand einbeziehen'-Toggle gibt es jetzt einen zweiten Toggle 'Mengen auf Einkaufsliste einbeziehen' (Default an). Mengen, die für diesen Lieferanten bereits auf shopping_list_items stehen, werden aus der Vorgeschl. Menge abgezogen — verhindert doppelten Einkauf wenn man den Vorschlag mehrfach durchläuft oder zwischendurch manuell Artikel auf die Liste setzt. Lieferantenscharf: gleiche SKU für anderen Lieferanten auf der Einkaufsliste zählt NICHT mit. Schema-Erweiterung consider_shopping_list, neue Map onShoppingListByProduct, Subtraktion in der MOQ-Formel: max(forecastedNeed - alreadyOrdered - currentStock - onShoppingList, 0). Response-Item bekommt on_shopping_list-Feld, Tabelle bekommt sortierbare Spalte 'Auf Einkaufsliste' zwischen 'Im Zulauf' und 'Vorgeschl. Menge', Mobile-Card-Detail-Grid bekommt eine Zeile mehr.
v1.84.0232026-04-30
  • PROJ-281: Bulk-Add Constraint-Drift-Fix. PROJ-280 nutzte ON CONFLICT ON CONSTRAINT shopping_list_items_unique_product_per_supplier, aber auf Production heißt der Constraint historisch unique_workspace_supplier_product (Migration-Drift wie bei PROJ-277). PROJ-273-Diagnose-Toast lieferte SQLSTATE 42704 'constraint does not exist'. Fix in zwei Schritten: (1) Migration benennt den Production-Constraint auf den Git-erwarteten Namen um — idempotent, kein Effekt auf Staging wo der Name schon stimmt; (2) RPC nutzt jetzt wieder Spaltenliste ON CONFLICT (workspace_id, supplier_id, product_id), die mit jedem unique-index funktioniert egal welcher Name, plus #variable_conflict use_column-Direktive, die die product_id-Ambiguität gegen den OUT-Parameter auflöst. Production-Schema und Git sind wieder aligned, und der Runtime hängt nicht mehr an einem Constraint-Namen. Closes the toast loop: PROJ-272/273/277/280/281.
v1.84.0222026-04-30
  • PROJ-280: Bulk-Add Hotfix — product_id ambiguous in RPC. PROJ-273-Diagnose-Toast meldete SQLSTATE 42702 column reference product_id is ambiguous. Der PL/pgSQL-Rewrite hatte im INSERT ON CONFLICT (workspace_id, supplier_id, product_id) DO UPDATE einen unqualifizierten Spaltennamen, der mit dem gleichnamigen OUT-Parameter (RETURNS TABLE product_id UUID, ...) kollidierte. Fix: ON CONFLICT ON CONSTRAINT shopping_list_items_unique_product_per_supplier statt Spaltenliste, plus #variable_conflict use_column-Direktive und in_product_id/in_quantity-Aliases im FOR-Loop, damit kein unqualifiziertes product_id mehr in einer SQL-Anweisung im Funktionsbody auftaucht. Damit ist die Bulk-Add-Toast-Schleife (PROJ-272/273/277/280) endgültig durch.
v1.84.0212026-04-30
  • PROJ-279: Bestellvorschlag — Lieferanten-Produkt aus Vorschlag ausschließen. Neues Flag supplier_products.exclude_from_purchase_suggestion (BOOLEAN DEFAULT false) ermöglicht es, einzelne Lieferanten-Produkt-Mappings dauerhaft aus dem Bestellvorschlag zu entfernen — z.B. für Auslaufprodukte, manuell bewirtschaftete Artikel, oder einzelne zu teure Lieferanten einer SKU ohne andere Lieferanten der gleichen SKU zu blockieren. Default false = bestehendes Verhalten für alle Live-Daten, kein Bestandsdaten-Eingriff. UI: per-Row EyeOff-Icon im Vorschlag (Desktop) bzw. Aus-Vorschlag-ausschliessen-Button (Mobile) mit optimistic remove und Success-Toast inkl. Reaktivierungs-Hinweis. Reaktivierung via zweiter Checkbox im Lieferanten-Zuordnungs-Dialog (analog is_preferred). API: neuer rate-limited PATCH-Endpoint /api/supplier-products/[id]/exclude-from-suggestion mit Workspace-Ownership-Check. Calculate-Route filtert markierte Mappings raus und gibt supplier_product_id mit zurück. Partial-Index auf (supplier_id) WHERE exclude=false hält den Suggestion-Pfad schnell. Branch trägt Tag PROJ-278 wegen ID-Race mit dem parallel gemergten Allokations-UI-Refactor.
v1.84.0202026-04-30
  • PROJ-278: Allokations-Dropdowns inline in den Kosten-Cards des LB-Detail-Overlays. UX-Folge zu PROJ-271 — statt einer separaten 'Verteilmethode pro Kostenart'-Card mit drei Zeilen ist die Allokations-Auswahl jetzt direkt in den Frachtkosten-, Zollkosten- und Sonstige-Kosten (EUR)-Cards integriert (jeweils als 'Verteilung'-Zeile unter dem Betrag-Input). Hinweis in der Sonstige-Card markiert, dass die Methode für EUR und Fremdwährung gemeinsam gilt (es ist ein einziges Bucket im RPC). Reine UI-Restrukturierung, RPC und Datenmodell unverändert. Branch trägt Tag PROJ-277 wegen ID-Race mit dem Bulk-Add-Final-Fix; INDEX und commit nutzen PROJ-278.
v1.84.0192026-04-30
  • PROJ-277: Bulk-Add Bugfix Final — shopping_list_items.price_at_addition Spalte auf Production nachgezogen. PROJ-273-Diagnose-Toast machte den eigentlichen Fehler sichtbar: SQLSTATE 42703 column price_at_addition of relation shopping_list_items does not exist. Die Original-Migration 20260215000009_create_shopping_list_items.sql deklariert die Spalte zwar in Git, aber sie existiert auf Production nicht — der Migration-File wurde offenbar nach dem ursprünglichen Apply editiert, die Spalte wurde nie auf Prod erstellt. Idempotente Migration: ADD COLUMN IF NOT EXISTS plus DO-Block, der den CHECK-Constraint nur anlegt wenn er fehlt. Damit ist die Bulk-Add-Toast-Schleife (PROJ-272/273/277) endgültig durch.
v1.84.0182026-04-30
  • PROJ-276 (TARIC): LB-Detail-Overlay zeigt jetzt den TARIC-Code des Produkts inline neben der SKU in der Positionsliste (Format '<sku> · TARIC <code>'), damit Einkauf und Lager den Zolltarifcode sehen, ohne den Artikel öffnen zu müssen. Wird nur gerendert, wenn das Produkt einen Code hat (PROJ-126), sonst bleibt die Anzeige bei der bisherigen reinen SKU. Technisch: taric_code wurde durch den PO_DETAIL_SELECT-Join, den POLineItem.product-Type und PositionRowData gezogen; itemToRow mappt aus dem Join in das Row-Modell. Reine UI-Erweiterung im Detail-Overlay, keine DB-Migration. Branch + Commit-Tag bleiben auf PROJ-275 wegen ID-Race mit dem Mixed-Allocation-Hotfix in v1.84.017 (PR #201 wurde gemerged während dieses Feature im Review war).
v1.84.0172026-04-30
  • PROJ-275 (Mixed-Allocation Hotfix): Folgefix zu PROJ-271 — calculate_landed_costs() schreibt 'mixed' ins goods_receipt_items.cost_allocation_method-Feld, wenn die drei purchase_orders.{freight,customs,other}_allocation_method-Werte einer LB divergieren. Der alte CHECK aus PROJ-73 erlaubte aber nur volume/value/quantity → Trigger-Recompute warf 'violates check constraint goods_receipt_items_cost_allocation_method_check' beim Umschalten von Zoll auf Wert-Allokation am LB-10056-Detail-UI. Migration droppt + recreated den Constraint inklusive 'mixed'. Auf Production direkt via Management-API gepatcht (PR #201).
v1.84.0162026-04-30
  • PROJ-274: Bestellvorschlag — FBA-Bedarf einbeziehen + Tabellen-Polish. Bisher zählten nur pick/transfer_out-Movements als Verbrauch; FBA-Verkäufe (gebucht als amazon_fba_sync, siehe PROJ-177) wurden ignoriert, sodass für rein FBA-vertriebene SKUs Bestellvorschlag stets 0 herauskam. Fix: amazon_fba_sync ist jetzt Teil der Consumption-Movement-Types, aber nur negative Quantity-Changes zählen — positive Werte sind Inbound-Versand zu Amazon oder Drift-up-Korrekturen und dürfen nicht als Verkauf gezählt werden. Production-Verifikation: 1000 letzte amazon_fba_sync-Movements zeigten 874 negativ vs 126 positiv. Plus UI-Polish in der Bestellvorschlags-Tabelle: Sticky-Header bleibt beim Scrollen sichtbar (max-h-Container mit overflow-auto), alle Spalten sind klickbar sortierbar mit ArrowUp/ArrowDown-Icon-Indikator, neues Suchfeld filtert live nach Produktname und SKU, Footer zeigt bei aktiver Suche 'X von Y (gefiltert)'. Default-Sort bleibt 'Vorgeschl. Menge' absteigend (heutiges visuelles Verhalten, jetzt explizit). Mobile-Cards respektieren die Suche ebenfalls. Bewusst NICHT in Scope: Lager-Auswahl-Filter — erstmal beobachten, ob FBA-Einbeziehung allein reicht.
v1.84.0152026-04-30
  • PROJ-273: Bulk-Add RPC PL/pgSQL Rewrite + API-Diagnose. Folgefix zu PROJ-272: die neue Bulk-API schlug auf Production weiterhin mit Toast 'Artikel konnten nicht zur Einkaufsliste hinzugefuegt werden' fehl, weil die RPC einen SQLSTATE warf, der nicht in {42501, P0002, 22023} fiel. Service-Role-Probes bestätigten: RPC ist erreichbar, Admin-Check funktioniert. Der Fehler war user-context-spezifisch in der komplexen CTE-with-modifying-INSERT-Komposition. Migration 20260430080000 droppt + erstellt die RPC neu als explizite PL/pgSQL FOR-Loop mit per-Row-Klassifikation und RETURN NEXT. Gleicher externer Vertrag, gleiche Race-sichere atomare Upsert-Logik (ON CONFLICT DO UPDATE mit Quantity-Merge), aber per-Schritt-Fehlerattribution und keine fragile CTE-Komposition mehr. Plus: API 500 gibt jetzt db_error_code + db_error_message in der Response zurück, Frontend zeigt den SQLSTATE in der Toast-Description — jeder zukünftige RPC-Fehler ist aus der UI diagnostizierbar ohne Coolify-Log-Zugriff. 10 Vitest-Tests unverändert grün.
v1.84.0142026-04-29
  • PROJ-272: Bestellvorschlag → Einkaufsliste Bulk-Add. Live-Bug am 2026-04-29: 9 Items von sk@turnup.eu auf 'Alle auf Einkaufsliste' geklickt, alle POSTs liefen in 401-Burst (Session abgelaufen), shopping_list_items blieb leer — User sah trotzdem grünen toast.success('.'), weil der Frontend-Loop res.ok-Failures stumm verworfen hat. Fix ist architektonisch: neue atomare Bulk-API POST /api/shopping-list/items/bulk + RPC bulk_add_shopping_list_items() (SECURITY DEFINER, search_path explizit, INSERT … ON CONFLICT DO UPDATE mit Quantity-Merge race-safe). Ein Auth-Check, ein Rate-Limit-Hit (20/min, jeder Call deckt bis 500 Items), ein atomarer Upsert. Frontend purchase-suggestion-table feuert jetzt einen Bulk-Call statt N sequenzieller, zeigt ehrliche Toast-Variante (success / warning bei Skips / error bei Total-Failure) mit gruppierter Skip-Reason-Description, und detected 401 → toast.error('Sitzung abgelaufen — bitte neu anmelden') + Login-Redirect statt silent fail. Skip-Gründe aus DB-Pre-Check: product_not_found / product_archived / supplier_product_missing / invalid_quantity. Single-Item POST bleibt für 'Produkt hinzufuegen'-Dialog (legitimer Single-Use). 10 Vitest-Tests grün (happy / partial / 401 / 429 / empty / oversize / invalid uuid / 403 / 404 / 500).
v1.84.0132026-04-29
  • PROJ-271: Hybrid-Allokation für Nachlaufkosten (Fracht / Zoll / Sonstige). Bisher wurde eine einzige cost_allocation_method (volume / value / quantity) für Fracht UND Zoll UND Sonstige zugleich genutzt — konzeptuell falsch, weil Zoll im EU-Recht stets ein Prozentsatz auf den Warenwert ist und Fracht physisch nach Volumen abgerechnet wird. Drei neue Spalten auf purchase_orders (freight/customs/other_allocation_method), Default für neue LBs: freight=volume, customs=value, other=value. Bestehende LBs erben rückwärtskompatibel ihre alte Methode in alle drei Felder, kein Verhaltenswandel auf historischen FIFO-Werten. RPC calculate_landed_costs() berechnet drei separate Shares pro Kostenart mit Mixed-Mode-Normalisierung (Items ohne Maße im Volume-Modus → qty-Anteil, Σ shares = 1 garantiert). Neue UI im LB-Detail mit drei Dropdowns. landed-cost-preview.ts spiegelt die DB-Logik exakt. 9 Vitest-Tests, 84 von 84 Tests im purchase-order-Bereich grün. Konkret betraf das LB-10056/SKU 200155: Differenz zwischen volume- und value-allokiertem Zoll war ~0,07 €/Stk (102,75 € vs. 82,77 € auf 300 Einheiten).
v1.84.0122026-04-29
  • PROJ-269: Customer-Number Race & LPAD-Trunkierung. Zwei zusammenhängende Bugs: (1) Shopify- und Amazon-Importer benutzten weiter den nicht-atomaren get_max_customer_number_suffix-RPC; bei parallel laufenden Imports (Shopify+Amazon-Cron im selben Tick) bekam ein Insert die K-Nummer eines anderen → 23505. Der Handler in autoCreateCustomer interpretierte das pauschal als shopify_customer_id-Kollision und ließ die Bestellung als Gast — z.B. Auftrag 24751 (Marcus Köppen, eBay) blieb so unverknüpft. Beide Importer nutzen jetzt den atomaren generate_customer_number()-RPC (PROJ-266) plus Constraint-Name-Check und Retry-on-23505. (2) generate_customer_number und generate_product_sku formatierten den Kandidaten mit LPAD(seq, padding, '0'), was bei seq länger als padding von rechts trunkiert (LPAD('26101',4) → '2610'). Mit padding=4 und Bestand >9999 produzierte der Generator deterministisch bereits vergebene Kandidaten und gab nach 1000 Versuchen P0001 — Pixkom war damit produktiv kaputt für manuelle Kunden-Anlage. Fix: LPAD(seq, GREATEST(LENGTH(seq), padding), '0'). Auftrag 24751 wurde 2026-04-29 retroaktiv direkt in DB nachverknüpft (Customer K-26101).
v1.84.0102026-04-29
  • PROJ-270: Order-Snapshot autoritativ im Versand-Layer — Bugfix-Folge auf PROJ-267: nach UK-Adress-Korrektur kam das DP-Internetmarken-Label mit doppeltem Straßennamen heraus, weil /api/shipping/ship pro Feld auf customers.shipping_* zurückfiel und der Customer-Datensatz noch alte Daten hatte. Neuer Shared-Helper resolveShippingRecipient(order, customer): bei vollständigem Order-Snapshot (name1+street+city+plz+country) kein Customer-Fallback mehr; Customer-Felder nur noch als Komplett-Backup für uralt-Imports ohne Snapshot. DHL- und DP-Hauptpfad nutzen jetzt denselben Helper (vorher 2× duplizierter Code), Retoure-Pfade bewusst unverändert. 8 neue Vitest-Tests. Branch trägt Tag PROJ-268 wegen ID-Race mit Landed-Cost-Resync-Feature.
v1.84.0092026-04-29
  • PROJ-268: Landed-Cost Snapshot Resync für LB-10056 — 8 goods_receipt_items mit type='purchase_order' hatten purchase_order_item_id=NULL, dadurch filterte calculate_landed_costs() sie raus und der WE-Snapshot driftete bei späteren Änderungen von exchange_rate/Fracht/Zoll. Konkret SKU 200155: unit_cost_eur=4.7000 EUR (= 4.70 USD ohne Konvertierung) statt 4.0240 EUR (= 4.70/1.168), customs_alloc=0 statt 0.3425 EUR, freight_alloc=0.0013 statt 1.3381 EUR. Migration repariert in 3 Schritten: Backfill GRI→POI-Verknüpfung über (po_id, product_id), Rekonstruktion quantity_received aus realen GRI-Buchungen, Recompute calculate_landed_costs() für alle POs mit GRIs. Idempotent. Audit auf Production zeigte nur 1 betroffene LB. Branch trägt Tag PROJ-266 wegen ID-Race mit dem Kundennummer-Feature. Folge-Inkonsistenz bekannt: WE-Snapshot (volume-Allokation aus DB) weicht von LB-Preview (Value-Fallback wegen fehlender Maße im Frontend-PO-API) ab — separat zu fixen.
v1.84.0062026-04-29
  • PROJ-267: Amazon UK Hausnummer/Straße-Split zusammenführen — amazon.co.uk-Eingabemaske hat zwei getrennte Felder ("Building number/name" + "Street name"); Käufer produzieren AddressLine1="39" + AddressLine2="WALMER CLOSE", was unser Mapper 1:1 in shipping_street + shipping_name2 schrieb. Versand-Preflight (DHL + DP) lehnte daraufhin mit "Straße unplausibel" ab. Fix in amazonToShippingAddress() erkennt das UK-Pattern (country=GB + Line1 reine Hausnummer ± Buchstabensuffix wie "12A" + Line2 mit Buchstabe-Start) und führt zu street="39 WALMER CLOSE" zusammen. Heuristik bewusst eng — keine Bereiche "12-14", keine DE-Adressen, false-positives wie Order 026-7620982 (Line1="Prinkham BARN") bleiben unangetastet. 4 neue Vitest-Tests. Auftrag 27504 direkt in der DB korrigiert; rückwirkender Backfill auf User-Ansage nicht durchgeführt. Commits tragen Tag PROJ-266 wegen ID-Race mit dem Kundennummer-Feature.
v1.84.0052026-04-29
  • PROJ-266: Kundennummer-Auto-Vergabe per atomarem RPC — Anlegen ohne Kundennummer schlug fehl, weil der Loop-Generator wegen PostgREST db-max-rows = 10 000 nur die ersten 10 000 von 23 588 K-Customers sah und K-19263 (bereits vergeben) vorschlug. Plus Stale-Error-Fix im Anlege-Dialog. Fünfte Card im Nummernkreise-Tab analog PROJ-262.
  • QA-Hardening: Migration umbenannt zu 20260427110000 (Timestamp-Kollision mit refund_reasons-Migration), Staging-Drift 20260427130000 (phantom aus PROJ-265-Branch) per supabase_migrations.schema_migrations-Repair entfernt.
v1.84.0032026-04-29
  • Live-Volumenrechner im Produkt-Logistik-Tab: zeigt unterhalb der Maße L/B/H das berechnete Volumen in m³ + Liter, plus optionalen Mengenrechner für die Gesamtvolumen-Schätzung (z. B. Kartonplanung, LB-Mengen). Mengenwert ist nur lokal — wird nicht persistiert.
v1.84.0022026-04-28
  • PROJ-265 (QA-Härtung): Alle drei neuen Trigger-Funktionen plus mark_product_dirty (PROJ-55) bekommen SET search_path = public, pg_temp — verhindert search_path-Hijacking auf SECURITY-DEFINER-Funktionen.
  • PROJ-265: Doku-Inkonsistenz Safety-Sync-Intervall (Spec/INDEX/Code drifteten 5/15/60 Min) auf 60-Min-Code-Default angeglichen — Cursor ist funktionaler Gate, Coolify-Cron-Schedule ist optional.
v1.84.0012026-04-27
  • PROJ-265: BEFORE-DELETE-Trigger auf orders fängt Order-Hard-Delete atomar in der Transaktion ab — App-Hook-Snapshot ist jetzt redundante Defense-in-Depth statt einzige Verteidigung.
  • PROJ-265: enqueueAmazonDirtyBatch mit 1× Retry + 500ms Backoff + [PROJ-265]-Logging — Amazon-Queue hat keinen DB-Trigger als Backup, daher schliesst der Retry die letzte Silent-Failure-Lücke.
  • PROJ-265: syncInventoryForProducts und notifyInventoryQueuesAfterImport werten jetzt Promise.allSettled-Resultate aus und loggen Rejects pro Plattform-Queue separat — vorher wurden Rejects stumm geschluckt.
v1.84.0002026-04-27
  • PROJ-265: DB-Trigger auf order_line_items + orders.status UPSERTen Reservierungsänderungen automatisch in inventory_sync_queue — Shopify-Bestandssync ist jetzt resilient gegen App-Layer-Hook-Failures (verhindert Drift wie zuletzt SKU 200266: Shopify zeigte 998 statt 997).
  • PROJ-265: Safety-Sync-Cron mit last_safety_sync_at-Cursor + 60-Min-Default-Intervall — fixt Coolify-Timeout-Drift (Reconciliation-Layer war seit Stunden tot).
  • PROJ-265: markProductsDirty mit 1× Retry + strukturiertem [PROJ-265]-Logging statt Silent-Failure im Promise.allSettled.
v1.83.0232026-04-27
  • PROJ-264: Disk-IO-Reduktion. Auf Production zeigte pg_stat_statements (71 Tage Live-Daten) Supabase-Realtime-WAL-Polling als Top-Verbraucher (1,9 Mio Calls / 2,6 h Total-Exec-Time). Diese PR adressiert die niedrig-riskanten Quick-Wins: (a) `public.stock` und `public.product_locks` aus der `supabase_realtime`-Publication entfernt — Stock-Overview aktualisiert sich jetzt via TanStack `refetchInterval: 30s`, Product-Detail-Lock pollt `acquireLock()` alle 5 s solange der wartende User keinen Lock hat. (b) `print-heartbeat` Edge Function bekommt einen Server-Side-Throttle: UPDATE auf `workstations` läuft nur, wenn `last_seen_at` älter als 180 s ODER `agent_version`/`realtime_status` sich geändert haben — Print-Agent-.NET-Code bleibt unverändert. (c) `/api/cron/cleanup-sync-logs` löscht zusätzlich `amazon_sync_log` mit `finished_at` älter als 90 Tage (analog `shopify_sync_logs`). `print_jobs` bleibt bewusst in der Realtime-Publication (PROJ-41 setzt explizit darauf). Out-of-Scope für diese PR: `execute_workflow`-Batch-API, `order_notes`-Konsolidierung, `pg_timezone_names`-Frontend-Cache.
v1.83.0222026-04-27
  • Zwei neue Default-Erstattungsgründe im Storno-/Erstattungsdialog: "Adressfehler/Annahme verweigert" und "Kundenstorno". Seed für neue Workspaces aktualisiert + idempotente Backfill-Migration (`ON CONFLICT (workspace_id, slug) DO NOTHING`) für bestehende Workspaces. Sortierung: neue Gründe stehen zwischen "Doppelt bestellt" und "Sonstiges" (sort_order 6/7), "Sonstiges" rückt auf 8.
v1.83.0212026-04-25
  • Workflow-Manuel-Trigger JS-Timeout auf 290 s angehoben (passend zum frischen PG-`statement_timeout` von 300 s aus 1.83.020). Vorher schlug der JS-Promise.race in `/api/workflows/[id]/run` nach 30 s zu, sodass User trotz PG-Bump weiter "Zeitlimit überschritten (30 Sekunden)" sahen. 290 s ist knapp unter dem PG-Limit gewählt, damit bei wirklich hängenden Aufrufen der saubere PG-Fehler durchkommt statt eines harten JS-Aborts. Fehlermeldungstext entsprechend auf "5 Minuten" angepasst.
v1.83.0202026-04-25
  • Workflow `execute_workflow` Postgres statement_timeout auf 300 s angehoben: PostgREST nutzt für service_role einen Default statement_timeout von 8 s in Supabase Standard. Bei Workflows mit großem Order-Backlog (Fallback-Rechnungen-Workflow mit ~2050 Aufträgen) bricht Postgres mit `canceling statement due to statement timeout` ab — sichtbar im UI als 500-Fehler. Per `ALTER FUNCTION ... SET statement_timeout = '300s'` wird der Timeout funktionslokal angehoben (nur für die Dauer dieses einen Funktionsaufrufs), die globale Rolleneinstellung bleibt unangetastet. Greift in allen Aufrufpfaden: manueller Trigger (/api/workflows/[id]/run), Auto-Cron (/api/cron/execute-workflows), Order-Created-Trigger (Shopify-Import, Manual-Order).
v1.83.0192026-04-25
  • Revert von 1.83.017 (Workflow Fire-and-Forget): Naive Umsetzung war fehlerhaft — die `workflow_runs`-INSERT mit `status='running'` lebt innerhalb der RPC-Transaktion und ist für den UI-Refetch erst sichtbar, wenn die ganze Funktion zu Ende läuft. Resultat: Toast erschien ("läuft im Hintergrund"), UI hing aber bei "vor 1 Tag" und das Polling sprang nie an, weil kein Workflow als running gesehen wurde. Saubere Lösung erfordert RPC-Refactor (separate Run-Erstellung außerhalb der RPC-Transaktion oder COMMIT-fähige PROCEDURE) — kommt als eigener PR.
v1.83.0182026-04-25
  • PROJ-263 Dashboard "Heute versendet"-Kachel trennt FBA-Sendungen vom eigenen Versand: FBA-Aufträge bekommen via PROJ-250 (Shipments-Invoicing-Report) auch `shipped_at` gesetzt und tauchten dadurch fälschlich als selbst versendet auf. Hauptzahl zeigt jetzt nur noch eigene Versendungen (DHL/DP/...), FBA wird als kleines Sublabel "+ X via FBA" in der Description angehängt. Erkennung über `orders.amazon_fulfillment_channel = 'FBA'` (CHECK-Constraint FBM/FBA/NULL beim Import gesetzt — Source of Truth statt Umweg über die Versandart, robuster gegen Versandart-Drift).
v1.83.0142026-04-25
  • PROJ-262 Produkt-SKU Auto-Vergabe & Nummernkreis: Konfigurierbarer Nummernkreis für Produkt-SKUs analog PROJ-65/120 — vierte Card im Nummernkreise-Tab unter Einstellungen → Allgemein. Auto-Vergabe greift NUR bei manueller Produkt-Anlage und im Variantengenerator; Importe (Shopify, Amazon, CSV) behalten ihre Original-SKU bewusst, weil deren SKU der Lookup-Key fürs Re-Import-Dedupe ist. Atomarer `generate_product_sku()` RPC mit Retry-Loop gegen den bestehenden Unique-Constraint `products_unique_sku_per_workspace` zählt automatisch über Kollisionen mit existierenden SKUs hinweg (z.B. wenn jemand parallel manuell `200270` setzt). POST `/api/products` neu (war vorher nur GET), Frontend-Anlage geht über den neuen Endpoint statt direktem `supabase.from().insert()`. Variantengenerator fällt auf RPC zurück wenn Kind-SKU leer bleibt. PUT `/api/settings/workspace/product-sku-sequence` mit monotonic-guard `>= current` für den Startwert-Setter (anders als die anderen drei Nummernkreise immer verfügbar, weil Bestandskunden mit existierenden SKUs den Counter initial setzen müssen — User-Initial: 200270). QA-Härtung: POST-Schema mit `.strict()` + expliziter Allowlist (~30 Felder) gegen Mass-Assignment, Retry-Loop on 23505 (max 3) für Race gegen parallel manuell vergebene SKU, kein `parentSku || "PROD"`-Fallback mehr im Variantengenerator (sonst inkonsistente Eltern/Kind-SKUs wenn Eltern auto-vergeben wird). 24 neue Vitest-Tests (Helper, POST-Route, Variantengenerator). Doku in flowkom-docs unter einstellungen/allgemein.mdx ergänzt.
v1.83.0072026-04-25
  • Kundensuche flackert kein weißes Bild mehr beim Tippen: useCustomers hatte als einziger Listen-Hook im File kein `placeholderData: keepPreviousData`, dadurch wurde bei jedem Such-Buchstaben (Debounce) die alte Liste verworfen und `isLoading=true` getriggert. Die Customers-Page rendert bei isLoading einen Full-Page-Spinner — daher das beobachtete weiße Flackern + Fokus-Verlust im Suchinput. Fix: keepPreviousData ergänzt + Page nutzt isPending (nur bei initialem Load true) statt isLoading; isFetching erscheint als kleiner Spinner rechts im Such-Input für sichtbares Refetch-Feedback ohne die Liste zu blanken. Profitiert mit: Pagination, Status-Filter, Source-Filter und alle PROJ-147 Advanced-Filters.
v1.83.0052026-04-25
  • PROJ-261 Deploy-Nachzug: Die ursprüngliche Retro-Migration (20260424120000) ist auf Production zweimal an `customers_check_name_or_company` gescheitert — der QA-Fix-Commit hatte `last_name=NULL` gesetzt, aber 24 von 41 zu splittenden Ship-Adress-Gruppen haben keine `billing_company` (Privatperson an Business-Account) → alle drei Name-/Firma-Felder NULL → CHECK-Violation → Transaktions-Rollback. Da die Migration nie als appliziert markiert wurde, wurde sie bei jedem `supabase db push` erneut versucht und blockte den Hotfix. Zwei zusätzliche Deploys: (a) `20260425000000_proj261_constraint_hotfix.sql` mit constraint-safem Name-Resolver analog TS (Firma wenn vorhanden, sonst `shipping_name1` in `last_name`, ultimativer Fallback `'Amazon Kunde'`), (b) die Ursprungs-Migration content-mäßig auf no-op `SELECT 1` reduziert damit Production endlich an den Hotfix rankommt. Post-Deploy verifiziert auf Production: 0 vermischte Business-Kunden übrig, 4 Ursprungs-Rows auf echte Firmen (DB Energie, Kita Bendelstein, Eurofins, Nostravant S.L.L.) upgedatet, 37 neu angelegte Split-Kunden mit `amazon-business:<firma>|<land>|<plz>|<straße>`-Key.
v1.83.0032026-04-24
  • PROJ-261 QA-Findings-Fix: Retro-Migration setzte `last_name = shipping_name1` → Firmenname landete doppelt in `company_name` und `last_name`. Jetzt konsistent zum TS-Pfad `last_name = NULL` (sowohl im UPDATE des Ursprungs-Kunden als auch in den neu angelegten Split-Customers). Doppelter `shipping_name1`-Wert im INSERT-VALUES aufgeräumt. Drift bei `companyFromTaxInfo` als Kommentar dokumentiert (strukturell unvermeidbar, Praxis-Effekt 0). Neue `scripts/verify-proj-261.sql` mit 5 Pre-/Post-Verifikations-Queries (Q1 vermischte Kunden, Q2 neue Business-Keys, Q3 Ursprungs-Kunden haben shipping_groups=1, Q4 Orphan-Check customer_addresses, Q5 Billkom-Sanity).
v1.83.0022026-04-24
  • PROJ-261 Amazon Business Customer Dedupe: Bei Amazon-Business-Orders (IBA) matchte der bisherige Email-Dedupe wildfremde Firmen auf einen Kundendatensatz, weil Amazon laut Orders API v2026-01-01-Schema und Issue #5030 keine pro-Käufer-stabile `buyerEmail` liefert (seller-generische `no-reply-amazon-iba-buyer@marketplace.amazon.xx`-Sammeladresse + generischer `buyerName` 'Amazon Business EU SARL'). Production-Impact: K-1961 mit 19 realen Firmen (CWS Hygiene, DB Energie, KERMI, …), K-3915 mit 17 Firmen (Kita Bendelstein, BTT Beton, Heidelberg Materials, EKS-Tec, Spacewood, …). Fix: neuer `buildBusinessDedupeKey(address, companyFromTaxInfo)` baut den Dedupe-Key bei `isBusiness=true` aus `(company, country, postalCode, street)`, Fallback `amazon-business-order:<orderId>` bei unvollständigen Daten. Consumer-Pfad unverändert (Proxy-Email ist dort per-buyer stabil). Retro-Migration `20260424120000_proj261_amazon_business_dedupe_split.sql` splittet die 4 betroffenen Kunden pro distinct Ship-Adress-Gruppe (älteste bleibt am Ursprungs-Kunden, andere wandern in neue Kunden-Rows) — idempotent via HAVING-Filter, transaktional im DO-Block, Post-Check-Assertion verhindert Restvermischung. Billkom/DHL/DP unbetroffen, Order-Snapshots sind pro Order bereits autoritativ via `buildAmazonOrderAddressFields`.
v1.83.0002026-04-24
  • PROJ-260: Produkt-Notizen + Dateien-Tab-Restrukturierung. Neuer Main-Tab 'Notizen' im Produktdetail analog Aufträge/LBs (product_notes-Tabelle mit RLS, eigene Notizen editier-/löschbar). Die Main-Tabs 'Dateien' und 'Dokumente' sind zu einem Main-Tab 'Dateien' mit Subtabs Cloud/Dokumente zusammengefasst — Tab-Count im Strip bleibt gleich. Zusätzlich: Shared NoteContent-Renderer macht URLs in Produkt-, Auftrags- und LB-Notizen klickbar (öffnet in neuem Tab, erkennt trailing Punctuation).
v1.82.0102026-04-24
  • PROJ-231 Bugfix: OneDrive-Ordner-Picker knallte mit 'Cannot read properties of undefined (reading replace)', sobald ein Drive-Item im Root kein webUrl oder name hatte (z.B. Shared- oder Business-Account-Items). decodeHtmlEntities() und getFolderWebUrl() sind jetzt null-safe.
v1.82.0092026-04-24
  • PROJ-231 Bugfix: ProductFilesTab wählt die Cloud-Connection jetzt über use_for_products statt stumpf connections[0]. Im Produkt-Reiter 'Dateien' wurde sonst bei Multi-Provider-Setups (Google Drive + OneDrive) der falsche Provider gezeigt, selbst wenn OneDrive für Produkte aktiv war. Zusätzlich: Fehlersichtbarkeit im Ordner-Picker — API-Fehler werden jetzt statt als 'Keine Unterordner vorhanden' als Error-State gerendert.
v1.82.0082026-04-24
  • PROJ-231 Bugfix: Cloud-Ordner im Produkt- und Lieferantenbestellungs-Detail folgt jetzt dem Use-Case-Toggle. GET-Endpoints filtern via cloud_connections!inner auf use_for_products / use_for_purchase_orders = true. Zuvor wurde eine alte Google-Drive-Verknüpfung weiterhin angezeigt, obwohl OneDrive für Produkte aktiv geschaltet war. Alte Links bleiben in der DB (reversibel).
v1.82.0062026-04-24
  • Session-Housekeeping: PROJ-257 (Cron-Trigger Fire-and-Forget) und PROJ-259 (Amazon SP-API Reliability) in features/INDEX auf Deployed gesetzt. Remote-Branches der beiden PRs entfernt.
v1.82.0052026-04-24
  • PROJ-259 Amazon SP-API Reliability: Fix für wiederkehrende FBA-Import „error"-Runs. Drei zusammenhängende Bugs — (1) LWA Access-Token lebt nur 1h, aber EU-FBA-Report-Polls laufen öfter >1h, was zu 401 „access token expired" mitten im Job führte (Runs 11:30/12:00 heute Vormittag). Neuer optionaler `refreshAccessToken`-Callback im `AmazonClient`: bei 401 wird einmal pro Request ein frischer Token über `forceRefreshAccessToken()` gemintet und der gleiche Request retried — RDT-Requests bleiben bewusst außen vor. Alle 5 langlaufenden Crons (fba-import, fbm-import, order-status-sync, finance-events-pull, shipment-confirmation) nutzen jetzt die neue `buildAmazonClientFromRow()`-Factory, die den Callback automatisch einbaut. (2) 429-Retry-Budget zu knapp (5 Retries × max 30s), sodass der 12:30-Run nach 6:49 Min aufgab → hochgesetzt auf 8 Retries × max 60s. `retry-after`-Header wird weiterhin respektiert. (3) Altlasten-Cleanup: `amazon_sync_log`-Rows mit `status=running` + `finished_at=null`, die aus Pod-Restarts/502-Kills stammen und die UI dauerhaft als „läuft seit 3h" angezeigt hat, werden einmalig per Migration auf `status=error` geflippt (>2h Schwelle, Zombie-Kennzeichnung im error_message).
  • INDEX-Housekeeping: PROJ-256 Status auf Deployed gesetzt (PR #164 ist seit gestern auf main und läuft über den Coolify-Auto-Deploy live).
v1.82.0042026-04-24
  • Produktdetail-Plattformen-Tab: Amazon-SKU wird jetzt als eine Zeile statt einer pro Marketplace angezeigt; Bearbeitungszeit-Input bleibt nach Refetch sichtbar korrekt (Stale-DOM-Fix, PROJ-258).
v1.82.0032026-04-24
  • PROJ-257 Manueller Cron-Trigger liefert für Amazon-Report-Crons keinen 502 Bad Gateway mehr: `amazon-fba-import`, `amazon-fbm-import`, `amazon-order-status-sync`, `amazon-finance-events-pull` und `amazon-shipment-confirmation` pollen Amazon-Reports bis zu 30 Min synchron, der Coolify-Reverse-Proxy killt die Verbindung aber nach 60–120 s. Die Trigger-Route returnt für diese Whitelist jetzt sofort `{async:true}`, der Handler läuft im Node-Eventloop weiter und schreibt das Ergebnis wie gehabt via `logCronExecution()` in `cron_last_execution`. UI pollt nach Start 3× (10s/30s/60s) `loadLastExecutions`, damit Success/Error automatisch unter „Letzte Ausführung" erscheint. Toast-Text angepasst: „Job gestartet — Ergebnis erscheint in Kürze". Alle anderen Crons (order-import, cleanup, billkom-queue-process usw.) bleiben synchron mit dem alten Toast-Feedback-Pfad. Kein DB-Change, keine Änderung an den Handlern selbst.
v1.82.0022026-04-24
  • PROJ-256 Amazon Cancel/Refund Feed Corrections: Zwei PROJ-188-Bugs behoben, die jeden „An Amazon übertragen"-Storno seit Deploy scheitern lassen. (1) `CancelReason=CouldNotShip` ist kein gültiger XSD-Enum-Wert in `OrderAcknowledgement.xsd` — Amazon lehnt konsistent mit `MessageCode 25` ab. Neuer Mapper: vor dem Feed-Build wird `/orders/v0/orderItems` abgefragt; bei `IsBuyerRequestedCancel=true` (Käufer hat bei Amazon Storno angefragt) wird `BuyerCanceled` gesetzt, sonst `NoInventory` als Default. Entspricht Seller-Central-Button „Cancel order → Buyer Canceled". (2) SP-API v2021-06-30 `getFeedDocument` liefert `{feedDocumentId, url, compressionAlgorithm?}` auf Top-Level, unser Code las `docRes.payload.url` (MWS-Legacy). `fetch(undefined)` crashte in jedem Retry → nach 8 Crash-Retries `status=failed`, Amazons echter Fehler nie gelesen. Neuer shared Helper `feed-documents.ts` mit `downloadFeedResultDocument()` für alle 5 Call-Sites (cancel/refund/cron/shipment-confirmation/shipment-verifier), inkl. GZIP-Dekompression. Drei Copies des fehlerhaften `fetchResultDocument`-Helpers gelöscht. Shipment-Feeds gewinnen kostenlos GZIP-Support. 7 neue Unit-Tests. Verifiziert gegen Live-SP-API (Feed `1849323020566`, Order 04176).
v1.82.0002026-04-24
  • Amazon FBM Bearbeitungszeit (lead_time_to_ship_max_days) pro SKU pflegbar — im Produktdetail-Plattformen-Tab und im Integrations-Listings-Manager inkl. Bulk-Action (PROJ-255).
v1.81.0042026-04-24
  • INDEX-Housekeeping: Status auf Deployed gesetzt für gemergte Features PROJ-210, PROJ-220, PROJ-234, PROJ-238, PROJ-249, PROJ-251, PROJ-254. Dazu 30 stale merged Remote-Branches und einen alten Worktree weggeräumt — keine Code-Änderung, nur Doku/Aufräumen.
v1.81.0012026-04-23
  • PROJ-254 FBA Bulk-Backfill UI-Modal: Der in v1.81.000 als CLI-only gedachte Admin-Endpoint bekommt doch eine UI — neuer Button „Bulk-Backfill…" im FBA-Bereich der Amazon-Settings-Seite öffnet einen Dialog mit Days/Concurrency-Inputs und Start-Button. Der Dialog verbindet sich direkt per `fetch` + `ReadableStream`-Reader mit dem SSE-Endpoint, rendert Live-Progress mit Badges (processed/total, ok/skipped/failed), Progress-Bar und gescrolltem Log (max 500 Zeilen). Abort-Button bricht den Stream sauber via AbortController ab. Dialog ist nicht schließbar während aktiv (Toast-Hint). Nur bei FBA sichtbar, FBM sieht den Button nicht. Bash-Script Default-Host mit korrigiert (`flowkom.app` → `app.flowkom.de`).
v1.81.0002026-04-23
  • PROJ-254 Amazon FBA Bulk-Backfill (One-Shot Admin): Admin-SSE-Endpoint `POST /api/admin/amazon/backfill-fba` für einmalige großvolumige FBA-Imports (10k+ Orders in einem Rutsch). Zieht **einen einzigen** Shipments-Invoicing-Report statt 40× via Auto-Cron, paginiert `getOrders` mit NextToken und ruft processOne concurrent mit Limit 3 auf (bleibt unter Amazon's 30-getOrder-Burst). Live-Progress als Server-Sent-Events, Bash-Looper `scripts/run-fba-backfill.sh` streamt pro Order eine Terminal-Zeile. Idempotent (bestehender `amazon_order_id`-Upsert überspringt schon importierte Orders — erscheint als `order_skipped`-Event). Admin-only, Workspace-scoped, keine UI — bewusst CLI-only damit keiner den Bulk-Import versehentlich klickt. Realistische Dauer: 1–2 h für 10 000 EU-Orders statt 20h+ via Auto-Cron. Keine DB-Migration.
v1.80.0302026-04-23
  • PROJ-253 Versandfehler-Aufträge im Pickliste-Versand-Scan werden ans Queue-Ende gestellt: Wenn ein Auftrag einen DHL- oder Deutsche-Post-Internetmarken-Fehler geworfen hat (offener `dhl_error_log`-Eintrag), sortiert der Picklist-Orders-Endpoint ihn ans Ende der Liste — der Quick-Scan-Flow überspringt ihn automatisch und greift sich zuerst fehlerfreie Aufträge für den gescannten Artikel. Fehlerhafte Aufträge bleiben in der Tabelle sichtbar mit einem roten „Versandfehler"-Badge, damit klar ist warum der Auftrag nicht drankommt. Korrektur läuft wie gehabt über den Versandfehler-Tab; nach erfolgreichem Retry setzt der Auto-Resolve-Pfad den Auftrag automatisch zurück in die reguläre Chronologie.
v1.80.0292026-04-23
  • PROJ-252 Workflow-Tags auf abgeschlossenen Auftraegen: `execute_workflow()` filterte Auftraege mit Status `shipped/completed/cancelled` komplett aus dem Order-Loop, wenn keine `change_status`/`create_invoice`/`create_delivery_note`-Aktion dabei war — und hatte in den `add_tag`/`remove_tag`-Action-Bloecken nochmal ein `CONTINUE`-Gate. Folge: Der Workflow „Bei FBA-Import Tag FBA zuweisen" lief nie, weil Amazon FBA-Bestellungen direkt als `completed` importiert werden. Inkonsistent zum manuellen `POST /api/orders/[id]/tags`-Endpoint, der keinen solchen Check hat. `add_tag`/`remove_tag` sind jetzt auch auf geschuetzten Status erlaubt; `change_shipping_method`/`change_priority` bleiben bewusst geschuetzt (Fulfillment-relevante Felder, PROJ-200 Lock bleibt intakt).
v1.80.0262026-04-22
  • PROJ-250 FBA-Tracking sichtbar im Auftragsdetail: Neuer Card-Block „Versand durch Amazon" unter der Versandart zeigt Tracking-Nummer + Carrier-Badge + Copy-Button pro FBA-Sendung. Greift auf `shipping_labels`-Rows mit `shipping_task_id IS NULL` (Amazon versendet selbst, keine Flowkom-Packtask). Multi-Paket-FBA rendert mehrere Cards.
  • PROJ-250 FBA-PII vollständig auf Production: Parent-API liefert für EU-FBA Name+Straße direkt, `_INVOICING`-Report ergänzt Email (Relay-Alias) und Tracking (Carrier + Tracking-Nr). Für US-FBA bleiben Name/Straße Amazon-seitig redigiert (dokumentierte US/JP/SG-Policy), aber Email und Tracking funktionieren. Session-Zwischenfixes: Parser merge-across-rows (fixt NA-Mehrzeilen-Fälle), Report-Timeout 10→30 Min (Amazon-Queue-Resilienz), region-spezifischer Report-Type (EU `_INVOICING`, NA `_TAX`) — vorübergehender `_TAX`-Switch für EU wurde verworfen, weil die App dort keine `Tax Remittance (Restricted)`-Rolle hat.
  • PROJ-59 Audit-Trail-Bug behoben: `order_events.event_type_check` hatte nur 15 Werte, der TypeScript-Typ 23 — 8 Event-Types wurden dadurch seit Einführung (PROJ-134 Refund, PROJ-139 Replacement, PROJ-149 Address-Update, PROJ-209 Manual-Tracking) stumm mit Constraint-Violation verworfen. Constraint erweitert, COMMENT dokumentiert 1:1-Sync-Pflicht mit dem TS-Typ.
v1.80.0162026-04-22
  • PROJ-251 Bestellvorschlag OOS-Korrektur: Neue Option „Nur Tage mit Bestand berücksichtigen" teilt den Verbrauch durch die Tage, an denen tatsächlich Bestand vorhanden war (rückwärts aus `stock_movements` rekonstruiert), statt stur durch den kompletten Analysezeitraum. Verhindert systematische Unterschätzung des Bedarfs bei Artikeln mit OOS-Phasen. Default aus — bestehendes Verhalten bleibt unverändert.
  • PROJ-251 Zulauf-Whitelist korrigiert: Zulauf zählt jetzt ab Status „Genehmigt" (approved, shipped, partially_received). Vorher fehlte der seit PROJ-76 vorhandene shipped-Status, und gleichzeitig wurden draft/pending_approval fälschlich mitgezählt — beides hat den Vorschlag verzerrt.
  • PROJ-251 „Im Zulauf"-Spalte folgt der Checkbox jetzt live. Vorher war die Spalten-Anzeige nur an den letzten Berechnungs-Snapshot gekoppelt — wer die Checkbox nachträglich aktiviert hatte, sah die Spalte nicht.
v1.80.0142026-04-22
  • PROJ-250 Amazon FBA-Tracking-Import & Billing-Konsistenz: Der bestehende Shipments-Invoicing-Report (EU) bzw. -Tax-Report (NA) wird nun zusätzlich auf `carrier`, `tracking-number` und `shipment-date` pro Shipment-Zeile geparst. Für jede FBA-Order landet pro versendetem Paket eine eigene Row in `shipping_labels` (idempotent via `(order_id, tracking_number)`-Precheck und neuem Composite-Index). `orders.shipped_at` wird beim ersten Import auf die früheste Shipment-Date gesetzt — NULL-guarded via PostgREST `.is("shipped_at", null)`, damit manuell eingetragene Werte nie überschrieben werden. Billing-Snapshot wurde empirisch auf Production verifiziert: der bestehende Mapper `buildAmazonOrderAddressFields` füllt bereits alle 14 `billing_*`-Felder korrekt aus Shipping-Daten (Amazon liefert strukturell keine separate Rechnungsadresse — Bill=Ship ist Branchenstandard wie bei JTL/Sellerboard/Linnworks). Migration: `shipping_labels.label_pdf_url` auf nullable (FBA-Rows haben kein eigenes Label-PDF). Helper `upsertFbaShipments` ist try/catch-hardened — Netzwerk-Blips dürfen den Import nicht aufreißen. Multi-Paket-Orders zeigen alle Tracking-Nummern automatisch im bestehenden Versandhistorie-Sheet (PROJ-218). FBM-Pfad komplett unberührt durch `channel === "FBA"`-Guard. Kein neuer SP-API-Call, kein neuer RDT-Scope — nutzt denselben Report wie PROJ-175.
v1.80.0052026-04-22
  • PROJ-249 Amazon Feed-Historie (Audit-Trail): Neue Tabelle amazon_feed_history + privater Storage-Bucket amazon-feeds. Jeder SP-API-Feed-Submit (inventory, zero_out, dry_run) persistiert Metadaten + JSON-Payload. RLS workspace-scoped, signed-URL-Downloads, Retention 90 Tage analog PROJ-47.
  • PROJ-249 Feed-Vorschau (Dry-Run) unter /dashboard/settings/integrations/[id]/amazon/feed-preview: Zeigt pro Marketplace den nächsten Inventory-Feed, Item-Count, SKU-Liste mit qty, Raw-JSON-Accordion, JSON-Download. Durchläuft denselben Code-Pfad wie der echte Push ohne submitFeed. Jeder Dry-Run wird in der Feed-Historie protokolliert.
  • PROJ-249 FBA Zero-Out-Admin-Button: Einmalige gelbe Warning-Card auf der Amazon-Integration-Seite, die für alle Listings mit amazon_fba_inventory-Eintrag einen JSON_LISTINGS_FEED mit qty=0 über den FBM-Kanal sendet. Admin-only, AlertDialog-Confirm, idempotent. Neutralisiert historisch fälschlich übertragenen FBM-Bestand für FBA-SKUs bei Amazon, ohne den FBA-Bestand anzufassen.
  • PROJ-249 FBA-Badge mit Tooltip in der Listings-Management-Tabelle: `FBA • Sync aus` macht explizit, dass für FBA-Listings kein Flowkom-Bestand an Amazon übertragen wird (Amazon verwaltet FBA-Bestand selbst).
  • PROJ-249 FBA Fulfillment-Channel Mapping & Defense-in-Depth: 289 FBA-Listings (ein Kunde, 27.277 FBA-Einheiten) waren fälschlich als FBM klassifiziert und bekamen FBM-Bestand an Amazon gepusht — bei FBA-Ausverkauf reactivierte Amazon das Angebot als Versand-durch-Verkäufer. Root Cause: mapFulfillmentChannel in listings-report-worker matchte `AMAZON_EU`/`AMAZON_NA`/`AMAZON_DE` nicht (Exact-Match statt startsWith). Fix: Whitelist erweitert + Defense-in-Depth über amazon_fba_inventory als Ground Truth in allen drei Push-Stellen (enqueueAmazonDirtyBatch, safetyFullSync, buildFeedItemsByMarketplace). Emergency-SQL-Hotfix auf Production (289 Rows geflippt), Listings-Report-Cleanup-Cron manuell getriggert für sauberen Report-basierten Re-Sync.
v1.80.0012026-04-22
  • PROJ-248 PR-g2: DB-Drop der Legacy-Shipping-Spalten. 7 Spalten auf `orders` (shipping_company, shipping_first_name, shipping_last_name, shipping_recipient_name, shipping_address_line_2, shipping_address_line_3, shipping_address_category) + 3 auf `customers` gedroppt. `customer_addresses` unberührt (Billing nutzt Canonical-Felder weiter). `orders_with_totals`-View wird mit-dropped und neu erstellt (PostgreSQL-Constraint). 16 Dateien Code-Cleanup. Finale Abschluss der PROJ-248-Serie nach 10 PRs.
  • PROJ-248 Correction-Modal-Hotfix: Das Versandfehler-Cockpit-Inline-Korrektur-Modal war seit PR-f (2026-04-22 nachmittags) still-broken — es schickte Canonical-Felder (first_name/last_name/company) an eine API, die strict gegen das flat DHL-Shipping-Schema validiert. Vom Subagent bei PR-g2 gefixt (Modal-Interface + UI-Felder auf NAME 1/2/3 + post_number + state_region).
v1.79.0102026-04-22
  • Dashboard-KPI „Heute versendet" zeigte fälschlich 1.688 statt der realistischen Tageszahl — Filter lief über updated_at, das jeder Status-Sync (Amazon, Shopify) bumpt und damit historische Aufträge mitzählte. Jetzt über shipped_at (wird nur einmalig beim Versand gesetzt).
v1.79.0092026-04-22
  • PROJ-248 Shipping Address DHL-Flat Schema — Lieferadressen folgen jetzt 1:1 dem DHL-Geschäftskundenportal-Schema (name1/name2/name3 + street + post_number + PLZ/Ort/Bundesland/Land/Telefon). UIs in Customer-Dialog, Order-Edit-Dialog, Manual-Create-Dialog und Versandfehler-Cockpit nutzen einheitliches DHL-Portal-Layout mit 4-Adresstyp-Radio (Straße/Packstation/Filiale/Postfach), NAME 1/2/3-Block mit Tauschen-Button für Amazon-B2B-Vertauschungs-Fälle und mode-aware Straße-Block. Shopify- und Amazon-Importer schreiben direkt in die flat-Felder. DHL- und DP-Internetmarke-Ship-Routes lesen flat. Strukturelle Bug-Behebung: Amazon-BuyerName kann nicht mehr ins DHL-/DP-Label als Empfängerzeile rutschen (z.B. „Amazon Business EU SARL"-Fall). Billing-Adressen bleiben bewusst auf Canonical-Schema für Anrede + USt-IdNr. + ZUGFeRD-Export. Shared Helper canonicalNamesToFlat + canonicalRowToShippingAddress fasst vorher 4× duplizierte Mapping-Logik zusammen und fixt nebenbei latenten Whitespace-Bug.
  • PROJ-248 Hotfix: "Auch als Lieferadresse übernehmen"-Checkbox beim Billing-Create hat Canonical-Payload an den flat-only Shipping-Endpoint gepostet — Duplicate-Flow ließ sich nicht mehr speichern. Neuer Helper mappt Billing-Canonical → flat-Shipping (Firma→name1, Person→name2, Recipient→name3).
v1.78.0042026-04-22
  • PROJ-247 Bestandsverwaltung: Spalten „Ø Einstandspreis" und „Bestandswert" aus Flat- und Grouped-View raus, gleicher Fokus im CSV-Export. Die Bewertung läuft ausschließlich im Profitbutler-Sub-Tab „Bestandsbewertung" (FIFO/Manual/Fallbacks). Nebenher: useStockValuation-Hook auf der Stock-Seite entfernt — ein API-Roundtrip weniger pro Seitenaufruf.
v1.78.0032026-04-22
  • PROJ-246 Profitbutler Bestandsbewertung zeigt jetzt den Zulauf aus bezahlten und genehmigten/verschickten Lieferantenbestellungen als Pseudo-Lager „Im Zulauf" (plus „Gesamt inkl. Zulauf"-Zeile und Sublabel am Lagerwert-Tile). Bewertungsbasis: offene Menge × Stückpreis / Wechselkurs — Nachlaufkosten sind bewusst nicht enthalten, weil sie erst beim Wareneingang final allokiert werden. Teilweise oder vollständig erhaltene LBs fallen automatisch raus, damit nichts doppelt zählt; die erhaltenen Stücke laufen weiter durch FIFO.
  • PROJ-245 Versandhistorie-Sheet Reihenfolge: Positionen-Liste jetzt unter den Sendungsnummern statt darüber — Versandart, Tracking-Nummern und Etikett-Aktionen bleiben oben, Positionen als ergänzende Info unten.
v1.78.0022026-04-22
  • PROJ-245 Auftragspositionen im Versandhistorie-Sheet: Im Side-Sheet der Versandhistorie werden jetzt die Auftragspositionen mit Produktbild, Titel, SKU und Menge angezeigt. Badges für Freipositionen, Service-Artikel und archivierte Produkte. Bild-Fallback auf deleted_product_image_url für gelöschte Produkte (PROJ-119). Reine UI-Erweiterung — Daten kommen bereits über useOrder().
v1.78.0012026-04-22
  • PROJ-244 Picklisten-Profile-Badge mit Bestandsprüfung: Die Auftragszahl auf den Profile-Karten zeigt jetzt die tatsächlich picklistbare Anzahl — vorher nur Filter-Match, weichte beim Klick auf 'Pickliste erstellen' häufig ab. Neuer Shared-Helper `computeFulfillableOrders` wird von Badge, Preview-Count und Create gemeinsam genutzt (Drift-Prevention per Konstruktion): Bundle-Expansion (PROJ-184), Service-Artikel-Ausschluss (PROJ-98), Stock-Query mit Lager-/Lagerplatz-Filter, Reservierungs-Abzug (PROJ-195), Greedy-Fulfillment. Info-Icon + Tooltip neben Badge wenn Aufträge wegen fehlendem Bestand rausfallen. Unmatched-Banner bleibt filter-basiert (Konfigurationslücke ≠ Bestandslücke).
v1.77.0132026-04-21
  • PROJ-243 Profitbutler Bestandsbewertung: Bundle-Artikel tauchten mit Restbestand (53 Produkte, 1.094 Stk) als unbewertet auf, obwohl sie definitionsgemäß keinen eigenen Bestandswert haben (PROJ-190 FIFO bewertet die Komponenten). Beide Stock-Routes (/api/profitbutler/inventory-valuation und /api/stock/valuation) filtern jetzt zusätzlich auf is_bundle=false.
v1.77.0122026-04-21
  • PROJ-242 Lieferantenbestellung Summen-Card: Bei Fremdwährungs-LBs mischte die 'Gesamt'-Zeile numerisch die USD-Waren mit den EUR-Nachlaufkosten und zeigte das Ergebnis mit $-Suffix (z.B. 1.594 USD + 386,67 EUR → fälschlich '1.980,67 $'). Jetzt zwei saubere Gesamt-Zeilen: 'Gesamt (Waren)' in PO-Währung und 'Gesamt (EUR, inkl. Nachlauf)' über po.exchange_rate. Zwischensumme zusätzlich mit EUR-Referenz. EUR-LBs bleiben unverändert. Ohne hinterlegten Kurs Fallback auf Single-Currency-Anzeige.
  • PROJ-242 Cloud-Ordner-Verknüpfung: Im LB-Dokumente-Tab fehlte im State 'Ordner verknüpft' der Weg zurück — ein falsch verknüpfter Google-Drive-Ordner ließ sich nicht tauschen. 'Verknüpfung lösen'-Button mit AlertDialog über dem Cloud-File-Browser; Hook und DELETE-Endpoint existierten bereits ungenutzt.
v1.77.0112026-04-21
  • Produktfilter: Neue Option 'Ohne Lieferant' im Lieferanten-Filter (analog zu 'Ohne Marke' und 'Keine Versandart'). Findet alle Produkte ohne supplier_products-Zuordnung — ideal, um Artikel zu identifizieren, bei denen der Einkauf noch nachpflegen muss.
  • Produkt-Lieferantenfilter war komplett kaputt: die Produkte-API las aus der nicht existierenden Tabelle 'supplier_assignments' (richtig: 'supplier_products', PROJ-19). Der Fehler wurde nach Promise.all nicht geprüft und lief still in einen leeren supplier_map → Filter-Dropdown zeigte immer 'Keine Ergebnisse' trotz vorhandener Lieferanten-Zuordnungen. Query auf supplier_products umgestellt, Workspace-Scope via suppliers!inner Join (Tabelle hat kein eigenes workspace_id), Error-Log für die Supplier-Query ergänzt, damit solche stillen Schema-Fehler nicht wieder durchrutschen.
v1.77.0102026-04-21
  • PROJ-241 Post-Deploy-Härtung. Automatisches Resolved-Markieren von dhl_error_log nach erfolgreichem Label in ship/route.ts (nach Entkopplung durch Client-side Retry). DE-Label-Workaround: addressLine2/3 werden bei country=DE in name2/name3 gepackt (DHL druckt additionalAddressInformation1/2 bei Inlandssendungen laut parcel-de-shipping-v2.3 Zeile 926/932 nicht — nur international + AUT/CHN/DNK/GBR/HRV/LTU/PRT/ROU/RUS). Client-side Retry ersetzt fragile Server-Internal-Fetch. Cockpit-Postnummer-Validation mit Inline-Hint und Pre-Submit-Check.
v1.77.0082026-04-22
  • Profitbutler Warenkosten: NULL product_ids (unvollständig gemappte Shop-Positionen) crashten die resolveProductCosts-Query mit 'invalid input syntax for type uuid: null' — Promise.all rejected, costMap leer, Warenkosten 0 € für 7-Tage/30-Tage/Monat (HEUTE/GESTERN funktionierten nur, weil deren Order-Set zufällig keine NULL-Items enthielt). Filter in resolveProductCosts eingebaut.
  • Profitbutler resolveProductCosts: supplier_products-Query hatte einen .eq('workspace_id', ...) auf einer Spalte, die die Tabelle nicht besitzt — PostgREST-Fehler hat Promise.all rejected und damit denselben Effekt (Warenkosten 0 € für Fallback-Pfade). Workspace-Filter entfernt; Workspace-Zugehörigkeit kommt über die product_ids aus diesem Workspace.
  • Lieferantenbestellung: Sidebar-Summen zeigten Fracht/Zoll/Sonstige-EUR in PO-Währung statt in EUR. formatPOPrice für diese drei Zeilen jetzt hart auf 'EUR' gesetzt; Zwischensumme/Gesamt bleiben in Lieferantenwährung.
  • Lieferantenbestellung Einstandspreis-Regression: PROJ-237 Migration 20260419300000 hatte den v1.72.000-Fix für unit_price überschrieben (Temp-Table wieder INTEGER, Formeln wieder /100). Neue Migration 20260421000000 fixt Typ auf NUMERIC(10,4) + entfernt /100, rechnet alle bestehenden POs neu. LB-10074: 15 GRIs mit purchase_order_item_id=NULL (Kollateral aus PROJ-168) per product_id neu verknüpft; EK jetzt 2,99 € statt 0,03 €.
v1.77.0052026-04-21
  • PROJ-241 Phase 1 deployed: Canonical-Address-Foundation + Migration von Customer/Order/Cockpit/Billkom auf gemeinsame UI-Primitives. Supplier-Form + Workspace-Firmenprofil als Future-Polish deferred.
v1.77.0042026-04-21
  • PROJ-241 PR-e — Billkom Canonical Snapshot + PDF additive rendering. buildCustomerSnapshot erweitert um recipient_name/address_line_2_3/post_number/state_region/address_category/vat_id. PDF-Generator rendert neue Zeilen conditional (nur wenn Snapshot-Felder gesetzt), alte finalisierte Belege byte-identisch. Bonus: company_name-Alias schließt ZUGFeRD-Drift bei B2B-Rechnungen (buyerName jetzt korrekt = Firmenname statt Fallback auf Personenname). GoBD-Immutability gewahrt, keine JSONB-Migration, 5 Caller (documents/quotations/dunning/batch/queue) durchgereicht.
v1.77.0032026-04-21
  • PROJ-241 PR-d — Shipping Error Cockpit auf Canonical-Primitives. ~200 Zeilen Form-Code durch <AddressFields context=shipping mode=compact> ersetzt. Land jetzt CountryCombobox statt ISO-Text. correctionSchema erweitert um recipient_name/state_region/address_category/country (backwards-compat mit country_code). Packstation-Hint + Postnummer-Pflicht weiter interaktiv.
v1.77.0022026-04-21
  • PROJ-241 PR-c — Order Address Edit Dialog auf Canonical-Primitives. 13 individuelle Input-Felder durch <AddressFields> ersetzt. DHL-Postnummer jetzt via Dialog editierbar (bisher war Feld in DB seit PROJ-239, nicht aber im Dialog). Order-Type + orderAddressUpdateSchema + fieldMap in API um shipping_post_number/billing_post_number erweitert.
v1.77.0012026-04-21
  • PROJ-241 PR-b — Customer Address Dialog auf Canonical-Primitives. Von react-hook-form auf simple useState. customerAddressFormSchema erweitert um recipient_name/post_number/state_region/address_category (DB-Drift seit PROJ-145/219/239 geschlossen). POST + PUT in /api/customers/[id]/addresses schreiben die neuen Felder.
v1.76.0002026-04-21
  • PROJ-241 PR-a — Foundation: CanonicalAddress TypeScript-Type + 5 Mapper (orders, customers, customer_addresses, billkom JSONB, workspaces) + 7 UI-Primitives (AddressFields, AddressFormSkeleton, AddressCompanyBlock, AddressPersonBlock, AddressStreetBlock mit Packstation-Detection, AddressLocationBlock mit CountryCombobox, AddressContactBlock) + Zod-Validation-Schemata (shipping/billing/sender) + 64 Tests mit realen Fixture-Daten (Auftrag 02041 Amazon, 02042 Shopify Packstation, synthetisches B2B, US-International, Legacy-Billkom-Snapshot). Rein additiv — keine bestehende Form geändert.
v1.75.0082026-04-21
  • PROJ-241 Spec angelegt: Canonical Address — systemweite Adress-Daten-Unifikation. 8-PR-Rollout geordnet nach aufsteigendem Live-Risiko (Foundation → Customer → Order → Cockpit → Billkom → LB → Workspace → optional DHL/DP-Adapter). Fixture-basierte Regression-Tests, Live-Smoke-Test-Rezepte, DHL/DP/Shopify/Amazon-Integrationen bleiben unangetastet.
v1.75.0062026-04-21
  • PROJ-240 — Label-Aktionen für abgeschlossene und stornierte Aufträge freigegeben: Die Buttons "Nachdrucken" (Reprint), "Retoure" und "+ Etikett" in der Versand-Sektion des Auftragsdetails sind jetzt auch bei Status completed/cancelled sichtbar. Vorher hat die PROJ-200-Auftragssperre die gesamte Versand-Section auf readonly gesetzt und damit Label-Aktionen versteckt — obwohl die dahinterliegenden APIs (reprint, return-label, additional-label) den Order-Status ohnehin nicht prüfen. Adress- und Tracking-Edits bleiben weiterhin gesperrt (ManualTrackingSection behält readonly).
v1.75.0052026-04-21
  • PROJ-139 — Ersatzlieferung übernimmt jetzt Liefer- und Rechnungsadresse vom Ursprungsauftrag: Die Replacement-API kopierte bisher nur Kunde, Versandart und Positionen, wodurch der Ersatzauftrag adresslos angelegt wurde. Alle 28 Adress-Snapshot-Felder (PROJ-145/PROJ-219/PROJ-239) werden jetzt 1:1 aus dem Parent-Order übernommen (inkl. Firma, Adresszeile 2/3, DHL-Postnummer, state_region und address_category).
v1.75.0032026-04-21
  • PROJ-239 Teil 4/4 — DP Internetmarke Packstation-Parity: shipOrderDeutschePost nutzt jetzt Firma (name) + Person (additionalName) parallel statt name zu überschreiben. Packstation/Postfiliale-Erkennung über parsePackstationStreet (PR #1) routet Postnummer als addressLine2 gemäß offizieller DP-Konvention (1C4A API hat kein eigenes Locker-Schema, verifiziert gegen DP Quick-Guide Internetmarke v2.0). Preflight-Validierung identisch zum DHL-Pfad.
v1.75.0022026-04-21
  • PROJ-239 Teil 3/4 — DHL Locker/PostOffice + name1/2/3 Mapping: DhlRecipientAddress komplett erweitert auf DHL v2.3 Consignee-Schema. Neuer buildConsigneePayload() branch-switched zwischen ContactAddress (name1/2/3 + addressStreet + additionalAddressInformation1/2), Locker (lockerID+postNumber) und PostOffice (retailID+postNumber/email). Ship-Route: Firma UND Person parallel (name1=Firma, name2=Person), Packstation-Pattern auto-switch auf Locker-Payload, Preflight gegen nur-Ziffern-Straßen. Auftrag 02041-Klasse ("21891674" als Straße) scheitert jetzt mit sprechendem Hint statt DHL "Please enter a house number".
v1.75.0012026-04-21
  • PROJ-239 Teil 2/4 — Versandfehler-Cockpit: In der Versandfehler-Queue blendet sich bei jedem Fehler-Row eine Collapsible "Original-Daten vom Shop" ein, die alle Import-Notizen (Shopify/Amazon-Rohdaten) als Monospace-Block anzeigt. Mitarbeiter sieht sofort was der Kunde wirklich eingetragen hat. Korrektur-Formular um Adresszeile 2, Adresszeile 3, DHL-Postnummer erweitert; Postnummer wird bei erkanntem Packstation/Postfiliale-Pattern als Pflicht mit rotem Rand markiert. /api/shipping/errors/[id]/correct speichert die neuen Felder, Retry nutzt sie automatisch.
v1.75.0002026-04-21
  • PROJ-239 Teil 1/4 — Adress-Mapping Foundation: Schema-Migration mit neuen Spalten orders.shipping_post_number/billing_post_number, customers.shipping_post_number/billing_post_number + shipping_address_line_2/3 + billing_address_line_2/3, customer_addresses.post_number. Neuer shipping-address-parser mit parsePackstationStreet (matchet Packstation + 3-stellige ID, lockerID 100-999), parsePostfilialeStreet (retailID 401-999), isDhlPostNumber (6-10 Ziffern), routeAddressLine2 (entscheidet ob address2 in address_line_2 oder post_number gehört). Shopify-Importer routet address2 jetzt strukturiert: bei Packstation-Pattern in post_number, sonst in address_line_2. 22 Unit-Tests inkl. Edge Cases wie 'Packstationstraße 5' (matcht nicht). Grundlage für DHL- und DP-Versand-Mapping.
v1.74.0052026-04-21
  • PROJ-239 Spec angelegt: Adress-Mapping Härtung & Versandfehler-Cockpit. Aufschlüsselung der beiden Live-Vorfälle (Amazon Postnummer in AddressLine1, Shopify/eBay Packstation mit verlorener address2) in vier Sub-PRs: Shopify-address2-Persistierung + neue Postnummer-Spalten, DHL Locker/PostOffice-Schema + name1/2/3-Mapping, Versandfehler-Queue mit inline Shop-Notizen, DP-Parität. API-Verifikation gegen Hersteller-Doku als Merge-Gate.
v1.74.0042026-04-21
  • Profitbutler Stats: 7-Tage/30-Tage/Monat zeigten Warenkosten/Versand/Verpackung/Pick&Pack 0 € (Heute/Gestern korrekt). Root cause: .in("order_id", orderIds) sprengte mit 300+ UUIDs die 16-KB-PostgREST-URL-Grenze und lieferte stillschweigend data: null. Neuer Helper src/lib/query-batch.ts mit fetchInBatches() (Default 200 IDs/Batch, parallel). Eingesetzt in stats/route (Orders+Invoice), stats/chart, daily-stats. Selbes Muster wie v1.73.006.
v1.74.0032026-04-20
  • Amazon-Import speichert jetzt die rohen SP-API-Adressdaten (ShippingAddress + BuyerInfo, alle AddressLine-Felder unverändert) als Import-Notiz am Auftrag. Hintergrund: Käufer tragen auf Amazon manchmal DHL-Postnummern, Firmen oder Abteilungen in die falsche Adresszeile ein — unser 1:1-Mapping AddressLine1 → shipping_street führt dann zu DHL-Validierungsfehlern (Auftrag 02041: AddressLine1="21891674" statt "Buchenweg 17"). Nach manuellen Korrekturen bleibt so die Original-Käufereingabe für Support/Audit sichtbar.
v1.74.0022026-04-20
  • Profitbutler Versand- und Verpackungskosten waren um Faktor 100 zu niedrig — selbe Bug-Klasse wie v1.73.005: shipping_method_country_costs.shipping_cost, weight_surcharge und shipping_packagings.price liegen als NUMERIC(10,2) in EUR, die Cost-Pipeline rechnet aber in Cent. Neuer Helper eurNumericToCents() in costs-calculate.ts, alle 3 Load-Sites (daily-stats, stats/orders, stats/chart) umgestellt. profitbutler_daily_stats muss per Aggregate-Endpoint neu berechnet werden.
v1.73.0082026-04-20
  • Dashboard 'Heute versendet' zählte nur Orders mit status='shipped'. Seit PROJ-217 gehen erfolgreiche Versendungen aber direkt auf 'completed', shipped wird nur noch bei manueller Tracking-Eingabe (PROJ-209) gesetzt. Filter auf ['shipped', 'completed'] erweitert — Zähler zeigt jetzt die echte Tagesmenge.
v1.73.0072026-04-20
  • Dashboard-KPI 'Heute versendet' (und Profitbutler-Tageskarten Tagesumsatz/-gewinn/Marge) zählte Orders in UTC-Tagen statt in Europe/Berlin. Auf dem UTC-Server fielen dadurch Versendungen zwischen Berlin-Mitternacht und 01/02 Uhr aus dem 'Heute'-Fenster. Neuer Helper src/lib/timezone-helpers.ts (DST-korrekt via Intl), auch für Orders-Stats-API verwendet.
v1.73.0062026-04-20
  • [object Object]
v1.73.0052026-04-19
  • Profitbutler Warenkosten waren um Faktor 100 zu niedrig — die Cost-Pipeline rechnet intern in Cent, supplier_products.purchase_price liegt seit PROJ-138 aber als NUMERIC(10,4) in Euro vor. resolveProductCosts liefert jetzt cost_cents (EUR × 100) statt cost_eur. Alle 4 Aufrufer (daily-stats, stats/orders, stats/invoice, stats/chart) umgestellt. Bestehende daily-stats müssen per POST /api/profitbutler/stats/aggregate neu aggregiert werden.
v1.73.0042026-04-19
  • Profitbutler-Auswertungen (Sellerboard, Chart, Tagesstatistik) nutzten für die Warenkosten-Berechnung ausschließlich supplier_products.purchase_price (preferred) — FIFO-Daten und manuelle Einstandspreise wurden ignoriert. Jetzt identische Kaskade zur Bestandsbewertung: manual (bevorzugt) → FIFO → Lieferanten-EK. Zentraler Helper src/lib/profitbutler/resolve-cost.ts
v1.73.0032026-04-19
  • Breadcrumbs im Header zeigten für Profitbutler, Bestandsbewertung, Retourenauswertung, Kunden, Kundenaufträge, Daten-Hub und Nachfüllung nur 'Dashboard' statt des vollen Pfads — breadcrumbMap in dashboard-shell ergänzt
v1.73.0022026-04-19
  • Profitbutler Bestandsbewertung: Header 'Bestandsbewertung' + Untertitel entfernt (redundant mit Sidebar + ProfitbutlerNav), CSV-Export-Button an das rechte Ende der Filter-Toolbar verschoben — mehr Platz für die Daten
v1.73.0012026-04-19
  • Profitbutler Bestandsbewertung visueller Polish: Hero-Summary mit 4 KPI-Tiles (Wallet/Package/Boxes/TrendingUp), Coverage-Progressbar in Ampelfarben, Source-Badges farbig (FIFO emerald, Manuell sky, Keine Bewertung red), farbige Lager-Status-Dots (Amazon orange, Westheim indigo), Sparkles-Header-Icon, CSV-Export in Emerald-Akzent
v1.73.0002026-04-19
  • Profitbutler Bestandsbewertung UI-Rework: Volltext-Suche, Filter-Drawer mit Lager/Quelle/Schätzungs-Typ/Bestand-Spanne/Lagerwert-Spanne, aktive Filter-Chips, klickbare Coverage-Badges als Quickfilter + Progress-Bar, Lager-Card mit aufklappbaren Drill-Down-Zeilen (Top-10 Artikel pro Lager) und klickbaren Lager-Namen als Quickfilter, CSV-Export mit pro-Lager-Spalten, Produktdetail-Direktlinks in jeder Zeile, Live-Summen unter aktiven Filtern
  • Bewertungs-Kaskade: Manueller Einstandspreis wird jetzt nur noch verwendet wenn 'Manuellen EK bevorzugen' aktiv ist. Ohne Toggle wird der Wert ignoriert (früher fiel er als manual_fallback trotzdem ein, wenn keine FIFO-Daten existierten). User kann den EK so als Referenz hinterlegen ohne Auto-Nutzung. Hybrid-Fallback-Kaskade entsprechend entschlackt (bleibt supplier → FIFO-Schnitt → 0).
v1.72.0062026-04-19
  • PROJ-237: LB Nachlaufkosten UI — Fracht/Zoll/Sonstige EUR/Sonstige Fremdwährung mit Kurs-Abruf-Button (EZB), drei Verteilmethoden (Volumen/Warenwert/Menge), retroaktive FIFO-Korrektur für bereits gebuchte Wareneingänge, Einstandspreis-Preview pro Position. HelpLink zur neuen Nachlaufkosten-Doku im Kosten-Tab.
v1.72.0032026-04-19
  • Profitbutler Bestandsbewertung: Stücke ohne FIFO-Deckung und ohne manuellen/Lieferanten-EK blieben unbewertet (Wert 0). Erweiterte Fallback-Kaskade — wenn FIFO existiert, wird für die Rest-Stücke der FIFO-Durchschnitt als Schätzwert verwendet. UI zeigt Fallback-Typ pro Zeile (+ Manueller EK / + Lieferanten-EK / + FIFO-Schnitt).
v1.72.0022026-04-19
  • Produkt-Kanban Cleanup: tote Props members und onAssigneeChange aus ProductKanban entfernt, unbenutzte handleAssigneeChange auf Produkt-Liste entfernt (Zuweisung bleibt auf Produkt-Detailseite editierbar). PROJ-236 auf Deployed gesetzt
v1.72.0002026-04-19
  • Profitbutler Bestandsbewertung — Hybrid-Bewertung: FIFO-abgedeckte Stücke aus echten LB-Schichten + Rest-Stücke via manual_landed_cost_eur → supplier_products.purchase_price (preferred) → 0. Neue Response-Felder fifo_qty/fallback_qty/unvalued_qty pro Produkt. UI zeigt Coverage-Badges (FIFO/Lieferanten-EK/Unbewertet) und bei Mischbestand per-Zeile Aufteilung (z.B. '500 FIFO · 1048 LE')
  • calculate_landed_costs() RPC war nach Migration 20260415 (unit_price INTEGER → NUMERIC(10,4)) nicht nachgezogen. Temp-Table unit_price blieb INTEGER → Cast rundete 0.14 → 0, 0.52 → 1 (banker's rounding); zusätzlich Division /100 aus Cent-Modell. Resultat: landed_cost_eur wurde auf 0 oder 0,01 € gebucht obwohl echte LB-Preise hinterlegt waren. Neue Migration fixt RPC und kalkuliert alle bestehenden POs neu.
  • Profitbutler Ø Einstandspreis teilte FIFO-Summe durch Gesamtbestand (inkl. Stücke aus freier WE ohne Kosten). Bei Mischbestand wurde der Schnitt dadurch künstlich niedrig gezogen. Fix: Division durch FIFO-allokierte Menge (allocatedQty).
v1.71.0022026-04-19
  • Produkt-Tabelle Titel-Spalte war nach line-clamp-Fix auf Wort-Minimalbreite geschrumpft (schmaeler als Marke-Spalte). Fix: div-Wrapper mit fixer w-[250px] um den clamp-span — Breite bleibt stabil
v1.71.0012026-04-19
  • Produkt-Tabelle Titel-Spalte: line-clamp-2 hatte nicht gegriffen (block-Class hatte display:-webkit-box ueberschrieben), Titel wuchsen auf beliebig viele Zeilen. Fix: block-Class entfernt, Titel werden jetzt wieder auf 2 Zeilen geklammert, Spaltenbreite unveraendert
v1.71.0002026-04-19
  • PROJ-236: Kanban Parent/Child-Gruppierung — Eltern-Karten kollabieren zu einer Karte mit Kinder-Zähler, Expand/Collapse pro User persistiert. Cascade-Drag beim Parent-Move bewegt Eltern + alle Kinder mit gleichem Board-Status atomar (neue Supabase-RPC + API-Route). Stray-Kinder in abweichender Spalte erscheinen eigenständig mit ↳-Parent-Hinweis und amber Akzent-Rand. Undo-Toast (6 Sek) nach Cascade-Move. Bundles bleiben Einzelkarten.
v1.70.0062026-04-19
  • PROJ-235 Follow-up: Initial-Bestand nach Shopify-Product-Push automatisch enqueuen (Push-Button → Bestand landet in Queue)
v1.70.0052026-04-19
  • Profitbutler Bestandsbewertung: Ø Einstandspreis zeigte für Kleinteile überall 0,01 € — jetzt mit 4 Nachkommastellen (landed_cost_eur wird als NUMERIC(10,4) gespeichert, wurde im Frontend aber auf 2 Dezimal gerundet). Lagerwert bei FIFO-Quelle aus echter Schichten-Summe statt aus gerundetem Ø-Preis × Menge.
v1.70.0042026-04-19
  • Produkte-Tabelle: Spaltenkonfiguration (z.B. Gesamtbestand) blieb nach Reload nicht erhalten — PROJ-203 Orders-Migration lief unscoped und wipte die Products-localStorage-Config bei jedem Laden, jetzt auf tableKey === "orders" beschränkt
  • Produkt-Kanban-Karte: Zugewiesen-Select und Drag-Overlay-Footer entfernt (Datenmodell bleibt, nur UI)
  • Produkt-Kanban & -Tabelle: Titel zweizeilig (line-clamp-2) statt abgeschnitten
  • Produkt-Kanban-Karte: EAN als neue Zeile, Copy-Buttons für SKU und EAN
  • Produkt-Tabelle: Copy-Buttons für SKU, EAN und FNSKU (auf Row-Hover) — auch in Varianten-Zeilen
v1.70.0032026-04-19
  • PROJ-235 Status auf Deployed gesetzt
v1.70.0022026-04-19
  • PROJ-235: Bestandssync auf Shopify/Amazon nach Buchungen zuverlässig (fire-and-forget in 13 Routen auf await umgestellt, 5 fehlende Enqueues bei Order Cancel/Delete/PUT/Status + Shopify-Status-Sync ergänzt)
v1.70.0002026-04-19
  • PROJ-234: Profitbutler-Auswertung pro Artikel — im Profitbutler-Tab der Produktdetailansicht gibt es jetzt einen neuen Untertab „Auswertung" zwischen „Kalkulation" und „Retouren". Der Tab zeigt genau die Auswertungen der Profitbutler-Hauptseite (Umsatz-/Gewinn-Chart über 7/14/30/90 Tage, Multi-Perioden-Sellerboard mit Umsatz, Stornos, Warenkosten-Gruppen, Gewinn, Marge, Bestellungen, Ø Bestellwert und Erstattungen, sowie aufklappbarer Kanal-Breakdown) — aber eingeschränkt auf den aktuell geöffneten Artikel. Ohne Bestellungen im Zeitraum erscheint ein Empty State. Perioden-Konfiguration bleibt workspace-weit auf der Hauptseite.
v1.69.0002026-04-18
  • PROJ-233: Zahlungen-Tab an Lieferantenbestellungen — jede LB hat jetzt einen eigenen Reiter, in dem Anzahlungen und Teilzahlungen mit Datum, Betrag und optionaler Notiz erfasst werden. Der Zahlungsstatus der Bestellung (Unbezahlt / Anbezahlt / Vollständig bezahlt) wird automatisch aus der Summe aller Zahlungen und dem PO-Total abgeleitet — sowohl beim Erfassen als auch beim Löschen. Die Sidebar-Card „Zahlung" zeigt den gezahlten Betrag und den offenen Restbetrag live in LB-Währung. Beträge werden intern in Cents gespeichert, UI akzeptiert deutsche Dezimalformate (1,23 oder 1.23). Zahlungen sind immutable (nur anlegen + löschen, kein Edit).
v1.68.0002026-04-19
  • PROJ-232: LB-Übersichts-Redesign — analog zur Kundenaufträge-Seite. Neuer View-Toggle zwischen Kanban und konfigurierbarer Listen-Ansicht (14 Spalten, 6 als Default sichtbar, Auswahl pro User persistiert). Pipeline-Tabs zeigen Live-Counts pro Status. Neue Unified Search mit sechs Scopes (Überall / LB-Nummer / Lieferant / Lieferanten-Artikelnummer / Produkt SKU+Name / Notizen) — „Überall" macht eine OR-Union über alle Scopes. Neuer Filter-Drawer rechts mit Multi-Select für Zahlungsstatus, Lieferant, Lager, Incoterm, Transportart plus Datum-Ranges. Aktive Filter erscheinen als Chips mit einzeln-entfernbaren X-Icons plus einem roten „Alle zurücksetzen"-Button. Listenspalten für Incoterm, Transportart, Lager, Positionen, Erhalten %, Erstellt-von und Genehmigt-von neu verfügbar.
  • PROJ-232: Notizen-Tab an Lieferantenbestellungen — jeder Workspace-Member kann chronologisch Kommentare hinzufügen (Autor + Zeitstempel werden automatisch gesetzt, „bearbeitet"-Hinweis wenn nachträglich geändert). Eigene Notizen lassen sich editieren oder löschen, fremde sind schreibgeschützt (API gibt 403 zurück). Tab-Label zeigt Count-Badge. Cmd+Enter speichert eine neue Notiz direkt.
  • PROJ-232: Versandinfo-Tags und Notizen sind jetzt volltext-durchsuchbar — die Übersicht findet LBs auch wenn der Suchbegriff nur in einer Notiz oder der Lieferanten-Artikelnummer steht.
v1.67.0182026-04-18
  • PROJ-232: Versandinfo-Tags (Incoterm & Transportart) sind jetzt im LB-Detail-Overlay und auf den Kanban-Karten sichtbar. Im Detail gibt es eine neue Sidebar-Card zwischen Lieferant und Summen — im Bearbeiten-Modus per Dropdown änderbar, im Ansichtsmodus mit Badges. Der Header des Overlays zeigt die gesetzten Tags neben dem Status-Badge, die Kanban-Karte zeigt sie unter dem Gesamtbetrag (nur wenn gesetzt). Jeder Tag lässt sich einzeln auf „Nicht gesetzt" zurücksetzen und verschwindet dann wieder aus allen Ansichten.
v1.67.0152026-04-18
  • PROJ-232: Lieferantenbestellungen können jetzt mit Versandinfo-Tags (Incoterm & Transportart) angereichert werden. Incoterms gemäß ICC 2020 (EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, DDP), Transportarten Schiff/Luft/Zug/LKW. Backend-Endpoint akzeptiert die neuen Felder, null entfernt einen gesetzten Tag wieder. UI folgt in einem Folgecommit.
v1.67.0052026-04-19
  • Abgeschlossene Kundenaufträge können jetzt wieder kostenlose Ersatzlieferungen erzeugen — UI-Guard hatte den Button versehentlich ausgeblendet, obwohl die API das schon lange erlaubt.
v1.67.0002026-04-19
  • PROJ-231: Google Drive als zweiter Cloud-Provider neben OneDrive. Admins können beide Clouds parallel verbinden und pro Use-Case (Produkte / Lieferantenbestellungen) einzeln aktivieren — pro Workspace und Use-Case darf nur eine Cloud aktiv sein (DB-Level-Exklusivität via Partial-Unique-Indexes, UI zeigt bei Kollision disabled-Checkbox mit Hinweis auf den aktuellen Blocker-Provider).
  • PROJ-231: Neuer „Dokumente"-Tab im LB-Detail-Overlay zeigt Cloud-Ordner-Inhalte direkt in Flowkom. Auto-Match sucht Drive-weit nach der LB-Nummer mit Token-Boundary-Erkennung (LB-10058 matcht nicht LB-10008), Shared-Ordner wie „LB-10058 / LB-10061 / LB-10067" erscheinen als Kandidaten-Picker, leere Treffer bieten „Ordner anlegen" oder manuelle Auswahl. Lazy Mount via Radix Tabs — Drive-API-Quota wird nur belastet wenn der Tab tatsächlich geöffnet wird.
  • PROJ-231: Tabelle product_cloud_folders wurde zu polymorphem cloud_folder_links (entity_type: product | purchase_order) generalisiert. Bestehende OneDrive-Produkt-Verknüpfungen bleiben unverändert, die alte Tabelle wird für die Rolling-Deploy-Phase als Compat-View weiter bereitgestellt.
v1.66.0122026-04-18
  • PROJ-229: Neuer Import-Typ „JTL Historische Aufträge" im Daten-Hub. Upload-Step lädt den CSV-Export direkt in Supabase Storage; Preview-Step analysiert die ersten 512 KB und zeigt Anzahl der Aufträge, erkannte Verkaufskanäle, Duplikate gegen bestehende Aufträge sowie ggf. Mojibake. Klick auf „Import starten" legt einen Background-Job an — der Worker läuft asynchron (1–3 h bei 150k Aufträgen).
v1.65.0152026-04-18
  • PROJ-230: Lieferantenbestellungen können gelöscht werden (via 3-Punkte-Menü in der Liste und im Detail-Overlay). Guard verhindert das Löschen, wenn bereits Wareneingänge gebucht wurden — der Server antwortet dann mit einer klaren Fehlermeldung.
  • PROJ-230: LB-Status sind jetzt in beide Richtungen bewegbar — draft ↔ pending_approval ↔ approved ↔ shipped, sowie cancelled → draft und rejected → pending_approval. Partially_received und completed bleiben WE-gesteuerte Einbahnstraßen (werden nur beim Buchen eines Wareneingangs gesetzt). Jede Status-Änderung wird in der History protokolliert.
  • Button-Label „Wareneingang buchen" im LB-Detail-Header zu „Als verschickt markieren" geändert — der Button setzt tatsächlich nur den Status auf „Verschickt", der eigentliche Wareneingang wird im eigenen Tab gebucht.
v1.65.0062026-04-18
  • Versandart-Filter in der Kundenaufträge-Übersicht zeigte immer „Keine Versandarten vorhanden" — Response-Property wurde falsch gelesen (`shipping_methods` statt `data`). Filter funktioniert jetzt wieder.
v1.65.0032026-04-18
  • PROJ-228: Versandart-Filter in der Kundenaufträge-Übersicht. Neuer Multi-Select-Abschnitt im Filter-Drawer mit allen aktiven Versandarten als lila Toggles. Aktive Auswahl erscheint als Chip in der Aktive-Filter-Leiste.
  • PROJ-228: Copy-Buttons neben der Auftragsnummer und der externen Bestellnummer in der Auftragsliste. Hover-Icon + Klick kopieren den Wert in die Zwischenablage.
  • PROJ-228: Sortierung nach Auftragsnummer sortiert jetzt tatsächlich nach der Nummer. Bisheriger Proxy auf created_at (PROJ-40) brach bei parallelen Importen auseinander. Da alle WMS-Nummern zero-padded sind, ist lexikographische Sortierung == numerische. Zusätzlich columnKey des Smart-Column-Headers korrigiert.
v1.65.0002026-04-18
  • PROJ-223: Kundenaufträge-Übersicht aufgeräumt — kompakte Status-Tabs ersetzen die großen Pipeline-Kacheln. Eine Unified Search mit Scope-Dropdown (Überall/Auftrag+Kunde/Artikel/Notizen/Externe Nr.) findet Amazon-Bestellnummern in der externen Bestellnr., eBay-Nummern in Notizen und Artikel per SKU/EAN/ASIN/FNSKU. Neuer Filter-Drawer rechts bündelt Verkaufskanal, Zahlstatus, Kanal-Quelle, Tags, Zeitraum und Freipositionen. Aktive Filter erscheinen als Chipleiste mit auffälligem rotem 'Alle zurücksetzen'-Button.
v1.64.0762026-04-18
  • PROJ-223 Backend: Neuer search_scope-Parameter an GET /api/orders mit OR-Union über orders.order_number, orders.external_order_number, customers.*, order_notes.content und order_line_items (via products.sku/sku2/barcode/fnsku + amazon_listings.seller_sku/asin). Trigram-GIN-Indizes auf allen neuen Suchfeldern für Full-Table-Scan-Vermeidung. notes_search bleibt als Legacy-Alias funktional.
v1.64.0742026-04-17
  • Shopify Bestellstatus-Sync granular pro Integration steuerbar: Master-Toggle plus vier Sub-Toggles (Stornierungen, Versandstatus, Zahlstatus & Erstattungen, Sendungsnummern). Master aus → Cron überspringt die Integration komplett; einzelne Sub-Toggles aus → nur die abgeschalteten Bereiche werden übersprungen. Tracking-Import bleibt an den Versandstatus-Sync gekoppelt. Bestandsintegrationen behalten Standardverhalten (alle Toggles an).
v1.64.0722026-04-17
  • Amazon Bestellstatus-Sync granular steuerbar: Drei neue Sub-Toggles (Stornierungen, Versandstatus, Sendungsnummern). Abgeschaltete Teile werden vom Cron übersprungen, Tracking-Import bleibt vom Versandstatus-Sync abhängig. Bestandsintegrationen behalten Standardverhalten (alle Sub-Toggles an).
v1.64.0712026-04-17
  • Amazon-Importe nutzen jetzt den echten Empfängernamen aus ShippingAddress.Name statt des Amazon-Account-Handles aus BuyerInfo — verhindert dass z.B. Usernamen wie "wergen" fälschlich als Nachname in der Lieferadresse landen (PROJ-219 Hotfix).
v1.64.0692026-04-17
  • Kunden-Adressen-Dialog zeigt und speichert Adresszeile 2 und 3 analog zu Auftrag-Adressen (PROJ-219 Hotfix).
v1.64.0682026-04-17
  • Amazon-Adressen mit c/o-Zusatz werden jetzt korrekt getrennt gespeichert — AddressLine1/2/3 landen in separaten Feldern, keine Konkatenation mehr im Straßenfeld (PROJ-219 Hotfix).
v1.64.0572026-04-16
  • Amazon Business Lieferadressen werden jetzt vollständig übernommen — Empfänger, Firma, Kaufauftragsnummer, Adresstyp und Bundesland/Region erscheinen im Auftragsdetail (PROJ-219).
v1.64.0562026-04-16
  • Produktübersicht-Spalte 'Im Zulauf' zeigt jetzt auch LBs, die als verschickt markiert wurden — hardcoded Status-Filter übersah seit PROJ-76 den 'shipped'-Zustand. Zusätzlich Single Source of Truth für In-Flight-LB-Stati (Entwürfe zählen nicht).
v1.64.0552026-04-16
  • Versand & Mobile-Picking: Picklisten-Liste filtert seit PROJ-217 nicht mehr nach Status — fertige Picklisten blieben in Mobile-App, Web-Mobile und Versand sichtbar. Neuer include_completed-Filter blendet erledigte Picklisten aus. Web-Mobile-Picking lud zusätzlich jede Pickliste doppelt (zwei Status-Fetches mit identischem Ergebnis), jetzt nur noch ein Fetch.
  • Versand-Übersicht: Kartenfußzeile 'X/X Aufträge gepickt' war seit PROJ-217 irreführend (Aufträge sind ab Picklisten-Erstellung in_progress, Zähler war immer X/X). Zeigt jetzt 'X/Y versendet'.
v1.64.0362026-04-15
  • PROJ-55: Stale-Sync Guard — Hängende Inventory-Sync-Logs (in_progress >10min) werden automatisch als failed markiert, damit nachfolgende Syncs nicht permanent blockiert werden
v1.64.0352026-04-15
  • Bundle-Gewicht aus Komponenten berechnen statt Bundle-Produkt-Gewicht (Versand, Customs, Retoure)
v1.64.0342026-04-15
  • Customs-Dialog Gewichtseinheit von Gramm auf kg korrigiert (WEIGHT_EXCEEDED Bug bei Non-EU-Sendungen)
v1.64.0292026-04-15
  • Versand-Dialog: Vollständige Lieferadresse (inkl. Land als Klartext) und Versandverpackung mit Preis dezent angezeigt
v1.64.0282026-04-15
  • PROJ-215: Picklisten-Versand-Entkopplung — Versand aus laufenden/pending Picklisten, Bestandsabbuchung beim Versand, Auto-Complete
  • Bundle-Komponenten-Reservierung in Bestandsanzeige + Plattform-Sync (Shopify/Amazon)
  • Bundle-Tab: Reserviert/Verfügbar-Spalten + SKU-Links zu Stammartikeln
v1.64.0222026-04-15
  • Volle Mitarbeiter-Rechte: Alle 192 API-Routen + alle RLS-Policies + alle RPCs für Mitarbeiter geöffnet. Nur Einstellungen, Profitbutler und Team-Verwaltung bleiben Admin-exklusiv.
  • Wareneingang LB-basiert: Lagerplatz-Feld ist jetzt eine durchsuchbare Combobox (Barcode-Scanner + Tastatursuche)
  • Wareneingang (Web + Mobile): 'cannot get array length of a scalar' behoben — p_items als Array statt JSON-String an RPC übergeben
  • Wareneingang LB-basiert: Status 'shipped' als gültiger Empfangsstatus hinzugefügt
  • Picklisten: populate_picklist, complete_picklist, delete_picklist — Admin-Check durch Member-Check ersetzt
  • Mobile App: Endpoint-Typo /api/goods-receipt → /api/goods-receipts korrigiert
  • Sidebar: Daten-Hub und Profitbutler für Nicht-Admins ausgeblendet
v1.64.0112026-04-15
  • isDhlShipment ReferenceError bei Warenpost International behoben — Customs Declaration in attemptDhlLabelGeneration nutzte undefinierte Variable
v1.64.0102026-04-15
  • PROJ-2: Dezimaleingabe mit Komma in Produktdaten (Gewicht, Maße, UVP) — type=number blockierte Komma, umgestellt auf type=text inputMode=decimal
v1.64.0082026-04-15
  • RLS-Policies: Alle Workspace-Mitglieder haben jetzt vollen Zugriff (SELECT/INSERT/UPDATE/DELETE) auf Picklisten, Aufträge und Versand — identisch mit Admins
  • Picklisten-UI: Picker zuweisen, Abschließen und Löschen jetzt für alle Mitglieder sichtbar
v1.62.0002026-04-14
  • PROJ-209: Manuelle Trackingnummer & Fulfillment-Trigger — Tracking + Carrier im Auftrag hinterlegen, Status auf versendet setzen, Fulfillment an Shopify/Amazon übertragen
v1.61.0242026-04-14
  • PROJ-208: CSV-Bestands-Import prüft jetzt is_read_only — verhindert versehentliches Einbuchen in FBA-Lager
  • PROJ-208: Cleanup-Migration entfernt alte System-Lagerplätze aus FBA-Lagern und bucht Restbestand auf Westheim um
v1.61.0232026-04-14
  • PROJ-16: Amazon FBA-Bestand wird nicht mehr in Bundle-Verfügbarkeit mitgezählt (Frontend + Backend)
v1.61.0202026-04-14
  • Double-Submit-Schutz für Plusbuchung, Minusbuchung und Umlagerung (Web + Mobile Web) — synchroner useRef-Guard verhindert Mehrfachbuchungen bei schnellem Enter-Spam
v1.61.0002026-04-14
  • PROJ-207: API-basierten Nightly Listings Refresh vollständig entfernt — 4 Route-Files, listings-worker.ts, Test-File und alle Referenzen (cron/trigger, AmazonTogglesBlock, Cron-Jobs-UI) gelöscht. Report-basierter Sync (listings-report-worker.ts) ist jetzt der einzige Sync-Pfad.
v1.60.004
  • PROJ-207: Report-Worker upserted Listing-Daten aus GET_MERCHANT_LISTINGS_ALL_DATA direkt in DB (Status, ASIN, Titel, Preis, Menge, Fulfillment-Channel)
  • PROJ-207: Auto-Mapping (remapUnmappedListings + propagateCrossMpMapping) läuft nach jedem Report-Cleanup-Lauf
  • PROJ-207: Vereinfachte Diff-Logik — Reaktivierungs-Block entfernt, da Upsert bereits korrekten Status setzt
v1.58.0522026-04-14
  • PROJ-64: enqueueAmazonDirtyBatch — 1 DB-Roundtrip statt N bei Picklist/Versand/WE/CSV-Import
v1.58.0512026-04-14
  • PROJ-64: .limit(10000) auf alle Supabase-Queries im Bestandssync (inventory-push, stock-change-hook, inventory-sync) gegen Silent-Truncation bei Skalierung
v1.58.0502026-04-14
  • PROJ-64: QA — .limit(10000) auf Reservierungs-Queries gegen PostgREST-Trunkierung
  • PROJ-64: QA — Shopify Sync-Toggle löst jetzt markProductsDirty aus (fehlte bisher)
v1.58.0492026-04-14
  • PROJ-64: Shopify Multi-Warehouse Reservierungs-Verteilung — Rundungsfehler + Bundle-Reservierungen proportional verteilt
v1.58.0482026-04-14
  • PROJ-64: Auftragsreservierungen vom Bestandssync abgezogen (Amazon + Shopify) — verhindert Überverkauf am Wochenende, Safety-Sync pusht jetzt physisch − offene Aufträge
v1.58.0472026-04-14
  • PROJ-64: Picklist-Complete löst Bestandssync aus (gepickte Produkte → Amazon/Shopify)
  • PROJ-64: Picklist-Delete mit Rebook löst Bestandssync aus (zurückgebuchte Produkte)
  • PROJ-64: Stock-Initialimport (CSV) löst Bestandssync aus (importierte Produkte)
v1.58.0452026-04-14
  • SKU, SKU2 und Barcode (EAN) nur noch von Admins bearbeitbar — Mitarbeiter sehen Felder read-only, Payload-Stripping verhindert Manipulation
  • PROJ-64: Bundle-Bearbeitung (Komponente add/remove/qty) löst jetzt Bestandssync aus (Amazon + Shopify)
v1.58.0422026-04-14
  • PROJ-64: Amazon Bestandssync fehlte für Bundles — PostgREST max_rows=1000 schnitt Listings ab, safetyFullSync filtert jetzt direkt auf sync-enabled
  • PROJ-64: Toggle-Trigger — Aktivierung von inventory_sync_enabled trägt Produkt sofort in Dirty Queue ein
  • PROJ-55: Shopify markAllMappedProductsDirty mit .limit(10000) gegen gleiches PostgREST-Limit abgesichert
v1.58.040
  • Audit-Logging in alle Admin API Routes eingebaut (user_management, integration, workflow, settings, tags, print, picklist, customers, orders, products)
v1.58.0152026-04-13
  • Einstellungen für alle Rollen sichtbar, Mitarbeiter landen auf Konto-Seite
v1.58.0142026-04-13
  • Product-Lock: Verwaiste Locks lösen sich nach 2 Min automatisch auf (Heartbeat + TTL)
v1.58.0122026-04-13
  • PROJ-203: Pipeline-Navigation und Alert Strip in Auftragsübersicht integriert (Status-Filter per Klick, Tages-KPIs mit Umsatz/unbezahlt/Adressfehler)
v1.58.010
  • PROJ-203: Stats-Endpoint auf Supabase RPC umgestellt (get_order_stats), JS-seitiges Row-Counting entfernt, automatischer Fallback auf Inline-Queries wenn SQL-Funktion noch nicht deployed
v1.58.008
  • PROJ-203: OrderStatusIndicator circle component — 32x32px Statuskreis pro Auftragszeile mit 7 Prioritätsstufen (Problem, NEU, Wartend, In Bearbeitung, Gepickt, Versendet/Abgeschlossen, Storniert)
v1.58.0062026-04-13
  • PROJ-203: /api/orders/stats Endpoint (Status-Counts + Tages-KPIs: Aufträge, Umsatz, unbezahlt, Adressfehler) + useOrderStats Hook für Pipeline-Navigation und Alert Strip
  • order_total als sortierbare Spalte in /api/orders ergänzt
v1.58.0052026-04-13
  • OrderPipeline Navigation-Komponente: Klickbare Status-Segmente mit farbigen Fortschrittsbalken für Auftragsübersicht (PROJ-203)
v1.58.0032026-04-13
  • Daten-Hub nur noch für Admins zugänglich (Sidebar + Layout-Redirect)
  • Picklisten erstellen/verwalten für alle Rollen geöffnet
  • Produkt-Import/Export-Buttons nur noch für Admins sichtbar
v1.58.0002026-04-13
  • Produkt-Plattformen-Tab: Zentrale Übersicht aller Integrations-Verknüpfungen pro Artikel (Multi-SKU, FBA/FBM, Bestandssync-Toggle)
v1.57.0382026-04-13
  • PROJ-203: inventory_sync_enabled auf integration_product_mappings, amazon_sync_inventory migriert und entfernt
  • Varianten-Tab: Neue Kombinationen werden jetzt als ungespeicherte Änderungen erkannt (Speichern-Button aktiviert sich sofort)
v1.57.0362026-04-13
  • Code-Cleanup: JSDoc-Kommentar korrigiert, JSON-Fehlerbehandlung in Varianten-Pagination
v1.57.0352026-04-13
  • Shopify Varianten-Attribute (Farbe, Größe etc.) werden jetzt beim Import korrekt übernommen
  • Integration-Sync befüllt fehlende Varianten-Attribute automatisch aus Shopify-Optionen bei gemappten Produkten
v1.57.0342026-04-13
  • Shopify Varianten-Pagination: Produkte mit >100 Varianten werden jetzt vollständig abgerufen (vorher bei 100 abgeschnitten)
v1.57.0332026-04-13
  • PROJ-6: Wareneingang zeigt jetzt auch verschickte LBs (approved + shipped + partially_received)
v1.57.0322026-04-13
  • PROJ-168: Bestelldatum (Erstellt) im LB-Detail editierbar
v1.57.0312026-04-13
  • PROJ-168: LB-Detail — Lieferdatum, Ziellager und Zahlungsstatus jetzt editierbar
  • PROJ-168: PDF-Lieferadresse nutzt Warehouse-Adresse statt immer Firmenadresse
  • PROJ-168: Elternartikel können nicht mehr auf LB gepackt werden
  • PROJ-168: Produkttitel/SKU nach Artikel-Hinzufügen sofort sichtbar (kein Reload nötig)
v1.57.0302026-04-13
  • PROJ-202: Amazon Listing Stale-Detection & Cleanup — Wöchentlicher Report-basierter Vollabgleich (GET_MERCHANT_LISTINGS_ALL_DATA + CANCELLED), Status deleted mit Löschdatum/Grund, 90-Tage-Archivierung, Order-Mapping Archiv-Fallback, Cron-Endpoint mit Toggle
v1.57.0192026-04-13
  • PROJ-134: Preisnachlass-Gutschrift wurde für vollen Rechnungsbetrag statt Erstattungsbetrag erstellt — Teilbeträge nutzen jetzt createAmountCreditNote() mit exaktem Bruttobetrag
v1.57.0182026-04-13
  • Bundle-Badge auch bei ausgeklappten Kindartikel in Produktübersicht
v1.57.0172026-04-13
  • Produkt-Badges (Bundle, Child, Eltern, Service) kompakter unter SKU statt als große Badges nebeneinander
v1.57.0162026-04-13
  • Child-Badge in Produktübersicht bei Kindartikel
  • Bundle-Badge in Varianten-Tabelle bei Elternartikel (is_bundle im API ergänzt)
v1.57.0152026-04-13
  • Bundle-Badge in Varianten-Tabelle bei Elternartikel (neben SKU)
v1.57.0142026-04-13
  • Bundle-Komponenten Titel vollständig anzeigen statt abschneiden (kein Truncate mehr)
v1.57.0122026-04-13
  • Amazon Nightly Refresh immer als Full-Refresh — erkennt gelöschte Listings zuverlässig, deaktiviert Geister-Einträge automatisch
  • Stale-Listings-Cleanup — nach Full-Refresh werden Listings die Amazon nicht mehr als BUYABLE zurückgibt auf inactive gesetzt
v1.57.0112026-04-13
  • Web-Bestandskorrekturen (Plus/Minus/Dialog) laufen jetzt über /api/stock/adjust — Amazon Dirty-Queue wird bei jeder Bestandsänderung befüllt
  • Amazon Listings-Refresh re-mappt unmapped Listings automatisch — Produkte die nach dem Listing-Import angelegt wurden werden jetzt gefunden
v1.57.0102026-04-13
  • PROJ-189: Amazon Financial Events Pull — PostedBefore Clock-Drift-Fix, 3min Puffer gegen SP-API "Date is not valid" Rejection
v1.57.0092026-04-12
  • Amazon Listings-Sync überschreibt manuelle Zuordnungen nicht mehr mit null — bestehende Mappings bleiben erhalten, Auto-Mapping wird bei jedem Sync erneut versucht
  • Amazon FBM Bestandssync Feed IN_PROGRESS wird nicht mehr als Fehler gewertet — nur FATAL/CANCELLED sind echte Fehler
v1.57.0052026-04-12
  • Per-Product Amazon Sync — Checkbox pro Artikel steuert ob FBM-Bestandsabgleich den Lagerbestand an Amazon überträgt (Default: aus)
v1.57.0002026-04-12
  • PROJ-201: Shopify Product Push — Produkte (Einzelartikel + Varianten) per GraphQL Admin API als Draft auf Shopify anlegen, automatische Verknüpfung via integration_product_mappings, Bestandssync greift sofort
v1.56.024
  • PROJ-200: Status-, Zahlstatus- und Versandart-Dropdowns bei abgeschlossenen/stornierten Aufträgen als nicht-interaktive Badges dargestellt
v1.56.023
  • PROJ-170: Picker-API HTTP 500 behoben — selling_price Spalte existiert nicht in products-Tabelle, Preis aus Picker-Query entfernt (nur id/sku/title nötig für Zuordnung)
v1.56.022
  • PROJ-200: Ersatzlieferungen und Zahlstatus-Änderungen bei stornierten Aufträgen blockiert, leeres Dropdown-Menü bei gesperrten Adresskarten versteckt
v1.56.021
  • PROJ-170: Amazon-Artikelzuordnung Suche kaputt — ProductPickerDialog sendete falschen Query-Parameter (?q= statt ?search=), Suchergebnisse waren zufällig statt gefiltert. Neuer leichtgewichtiger /api/products/picker Endpoint (1 DB-Query statt 7) für deutlich schnellere Picker-Suche
v1.56.019
  • PROJ-200: Frontend-Bearbeitungssperre — Action-Buttons gesperrt bei abgeschlossenen/stornierten Aufträgen, Lock-Banner mit Statushinweis, Adressbearbeitung readonly, Versand-Aktionen (Etikett/Retoure/Nachdrucken) ausgeblendet
v1.56.016
  • PROJ-200: Auftrags-Bearbeitungssperre — Abgeschlossene/stornierte Aufträge: PUT/Adressen/Versandart/Status gesperrt, Erstattungen bei stornierten Aufträgen blockiert, Status-Änderungen bei abgeschlossenen Aufträgen nur noch Stornierung erlaubt
v1.56.009
  • PROJ-198: Alle 130 TypeScript-Kompilierungsfehler in 27 Dateien behoben — null/undefined-Signaturen, RHF/Zod v4 Generics, fehlende Typ-Properties (Profitbutler Bundle, Workspace supplier_number_*), doppelte Country-Codes, Zod v4 refine()-Signatur, shopify_sync Enum-Korrektur, Buffer→Uint8Array für OneDrive
v1.56.0082026-04-12
  • Lagerplatz-Dropdown in Picklisten-Profilen war nicht scrollbar
v1.56.0072026-04-12
  • Lagerplatz-Auswahl in Picklisten-Profilen zeigte keine Lagerplätze (API filterte nach nicht-existierender workspace_id Spalte)
v1.56.005
  • PROJ-98: Service-Artikel (inventory_tracking=false) systemweit aus Picking/Packing/Shipping gefiltert — betrifft Picklist-Klassifizierung, Stock-Fulfillment, Pickpositionen, Versand-Dialog, Scan-Validierung, DHL/DP-Gewicht, Customs-Check, Zusatzlabel, Versandhistorie und DB-Trigger item_count
  • Deutsche Post Internetmarke: Vollständige ISO 3166-1 Ländercodes — Schweden, Norwegen, Finnland und 200+ weitere Länder fehlten in der Alpha-2→Alpha-3 Map
v1.56.004
  • Einzelner Versandfehler löschbar per Trash-Button in der Fehler-Zeile
  • Alle Versandfehler auf einmal löschen mit Bestätigungs-Dialog (AlertDialog)
v1.56.000
  • Versandfehler-Queue & Adresskorrektur — Fehlerliste mit Badge, Inline-Adresskorrektur, Blocking/Non-Blocking pro Picklisten-Profil, zweistufiges Error-Mapping für DHL & Deutsche Post (PROJ-199)
v1.55.066
  • PROJ-199: Ship-API gibt error_log_id zurück (DHL + DP Fehler-Insert mit .select('id').single())
  • PROJ-199: ShippingErrorCorrectionModal — Blocking-Dialog mit Fehlermapping, editierbaren Adressfeldern (nur bei address-Fehlern) und Retry via PATCH /api/shipping/errors/:id/correct
  • PROJ-199: ShippingScanningDialog Non-Blocking-Modus — bei shippingErrorBehavior='non_blocking' Toast + Fehlerliste statt Modal
  • PROJ-199: ShippingPicklist-Typ um shipping_error_behavior erweitert, Prop an ShippingScanningDialog weitergegeben
v1.55.064
  • PROJ-199: Shipping Errors Table — aufklappbare Fehlerliste mit Schweregrad-Farbkodierung, Adresskorrektur-Formular (nur bei address-Fehlern), technischen Details und Carrier-Filter
  • PROJ-199: Shipping Errors Page unter /dashboard/outbound/shipping/errors mit Carrier-Dropdown und Gesamtanzahl-Anzeige
v1.55.063
  • Auftragsübersicht und Versand-Scanning-Dialog zeigten Kunden-Stammdaten statt Auftrags-Snapshot-Adresse — Adressänderungen im Adressen-Tab wurden nicht in Übersicht/Versand reflektiert
v1.55.062
  • PROJ-199: TanStack Query hooks useShippingErrors und useShippingErrorCount (30s Auto-Refetch)
  • PROJ-199: ShippingNav-Badge zeigt offene Versandfehler mit rotem Counter-Badge
v1.55.061
  • PROJ-199: GET /api/shipping/errors — Versandfehler-Liste mit Auftrags-Adress-Join, Count-Only-Modus für Badge, Carrier-Filter und Pagination
  • PROJ-199: PATCH /api/shipping/errors/[id]/correct — Adresskorrektur mit optionalem Versand-Retry, Auto-Resolve bei bereits versendeten Aufträgen, Retry-Count-Tracking
v1.55.060
  • PROJ-98: Service-Artikel aus Stock-Fulfillment-Check und Pickpositionen ausschließen — Aufträge mit Versandkosten konnten nur erfüllt werden wenn fälschlich Bestand gebucht war
  • PROJ-182: Service-Artikel (inventory_tracking=false) aus Pick-Unit-Zählung ausschließen — Versandkosten mit zugeordnetem Produkt wurden fälschlich als pickbare Einheit gezählt
  • PROJ-182: DB-Trigger item_count zählt product_id=NULL nicht mehr mit — Backfill aller bestehenden Aufträge
  • PROJ-182: Versandkosten-Position verfälschte one_scan/multi Klassifizierung — Aufträge mit 1 Produkt + 1 Versandkosten-Zeile wurden fälschlich als Multi eingestuft
v1.55.058
  • PROJ-199: Zwei-Stufen Versandfehler-Mapping-Modul — Tier 1 feste Codes (AUTH_FAILED, DP_BALANCE_INSUFFICIENT etc.), Tier 2 Keyword-Parsing von Fehlermeldungen (PLZ, Hausnummer, Straße, Stadt, Land, Gewicht, EKP, Produktcode) mit Schweregrad-Farbgebung für Versandfehler-Queue
v1.55.049
  • Amazon-Import triggert jetzt Workflows (FBM + FBA), neue ignore_fba Checkbox in Workflow-Einstellungen
  • Tax-Preview: Kundenland-Fallback auf customer_addresses bei Kunden mit neuem Adress-System (PROJ-145)
  • Auftragsanlage: Versandart-Zuweisung Race Condition bei Produkt-Hinzufügen behoben
v1.55.047
  • Profitbutler Aggregate Cron-Endpoint: GET-Route hinzugefügt — externe Cron-Services (all-inkl KAS, Uptime Kuma) konnten den Endpoint nicht aufrufen, da nur POST existierte
v1.55.046
  • PROJ-197: Bundle-Scan im Versand — Komponenten einzeln oder Bundle-Barcode scannen, visuelles Bundle-Badge, Server-Validierung für Komponenten-IDs
v1.55.045
  • PROJ-166: IN_PROGRESS Feed-Status als Erfolg werten — Feed wurde eingereicht, nur FATAL/CANCELLED = Fehler
v1.55.044
  • PROJ-166: Carrier-Mapping nutzt shipping_methods.carrier als Fallback — Kompaktbrief/Großbrief etc. korrekt als Deutsche Post statt Other
v1.55.043
  • PROJ-166: shipping_tasks.carrier entfernt (Feld existiert nicht, carrier nur auf shipping_labels)
v1.55.042
  • PROJ-166: tracking_number/tracking_carrier aus orders-Query entfernt (existieren nur auf shipping_tasks/shipping_labels)
v1.55.041
  • PROJ-166: Versandbestätigung Vorschau (Trockenlauf) — Preview-Dialog zeigt ausstehende FBM-Bestellungen mit Carrier, Tracking, Versanddatum
  • PROJ-166: Amazon Versandbestätigung — shipping_method→shipping_methods Join Fix (Column existierte nicht)
v1.55.039
  • PROJ-196: Pickliste Löschen statt Stornieren — delete_picklist() RPC mit Rebook-Option, Smart Delete Dialog, cancelled Status komplett entfernt
v1.55.038
  • PROJ-195: 'picked' Status in manueller Auftrags-Status-API (PATCH /api/orders/[id]/status) ergänzt
v1.55.037
  • PROJ-195: Regression behoben — complete_picklist() setzte Aufträge auf 'shipped' statt 'picked', Backfill für betroffene Aufträge
v1.55.035
  • Neuer Auftrag direkt aus Kundendetailseite erstellen (Kunde vorausgewählt)
  • Cleanup ungenutzter Imports und toter Code in CustomerFormDialog und Kundenliste
v1.55.034
  • CustomerFormDialog auf Create-Only vereinfacht
v1.55.033
  • PROJ-166: Amazon Cron Error-Logging verbessert (JSON.stringify statt [object Object]), Feed-Upload Fehlerprüfung hinzugefügt
v1.55.032
  • Rundungsfehler bei Brutto-Gesamt in Auftragsdetails behoben (gross_price_per_unit direkt verwenden)
v1.55.031
  • PROJ-Kommentar-Prefixe aus deployed Code entfernt
v1.55.030
  • Debug-Logs entfernt, migrate-currency Route gelöscht, PROJ-193 Plan aufgeräumt
v1.55.029
  • formatAmount-Helper zentralisiert, Frankfurter API URL aktualisiert
v1.55.028
  • Multi-Wort-Suche für Kundenname bei Aufträgen und Kunden (Vorname + Nachname zusammen suchbar)
v1.55.027
  • PROJ-195: Picklisten-Bestandsreservierung — Lagerplatzbezogene Reservierung durch offene Picklisten, DB-Level Enforcement (FOR UPDATE Lock), verfügbare Menge in UI/API, Doppel-Reservierungs-Schutz bei Picklisten-Erstellung
v1.55.026
  • PROJ-4: Hierarchy-Felder beim Bearbeiten nicht mehr alle Pflicht (nur erstes Level), Sortiernummer 0 erlaubt, fehlende Keys werden mit leerem String aufgefüllt
v1.55.025
  • PROJ-4: Bulk-Typ-Änderung für Lagerplätze — Checkbox-Auswahl + Dropdown zum Setzen von Pick & Versand / Nachfüll / Gesperrt für mehrere Standorte gleichzeitig
v1.55.024
  • PROJ-85: Datenhub-Import von Lagerplätzen generiert jetzt automatisch hierarchy_values (Halle, Gang, Regal, Ebene, Fach) aus dem Namen — Backfill-Migration für bestehende Daten
v1.55.023
  • PROJ-192: Zwei-Phasen Status+Tracking Sync — Phase 1 (GENERAL Report) für Status, Phase 2 (restricted SHIPPING Report mit RDT) für Tracking-Nummern und Carrier
v1.55.021
  • PROJ-192: Fehlende Toggles im Amazon-Settings Zod-Schema ergänzt (auto_sync_order_status, amazon_sync_pull_enabled, show_alternative_currency wurden beim Speichern verworfen)
v1.55.020
  • PROJ-192: Amazon Cron-Routes geben jetzt success statt ok zurück — Cron-Jobs-UI zeigt Ergebnis korrekt an (betrifft alle 9 Amazon-Crons)
v1.55.016
  • PROJ-194: Cleanup — ungenutzten Helper entfernt, Pending-Query mit Limit abgesichert, Status Deployed
v1.55.015
  • PROJ-194: Bulk-Apply Date-Boundary Fix (lt next month statt lte last second)
v1.55.0142026-04-11
  • PROJ-117: Amazon FBM-Bestellungen erhalten jetzt automatisch die Versandart aus Produkt-Priorität (analog zu Shopify-Import)
v1.55.013
  • PROJ-194: show_alternative_currency in channel-config Test-Fixture ergänzt
v1.55.012
  • PROJ-194: show_alternative_currency Toggles (Amazon, Billkom Kanäle) + Währungs-Info-Banner im Belegdialog
v1.55.011
  • PROJ-194: BMF-Kursverwaltung UI (Billkom Settings Tab "Währungen", Pending-Banner, Bulk-Apply)
v1.55.010
  • PROJ-194: PDF-Generator rendert Alternativwährung pro Position + Kurs-Footer (§16 Abs. 6 UStG)
v1.55.009
  • PROJ-194: Invoice-Creation speichert Währungsfelder aus Order (BMF > ECB Kurs-Priorität)
v1.55.008
  • PROJ-194: BMF-Monatskurs API (GET/PUT/POST apply) für manuelle Kursverwaltung
v1.55.007
  • PROJ-194: Währungs-Formatierung (formatCentsCurrency) und currency-helpers für Kurs-Logik
v1.55.006
  • PROJ-194: DB-Migration — Währungs-Spalten auf billkom_documents, document_items und channel_configs
v1.55.0032026-04-11
  • PROJ-55: Shopify Safety-Sync — vollständiger Bestandsabgleich aller Artikel als Reconciliation-Layer, Intervall konfigurierbar (Standard: 2h)
  • PROJ-55: Safety-Sync Intervall-Selector in Shopify-Integrationseinstellungen (1h bis 24h)
v1.55.0022026-04-11
  • PROJ-193: Migration COALESCE für NULL gross_price_per_unit bei manuell angelegten Aufträgen
v1.55.0012026-04-11
  • PROJ-193: original_* Felder in Manual Order + Shopify Import, atomare Migration, Rate-Plausibilitätsprüfung, Cache-Error-Logging, Explicit ROUND_HALF_UP
v1.55.0002026-04-10
  • PROJ-193: Multi-Currency Orders — Amazon-Bestellungen in Originalwährung importieren, ECB-Tageskurs beim Import konvertieren (Dual-Storage), Kurs-Cache-Tabelle, retroaktive Migration für bestehende Nicht-EUR-Bestellungen, Währungs-Badge in Bestellliste, Kurs-Info-Box im Bestelldetail
v1.54.0032026-04-10
  • PROJ-131: Shopify Bestellstatus-Sync nur noch für offene Bestellungen (open/in_progress/picked) — shipped/completed rausgenommen, verhindert Timeouts bei vielen historischen Bestellungen
v1.54.0022026-04-10
  • PROJ-192/PROJ-189: amazon-order-status-sync und amazon-finance-events-pull im manuellen Cron-Trigger-Handler registriert — fehlten in der Endpoint-Whitelist
v1.54.0002026-04-10
  • Cron-Jobs Einstellungsseite komplett redesigned — 20+ Jobs in 5 Kategorien (Shopify, Amazon, Workflows, Profitbutler, Cleanup) gruppiert, kompakte Zeilen mit Health-Dots statt voller Cards, Summary-Bar mit Gesund/Verspätet/Fehler-Zähler, Einrichtungsanleitungen auf 3 Ein-Klick-Kopier-Cards reduziert (vorher 3× die volle 20-Job-Liste)
v1.53.0242026-04-10
  • PROJ-192/PROJ-189: Fehlende Cronjob-UI-Einträge für Amazon Bestellstatus-Sync und Amazon Finanzereignisse-Pull in der Einstellungsseite ergänzt
v1.53.023
  • Manueller Einstandspreis unterstützt jetzt 4 Dezimalstellen (Input, Anzeige, Bestandswert)
v1.53.0222026-04-10
  • PROJ-55: Bundle-Artikel Bestandssync — Shopify + Amazon erhalten berechneten Bundle-Bestand (MIN(Komponenten/Menge)), nicht mehr 0
  • PROJ-55: Dirty-Flag Cascade — Komponenten-Änderung flaggt automatisch Eltern-Bundles für Shopify- und Amazon-Sync
v1.53.0212026-04-10
  • PROJ-55: Stock-Query warehouse_id Filter wiederhergestellt (Performance-Regression aus Chunking-Refactor)
  • PROJ-55: Shared ShopifyRateLimiter zwischen fetchAndCacheInventoryItemIds und Main Loop
  • PROJ-55: Frontend Edge Case — totalExpected > 0 bei 0/0 zeigt Warning statt falsches Success
v1.53.0202026-04-10
  • PROJ-55: Shopify Bestandssync Fehlerbehandlung — finalizeSyncLog markiert 0/0+Error korrekt als failed statt success, Frontend-Toast unterscheidet zwischen keine Änderungen und Sync-Fehler
  • PROJ-55: Chunked .in()-Queries gegen PostgREST URL-Length-Limits bei 400+ Produkten
  • PROJ-55: Shopify Leaky-Bucket Rate Limiter (40 Burst, 2/s) statt starrem 500ms Delay — deutlich schnellere Syncs
  • PROJ-55: Strukturiertes Logging an jedem Early-Return-Pfad mit deutschem errorReason
v1.53.0192026-04-10
  • PROJ-193: Freie Wareneingänge aus FIFO-Bewertung ausgeschlossen — nur LB-basierte WEs fließen in den Einstandspreis ein, DB-Migration bereinigt bestehende Daten, 3 API-Routen gefiltert
v1.53.0172026-04-10
  • Amazon-Import nutzt jetzt die Versandpositions-Erkennung — Versandpositionen werden dem konfigurierten Ziel-Artikel zugeordnet statt immer als Freiposition angelegt
v1.53.0162026-04-10
  • FBM/FBA-Filtereinstellungen (Bestellstatus, Zahlungsstatus, Sync-Zeitraum, Import-Defaults) bleiben jetzt nach Seitenaktualisierung erhalten — fehlender useEffect-Sync zwischen Props und lokalem State behoben
v1.53.0152026-04-10
  • Kanban-Karten zeigen jetzt Herstellernamen statt UUID (PROJ-77)
v1.53.0142026-04-10
  • Amazon-Import berücksichtigt jetzt den Toggle 'USt-Satz von Amazon übernehmen' — bei amazon_native wird der Steuersatz aus ItemTax berechnet und auf gängige EU-Sätze gerundet, bei flowkom_recompute greift OSS-Lookup nach Lieferland
v1.53.0132026-04-10
  • OSS-konforme MwSt im Shopify-Import — Steuersatz wird jetzt anhand des Lieferlandes aus billkom_tax_rates aufgelöst (z.B. AT=20%, FR=20%, DE=19%) statt pauschal 19%
v1.53.0122026-04-10
  • PROJ-187 Redundanten Versandstatus-Filter aus FBM-Bestellimport entfernt (war Duplikat zum Bestellstatus-Filter), Ziel-Artikel in Versandpositions-Erkennung wird jetzt korrekt gespeichert
  • OSS-konforme MwSt im Amazon-Import — Steuersatz wird jetzt anhand des Lieferlandes aus billkom_tax_rates aufgelöst statt pauschal 19%
v1.53.0112026-04-10
  • Amazon-Source überall ergänzt: Kunden-API Filter, SourceBadge, Kundendetail, Dropdown, TypeScript-Typen, Event-Typen
v1.53.0102026-04-10
  • PROJ-192 Amazon FBM Bestellstatus-Sync — Neuer Cron-Job holt regelmäßig den Bestellstatus und Tracking-Nummern für FBM-Bestellungen von Amazon ab (Reports API: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL). Status-Mapping (Shipped→shipped, Cancelled→cancelled, PartiallyShipped→in_progress), Tracking als shipping_task mit Duplikat-Check, Shipment-Confirmation-Skip (amazon_confirmation_sent_at), Downgrade-Schutz, Audit Trail, Advisory Lock, Cursor-basiert. Toggle 'Automatischer Bestellstatus-Sync' in den Amazon-Einstellungen (default: aus). 22 Unit Tests.
  • PROJ-189/PROJ-192: Fehlende job_type-Werte (finance_events_pull, order_status_sync) im amazon_sync_log CHECK Constraint nachgetragen
v1.53.0042026-04-10
  • Amazon-Quellenfilter in Auftragsübersicht funktioniert jetzt (source-Validierung fehlte)
v1.53.0022026-04-10
  • Unused Loader2 Import aus Bestandsbewertungs-Seite entfernt (Cleanup Profitbutler-Nav)
v1.53.0012026-04-10
  • PROJ-166 amazon-rebuild-reference/v1-snapshot entfernt — 60 Dateien, 17.554 Zeilen Altlast aus dem v1/v2-Rewrite gelöscht. Die v3 Amazon-Integration ist stabil und produktionsbereit.
v1.53.0002026-04-10
  • PROJ-191 Amazon JSON_LISTINGS_FEED Migration — FBM-Bestandssync migriert von deprecated POST_INVENTORY_AVAILABILITY_DATA (XML, tot seit Juli 2025) auf JSON_LISTINGS_FEED mit PATCH-Semantik. fulfillment_channel_code DEFAULT für FBM, productType PRODUCT universell, Content-Type application/json; charset=UTF-8. Per-Marketplace-Architektur bleibt bestehen.
v1.52.0162026-04-10
  • Profitbutler Subtab-Navigation als saubere shared Nav-Komponente (SettingsNav-Pattern statt lose Buttons)
v1.52.0152026-04-10
  • PROJ-64 Per-Marketplace Inventory Feeds — FBM-Bestandssync sendet jetzt einen Feed pro Marktplatz statt alle SKUs an alle active_marketplace_ids. Jede SKU wird genau einem Marktplatz zugeordnet (Primary-MP bevorzugt, z.B. DE für EU). Verhindert Phantom-Listing-Risiko (SP-API #2784) und nutzt Amazons globale Bestandspropagation bei EU Unified Accounts.
v1.52.0122026-04-10
  • PROJ-190: Bestandsbewertung & Einstandspreis-Konsolidierung — Manueller Einstandspreis am Produkt mit FIFO-Kaskade (Toggle → FIFO → Manuell → null), FBA-Bewertung auf Durchschnitts-Einstandspreis umgestellt, neuer Profitbutler Sub-Tab "Bestandsbewertung" mit Lagerwert pro Lager, Artikelliste und Lücken-Warnung, Lagerwert aus Bestandsübersicht entfernt, Datenhub-Import für manuellen Einstandspreis
  • PROJ-190: FIFO-Allokation im Profitbutler API korrigiert (echte FIFO statt einfacher Durchschnitt), workspace_id Filter im FBA Cost Lookup, Rate-Limiting auf Manual Cost PATCH, Toggle-UX Verbesserung, Paginierung der Produktliste
  • PROJ-189: UNIQUE Constraint mit COALESCE auf Unique Index umgestellt (PostgreSQL-Kompatibilität)
v1.52.0062026-04-10
  • PROJ-189: QA-Fixes — Idempotenz-Refactor (SELECT-then-INSERT, Credit-Note-Fehler retried), RPC für Adjustment-Upsert, 3 neue Test-Szenarien
v1.52.0052026-04-10
  • PROJ-64 SKU-Deduplizierung im FBM Inventory Feed — buildFeedItems() dedupliziert jetzt nach seller_sku via Map, damit identische SKUs bei Multi-Marketplace-Listings (DE+FR+IT etc.) nur noch einmal im XML-Feed auftauchen statt pro Marktplatz-Zeile.
v1.52.002
  • PROJ-190: Datenhub Schema-Overlay um manual_landed_cost_eur erweitert — Feld erhält deutschen Anzeigenamen 'Manueller Einstandspreis (EUR)', Gruppe 'Einkauf' und Synonyme für CSV-Auto-Mapping
v1.52.001
  • Bestandsbewertung-Link im Profitbutler-Header (navigiert zu /dashboard/profitbutler/inventory-valuation)
  • Gesamter-Lagerwert-Karte aus Bestandsübersicht entfernt (Lagerwert jetzt im Profitbutler-Modul)
v1.52.0002026-04-10
  • PROJ-190 Bestandsbewertung Profitbutler Sub-Tab — Neue Unterseite /dashboard/profitbutler/inventory-valuation mit Lagerwert-Summary, Warehouse-Breakdown-Tabelle, sortierbarer Artikelbewertungs-Tabelle (FIFO/Manuell/Keine Bewertung Badges), Warnbanner für Artikel ohne Einstandspreis mit Filter-Toggle.
v1.51.0002026-04-10
  • PROJ-189: Amazon Financial Events Pull — Automatischer Import von Erstattungen & Adjustments aus Amazon (Cron mit Cursor + 6h Overlap, Hash-basierte Idempotenz, Auto-Gutschrift bei Voll-/Teil-Refund, Dedup gegen Push-Marker, AdjustmentEvent capture-only)
v1.50.015
  • PROJ-189: Integration-Tests für Financial Events Pull (8 Szenarien: Happy Path, Idempotenz, Dedup, Orphan, kein Beleg, AdjustmentEvent, leere Response, API-Fehler)
v1.50.0132026-04-10
  • PROJ-190 FBA-Kostenlookup auf Bewertungskaskade umgestellt — getAmazonFbaValuationCost() in src/lib/amazon/fba-cost-lookup.ts nutzt jetzt resolveValuation() statt supplier_products.purchase_price. Kaskade: prefer_manual_cost + manual_landed_cost_eur > FIFO-Avg aus stock_movements Receipts > manual_landed_cost_eur Fallback > null.
v1.50.0082026-04-10
  • PROJ-190 Bewertungskaskade in cost-breakdown API — GET /api/products/[id]/cost-breakdown liefert jetzt zusaetzlich effective_cost_eur, valuation_source, manual_landed_cost_eur, prefer_manual_cost und fifo_receipt_count. Produktabfrage wurde auf manual_landed_cost_eur und prefer_manual_cost erweitert. resolveValuation() aus src/lib/inventory-valuation.ts loest die Kaskade auf (manuell > FIFO-Avg > null) und gibt die aktive Quelle zurueck.
v1.50.000
  • Amazon Refund & Cancel Push (PROJ-188): Erstattungen und FBM-Stornierungen werden über SP-API Feeds an Amazon gepusht. Job-Queue mit Status-Cron, Dedup-Marker, Badge + Historie-Sheet im Auftragsdetail, Settings-Toggles, Dialog-Checkboxen.
v1.49.012
  • Shopify Erstattung (PROJ-134): 422-Fehler 'transactions require a gateway' behoben. Gateway-Feld fehlte in der Refund-Transaction wenn eine parent_id vorhanden war. Gateway wird jetzt aus der Calculate-Response übernommen und immer mitgesendet.
v1.49.011
  • Amazon Purge Kunden-Cleanup: FBA-Kunden (PROJ-175 Reports-Enrichment) mit source='manual' ohne amazon_integration_id wurden nicht mitgelöscht. Filter entfernt — jetzt wird nur geprüft, ob der Kunde nach dem Order-Delete noch Orders hat. Kunden mit anderen Orders bleiben.
v1.49.010
  • delete_order_with_documents (PROJ-108): FK-Fehler billkom_job_queue_result_document_id_fkey beim Löschen von Orders mit Workflow-generierten Belegen behoben. RPC räumt jetzt vor dem Document-Delete alle Queue-Einträge der Order weg (über order_id und result_document_id). Entfernt gleichzeitig stuck "running"-Jobs zu gelöschten Orders.
v1.49.009
  • Amazon "Importierte löschen" (Testing-Purge): Scheiterte an finalisierten Rechnungen mit GoBD-Fehler ("Feld order_id darf nach Finalisierung nicht geändert werden"). Nutzt jetzt pro Order den PROJ-108-RPC delete_order_with_documents, der corrective-edit-Mode aktiviert und Belege + Nummernkreise sauber mit abräumt. Kunden-Cleanup unverändert.
v1.49.008
  • Amazon-Settings: Redundante "Pending-Bestellungen importieren"-Checkbox entfernt — Pending wird jetzt rein über den Bestellstatus-Filter ("Ausstehend") gesteuert
v1.49.007
  • Cron-Health-UI: Trigger-Whitelist um alle sechs fehlenden Amazon-Cronjobs ergänzt (FBA/FBM Import, Inventory Flush + Safety Sync, Listings Nightly Refresh, Shipment Confirmation). Der "Jetzt ausführen"-Button funktioniert jetzt für alle Amazon-Jobs.
  • Amazon FBA Inventory Pull Schedule in der Cron-UI von stündlich auf täglich 03:00 (0 3 * * *) geändert. Beschreibung aktualisiert: FBA ist seit PROJ-177 ein echtes Lager mit stock-Rows im FBA-POOL, nicht mehr virtuell. Der externe Cron in all-inkl muss manuell auf den neuen Takt umgestellt werden.
v1.49.006
  • Cron-Health-UI: "Jetzt ausführen"-Button für Amazon FBA Inventory Pull lieferte "Invalid endpoint" — Trigger-Whitelist um die Route ergänzt.
v1.49.005
  • PROJ-178 (Amazon FBA Umlagerung & echter FIFO-Pass-through) als Problem-Dump für Brainstorming-Session angelegt.
v1.49.004
  • PROJ-177 (Amazon FBA-Bestand als echtes Flowkom-Lager) als Deployed markiert nach drei Bugfix-Iterationen.
v1.49.003
  • FBA-Bestands-Pull Pan-EU/NA: Statt eines Loops über alle aktiven Marktplätze (der den FBA-Pool 17-fach summiert hätte) jetzt ein einziger Pull pro Region mit dem primären Consumer-Marktplatz (Amazon.de für EU, Amazon.com für NA). Amazon liefert für Pan-EU pro MP denselben Pool zurück — Summation wäre falsch gewesen.
v1.49.002
  • FBA-Bestands-Pull: Fetch-Timeout (60s/Request via AbortSignal), strukturiertes Progress-Logging pro Marktplatz/Page/Phase, maxDuration=900s in Cron- und Manual-Endpoint — vorher konnte ein hängender SP-API-Call den Job unbegrenzt blockieren ohne Log-Output.
v1.49.001
  • [object Object]
v1.49.000
  • [object Object]
v1.48.010
  • FBA-Bestands-Pull: Multi-Marketplace-Loop (war auf marketplaceIds[0] begrenzt, spec-widrig), Absolute-Sync-Fix (pro Produkt statt pro Listing, verhindert Überschreiben bei Produkten auf mehreren Marktplätzen), Kosten-Fallback auf 0 € statt hartem Skip wenn Lieferantenkosten fehlen (konsistent zu manuellem Wareneingang).
v1.48.0082026-04-09
  • PROJ-186 Verkaufskanal „Flowkom" für manuell angelegte Aufträge — Kundenaufträge, die direkt in Flowkom angelegt werden (source=manual), bekommen jetzt automatisch den Verkaufskanal `flowkom`. Neuer Eintrag in src/lib/channel-config.ts (KNOWN_CHANNELS) mit Flowkom-Blau (#2563EB) und eigenem SVG-Icon (public/channels/flowkom.svg). API-Insert in src/app/api/orders/route.ts setzt sales_channel=flowkom beim Anlegen, Backfill-Migration setzt bestehende Manual-Aufträge ohne Kanal rückwirkend. Badge „Flowkom" erscheint automatisch in Auftragsliste, Filter-Dropdown und Profitbutler-Kanalaufschlüsselung; Workflow-Bedingungen auf sales_channel greifen jetzt auch für manuelle Aufträge.
v1.48.005
  • PROJ-184: Bundle-Bestellung mit einer einzigen Zeile (1× Bundle-SKU, Menge 1) wurde von Multi-Scan-Profilen fälschlich als 'one_scan' klassifiziert und ausgeschlossen, weil orders_with_totals.item_count rohe Zeilen zählt (=1). Fix: der order_type-Filter expandiert jetzt Bundles in ihre Komponenten und klassifiziert auf Basis der effektiven Pick-Einheiten. Bundle-Order mit zwei Komponenten zählt jetzt korrekt als 'multi'. Gilt sowohl für den Preview als auch die Profil-Kachel-Zähler.
v1.48.004
  • PROJ-185: Beim manuellen Anlegen einer Rechnungsadresse erscheint jetzt eine optionale Checkbox 'Auch als Lieferadresse übernehmen'. Wenn aktiv, wird die Adresse zusätzlich als Lieferadresse gespeichert — spart den doppelten Eintrag. Einmaliges Kopieren, keine Verknüpfung (spätere Änderungen an der Rechnungsadresse wirken sich nicht auf die Lieferadresse aus). Nur bei Neuanlage, nicht im Bearbeiten-Modus.
v1.48.003
  • PROJ-184: Bundle-Artikel können endlich auf Picklisten landen. Bundles haben selbst keinen Bestand — nur ihre Komponenten (bundle_items). Vorher hat der Stock-Check gegen die leere Bundle-SKU geprüft und jede Bestellung mit Bundle-Artikel als 'nicht genug Bestand' stumm gedroppt. Neuer Expand-Schritt (src/lib/picklist-bundles.ts) löst Bundle-Line-Items in ihre Komponenten auf, bevor der Stock-Check läuft. picklist_item_assignments zeigt weiterhin auf den echten Bestell-Line-Item (Bundle-Parent), der Packer sieht die Bundle-SKU wie bisher, der Picker sieht die physischen Komponenten.
  • PROJ-184: Safety-Gate gegen Zero-Position-Picklisten — Aufträge, deren Bundle-Expansion leer ist (Bundle-Artikel ohne konfigurierte Komponenten), werden nicht mehr als erfüllbar markiert und erzeugen eine Warning beim Admin, damit die Bundle-Definition nachgezogen werden kann.
v1.48.001
  • PROJ-70: Veralteter Kommentar in dhl.ts (behauptete 'try base64 first from includeDocs=include') an den neuen URL-Modus angepasst. Die b64/zpl2-Zweige bleiben als defensive Fallbacks, da die DHL-Spec erlaubt, dass url+b64 gleichzeitig befüllt werden.
v1.47.001
  • PROJ-70: Exportdokumente (CN23 / Handelsrechnung) landeten beim Auslandsversand immer am DHL-Label-Drucker, auch wenn in den Workstation-Einstellungen ein separater Drucker für Exportdokumente zugewiesen war. Ursache: DHL-Shipment-Creation rief die API mit includeDocs=include auf, wodurch DHL die Export-Dokumente direkt in die Label-PDF einbettete. Fix: includeDocs=URL — Label und customsDoc kommen jetzt als getrennte URLs zurück, der bereits vorhandene separate Print-Job für export_document_printer_id in /api/shipping/ship wird endlich wirksam und routet die CN23-PDF korrekt auf den zugewiesenen Drucker.
v1.47.000
  • PROJ-182: Picklisten Filter-Parity — Shared picklist-filters Modul, Preview und Erstellung teilen sich jetzt eine einzige Filter-Pipeline. tag_filters, max_orders, warehouse_ids und location_filters werden jetzt konsistent von Profil-Karten, Vorschau und Erstellung angewandt (vorher drifteten die drei Implementierungen auseinander und Preview zeigte Aufträge die dann nicht auf der Pickliste landeten). Stock-Hinweis-Pill im Erstell-Dialog wenn Bestand/Lagerfilter gesetzt sind.
  • PROJ-182: Picklisten-Erstellung max_orders-Cap läuft jetzt NACH dem Stock-Check (nicht davor) — Stock-Drops fressen nicht mehr ins Cap-Budget. Drop-Counter pro Filter-Stage (Auftragstyp, Tag-Filter, Stock, Max-Limit) werden als Toast beim Erstellen angezeigt.
  • PROJ-182: Versand-Detailseite zeigt jetzt einen echten Fehler-State mit 'Erneut versuchen'-Button wenn die API fehlschlägt, statt stumm 'Alle Aufträge versendet' zu rendern. Schützt zukünftig vor Bugs der Klasse v1.44.011 (gedroppte Spalten).
v1.44.011
  • Versand: Picklisten-Detailseite zeigte fälschlich 'Alle Aufträge versendet', obwohl die Aufträge noch im Status 'Gepickt' waren. Ursache: SHIPPING_ORDER_SELECT referenzierte die durch PROJ-150 gedroppte orders.notes-Spalte, PostgREST warf 42703, Frontend rendert Fehler als leeren Zustand.
v1.44.010
  • PROJ-181: Neue Lieferantenbestellung — Supplier-First-Flow (kleines Dialog zur Lieferantenauswahl, dann direkt ins Fullscreen-Bestellformular im Edit-Modus, altes Popup-Formular entfernt)
v1.44.005
  • PROJ-180: Auftragsdetail zeigt magnalister Otto Retoure-Bridge Status (Übertragen/Fehlgeschlagen) wenn Metadaten vorhanden
v1.44.004
  • PROJ-180: Zod-Schema für Integration-PATCH erweitert — bridge_m2e_cloud_enabled und bridge_magnalister_enabled explizit als boolean optional deklariert
v1.44.003
  • PROJ-180: Marktplatz-Bridges UI — M2E Cloud Modus und magnalister Modus als unabhängige Toggles in der Shopify-Integrationsdetailseite
v1.44.0002026-04-09
  • PROJ-179 Bestands-Reiter im Artikeldetail — Neuer Tab "Bestand" in der Artikeldetailseite mit Sub-Tabs Uebersicht, Im Zulauf, Reserviert und Historie. Lazy Loading pro Sub-Tab, keine neuen Tabellen (nutzt bestehende stock/stock_movements/purchase_order_items/order_items). Fuer Bundle-Artikel wird ein Info-Banner statt der Sub-Tabs angezeigt; Service-Artikel (inventory_tracking=false) bekommen den Tab nicht. Die alte FBA-Overlap-Warnung im Header der Artikelseite wurde entfernt und lebt jetzt im Bestand-Uebersicht-Panel.
v1.43.001
  • PROJ-180: pushMagnalisterReturnAttributes GraphQL helper — read-merge-write auf Shopify Order.customAttributes für magnalister Otto Retoure-Felder
v1.42.0032026-04-09
  • PROJ-180 mergeOrderCustomAttributes — Pure Hilfsfunktion in src/lib/shopify/fulfillment.ts, die Shopify-Order customAttributes (bestehende Liste + Updates) sicher zusammenfuehrt: bestehende Keys ohne Update bleiben an ihrer Position, aktualisierte Keys werden ans Ende verschoben. TDD: 4 Tests (neue Keys anhaengen, Idempotenz, leere existing, Reihenfolge-Invarianz). Wird von pushMagnalisterReturnAttributes genutzt, um Shopifys orderUpdate-Semantik (ersetzt die gesamte customAttributes-Liste) zu erfuellen.
v1.42.0022026-04-09
  • PROJ-180 magnalister Otto Retoure-Bridge — Migration setzt bridge_m2e_cloud_enabled = true für alle bestehenden Shopify-Integrationen, damit Bestandsinstallationen ihr bisheriges Verhalten (Retoure als zweites Tracking) behalten. bridge_magnalister_enabled bleibt false und muss manuell aktiviert werden.
v1.41.003
  • Produktsuche: Bei Treffer auf Kindartikel (SKU/Barcode/EAN) wird der Kindartikel direkt angezeigt statt dem Parent zum Aufklappen
v1.41.0022026-04-09
  • PROJ-97 Shopify Metafeld-Mapping: „Metafelder von Shopify laden" lief auf 404, weil der nicht existierende REST-Endpoint metafield_definitions.json aufgerufen wurde. Umgestellt auf die GraphQL Admin API (metafieldDefinitions, ownerType: ORDER) — Definitionen werden jetzt wieder sauber geladen.
v1.41.0002026-04-09
  • PROJ-177 Amazon FBA-Bestand als echtes Flowkom-Lager — FBA-Pull schreibt jetzt stock-Rows im FBA-POOL des FBA-Warehouses (sync_amazon_fba_stock RPC + Reconciliation), Bewertung via supplier_products.purchase_price. Dadurch enthalten Lagerwert (PROJ-74) und Bestellvorschlag (PROJ-22) automatisch den FBA-Bestand. Read-only Warehouse + FBA-POOL Location via neuem create_system_locations Trigger-Branch, Backfill-Hook beim Mapping (Single + Bulk). Interim-Phase bis PROJ-178 mit Doppelzählungs-Warnung auf der Artikel-Detailseite.
v1.40.0022026-04-08
  • Profitbutler FBA-Kostennullung zurueckgerollt — kommt wieder wenn echte Amazon-Gebuehren (FBA-Fulfillment, Storage, Referral) ueber die Reports-/Finances-API abgeholt werden, damit der Gewinn sauber statt nur halb abgebildet wird
v1.40.0012026-04-08
  • PROJ-176 Profitbutler-Integration: Amazon FBA-Bestellungen werden automatisch mit 0 EUR Versand-, Verpackungs- und Pick&Pack-Kosten ausgewiesen, weil Amazon das Fulfillment uebernimmt. Order-Level Versandart hat Vorrang vor Produkt-Default.
v1.40.0002026-04-08
  • PROJ-176 Amazon FBA Auto-Versandart — alle FBA-Bestellungen bekommen automatisch die Versandart "Versand durch Amazon" (Carrier: Amazon). Bestehende FBA-Orders werden rueckwirkend getaggt, neue Workspaces bekommen die Versandart per Seed. Workflow-Regeln und Profitbutler koennen FBA jetzt sauber filtern.
v1.39.0012026-04-08
  • Amazon FBA: partielle Lieferadresse (PLZ+Stadt+Land ohne Strasse) wird jetzt trotzdem als customer_addresses-Eintrag gespeichert, damit der Kunde nicht leer wirkt wenn Amazon die Daten redigiert
  • Amazon Reports-API: 403 Unauthorized vom Shipments-Invoicing-Report wird jetzt als klare Handlungsanweisung geloggt (Tax Invoicing Role noch nicht approved)
v1.39.0002026-04-08
  • PROJ-175 Amazon FBA Kundendaten-Enrichment — volle Käufer-PII (Name, Straße, PLZ, Stadt) werden jetzt über den Shipments-Invoicing-Report (Reports-API) nachgeladen, wie es auch JTL macht. Ersetzt die von Amazon redigierten Orders-v0-Daten bei EU-FBA.
v1.38.0102026-04-09
  • Bundle-Artikel: Save-Button aktiviert sich jetzt direkt bei Änderungen im Bundle-Tab (Komponenten hinzufügen/entfernen/Menge ändern). Zuvor musste erst ein Feld in einem anderen Tab (z.B. Basis) geändert werden, damit der Artikel überhaupt speicherbar wurde, weil der Bundle-State außerhalb von react-hook-form lief und die Dirty-Erkennung ihn nicht berücksichtigt hat.
v1.38.0092026-04-08
  • Amazon FBA-Import: ausführliche Diagnose-Logs am Parent-PII-Call und beim Kunden-Upsert, damit klar wird welche Adressfelder Amazon bei EU-FBA tatsächlich freigibt
  • Amazon FBA-Kunden: degradierter Surrogate-Dedupe — wenn Amazon keine Straße rausgibt, wird pro Bestellung ein eigener Kunde mit Land+PLZ+Stadt angelegt statt alle im Gast-Bucket zu sammeln
v1.38.0082026-04-09
  • Picklist-Erstellung: One-Scan/Multi-Filter wird jetzt auch beim Anlegen der Pickliste angewendet. Zuvor filterte nur die Vorschau korrekt — die tatsächlich erstellte Pickliste enthielt alle Aufträge des Profils ohne Berücksichtigung des Bestelltyps.
v1.38.0072026-04-09
  • Picklist-Profil-Karten zeigen die konfigurierten Artikel-Tag-Filter jetzt direkt als Badges mit Tag-Name, Farbe und HAS_NOT-Kennzeichnung an (statt nur 'X Tag-Filter').
v1.38.0062026-04-08
  • Amazon FBA-Import: /address und /buyerInfo werden jetzt mit eigenem Sub-Path-RDT (ohne dataElements) und dem Pflicht-Parameter MarketplaceIds aufgerufen — vorher schlug der Fallback still fehl und FBA-Kunden landeten weiter im Gast-Fallback (verifiziert gegen offizielle SP-API Doku)
v1.38.0052026-04-08
  • Amazon FBA-Kunden: Lieferadresse und Käufername werden jetzt via dedizierte /address- und /buyerInfo-Sub-Endpoints nachgeladen, wenn das Order-Objekt sie nicht inline liefert — dadurch werden FBA-Kunden wie gewünscht mit voller Adresse angelegt statt im Gast-Fallback zu landen
v1.38.0042026-04-09
  • Picklisten-Profile: Artikel-Tag-Filter wird jetzt korrekt gespeichert und beim Bearbeiten wieder angezeigt. Zuvor strippte das Zod-Schema der POST/PUT-Routen das Feld `tag_filters` stillschweigend, sodass es nie in der DB landete und auch bei der Picklist-Erstellung nicht greifen konnte.
v1.38.0032026-04-08
  • Amazon Order-Import: Zahlstatus wird jetzt korrekt gesetzt (paid außer Pending/Canceled) statt generisch Unbezahlt
  • Amazon Order-Import: Verkaufskanal pro Marketplace erkannt (amazon_de/fr/it/es/nl/pl/se/be/uk/com/ca/mx)
  • Amazon Order-Import: Quelle zeigt Amazon-Badge mit Integrationsnamen statt Manuell
  • Amazon FBA-Bestellungen werden direkt als abgeschlossen importiert (FBM: shipped/open je OrderStatus)
  • Amazon FBA-Kunden: echter Kunde mit vollständiger Adresse wird angelegt (Surrogate-Dedupe über Name+PLZ+Straße) statt Fallback auf Amazon-Gastbestellungen
v1.38.0022026-04-09
  • PROJ-174: Fehlerzeilen-CSV-Download im Lagerbestand-Initialimport Dry-Run. Neuer Button im Strict-Mode-Banner lädt bei Fehlerzeilen eine CSV mit allen Originalspalten plus zusätzlicher 'Fehler'-Spalte herunter — so kann der Nutzer die problematischen Zeilen gezielt korrigieren und neu hochladen.
v1.38.0002026-04-08
  • PROJ-174: Lagerbestand-Initialimport (CSV) für JTL-Migration. Neuer Import-Target-Typ 'Lagerbestand — Initialbefüllung (JTL-Migration)' im Daten-Hub Import-Wizard. Akzeptiert JTL-Bestands-Export-CSVs mit Pflichtspalten Artikelnummer, Lagerplatz, Einzubuchende Menge (Header case-insensitive + Synonyme, DE-Dezimalkomma). Kein Mapping-Step — Spalten sind fix. Strict-Mode hart erzwungen: bei ≥1 Fehlerzeile (unbekannte SKU, unbekannter Lagerplatz, Bundle/Service-Artikel, ungültige Menge) wird der Import blockiert, User muss CSV korrigieren und neu hochladen. Bei grünem Dry-Run werden die Zeilen nach warehouse_id gruppiert und in Chunks à 200 Items atomar über die bestehende complete_goods_receipt-RPC (PROJ-6/PROJ-73) gebucht — Stock, Stock-Movements, Goods-Receipt-Header, FIFO-Layer und Landed-Cost-Integration bleiben automatisch konsistent. Mengen werden additiv pro Zeile verbucht. Job-Protokollierung in data_jobs, sichtbar im bestehenden Daten-Hub Job-Verlauf.
v1.37.0022026-04-08
  • Horizontales Seiten-Scrolling auf breiten Tabellen (v.a. Amazon-Angebote verwalten) behoben. SidebarInset bekam min-w-0, damit das Main-Panel unter seine Content-Breite schrumpfen darf und die interne overflow-auto-Wrapper-Div der shadcn-Table das horizontale Scrolling übernimmt, statt dass die ganze Seite mitscrollt.
v1.37.0002026-04-08
  • PROJ-172: Nächtlicher automatischer Amazon Listings Refresh. Neuer Cron-Endpoint /api/cron/amazon-listings-nightly-refresh iteriert seriell über alle aktiven Amazon-Integrationen (Opt-Out pro Integration via metadata.amazon.nightly_refresh_enabled) und treibt den PROJ-169-Listings-Sync-Worker komplett ohne HTTP-Loop zur Completion. Geschedulet extern wie die anderen Amazon-Crons (0 2 * * *, vor dem FBA-Inventory-Pull um 03:15). Time-Budget 20 Minuten pro Integration, per-Marketplace-Fehler-Isolation (ein fehlgeschlagener MP stoppt den Job nicht mehr). Neuer Settings-Toggle 'Nächtlicher Listings-Refresh' + 'Jetzt starten'-Testbutton pro Integration. Neuer Eintrag in der Cron-Jobs-Tab-Übersicht.
  • Der Listings-Sync-Worker aus PROJ-169 wurde nach src/lib/amazon/listings-worker.ts extrahiert (advanceListingsJob, buildInitialListingsDetails, runListingsRefreshLoop). Die bestehenden /refresh- und /process-Routen sind jetzt dünne Wrapper um diese Helpers — der Frontend-Poller funktioniert unverändert weiter. Zusätzlich Per-Marketplace-Fehler-Isolation: Fehler auf einem Marktplatz werden in details.per_marketplace[mp].error protokolliert, der nächste MP läuft trotzdem; Final-Status ist success (alle ok), partial (gemischt) oder error (alle failed).
v1.36.0042026-04-08
  • PROJ-167: Testing-Button 'Importierte löschen' pro Kanal (FBM und FBA) in den Amazon-Order-Import-Blöcken. Löscht alle importierten Bestellungen des gewählten Kanals inkl. abhängiger Tabellen und der dadurch verwaisten Amazon-Kunden dieser Integration. Nur für die Testphase gedacht, Confirm-Dialog mit 'nicht rückgängig'-Warnung, keine Safety-Checks (die saubere Version folgt über PROJ-173).
v1.36.0032026-04-08
  • PROJ-167: Amazon-Customer-Upsert schreibt Adressen jetzt in die separate customer_addresses-Tabelle (PROJ-145 Multi-Adressen-Modell), analog zum Shopify-Importer. Bisher lagen die Adressen nur in den Legacy-Discrete-Columns auf customers, wodurch der Adressen-Tab auf der Kundendetailseite leer blieb obwohl der Auftrag die Adresse enthielt. Bei Dedupe-Treffern wird die Adresse bei Bedarf ergänzt. Phone wird aus der Amazon-ShippingAddress mitübernommen.
v1.36.0022026-04-08
  • PROJ-171: Amazon FBA-Bestand wird in der Listings-Management-UI angezeigt — Spalte 'FBA-Bestand' default-sichtbar, Filter 'Bestand = 0' aktiv. DB-Trigger aggregiert amazon_fba_inventory → amazon_listings.quantity automatisch, stündlicher Cron und manueller Pull-Button bleiben unverändert.
v1.36.0012026-04-08
  • PROJ-167: Amazon-Import Sanity-Check behandelt jetzt beide VAT-Modi (VCS und Non-VCS). In Orders v0 ist ItemPrice beim Standard-Seller brutto (VAT-inclusive) und ItemTax informativ, beim VCS-enrolled Seller ist ItemPrice netto und ItemTax wird hinzuaddiert. Alter Code rechnete fest nach VCS-Formel und verursachte bei Non-VCS-Sellern 'sanity check failed'-Differenzen in Höhe des Tax-Anteils. Neuer Ansatz berechnet beide Modelle und akzeptiert das, das zu OrderTotal passt; Positionen werden entsprechend als Brutto-Einzelpreis gespeichert.
v1.36.0002026-04-08
  • PROJ-170: Amazon-Angebote verwalten — Neue Full-Page unter Integration → Amazon → 'Alle Angebote verwalten'. JTL-artige Multi-Select-Tabelle (shadcn/ui) mit Filterleiste (Marktplatz-Multi-Select, Fulfillment, Status, 'Nur nicht zugeordnet', Volltextsuche via Trigram-Indizes), Filter-Chips, URL-Deep-Links, serverseitiger Pagination (50/Page), sortierbaren Headers auf indizierten Spalten. Bulk-Aktionen: Zuordnen (mit Cross-Marketplace-Propagation), Zuordnung aufheben, Aus Sortiment entfernen (Soft-Delete). 'Alle N gefilterten auswählen'-Modus lädt IDs on-demand. Selektion überlebt Page-Wechsel, Confirm-Dialog bei Filter-Wechsel mit aktiver Auswahl. Konfigurierbare Spalten via ColumnPicker (localStorage pro User, Drag & Drop). CSV-Export der gefilterten Ansicht (Excel-DE, 50k Hard-Cap). Empty-States für leere Filter vs. kein Sync. HelpLink auf neue MDX-Doku. Wiederverwendbarer ProductPickerDialog aus AmazonMappingDialog extrahiert (src/components/products/product-picker-dialog.tsx). AmazonListingsBlock im Integration-Detail auf Kurz-Übersicht (5 jüngste Zeilen + Button) reduziert, alter Einzelzeilen-Dialog entfernt.
v1.35.009
  • PROJ-89: Produkt-Tags werden in der Produktübersicht wieder angezeigt und der Tag-Filter funktioniert. Die API filterte product_tags über eine nicht existierende workspace_id-Spalte, wodurch die Query leer zurückkam. Jetzt wird workspace-scoping über die geJOINte tags-Relation (tag.workspace_id) erzwungen.
v1.35.008
  • PROJ-167: PII-Daten (ShippingAddress + BuyerInfo) werden jetzt direkt über GET /orders/v0/orders/{id} mit RDT geladen statt über die Sub-Endpunkte /address und /buyerInfo. Der RDT ist strikt auf die in restrictedResources registrierten Pfade gescoped, der Parent-Pfad deckt die Sub-Endpunkte nicht automatisch ab — daher kam 'Access to requested resource is denied'. Die getOrder-Response enthält buyerInfo inklusive shippingAddress inline wenn der RDT mit entsprechenden dataElements erzeugt wurde (kanonischer SP-API-Workflow), spart zusätzlich zwei API-Calls pro Import.
v1.35.007
  • API orders-Endpoint: picked als gültigen Status-Filter zugelassen
v1.35.006
  • Kundenaufträge: Gepickt-Status im Filter ergänzt, Filter in Versandstatus umbenannt
v1.35.005
  • PROJ-167: Restricted Data Token wird jetzt dokumentations-konform nur auf dem Parent-Pfad /orders/v0/orders/{id} mit dataElements=['buyerInfo','shippingAddress'] angefragt. Das vorherige Muster registrierte dataElements auch auf /address und /buyerInfo — diese Sub-Endpunkte sind laut SP-API-Docs selbst PII-Endpunkte und akzeptieren keine dataElements. Amazon hat daraufhin die gesamte RDT-Anfrage mit 'Application does not have access to one or more requested data elements' abgelehnt.
v1.35.003
  • PROJ-167: Restricted Data Token wird jetzt mit Fallback ohne dataElements angefragt (wie v1-Snapshot PROJ-69); fixt 'Application does not have access to one or more requested data elements' beim selektiven Amazon-Import trotz aktiver Direktversand-Rolle — zusätzlich Parent-Path /orders/v0/orders/{id} in die Resources aufgenommen
v1.35.002
  • PROJ-167: Selektiver Amazon-Import zeigt jetzt den echten Skip-/Error-Grund im Toast (erster details.errors-Eintrag) statt 'erfolgreich importiert' zu melden, wenn tatsächlich 0 Orders durchgekommen sind — plus Server-Logging der SP-API Request/Response-Meta für Coolify-Diagnose
  • PROJ-173: Spec angelegt — Amazon-Order Import rückgängig machen (Delete-Endpoint + UI-Button in Auftragsdetail & Preview-Dialog, Safety-Checks gegen Pickliste/Versand/Belege, Hard-Delete via RPC)
v1.35.001
  • PROJ-170: Feature-Index auf 'In Progress' gesetzt
v1.35.000
  • PROJ-170: Backend-Fundament für das JTL-Style Amazon Listings-Management — Trigram-Indizes für Volltextsuche (Titel, SKU, ASIN), erweiterter List-Endpoint mit Multi-Marketplace-/Fulfillment-/Status-/Unmapped-/Sort-Filtern, drei Bulk-Endpoints (Zuordnen mit Cross-MP-Vererbung, Zuordnung aufheben, Aus-Sortiment-entfernen als Soft-Delete via status='inactive') und CSV-Export (Excel-DE, BOM, Semikolon) — UI folgt in Session 2
v1.34.005
  • PROJ-167: Selektiver Amazon-Import nutzt jetzt die korrekte SP-API-Syntax für AmazonOrderIds (komma-separiert statt MWS-Legacy AmazonOrderIds.Id.N); Amazon hatte den Parameter zuvor ignoriert und 'CreatedAfter or LastUpdatedAfter must be specified' zurückgegeben
v1.34.003
  • PROJ-170/171/172: Specs angelegt — Amazon Listings-Management-UI (JTL-Style Multi-Select Tabelle), FBA Inventory Pull (SP-API getInventorySummaries + pg_cron), Nightly Listings Full-Refresh via pg_cron (Job-Driver ohne HTTP-Loop)
v1.34.002
  • PROJ-169: Amazon-Artikel-Liste zeigt jetzt die gesynten Angebote (GET-Endpoint liefert { listings, total } statt { data, count }, Produkt-Join eingebaut)
v1.34.001
  • PROJ-167: Amazon-Import-Vorschau zeigt jetzt den echten Fehler aus results[].error an statt der generischen Meldung 'Import fehlgeschlagen.'
v1.34.000
  • PROJ-169: Amazon Listings-Sync als Background-Job mit Multi-Marketplace-Support, Live-Progress-Bar, JTL-Wawi-Modell (N:1 Mapping, FBA/FBM-Suffix Auto-Match, Cross-MP Mapping-Propagation), server-seitiger withStatus=BUYABLE Filter, inkrementeller Default-Sync, Abbrechen-Funktion
v1.33.0022026-04-08
  • PROJ-167: Status auf Deployed gesetzt (INDEX.md + Spec-Header).
v1.33.0012026-04-08
  • PROJ-168 LB-Detail-Rework — Lieferantenbestellungs-Detail als Fullscreen-Overlay (ersetzt alten Modal-Dialog). Cursor-Bug im EK-Preis-Input behoben (lokaler State + onBlur-Commit + React.memo PositionRow → keine Sibling-Re-Renders mehr). Multi-Select-Artikelpicker mit Live-Suche (Name/SKU/EAN/Lief.-Art.-Nr), Mengen-Eingabe pro Zeile und Footer-Live-Summe ersetzt den One-by-One-Flow. LB-Nummer inline editierbar mit debouncetem Live-Unique-Check (300 ms). Status-Badges klickbar mit Folge-Status-Dropdown. Kontext-Primäraktion (Einreichen / Genehmigen / Wareneingang buchen) und Mehr-Menü (Duplizieren / PDF / E-Mail / Stornieren / Löschen) im Header. 6 Tabs mit Lucide-Icons (Details, Positionen, Zahlungen, Wareneingänge, Dokumente, Verlauf). Sidebar-Cards (Lieferant, Summen, Zahlung) und Meta-Grid (Erstellt/Lieferdatum/Lager/Währung). Status-History-Timeline portiert. Neue stabile-ID API-Endpoints (POST /items, PATCH /items/[itemId], DELETE /items/[itemId], PATCH /[id] mit po_number-Rename) ersetzen den alten delete+reinsert-PUT und bewahren goods_receipt-FKs. 23 neue API-Tests, 343/343 Gesamt grün, 0 Lint-Errors.
v1.33.0002026-04-08
  • PROJ-167 Amazon Bestellungs-Filter & Import-Vorschau — Getrennt konfigurierbare Filter pro Kanal (FBM: Bestellstatus, Zahlungsstatus, Versandstatus, Synchronisierungszeitraum; FBA: ohne Versandstatus), neuer 'Bestellungen laden'-Dialog mit Mehrfachauswahl für selektiven Import, 'Jetzt synchronisieren' respektiert die Filter. Neuer GET /amazon/orders/preview Endpoint mit 250er Cap und already_imported-Lookup. importOrders erweitert um amazonOrderIds + filters. Kaputte FBM/FBA-Import-Buttons aus AmazonManualActionsBlock entfernt (Fix nebenbei).
v1.32.013
  • PROJ-166: Amazon Listing-Status (BUYABLE/INCOMPLETE/...) korrekt auf DB-Enum active|inactive|incomplete gemappt; echte DB-Fehler landen jetzt im Sync-Log statt [object Object]
v1.32.012
  • PROJ-166: Fehlende order-filters.ts committed — Deploy-Build (Turbopack Module not found) repariert
v1.32.010
  • PROJ-166: Amazon Listings-Aktualisierung — Marketplace-ID als seller_id wird abgelehnt, irreführender InvalidInput-Workaround entfernt
v1.32.0002026-04-08
  • PROJ-166 Amazon Integration Rebuild — FBM/FBA Order-Import, Listings-Sync mit SKU-Automap und manueller Zuordnung, FBM-Bestandspush via Dirty-Queue + Safety-Sync, FBA-Bestand-Pull, Versandbestätigung mit Carrier-Mapping + Overrides, Multi-Region (EU/NA), Multi-Marketplace. Inklusive neuer Tabellen (amazon_listings, amazon_inventory_dirty_queue, amazon_fba_inventory, amazon_sync_log), LWA-Token-Refresh + RDT, Advisory Locks pro (Integration, Job-Type), komplette Cron-Suite (FBM/FBA-Import, Inventory-Flush, Safety-Sync, FBA-Pull, Shipment-Confirmation), Credentials-Verschluesselung, Problems-API, Lifecycle-Service (Enable/Disable mit Stock-Safety-Check), neue UI-Sektion im Integrationen-Hub (Connection, Marketplaces, Toggles, Listings, Problems, Carrier-Overrides, Manual-Actions) und Burst-Test fuer die Dirty-Queue-Deduplication.
v1.30.0032026-04-08
  • PROJ-165: Orphan public/channels/amazon.svg und lokales docs/amazon-SDK-Dump (115MB) entfernt.
v1.30.0012026-04-08
  • PROJ-165: Status auf In Review.
v1.30.0002026-04-08
  • PROJ-165 Amazon Nuke & Pave: Amazon v1-Reste und komplettes v2 wurden restlos entfernt. Drop-Migration entfernt alle Amazon-Tabellen (amazon_carrier_mappings, amazon_shipment_retry_queue, amazon_failed_operations, amazon_v1_failed_operations_deprecated, amazon_v2_circuit_state, fba_inventory, fba_inventory_snapshots), die Spalte orders.amazon_fulfillment_confirmed_at, alle Amazon-Integrationen, FBA-Virtual-Warehouses und Amazon sync_log-Eintraege. integrations.type und integration_sync_logs.sync_type CHECKs werden ohne Amazon-Werte neu gesetzt. BREAKING CHANGE — Produktions-Deployment erfordert Backup und Pruefung offener Eintraege in amazon_v1_failed_operations_deprecated.
v1.29.0272026-04-08
  • PROJ-165: Amazon-Env-Variablen (AMAZON_SP_*, AMAZON_V2_*), vitest.sandbox.config.ts, test:sandbox Script und @sp-api-sdk/*-Dependencies entfernt. Letzte Amazon-Referenzen aus channel-config, workflow-form-dialog, warehouse-table (FBA-Virtual-Logik) und freescout-marketplace-urls geloescht.
v1.29.0262026-04-08
  • PROJ-165: Subagent-getriebener Cleanup von 29 shared Modulen — Amazon-Zweige aus Integration-Registry, Order-/Shipping-Table, Cron-Trigger, Disconnect, Sync-Routes, Validations, Cron-Jobs-Seite und weiteren Dateien entfernt. Drei komplett amazon-spezifische Dateien geloescht (amazon-order-preview-dialog, products/fba-inventory/route, products/fbm-inventory-sync/route).
v1.29.0252026-04-08
  • PROJ-165: src/lib/amazon-v2/ komplett geloescht (Services, Auth, Reliability, Status, Mappers, Tests). Alle Amazon-API-Routes, Cron-Jobs (amazon-v2-order-sync, amazon-v2-inventory-sync, amazon-v2-shipment-confirmation), FBA-Inventory-Page, AmazonIntegrationDetail- und amazon-v2-status-card-Komponenten entfernt — 106 Dateien insgesamt.
v1.29.0242026-04-08
  • PROJ-165: v1 Amazon-Snapshot (57 Dateien) aus Git-Commit 7e128e0 nach features/amazon-rebuild-reference/v1-snapshot/ gesichert als Read-only-Referenz fuer den spaeteren Rebuild. PROJ-151..164 Feature-Specs entfernt.
v1.29.0232026-04-08
  • PROJ-165: Amazon Nuke & Pave spec angelegt — v1-Reste + v2 werden komplett entfernt, v1-Code wird als Read-only-Referenz aus Git-Commit 7e128e0 gesichert, Rebuild folgt in separatem Ticket.
v1.29.0222026-04-08
  • PROJ-164: Amazon v2 FBA-Bestand UI & Steuerung — schliesst die UI-Luecke aus PROJ-157 (Backend lief, war aber unsichtbar/unsteuerbar). Neue Card 'FBA-Bestandssync' im Integration-Detail mit Auto-Sync-Toggle, letztem Lauf, Snapshot-Counter, Status-Badge, Jetzt-synchronisieren-Button und Link zur Detail-Seite. Neue GET/POST-Routes unter /api/integrations/[id]/amazon/fba/. Waisenseite fba-inventory/page.tsx an v2-Schema angepasst (reserved_total/unfulfillable_total) inkl. Back-Link und korrektem Empty-State.
v1.29.0212026-04-08
  • PROJ-164: Spec fuer Amazon v2 FBA-Bestand UI — beschreibt die Schliessung der UI-Luecke aus PROJ-157 (Backend lief, UI halbfertig: Waisenseite, fehlende Read-API, keine Section im Detail-View). Reine Frontend/API-Arbeit, null Backend-Aenderungen.
v1.29.0202026-04-08
  • PROJ-163: temporaeres LWA-Diagnostic-Logging aus v1.29.019 wieder entfernt. Root-Cause des 403 war ein Region-Mismatch (NA-Seller, EU-Endpoint) — Amazon antwortet bei falscher Region mit demselben generischen Body wie bei fehlender Sellers-Rolle, was die Diagnose in die Irre fuehrte.
v1.29.0192026-04-08
  • PROJ-163: temporaeres LWA-Diagnostic-Logging in self-authorize-service.ts, das den LWA-Token-Exchange mitloggt (Status, scope-Feld, token_type, expires_in, error) plus erste/letzte Zeichen von client_id/refresh_token — PII-sicher, keine vollstaendigen Tokens. In v1.29.020 wieder entfernt.
v1.29.0182026-04-08
  • PROJ-163: Expliziten Flowkom-User-Agent in allen v2-SDK-Client-Factories setzen (sdk-client, connection-service, orders-client, inventory-client, feeds-client, rdt-helper). sdk-client.ts war der einzige Pfad ohne userAgent und wird vom Self-Authorize-Flow genutzt — Amazon SP-API lehnte diese Requests mit 403 + generischem 'Access to requested resource is denied' ab (identisch zum PROJ-151-Befund im alten v1-Stack). Gemeinsame Konstante AMAZON_V2_USER_AGENT im v1-Format.
v1.29.016
  • PROJ-122: Spreadsheet-Bulk-Edit kann jetzt EK-Preis pro Lieferant und Standard-Lieferant setzen — neue Spalten 'Einkaufspreis (Lieferant)' und 'Standard-Lieferant', Validierung verlangt Lieferanten in Scope, beim Setzen von Standard-Lieferant wird der bisherige automatisch entmarkiert. Vorbefuellung der Zellen ueber neuen Endpoint /api/supplier-products/preferred-batch.
v1.29.013
  • PROJ-163 Commit 4: docs/amazon-v2/self-authorize-guide.md angelegt — vollstaendiger Setup-Guide mit Voraussetzungen (Developer-Console-Rollen), Token-Erzeugung in Seller Central, Token-Eingabe in Flowkom, Fehler-Diagnose fuer missing_seller_role/invalid_refresh_token, Reauth-Pfad, Sicherheits-Hinweise. production-app-setup.md mit PROJ-163-Banner versehen.
v1.29.012
  • PROJ-163 Commit 3: OAuth-Routen /api/integrations/amazon-v2/oauth/authorize und /callback liefern jetzt 410 Gone und verweisen auf den Self-Authorize-Endpoint. Code lebt in der Git-History; bei zukuenftigem Multi-Tenant-Bedarf ist ein Revert auf v1.29.009 der schnellste Weg zurueck. -449 LoC dead OAuth code. PROJ-163 in features/INDEX.md eingetragen.
v1.29.011
  • PROJ-163 Commit 2: Amazon-Setup-UI auf Self-Authorize-Card umgestellt. Neue Card mit Region-Select + Refresh-Token-Textarea + 'Speichern & testen'-Button. Inline-Ergebnis: Success-Alert mit Marketplace-Liste oder Error-Alert mit kind, http_status, message und togglable Rohdaten-Viewer des Amazon-Bodys. Gerendert bei isSetup/isInactive/isError sowie via 'Token ersetzen'-Toggle im active-State. Error-Banner 'Neu verbinden' scrollt jetzt zur Self-Authorize-Card. OAuth-Query-Param-Reader + oauthCallbackResult-State + handleConnectViaOAuth entfernt. 3-Schritte-Anleitung verweist auf self-authorize-guide.md.
v1.29.010
  • PROJ-163 Commit 1: Amazon v2 Self-Authorize-Service + POST /api/integrations/amazon-v2/self-authorize. Nimmt einen manuell aus Seller Central kopierten Refresh-Token entgegen, verschluesselt ihn, legt die Integration an (oder updated eine bestehende) und macht einen Soft-Probe-Call gegen getMarketplaceParticipations. Token wird IMMER persistiert (auch bei Probe-Fehler), Probe-Ergebnis landet im probe-Feld der JSON-Response. Reauth-Pfad mit Cross-Workspace-Check. 5 Unit-Tests (Happy Path, missing_seller_role, Reauth, Cross-Workspace, Token-Laenge).
v1.29.009
  • PROJ-162 Diagnostik: Roher Amazon-Response-Body wird jetzt im last_error-Feld und im Server-Log erfasst, sodass Probe-Fehler (z.B. missing_seller_role) ohne erneuten OAuth-Flow analysiert werden koennen.
v1.29.008
  • PROJ-162 Architektur-Fix: Phantom-Authorization beheben. Wenn der Marketplace-Probe-Call nach erfolgreichem Token-Tausch fehlschlug, wurde der Token bisher weggeworfen — Amazon Seller Central markierte die App aber als autorisiert. Flowkom-UI blieb im Setup-Status ohne Erklaerung. Neuer Flow: Token wird IMMER persistiert, Probe ist Soft-Operation, Status wird je nach Probe-Result auf active oder error gesetzt, last_error traegt die konkrete Amazon-Fehlermeldung. App-Rollen koennen jetzt gefixt werden, ohne OAuth-Flow erneut zu durchlaufen — der naechste Verbindung-testen-Klick reicht.
v1.29.007
  • PROJ-162 Diagnostik: persistente Diagnose-Box in der Amazon-Connect-Card zeigt das Result des letzten OAuth-Callback-Versuchs (success/error + kind) dauerhaft an, sodass Fehlermeldungen nicht mehr durch verschwindende Toasts verloren gehen. Bei Erfolg zusaetzlich Hinweis auf manuellen Reload, falls die clientseitige Aktualisierung haengt.
v1.29.006
  • PROJ-162 Hotfix: Setup-Karteileiche wurde nach erfolgreichem OAuth-Consent nicht in eine aktive Integration umgewandelt — stattdessen legte der Callback jedes Mal eine neue Integration an. Ursache: handleConnectViaOAuth setzte integration_id nur bei reauth=true, was bei isSetup nie der Fall war. Fix: integration_id wird grundsaetzlich mitgegeben, da die Komponente ohnehin nur im Kontext einer existierenden Integration gerendert wird. Setup-/Reauth-/Error-Pfade greifen jetzt alle auf den existing_integration_id-Merge-Pfad im Callback zu.
v1.29.005
  • PROJ-162 Hotfix: Zwei Probleme nach erstem erfolgreichen OAuth-Consent: (1) Reverse-Proxy-Origin — nach Amazon-Consent landete der User auf 0.0.0.0:3000/dashboard/... statt app.flowkom.de. callback/route.ts las den Origin aus request.url, was hinter Coolifys Reverse-Proxy die interne URL ist. Neuer Helper getPublicOrigin() extrahiert die Origin jetzt aus AMAZON_SP_V2_OAUTH_REDIRECT_URL. (2) Force-Delete fuer Setup-Karteileichen: AmazonIntegrationDetail.tsx Komplett-Loeschen-Button rendert jetzt auch bei isSetup, sodass leere Setup-Integrationen aus fehlgeschlagenen OAuth-Versuchen entfernt werden koennen.
v1.29.004
  • PROJ-162 Hotfix: Amazon-Consent warf Fehlercode MD1000 'Application not found', weil der Production-OAuth-Flow Draft-Apps ohne version=beta-Parameter nicht findet. Ursache: PROJ-154/162 hatten version=beta faelschlich an useSandbox gekoppelt. Korrektur entkoppelt App-Lifecycle-State vom Sandbox-/Production-Endpoint-Flag — neue Env AMAZON_SP_APP_DRAFT_MODE (Default true) steuert version=beta unabhaengig. Eine Draft-App kann jetzt sauber gegen Production-Endpoints OAuth-en. Setup-Guide-Troubleshooting fuer MD1000 ergaenzt. 5 neue Unit-Tests, 352 Tests gruen.
v1.29.003
  • PROJ-162 Commit 2/3: Amazon-Setup-UI auf OAuth-Connect-Card umgestellt. Beim Hinzufuegen einer neuen Amazon-Integration erscheint jetzt eine Region-Auswahl (EU/NA/FE) + Button 'Mit Amazon verbinden', der per Browser-Redirect den OAuth-Flow zu Amazon Seller Central startet. Reauth-Pfade: 'Verbindung erneuern' im Action-Bar bei aktiver Integration, 'Neu verbinden' im Error-Banner bei gestoerter Verbindung. Toast-Handling beim Mount fuer ?amazon_v2_oauth=success|error&kind=...-Redirects. Dead-Code-Abbau: refresh_token-State, marketplace-Dropdown, handleSaveAndTest und die komplette Refresh-Token-Eingabe-Form (postete auf eine in PROJ-161 geloeschte v1-Route) ersatzlos entfernt. -187 / +136 LoC.
v1.29.002
  • PROJ-162 Commit 1: Amazon v2 Config-Helper (src/lib/amazon-v2/config.ts) zentralisiert die in PROJ-161 ausgesparte Sandbox-zu-Production-Umstellung. Alle 9 USE_SANDBOX=true-Hardcodes (5 Service-Clients + lwa-client + 2 OAuth-Routes) lesen jetzt das AMAZON_SP_SANDBOX-Flag, je nach Wert AMAZON_SP_*- oder AMAZON_SP_SANDBOX_*-Variablen. Neue Env AMAZON_SP_APPLICATION_ID. vitest.sandbox.config.ts erzwingt Sandbox-Mode. Setup-Guide unter docs/amazon-v2/production-app-setup.md. 8 neue Unit-Tests, alle 347 bestehenden Tests gruen.
v1.29.001
  • PROJ-161 Phase 8 Deployed marker — PROJ-152 Amazon Greenfield-Rewrite vollstaendig abgeschlossen
v1.29.000
  • PROJ-161 Phase 8 Amazon v1 vollstaendig entfernt — Greenfield-Cutover auf v2 abgeschlossen. 18215 Zeilen v1-Code (lib/amazon, 13 Routen, 9 Cron-Routes, UI-Komponenten) geloescht. Migration: amazon_failed_operations → amazon_v1_failed_operations_deprecated (defensiv umbenannt statt gedroppt). BREAKING: kein Rollback auf v1 mehr moeglich.
v1.28.065
  • PROJ-161 Phase 8 v1-UI-Bloecke hinter v2Active-Flag ausgeblendet (Settings-Tabs, OpenIssues) — v2-Connections sehen nur noch das Status-Dashboard
v1.28.064
  • PROJ-161 Phase 8 Cron-Skip + v1-Routen 410: alle 13 v1-Amazon-Routen liefern 410 Gone, alle 9 v1-Cron-Routes ueberspringen v2-aktivierte Integrationen (geteilter Handler + 2 custom Crons + DLQ-Retry)
v1.28.063
  • PROJ-161 Phase 8 Cutover-Tooling: Admin-Routen /amazon-v2/enable und /amazon-v2/disable plus Cutover-Button im Detail-View (Confirm-Dialog, Reload nach Erfolg)
v1.28.062
  • PROJ-161 isV2EnabledFor liest jetzt korrekt settings.amazon_v2.v2_enabled (nested) — vorheriger flacher Pfad hat alle v2-Route-Gates faktisch deaktiviert
v1.28.061
  • PROJ-161 Phase 8 Spec — Amazon v1 Cutover & Delete (Plan: Per-Integration-Cutover, 410-Gone, Cron-Skip, UI-Flag, finaler v1-Delete mit Hard-Gate)
v1.28.060
  • PROJ-160 Phase 7 Deployed — Amazon v2 Status-Dashboard live (Read-only Dashboard pro v2-Connection mit Letzter Lauf, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
v1.28.059
  • PROJ-160: Manueller Trigger POST /api/integrations/[id]/amazon-v2/trigger (admin-only, isV2EnabledFor-Gate, Dispatch auf runOrderImport/runInventorySync/runShipmentConfirmation, respektiert Service-Soft-Lock, 3 Wire-In-Tests)
v1.28.058
  • PROJ-160: Amazon v2 Status-Dashboard UI (3 Karten pro Operation mit letztem Lauf, Circuit-Breaker-Badge, nächstem geplanten Lauf; eingehängt in AmazonIntegrationDetail, shadcn Card/Badge/Button/Tooltip/Skeleton)
v1.28.057
  • PROJ-160: Status-Aggregator + GET /api/integrations/[id]/amazon-v2/status (liest sync-logs, circuit-state, schedule-JSON; DI-Storage; 3 Unit-Tests)
v1.28.056
  • PROJ-160 Phase 7 Kickoff — Amazon v2 Status-Dashboard Spec (Read-only Dashboard pro v2-Connection mit Karte je Operation, Circuit-Breaker-Badge, nächster Lauf, Admin-only Trigger-Button)
v1.28.055
  • PROJ-159 Phase 6 Deployed — Amazon v2 Circuit-Breaker & Smart-Intervals (Status auf Deployed gesetzt)
v1.28.054
  • PROJ-159: Circuit-Breaker + Smart-Interval in alle drei v2-Cron-Routes (order-sync, inventory-sync, shipment-confirmation) verdrahtet, schedule-Persistenz in integrations.settings.amazon_v2.schedule, 3 Wire-In-Tests
v1.28.053
  • PROJ-159: CircuitBreaker + Smart-Interval Helper unter src/lib/amazon-v2/reliability/ inkl. 11 Unit-Tests (state-transitions, half-open, isolation, smart-interval-Heuristik)
v1.28.052
  • PROJ-159: Migration amazon_v2_circuit_state (Tabelle, RLS, partieller Index WHERE state=open)
v1.28.051
  • PROJ-159 Phase 6 Spec — Amazon v2 Circuit-Breaker & Smart-Intervals (Planned)
v1.28.050
  • FreeScout-Widget: Konversationsnummer wird nicht mehr fälschlich als Bestellnummer interpretiert (Subject-Quellen eingegrenzt, order_notes-Fallback mit Wortgrenzen + Mindestlänge gehärtet)
v1.28.049
  • PROJ-158 Phase 5 Deployed — Amazon v2 Shipment Confirmation komplett (Migration, FeedsClient, Carrier-Mapping-v2 DB-Reader, Strategy + Service, v1-Guard, Cron-Route, 5 Unit-Tests, Sandbox-Smoke)
v1.28.048
  • PROJ-158 Phase 5 — Cron-Route /api/cron/amazon-v2-shipment-confirmation (Feature-Flag-Gate, Soft-Lock-respektierend, sequentielle Iteration aller v2-Integrationen)
  • PROJ-158 — 5 Unit-Tests fuer runShipmentConfirmation (Strategy-DI, Auth-Abort, Per-Order-Fehler-Isolation, Idempotency, Soft-Lock) + Sandbox-Smoke fuer Feeds-API getFeeds
v1.28.047
  • Billkom: Rechnungsadresse erscheint wieder auf PDF-Rechnungen und ZUGFeRD-Export liefert wieder PLZ/Ländercode (Auflösung über Order-Snapshot > customer_addresses > Legacy, inkl. Auto-Repair bereits finalisierter Belege beim Download)
v1.28.046
  • PROJ-158 Commit 3 — ShipmentConfirmationStrategy-Interface, FeedsXmlConfirmShipmentStrategy (Default), ShipmentConfirmationService (DI-Orchestrator: Soft-Lock, Pending-Order-Selektion, Carrier-Mapping-Resolution, Strategy-Aufruf, amazon_fulfillment_confirmed_at-Update, DLQ-Insert pro Order-Fehler), Feature-Flag-Helper listV2ShipmentConfirmationEnabledIntegrations, dlq-Operationtype 'shipment_confirmation' ergänzt. 64/64 Tests grün.
v1.28.045
  • FreeScout-Widget: Flowkom-Button öffnet jetzt die Auftragsdetailseite statt der Kundenaufträge-Übersicht
v1.28.043
  • PROJ-158 Commit 2 — FeedsClient (5-Schritt-Pipeline um @sp-api-sdk/feeds-api-2021-06-30), build-fulfillment-feed-xml (POST_ORDER_FULFILLMENT_DATA), parse-feed-result-report, carrier-mapping-v2 (DB-Reader auf bestehende Tabelle amazon_carrier_mappings, kein statischer Port), v1-Guard als Top-of-function-Check in triggerAmazonShipmentConfirmation (einziger Touch in src/lib/amazon/), 3 Unit-Tests (64/64 grün). Spec aktualisiert: Carrier-Mapping als DB-Reader und v1-Guard als ein File-Touch dokumentiert.
v1.28.042
  • PROJ-158 Commit 1 — Migration orders.amazon_fulfillment_confirmed_at TIMESTAMPTZ + partieller Index (workspace_id, shipped_at) WHERE external_source=amazon AND shipped_at NOT NULL AND amazon_fulfillment_confirmed_at NULL. v2-isolierter Shipment-Confirmation-Marker, parallel zu v1.
v1.28.041
  • PROJ-158 Phase 5 kickoff — Spec für Amazon v2 Shipment Confirmation angelegt. Feeds-API-first Architektur (POST_ORDER_FULFILLMENT_DATA via @sp-api-sdk/feeds-api-2021-06-30), weil orders-api-2026-01-01 read-only ist. Neue Spalte orders.amazon_fulfillment_confirmed_at, Carrier-Mapping-v2-Port, 5-Commit-Plan, Test-Plan (5 Unit + 1 Smoke). SDK bereits installiert.
v1.28.040
  • PROJ-157 Phase 4 abgeschlossen — Amazon v2 Inventory Sync Deployed. FBM-Push via Listings PATCH + FBA-Pull via getInventorySummaries laufen kombiniert in einer Cron-Route, v2-isolierte Snapshots-Tabelle, Hybrid-Strategy mit Feeds-API-Stub (PROJ-157.5 Future Work), v1-Cron-Routes per Flag gegated. 55/55 Amazon-v2-Tests gruen, Spec synchron mit der finalen Architektur.
v1.28.039
  • PROJ-157 (Commit 4): Amazon v2 InventorySyncService-Orchestrator — FBM-Push + FBA-Pull sequentiell in einem Lauf, Soft-Lock via integration_sync_logs Sentinel (15min Cutoff), kombinierter sync_type='amazon_v2_inventory_sync', DI-Pattern mit InventorySyncDeps, Strategy-Selection ueber settings.amazon_v2.inventory_push_mode. Neue Cron-Route amazon-v2-inventory-sync mit Cron-Secret-Auth. 5 Unit-Tests (Strategy-DI-Wiring, FBM-Push-Errorhandling inkl. 401-Abort, FBA-Mapper aggregiert/leer/ohne-SKU, FBA-Pagination, FBA-Idempotency) + 1 Sandbox-Smoke (read-only getListingsItem mit Skip-Verhalten).
v1.28.038
  • PROJ-157 (Commit 3): Amazon v2 FBM-Push Strategien (Listings PATCH default, Feeds API stub mit PROJ-157.5 TODO), FBM-Push-Service (Queue-Read, Mapping-Lookup, Stock-Calc, Per-SKU-Push, DLQ, Queue-Cleanup), FBA-Pull-Service mit Pagination + Batch-Upsert + DLQ, fba-inventory-mapper mit aggregiertem reserved_total/unfulfillable_total, v2-Stock-Calc Port (PROJ-55-Semantik isoliert von v1), DLQ um inventory_push und fba_inventory_pull operation_types erweitert.
v1.28.037
  • PROJ-157 (Commit 2): Amazon v2 InventoryClient — kombinierter Wrapper um Listings (patchListingsItem) und FBA Inventory (getInventorySummaries paginiert) SDKs, gemeinsame Auth-Instanz, 100-Pages-Hardcap, AmazonV2AuthError-Mapping. v1-Cron-Routes (amazon-inventory-sync, amazon-fba-inventory-sync) bekommen negativen Filter auf settings.amazon_v2.inventory_sync_enabled. Spec mit den finalen Design-Entscheidungen synchronisiert.
v1.28.036
  • PROJ-157 (Commit 1): Migration fba_inventory_snapshots — neue v2-isolierte Tabelle mit seller_sku Unique, raw_details JSONB, snapshot_run_id Tracking, workspace-scoped RLS. v1 public.fba_inventory bleibt unveraendert.
v1.28.035
  • PROJ-157 (Commit 0): Amazon v2 Inventory-Sync Spec (Phase 4) — FBM-Push via patchListingsItem, FBA-Pull via getInventorySummaries, neue v2-isolierte Tabelle fba_inventory_snapshots, InventoryPushStrategy mit FeedsStrategy-Stub (PROJ-157.5 als Future Work)
v1.28.034
  • PROJ-157 (0a): npm-Deps für Listings & FBA Inventory hinzugefügt (@sp-api-sdk/listings-items-api-2021-08-01, @sp-api-sdk/fba-inventory-api-v1)
v1.28.033
  • PROJ-156 Phase 3 abgeschlossen — Amazon v2 Order Sync Deployed: Spec auf Status 'Deployed' gesetzt, alle Akzeptanzkriterien abgehakt, features/INDEX.md aktualisiert (PROJ-156 Deployed, Next Available ID = PROJ-158). Phase 3 ist das Herzstueck des Greenfield-Rewrites (PROJ-152) und liefert damit den ersten produktiv lauffaehigen End-to-End-Pfad der v2-Integration (OAuth → Connection-Health → Order-Sync mit DLQ), komplett parallel zu v1 und ueber settings.amazon_v2.v2_enabled gegatet.
v1.28.032
  • PROJ-156: OrderImportService + Cron-Route + 4 Unit-Tests + Sandbox-Smoke fuer Amazon v2 — runOrderImport orchestriert FBM+FBA sequentiell gegen dasselbe Rate-Limit-Budget, iteriert per Async-Iterator ueber searchOrdersPaged, holt pro Order einen frischen RDT, ruft getOrder mit BUYER/RECIPIENT/PROCEEDS/FULFILLMENT/PACKAGES-IncludedData, mapped via mapOrderToWmsRow und schreibt via batchUpsertOrders. Fehler-Klassifikation: 401/403 abort, 4xx/5xx pro Order in die DLQ mit version='v2'. Soft-Lock ueber integration_sync_logs Sentinel-Row statt Advisory-Lock (Begruendung in der Migration dokumentiert). Cron-Route /api/cron/amazon-v2-order-sync mit Cron-Secret-Auth iteriert ueber listV2EnabledIntegrations() sequentiell. 4 Unit-Tests (Strategy-Selection, Pagination, Idempotency, DLQ mit PII-Check) alle gruen, plus 1 Sandbox-Smoke der direkt den OrdersApiClient baut. Migration 20260407100001 erlaubt zusaetzlich sync_type='amazon_v2_order_import'. Gesamte Vitest-Suite gruen (15 Files, 42 Tests).
v1.28.031
  • PROJ-156: Order-Mapper + Batch-Upsert + DLQ-Wrapper fuer Amazon v2 — mapOrderToWmsRow ist pure function und mapped @sp-api-sdk/orders-api-2026-01-01 Order auf V2OrderDraft (Status via mapAmazonV2StatusToWms, Betrag aus proceeds.grandTotal in Cents, metadata.amazon_v2.raw_items als sanitized Line-Item-Snapshot OHNE PII, buyer_present/recipient_present nur als Boolean-Flags). batchUpsertOrders macht manuelles Insert/Update-Split via Pre-Query auf idx_orders_unique_external_order, generiert neue order_numbers via generate_wms_order_number-RPC nur fuer echte Inserts und erhaelt bestehende ids bei Updates. DLQ-Wrapper schreibt hart version='v2' mit Exponential-Backoff (5min * 2^(attempt-1), max 4h).
v1.28.030
  • PROJ-156: OrdersClient + RdtHelper fuer Amazon v2 — duenner Wrapper um @sp-api-sdk/orders-api-2026-01-01 und @sp-api-sdk/tokens-api-2021-03-01. searchOrdersPaged ist Async-Iterator mit 50-Pages-Hard-Cap, getOrder forwarded den RDT via x-amz-access-token-Header. RdtHelper baut RDTs pro Order auf Pfad /orders/2026-01-01/orders/{orderId}, mit lowercase Tokens-API dataElements und No-DataElements-Fallback bei fehlenden App-Rollen. Beide nutzen die memoized Auth-Instanz aus auth-instance-cache.ts. Keine DB-Zugriffe, keine PII in Logs.
v1.28.029
  • Retoure-Badge in der Kundenaufträge-Übersicht (Status-Spalte) sobald ein Retourenlabel existiert
v1.28.028
  • PROJ-156: Order-Status-Mapper fuer Amazon v2 (mapAmazonV2StatusToWms) — pure function, mapped die UPPERCASE-Enum-Werte aus @sp-api-sdk/orders-api-2026-01-01 (PENDING/UNSHIPPED/PARTIALLY_SHIPPED/SHIPPED/CANCELLED/UNFULFILLABLE/PENDING_AVAILABILITY) auf WMS-Status (open/in_progress/shipped/cancelled), fail-safe 'open' fuer unbekannte Werte mit Warn-Log ohne PII. Inkl. 4 Unit-Tests (alle gruen).
v1.28.027
  • PROJ-156: DB-Migration 20260407100000_proj156_amazon_failed_operations_version.sql — neue Spalte amazon_failed_operations.version (Default 'v1', CHECK v1/v2) plus Partial-Index (version, status) WHERE status IN ('pending','retrying'). Idempotent (IF NOT EXISTS + DO-Block fuer Constraint). Bereitet die DLQ auf v1/v2-Split fuer das spaetere Cutover (PROJ-161) vor; v1-Code bleibt unangetastet.
v1.28.025
  • PROJ-156: Spec-Alignment an die echte SDK-Surface von @sp-api-sdk/orders-api-2026-01-01@1.1.3 — nur 2 Methoden (searchOrders, getOrder) statt 5, includedData-Pattern statt separater Endpunkte, fulfilledBy: ['MERCHANT'|'AMAZON'] statt fulfillmentChannels, UPPERCASE FulfillmentStatus-Enums (CANCELLED mit zwei L), InvoiceUnconfirmed entfernt. Spec ist jetzt deckungsgleich mit dist/types des installierten SDK.
v1.28.023
  • PROJ-149: Filter und Suchen in der Kundenaufträge-Übersicht bleiben beim Zurück-Navigieren aus der Detailseite erhalten (Persistenz in localStorage). Neuer 'Filter zurücksetzen'-Button, der nur erscheint, wenn mindestens ein Filter aktiv ist.
v1.28.022
  • PROJ-156: Amazon v2 Order Sync Spec (Phase 3) — OrderImportService mit FBM+FBA Strategy, Orders v2026-01-01 via @sp-api-sdk/orders-api-2026-01-01, RDT-Pipeline pro Order, Batch-Upsert ON CONFLICT, Advisory Lock, DLQ mit version='v2', Cron-Route mit Feature-Flag-Gate, strikte PII-Disziplin.
v1.28.021
  • PROJ-155 Phase 2 abgeschlossen — Amazon v2 Connection & Health Deployed.
v1.28.020
  • PROJ-155: Unit-Tests + Sandbox-Smoke fuer Connection & Health (9 computeOverallStatus-Cases, disconnect-Idempotenz + Revoke-Fehler-Toleranz, testConnection Success + Sellers-Rolle-403, Feature-Flag-Gate auf beiden Routes). 280/280 gruen, Sandbox-Smoke gruen.
v1.28.018
  • PROJ-155: Amazon v2 Connection & Health Services — ConnectionService (testConnection + idempotenter disconnect mit LWA Token-Revoke), HealthService mit aggregiertem Status aus Sync-Logs/DLQ/Token/Connection-Test, neue API-Routes /test-connection + /health mit Feature-Flag-Gate
v1.28.016
  • PROJ-155: Amazon v2 Connection & Health Spec (Phase 2) — ConnectionService (testConnection, disconnect mit LWA-Token-Revoke), HealthService mit aggregiertem Status, v2-Routes /test-connection + /health mit Feature-Flag-Gate
v1.28.015
  • PROJ-154 (g): Sandbox-Smoke-Test — End-to-End-Beweis (LWA-Code-Tausch → encrypt/decrypt → SDK-Auth → getMarketplaceParticipations → Mapper). PROJ-154 Phase 1 abgeschlossen.
v1.28.014
  • PROJ-154 (f): Unit-Tests für OAuth-Flow-Module — crypto-Roundtrip + Tamper, oauth-state Sign/Verify/TTL/Tamper, error-classifier (Sellers-Rolle, 401/403), single-flight auth-instance-cache, marketplace-mapper
v1.28.013
  • PROJ-154 (d): SDK-Auth-Memo-Cache mit Single-Flight pro Integration (auth-instance-cache.ts), Reauth-Invalidation in Callback-Route
v1.28.012
  • PROJ-154: Amazon SP-API OAuth-Callback komplett — LWA-Code-Tausch, Marketplace-Detection, verschlüsselte Refresh-Token-Persistenz und klassifizierte Error-Redirects (Sellers-Rolle, abgelaufener Code, ungültiger Token)
v1.28.011
  • PROJ-154: Authorize-Route für den Amazon SP-API OAuth-Flow — Signed-State-Erzeugung, Region-Validierung und Redirect zur Seller-Central-Consent-Page
v1.28.010
  • PROJ-154: AES-256-GCM Token-Crypto und signed JWT für OAuth-State-Management (CSRF-Schutz) als Foundation für den Amazon SP-API OAuth-Flow
v1.28.009
  • PROJ-154: Amazon v2 OAuth-Flow Spec (Phase 1) — Authorize/Callback Routes, signed-JWT State, AES-256-GCM Token-Crypto, Single-Flight Refresh-Cache, Sellers-Rollen-Hint
v1.28.0082026-04-07
  • PROJ-153: vitest sandbox config laedt .env.local automatisch, Smoke-Test gegen Amazon-EU-Sandbox laeuft erfolgreich durch.
v1.28.0072026-04-07
  • PROJ-153: Sandbox-Smoke-Test fuer GET /sellers/v1/marketplaceParticipations (ueber @sp-api-sdk/sellers-api-v1, automatischer Skip ohne Sandbox-Credentials, anonymisiertes Logging ohne Marketplace-/Seller-IDs).
v1.28.0062026-04-07
  • PROJ-153: Sandbox-Env-Plan in .env.local.example und README fuer src/lib/amazon-v2/ mit Mermaid-Architektur, SDK-Begruendung, Sandbox-Setup-Schritten und Troubleshooting.
v1.28.0052026-04-07
  • PROJ-153: feature-flags.ts Helper (isV2EnabledFor / getV2PhasesFor) ueber zentralen Supabase-Admin-Helper, fail-safe Defaults, 6 Unit-Tests fuer alle Verhaltens-Pfade.
v1.28.0042026-04-07
  • PROJ-153: Vitest-Setup fuer v2-Phasen — Default-Lauf excludiert Integration-Tests, separate vitest.sandbox.config.ts mit 30s Timeout und neuer test:sandbox npm-Script.
v1.28.0032026-04-07
  • PROJ-153: Verzeichnis-Struktur src/lib/amazon-v2/ mit Stubs (sdk-client.ts, AmazonV2Error.ts) und Installation der drei Phase-0-SDK-Pakete @sp-api-sdk/auth, @sp-api-sdk/common, @sp-api-sdk/sellers-api-v1.
v1.28.0022026-04-07
  • Aufraeumer: verwaiste discount.test.ts entfernt (importierte ein nicht mehr existierendes Modul und liess npm test dauerhaft rot laufen).
v1.28.0012026-04-07
  • PROJ-153: Phase-0-Spec für das Amazon-v2-Fundament — SDK-Wahl @sp-api-sdk/* (live auf npm evaluiert, dediziertes orders-api-2026-01-01-Paket), Verzeichnis-Struktur src/lib/amazon-v2/, Vitest-Setup mit pragmatischer Test-Philosophie (4–5 Unit-Tests für kritische Logik + 1 Smoke-Test pro Phase), Sandbox-Env-Plan und Feature-Flag-Helper isV2EnabledFor.
v1.28.0002026-04-07
  • PROJ-152: Master-Spec für den kompletten Amazon-Integration-Neubau — OAuth-only, offizielles SDK, Orders v2026-01-01, Polling-first, Parallel-Build mit Per-Integration-Cutover. Ziel: ~9.500 LoC Alt-Code durch saubere v2-Architektur ersetzen, robust für 10k+ Bestellungen/Tag. Alle DB-Tabellen bleiben erhalten, andere Subsysteme sind nicht betroffen.
v1.27.0032026-04-07
  • PROJ-151: Crash-Schutz im Amazon test-connection Mode-2 — wenn die Integration noch keine gültige Region hat (z.B. nach gescheitertem Erstkontakt), kommt jetzt eine klare Fehlermeldung statt eines TypeErrors
v1.27.0022026-04-07
  • PROJ-151: User-Agent Header zu allen Amazon SP-API Requests hinzugefügt — Amazon verlangt diesen Header laut Doku, ohne ihn werden Requests mit 403 abgelehnt (sehr wahrscheinlicher Grund für die bisherigen 'Region nicht erkannt'-Fehler trotz gültigem Refresh Token und korrekten Rollen)
v1.27.0012026-04-07
  • PROJ-151: Amazon-Verbindungstest liefert jetzt konkrete Fehlerdiagnose pro Region (HTTP-Status, Amazon-Error-Body) statt der generischen Meldung 'Region nicht erkannt'
  • PROJ-151: Amazon Refresh Token wird erst nach erfolgreichem LWA-Exchange + Region-Detection + Validation persistiert — keine 'Karteileichen' mehr bei fehlgeschlagenen Verbindungstests
  • PROJ-151: Neuer 'Komplett löschen'-Button in der Amazon-Integration-Detail-Seite (sichtbar bei Status Fehler/Inaktiv) mit Texteingabe-Schutz, entfernt die Integration endgültig aus der DB
  • PROJ-151: DELETE /api/integrations/[id]?force=true Force-Delete-Pfad mit FK-/RLS-spezifischen Error-Codes
  • PROJ-151: Roter Error-Banner oberhalb der Amazon-Settings im Fehler-Status mit 'Neuer Token' / 'Verbindung testen' Quick-Actions
  • PROJ-151: Deutsche Umlaute in Amazon-Integration korrigiert (ungültig, Marktplätze, Eingeschränkt, Gestört, Löschvorgang, ausgewählt, Möchtest, endgültig, Südafrika, Ägypten, Türkei)
v1.27.000
  • Import-Notizen werden direkt in die order_notes-Tabelle geschrieben (PROJ-150): Shopify, Amazon FBA/FBM und manuelle Auftragsanlage nutzen jetzt einen einheitlichen Notiz-Helper mit Idempotenz-Schutz. Die alten orders.notes/import_notes-Spalten wurden entfernt, FreeScout eBay-Username-Lookup und die Notizsuche laufen über order_notes.
v1.26.083
  • Action-Buttons der neuen Auftragsdetailseite (Bearbeiten, Preisnachlass, Ersatzlieferung, Stornieren, Löschen) öffnen jetzt eigene Dialoge inline statt das alte Modal — Refund-/Cancel-/Delete-Dialoge in Standalone-Komponenten extrahiert, OrderDetailDialog komplett entfernt (PROJ-149)
v1.26.082
  • Auftragsdetailseite als Full-Page (PROJ-149 Task 7): Header mit Status/Financial-Popovers, Badges, Tags, 6 Tabs, Action-Buttons
v1.26.0812026-04-06
  • PROJ-149: Navigation zu Auftragsdetailseite — Klick auf Auftragszeile öffnet jetzt die neue Full-Page-Ansicht statt den Dialog, Kundendetails-Links ebenfalls umgestellt
v1.26.0802026-04-06
  • Workflow Intervall-Trigger — Workflows können jetzt in festen Intervallen ausgeführt werden (15min, 30min, 1h, 2h, 4h, 6h, 12h) zusätzlich zu täglich/wöchentlich
v1.26.079
  • PROJ-149: Notizen-Tab Komponente (OrderNotesSection mit CRUD, Inline-Edit, Source-Badges)
v1.26.0782026-04-06
  • Auftragslinks in Kundendetails (Aufträge-Tab) öffnen jetzt in neuem Browser-Tab statt im selben Tab
v1.26.077
  • PROJ-149: OrderNote-Typen, Adress-Update-Schema und Notiz-Validierung hinzugefügt
v1.26.0722026-04-04
  • PROJ-145: Kundendetailseite & Multi-Adressen — Full-Page /dashboard/customers/[id] mit 5 Tabs (Stammdaten, Adressen, Aufträge, Profitbutler, Notizen), customer_addresses Tabelle mit CRUD, Adress-Snapshots auf Orders, Shopify-Import Adressen-Deduplizierung
  • PROJ-146: Kundensperre — Block/Unblock API (Worker sperren, Admins entsperren), roter Banner + Badge, Versand-Guard (403), Import-Flagging in Order-Metadata
  • PROJ-147: Erweiterte Kundensuche — Collapsible Filter für PLZ (Prefix), Stadt, Land (CountryCombobox), Erstellungsdatum, letzter Auftrag; DB-Indexes auf customer_addresses, Badge-Pills mit Dismiss
  • PROJ-148: Kunden-Profitbutler — KPI-Cards (Gesamtumsatz, Aufträge, Ø Bestellwert, Erster/Letzter Auftrag, Erstattungen, Retourenquote), Umsatz-pro-Jahr Balkendiagramm, Top-10-Artikel Tabelle
v1.26.0612026-04-04
  • PROJ-136: Pending-Queue-Count Badge im Billkom Cron-Job — zeigt Anzahl ausstehender Rechnungs-Jobs direkt in der Cron-Job-Übersicht
v1.26.0602026-04-03
  • PROJ-136: billkom_job_queue CHECK Constraint fehlte 'skipped' — Processor konnte Jobs nicht als übersprungen markieren, blieben als 'processing' hängen und blockierten neue Jobs
v1.26.0592026-04-03
  • PROJ-136: billkom_job_queue Idempotency — Partial Unique Index statt absolutem UNIQUE, completed/failed Jobs blockieren keine neuen Workflow-Runs mehr, orders_changed zählt nur echte INSERTs
v1.26.0582026-04-03
  • PROJ-56: execute_workflow() aus PROJ-135/136 wiederhergestellt — fix_billkom_queue hatte massive Regression: fehlende Feld-Evaluierungen, kaputte is_one_of/is_none_of Operatoren, fehlende JOINs und Audit Trail
v1.26.0572026-04-03
  • PROJ-56: Bestehende Workflows hatten limitierte status_scope-Werte die Aufträge vor Bedingungsprüfung herausgefiltert haben — Backfill auf alle Status
v1.26.0552026-04-03
  • PROJ-56: Workflow status_scope Checkboxen entfernt — Auftragsstatus-Filterung nur noch über Bedingungen, redundante UI-Sektion und toter Code aufgeräumt
v1.26.0532026-04-03
  • PROJ-100: eBay Badge-Farbe im Auftragsdetail-Dialog nutzt jetzt DB-konfigurierte Farben wie die Tabellenansicht
v1.26.0492026-04-03
  • PROJ-144: Billkom Rundungsfehler (3,78€ statt 3,79€) — gross_price_per_unit in Order-API ergänzt, Produktname statt 'Position' in Auto-Rechnungen, Zahlstatus im PDF
v1.26.038
  • PROJ-144: Erstattungsblock in Auftragsdetails (Erstattet / Offener Betrag)
  • PROJ-144: shopify_total als Brutto-Gesamt (behebt Rundungsfehler durch Brutto→Netto→Brutto Roundtrip-Verlust)
  • PROJ-144: Refund-Vergleich auf Brutto-Referenz + ±2ct Toleranz (behebt falsche Teilerstattet-Status)
  • PROJ-144: Migration korrigiert bestehende falsche partially_refunded Status
  • PROJ-144: Shopify-Sync schreibt total_refunded aus Refund-Transaktionen (extern erstattete Aufträge)
  • PROJ-144: gross_price_per_unit — Billkom leitet MwSt aus originalem Shop-Brutto ab (behebt ±1ct Rechnungsfehler)
v1.26.0352026-04-03
  • PROJ-143: Deutsche Post Retouren — DHL Retoure + Internetmarke (umgedrehte Briefmarke) für DP-Versandarten, Popover-Auswahl, Auto-Return-Rules mit return_method
v1.26.0302026-04-03
  • Brutto-Preiseingabe in Aufträgen: Rundungsfehler behoben — 9,99€ wurde zu 9,98€ durch Brutto→Netto→Brutto Roundtrip
v1.26.0282026-04-03
  • Shopify Order Import matcht Artikel jetzt über integration_product_mappings statt products.shopify_variant_id — korrekt gemappte Artikel wurden fälschlich als Freiposition angelegt
v1.26.0252026-04-03
  • PROJ-142: Code-Review-Findings — Shipping-API Normalisierung, Workspace-Settings CountryCombobox, Validation max(2), CSV-Import Warnung für unbekannte 2-Letter-Codes
v1.26.0232026-04-03
  • PROJ-142: Country-Code-Normalisierung in allen API-Write-Paths (Kunden, Lieferanten, Produkte, Workspace) und CSV-Import mit Warnungen
v1.26.0212026-04-03
  • PROJ-141: Bestätigungsdialog bei manueller Änderung von Versandstatus und Zahlstatus
v1.26.0202026-04-03
  • PROJ-142: Alle Freitext-Länderfelder durch CountryCombobox ersetzt (Lieferanten, Produkte, Zolldaten, Workflows)
v1.26.0192026-04-03
  • PROJ-142: MultiCountryCombobox Komponente — Multi-Select mit Chips für Länderauswahl (ISO-Codes)
v1.26.0172026-04-03
  • PROJ-141: Auftragsdetail Action-Bar Redesign — klickbare Status-Badges im Header, farbige Aktions-Buttons, Mehr-Menü mit destruktiven Aktionen
v1.26.0162026-04-02
  • PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet
  • PROJ-140: Bundle-Artikel aus Bestellvorschlag, Einkaufsliste und Wareneingang ausgeschlossen
  • PROJ-140: Profitbutler zeigt Bundle-Komponentenkosten (FIFO/Lieferanten-EK, Aufschlüsselungstabelle)
  • PROJ-140: Profitbutler-Kalkulation verwendet Bundle-Komponentenkosten als Einstandspreisbasis
v1.26.009
  • PROJ-140: Lieferanten-Tab bei Bundle-Artikeln ausgeblendet (watchIsBundle-Konditionierung für TabsTrigger und TabsContent)
v1.24.0052026-04-02
  • Produktseite: Suchfeld verschluckt keine Buchstaben mehr (debounced URL-Sync)
  • Produktseite: Filter, Suche und Sortierung bleiben beim Zurücknavigieren erhalten (URL-Parameter + router.back)
v1.24.0002026-04-02
  • PROJ-135: Workflow-Bedingungen für Versandstatus, Zahlstatus und Versanddatum (älter als X Tage)
  • PROJ-135: Neue Workflow-Aktion 'Versandstatus ändern' mit Vorwärts-Validierung (z.B. shipped → completed)
  • PROJ-135: Status-Scope um 'Versendet' erweitert für Auto-Abschluss-Workflows
  • PROJ-136: Workflow-Bedingungen 'Rechnung vorhanden' und 'Lieferschein vorhanden'
  • PROJ-136: Neue Workflow-Aktionen 'Rechnung erstellen' und 'Lieferschein erstellen' über Billkom Job-Queue
v1.23.0212026-04-02
  • Shopify Bestellstatus-Sync Cron Job — automatischer Abgleich von Status, Zahlungsstatus und Tracking alle 15 Minuten
  • Shopify-Sync: shopify_order_id statt external_order_id, Tracking in shipping_tasks statt shipping_labels
  • Shopify-Import: fulfilled → shipped statt completed
v1.23.0062026-04-02
  • MwSt-Rundung auf Gruppennetto statt per-line — behebt 1-Cent-Differenz zu Shopify-Gesamtpreis
v1.23.0042026-04-02
  • PROJ-134: Financial Status auf Aufträgen (pending/paid/partially_refunded/refunded)
  • PROJ-134: Shopify Refund API Integration (Erstattung/Preisnachlass direkt aus Flowkom)
  • PROJ-134: Erstattungs-Dialog im Auftragsdetail mit Shopify-Notify + Gutschrift-Option
  • PROJ-134: Shopify-Refund im Storno-Flow integriert
  • PROJ-134: Financial-Status-Badge in Auftragsübersicht + Auftragsdetail
  • PROJ-134: refund_enabled Toggle in Shopify-Integrations-Einstellungen
  • PROJ-134: financial_status Mapping beim Shopify-Import + PROJ-131 Sync
v1.21.034
  • PROJ-132: Varianten-Attribut Inline-Zuweisung — Attributwerte direkt in der Kindartikel-Tabelle per Dropdown zuweisen
  • PROJ-132: Kombinations-Validierung — Generierung blockiert wenn Kinder unvollständige Attributwerte haben
v1.21.0322026-04-01
  • PROJ-132: PATCH /api/products/[id] akzeptiert jetzt variant_attribute_values (JSONB Record) für Inline-Zuweisung von Varianten-Attributwerten
v1.21.0312026-04-01
  • PROJ-48: Pagination in Auftragsübersicht repariert — exakter Count statt ungenauer Planner-Schätzung, Weiter-Button funktioniert wieder
v1.21.0292026-04-01
  • PROJ-131: Temporärer Shopify Order-Sync (Tracking + Status aus Shopify auf Knopfdruck abrufen)
v1.21.0262026-04-01
  • PROJ-130: orders_with_totals View recreated für import_notes Sichtbarkeit
  • PROJ-130: Lade-UX verbessert (keepPreviousData statt Full-Page-Spinner, subtiler Loader in Suchfeldern)
v1.21.0232026-04-01
  • PROJ-100: Verkaufskanal-Logos (Otto, Kaufland, eBay, Amazon, TikTok, Zalando, Temu) in Auftragsübersicht & Detail-Dialog
  • PROJ-100: DB-konfigurierte Badge-Farben aus Channel-Rules werden jetzt in der Auftragsübersicht angezeigt
v1.21.0222026-04-01
  • PROJ-130: Separates Notiz-Suchfeld in der Auftragsübersicht (notes + import_notes, Trigram-Index)
v1.21.0212026-04-01
  • PROJ-111: eBay-Username-Lookup für FreeScout Connector (eBay-Proxy-Mails umgehen via Magnalister Import-Notizen)
  • PROJ-111: DHL Hex-Tracking-Nummern erkennen (z.B. A004C58C4500000D9E1F)
  • PROJ-111: Flowkom-Deeplink korrekter Query-Param (orderId statt order)
  • PROJ-111: Flowkom-URL Fallback auf app.flowkom.de
v1.21.0152026-04-01
  • PROJ-123: Speichern-Button bei Attribut-Umbenennung im Varianten-Tab aktivieren (isDirty berücksichtigt jetzt out-of-band State)
v1.21.0142026-04-01
  • PROJ-78: Versandart-Filter für Produktübersicht (Ist/Ist-nicht-Modus, Keine Versandart, Multi-Select)
v1.21.0132026-04-01
  • PROJ-112: Profitbutler Farben gedämpft (emerald-600 statt Gift-Grün), Zeitraum-Zahnrad zur Tabelle verschoben
v1.21.0122026-04-01
  • PROJ-19: Mausrad-Scrollen in Lieferanten-Auswahl-Dropdown repariert (stopPropagation auf CommandList)
v1.21.0112026-04-01
  • PROJ-112: Profitbutler Farben verbessert (Gewinn/Marge dynamisch grün/rot, Kosten kräftiger)
  • PROJ-112: Kanal-Aufschlüsselung mit Perioden-Tabs zum Zeitraum-Wechsel (zeigt jetzt alle Kanäle)
v1.21.0082026-04-01
  • PROJ-78: Hersteller-Filter mit Ist/Ist-nicht-Modus und Ohne-Marke-Option (Negierung + Artikel ohne zugewiesene Marke filtern)
v1.21.0072026-04-01
  • PROJ-78: Hersteller-Filter zeigt Markennamen statt UUIDs im Dropdown und in den Filter-Chips
v1.21.0062026-04-01
  • PROJ-125: Hersteller/Marke wird bei ausgeklappten Kindvarianten in der Produkttabelle korrekt angezeigt
v1.21.0052026-04-01
  • PROJ-122: Hersteller-Dropdown in Massenbearbeitung 'Feld setzen' war leer (falsches Feld-Mapping brand_name vs. name)
v1.21.0042026-04-01
  • PROJ-19: Lieferant über Spreadsheet/Massenbearbeitung/Vererbung zugewiesen wird jetzt korrekt im Lieferant & Kosten-Tab angezeigt (supplier_products Sync)
v1.21.0022026-04-01
  • PROJ-129: Dokumenten-Kategorien CRUD — Eigene Kategorien erstellen, alle Kategorien bearbeiten/löschen/kopieren, Richtlinien & Normen inline editieren, Preset-Reset (einzeln oder alle), Zusatztexte in DB persistiert, Konformitätserklärung nutzt DB-Kategorien
v1.20.0192026-03-31
  • PROJ-128: Drag & Drop Sortierung für Varianten-Attribute — Werte-Bubbles und Attribut-Karten per DnD sortierbar, Kindartikel-Tabelle sortiert nach Werte-Reihenfolge
v1.20.0182026-03-31
  • PROJ-2: Unsaved-Changes UX — Sticky Banner mit Speichern/Verwerfen, deaktivierter Save-Button ohne Änderungen, Browser-Leave-Guard, Zurück-Button warnt bei offenen Änderungen
v1.20.0172026-03-31
  • PROJ-15: Parent-Child Checkbox-Kaskadierung — Elternartikel-Checkbox selektiert/deselektiert alle Kindvarianten, Indeterminate-State bei Teilauswahl, 'Alle auswählen' kaskadiert ebenfalls
v1.20.0162026-03-31
  • PROJ-127: Werte-Übertragung Eltern→Kind — Typ-Mismatch bei Zahlen behoben (EK-Preis, Gewicht etc.), Artikelmaße + TARIC-Code als übertragbare Felder ergänzt, Stale-State nach Speichern behoben, Fehlerbehandlung + Loading-Spinner + Unsaved-Changes-Banner hinzugefügt
v1.20.0152026-03-31
  • PROJ-92: Profilkarten zeigen jetzt Max Aufträge, Auftragstypen, Scan-Modus, Auto-Flags, Lagerplatz- und Tag-Filter
v1.20.0132026-03-31
  • PROJ-92: Picklisten-Wizard wählt jetzt das angeklickte Profil vor statt immer das erste aktive Profil
v1.20.0122026-03-31
  • PROJ-8: Import-Notizen für Kundenaufträge — Shopify note_attributes (z.B. Magnalister eBay-Metadaten) als eigenes Feld importieren und im Detail-Dialog anzeigen
v1.20.0112026-03-31
  • PROJ-19: Lieferant-Dropdown im Zuordnungsdialog scrollbar gemacht + Firmenzusatz unter Firmenname anzeigen
v1.19.0242026-03-31
  • PROJ-120: Firmenzusatz unter Firmenname in Lieferantenliste anzeigen
v1.19.0162026-03-31
  • PROJ-2: Gewicht-Eingabe erlaubt jetzt beliebig viele Dezimalstellen (step=any statt 0.01)
v1.19.0092026-03-31
  • PROJ-125: Lieferant- und Versandart-Spalten in der Produkttabelle zeigen jetzt Namen statt abgeschnittene UUIDs
v1.19.0052026-03-31
  • PROJ-125: localStorage-Key in useColumnConfig generalisiert (wms_table_columns_<tableKey>_<userId>) mit automatischer Migration vom alten Order-spezifischen Key
v1.19.0032026-03-31
  • PROJ-122: Lieferant Quick-Assign-Button in der Massenbearbeitungs-Toolbar
  • PROJ-122: Inline-Validierung im Spreadsheet mit roten Fehler-Zellen
  • PROJ-122: Warnung bei 500+ Artikeln im Spreadsheet
  • PROJ-122: Lieferant-Dropdown im 'Feld setzen'-Dialog war leer (suppliers-Prop nicht durchgereicht)
  • PROJ-122: Bestätigungsdialog für Lieferant-Schnellzuweisung hinzugefügt
  • PROJ-123: supplier_id zu übertragbaren Feldern im Vererbungsdialog hinzugefügt
  • PROJ-123: Debug-Stub Toolbar durch richtige VariantToolbar ersetzt
  • PROJ-123: ProductSlideOver Panel wieder eingebaut mit Prev/Next-Navigation
  • PROJ-123: Varianten-Tabellenzeilen klickbar für SlideOver
  • PROJ-123: Bulk-Action API-Parameter-Format korrigiert (params-Objekt, affected_count)
v1.19.0002026-03-30
  • PROJ-124: Eltern-Kind Zuordnung & Lösung — Kindartikel vom Elternartikel lösen und bestehende Produkte als Kind zuordnen
v1.18.0432026-03-30
  • PROJ-15: VariantCombinationsTable zeigt nur noch neue (nicht-angelegte) Kombinationen — kein doppeltes Tabellen-Display mehr
v1.18.0372026-03-30
  • PROJ-123: Variant-Tab-Absturz (React Error #185 / Maximum update depth exceeded) behoben — TanStack-Query-Hooks aus ProductFormContent in die Elternseite verschoben
v1.18.0332026-03-30
  • PROJ-122: Spreadsheet-Styling verbessert (Grid-Linien, Alternating Rows, Header, Fokus-Rahmen, Changed-Zellen)
  • PROJ-122: Cmd+C/V/D Tastenkürzel für Kopieren, Einfügen und Ausfüllen im Tabellen-Editor
v1.18.0322026-03-30
  • Versandverpackungen sortierbar via Pfeil-Buttons in Einstellungen, Sortierung wird im Produkt-Dropdown übernommen
v1.18.0302026-03-30
  • PROJ-123: Attribut-Umbenennung feuert nicht mehr per Tastendruck, sondern nur beim Speichern
  • PROJ-123: Rename-API aktualisiert Kindvarianten vor variant_attributes (bessere Atomizität)
  • PROJ-123: SQL-Migration verwendet DISTINCT-Subquery statt ungültigem jsonb_agg(DISTINCT ... ORDER BY ...)
  • PROJ-123: product_options in Shopify-Produkt-Preview nur noch am ersten Varianten-Eintrag pro Produkt
  • PROJ-123: members-Prop aus ProductSlideOver-Interface entfernt (war ungenutzt)
  • PROJ-123: VariantTable-Keys basieren auf attr.id statt mutablem attribute_name
  • PROJ-123: InheritanceDialog resettet selectedFields bei jedem Öffnen
v1.18.0292026-03-30
  • PROJ-123: Varianten-Tab mit VariantTable, VariantToolbar, InheritanceDialog, ProductSlideOver und SpreadsheetView integriert
  • PROJ-123: Varianten-API gibt jetzt alle für Tabelle und Slide-Over benötigten Felder explizit zurück
v1.18.028
  • PROJ-123: Vererbungs-Dialog — Felder vom Elternartikel auf ausgewählte Kindartikel übertragen (Gruppenauswahl, Vorschau)
  • PROJ-123: Produkt-Slide-Over — Schnellbearbeitung von Kindartikeln ohne Seitenwechsel (Sheet-Panel, Formular mit react-hook-form)
v1.18.027
  • PROJ-123: VariantAttributeBuilder — onRename-Callback für editierbare Attributnamen (DB-gesicherte Attribute)
  • PROJ-123: VariantTable — neue read-only Tabelle mit Checkbox-Selektion, dynamischen Attribut-Spalten und Status-Badges
  • PROJ-123: VariantToolbar — Varianten-spezifische Toolbar mit 'Werte übertragen'-Button über dem BulkActionToolbar
v1.18.026
  • PROJ-123: PATCH /api/products/[id]/variants/attributes — Umbenennung von Variantenattributen inkl. JSONB-Key-Update in allen Kindvarianten
v1.18.0242026-03-30
  • PROJ-123: Shopify-Produktimport verwendet jetzt echte Variantenattribut-Namen (Größe, Farbe) statt generischer Option1/Option2-Bezeichnungen
  • PROJ-123: variant_attributes werden beim Import des Elternartikels via replace_variant_attributes RPC befüllt
v1.18.0232026-03-30
  • PROJ-122: clear_field bulk-action prüft jetzt BULK_EDITABLE_FIELDS Allowlist (Security-Fix)
  • PROJ-122: AG Grid cell editors (Dropdown, Number) auf forwardRef+useImperativeHandle umgestellt
  • PROJ-122: AdjustPriceDialog sendet jetzt korrekte API-Modi (absolute/percentage mit Vorzeichen)
  • PROJ-122: SpreadsheetView useMemo-Abhängigkeiten für columnDefs auf spezifische Props eingegrenzt
v1.18.021
  • PROJ-122: Tabellen-Editor (Spreadsheet View) mit AG Grid Community
  • PROJ-122: Spalten-Picker mit Gruppen, Checkboxen und localStorage-Persistierung
  • PROJ-122: Custom Dropdown-Zelleditor für Referenzfelder (Hersteller, Versandart, etc.)
  • PROJ-122: Custom Zahlen-Zelleditor mit deutschem Dezimalformat (Komma-Support)
v1.18.020
  • PROJ-122: Bulk-Action Toolbar — BulkActionToolbar-Komponente mit SetFieldDialog (Feld+Wert in 2 Schritten, gruppiert nach Kategorie) und AdjustPriceDialog (5 Modi: absolut, ±%, ±€), inkl. AlertDialog-Bestätigungen für Archivieren/Löschen
v1.18.019
  • PROJ-122: POST /api/products/bulk-action Endpoint für Toolbar-Aktionen (set_field, clear_field, adjust_price, archive, unarchive, delete — mit filter-basierter Auswahl via all_matching)
v1.18.018
  • PROJ-122: PATCH /api/products/bulk Endpoint für Spreadsheet-Speichern (Bulk-Update einzelner Felder pro Produkt, Auth + Rate-Limit + 207 Multi-Status)
v1.18.017
  • PROJ-122: Bulk-Edit Validierungen — bulkUpdateSchema, bulkActionSchema, BULK_EDITABLE_FIELDS, NON_BULK_EDITABLE_FIELDS, validateBulkFieldValue
v1.18.0162026-03-30
  • PROJ-114: MIME-Type-Normalisierung & Cache-Busting bei Logo/Unterschrift-Upload (PNG-Fix)
v1.18.0152026-03-30
  • PROJ-114: Marken-Duplizierung nutzt download+upload statt storage.copy für zuverlässige Dateikopie
v1.18.0142026-03-30
  • PROJ-114: Marken direkt aus Tabellenübersicht duplizieren inkl. Logo & Unterschrift
v1.18.0132026-03-30
  • PROJ-114: Marke/Hersteller in Produktübersicht zeigt jetzt den Markennamen statt der UUID
v1.18.0122026-03-29
  • PROJ-8.5: Shopify-Import holt jetzt Produktbeschreibung (body_html) und Gewicht (kg-Konvertierung) mit
v1.18.0112026-03-29
  • Dev-Tools: Neues Cleanup-Target 'Produkte' — löscht alle Produkte, Bestände, Bestandsbuchungen, Wareneingänge und produktbezogene Daten
v1.18.0102026-03-27
  • PROJ-120: Feld 'Nächster Hafen' bei Lieferanten-Stammdaten hinzugefügt
v1.18.0092026-03-27
  • PROJ-120: Dev-Tools Lieferanten-Cleanup setzt jetzt auch supplier_number_next_seq zurück
v1.18.0072026-03-26
  • PROJ-85: Lager-Auswahl und Auto-Barcode beim Lagerplatz-Import — Dropdown für Ziel-Lager im Import-Wizard, Barcode wird automatisch aus Name generiert
v1.18.0062026-03-26
  • PROJ-85: Import von Lagerplätzen behoben — workspace_id-Injection, Duplikat-Erkennung und ON CONFLICT für warehouse-scoped Tabellen korrigiert
v1.18.0052026-03-26
  • PROJ-86: Export von Lagerplätzen behoben — storage_locations hat kein workspace_id, Filter läuft jetzt über warehouses-Join
v1.18.0002026-03-26
  • PROJ-121: Nachträgliche Sendungsnummern an Shopify — Zusatzlabels und Retourenlabels aus Auftragsdetails optional an Shopify syncen, Toggle pro Integration (Default: aus, Multi-Channel-sicher), Override pro Auftrag im Label-Popover, Kundenbenachrichtigungs-Option, Multi-Channel-Warnung
v1.17.0002026-03-25
  • PROJ-119: Produkte vollständig löschen (Hard Delete) — Admins können Produkte endgültig löschen (einzeln + Bulk), Abhängigkeitsprüfung (Bestand, Picklisten, Varianten, Bundles), Bestellpositionen werden automatisch in Freipositionen entkoppelt, 4-Phasen-Bestätigungsdialog
v1.15.0032026-03-24
  • PROJ-2: UVP-Feld (Unverbindliche Preisempfehlung) im Basis-Tab hinzugefügt, inkl. Daten-Hub Synonym-Mapping
v1.15.0022026-03-24
  • PROJ-85: Upsert ON CONFLICT fix für zusammengesetzte Unique-Constraints (workspace_id + key)
  • PROJ-84: JTL-Ameise Synonyme ergänzt (artikelname, versandgewicht, netto_ek, herkunftsland), country_of_origin im Schema-Overlay registriert
v1.15.0012026-03-24
  • PROJ-2: Produktbeschreibung-Feld (HTML/Fließtext) im Sonstiges-Tab hinzugefügt
  • PROJ-89: Tags von Sonstiges in den Basis-Tab verschoben
v1.15.0002026-03-24
  • Ausführliche Sync-Logs: Strukturierte Per-Item-Details für jeden Import (importiert/übersprungen/fehlgeschlagen mit Bestellnummer und Fehlergrund) (PROJ-118)
  • Detail-Sheet: Klickbare Sync-Log-Einträge öffnen Seitenleiste mit Admin-Übersicht und aufklappbaren technischen Details (PROJ-118)
  • Import-Rollback: Einzelne Imports rückgängig machen mit Bestätigungsdialog, Impact-Vorschau und verwaister-Kunden-Bereinigung (PROJ-118)
v1.14.0252026-03-24
  • PROJ-102: Billkom Kanäle-Tab zeigt nur noch Verkaufskanäle (Shop/Marketplace), keine Support-Integrationen wie FreeScout mehr
v1.14.0242026-03-24
  • Shopify-Import: Bestellungen ohne Tags schlugen fehl wegen NOT-NULL-Constraint auf metadata-Spalte — jetzt leeres Objekt statt null (PROJ-8)
v1.14.0232026-03-24
  • PROJ-2: ASIN-Feld (Amazon Standard Identification Number) bei Produkten hinzugefügt
v1.14.0222026-03-24
  • PROJ-100: Filter-Leiste (Status, Quellen, Kanäle) bleibt sichtbar wenn Kanal-Filter keine Ergebnisse liefert
v1.14.019
  • PROJ-117: Amazon FBM-Import erhält jetzt automatisch Versandart via Prioritätsauflösung (war vorher NULL)
  • PROJ-117: Versandarten-Priorität als Deployed markiert
v1.14.018
  • PROJ-117: Shopify-Import nutzt jetzt zentrale resolveShippingMethodByPriority() statt Inline-Sort-Order-Logik — shippingMethodSortOrders Map und Prefetch-Query entfernt
v1.14.017
  • PROJ-117: Versandarten-Priorität korrigiert — niedrigste sort_order gewinnt (ASC statt DESC)
  • PROJ-117: Fallback auf Grundversandart für Artikel ohne zugewiesene Versandart
  • PROJ-117: Toast-Info bei Fallback-Nutzung der Grundversandart
  • PROJ-117: Stale-Closure-Bug behoben — productShippingMap in useCallback-Deps ergänzt
  • PROJ-117: Inaktive Versandarten werden bei der Prioritätauflösung übersprungen
v1.14.016
  • PROJ-117: Orders-API nutzt jetzt resolveShippingMethodByPriority() statt eigenem Inline-Code (Service-Artikel-Filter, Inaktiv-Filter, Basis-Versandart-Fallback, ASC-Sortierung)
v1.14.015
  • PROJ-117: Info-Banner in Versandarten-Einstellungen (Prioritäts-Erklärung mit Truck-Icon)
  • PROJ-117: onReorder-Callback in ShippingMethodTable verdrahtet (Cache-Invalidierung nach Drag-and-Drop)
v1.14.014
  • PROJ-117: Neue Versandarten erhalten automatisch sort_order = MAX + 1, landen damit am Ende der Prioritätsliste
v1.14.013
  • PROJ-117: Drag-and-Drop Priorität für Versandarten-Tabelle – Prio-Spalte mit Griffpunkt, optimistisches UI, persistiert via /api/shipping-methods/reorder
v1.14.012
  • PROJ-117: Reorder-API für Versandarten hinzugefügt (PATCH /api/shipping-methods/reorder)
v1.14.0112026-03-23
  • PROJ-53: Importierte Bestellungen übernehmen jetzt das Original-Datum von Shopify statt dem Import-Zeitpunkt
v1.14.0102026-03-23
  • PROJ-53: Versandpositionen (Service-Artikel) werden jetzt immer als letzte Position in den Auftragsdetails angezeigt
v1.14.0092026-03-23
  • PROJ-53: Marketplace-Bestellnummern (Otto, Kaufland etc.) werden jetzt korrekt aus dem Shopify name-Feld übernommen statt der numerischen Sequenz
v1.14.0082026-03-23
  • PROJ-53: Shopify-Bestellungen werden jetzt in chronologischer Reihenfolge importiert (älteste zuerst)
  • PROJ-53: Shopify-Bestellname (z.B. #DE1001) wird in der Vorschau-Tabelle angezeigt
  • PROJ-53: 'Jetzt synchronisieren' zeigt jetzt die tatsächliche Fehlerursache statt generischer Meldung
  • PROJ-53: Deutsche Umlaute im Bestellungs-Vorschau-Dialog korrigiert
v1.14.0072026-03-23
  • PROJ-115: Vorschau nutzt direkte Download-URLs statt Preview-Endpoint (schneller, zuverlässiger)
  • PROJ-115: 'In OneDrive' Button nutzt echte Ordner-URL statt fragiler URL-Konstruktion
  • PROJ-115: HTML-Entities in webUrl werden korrekt dekodiert
  • PROJ-115: Loading-Spinner während Vorschau-Laden
v1.14.006
  • PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
  • Neuer Tab "Dokumente" in Produktdetailseite (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
  • 18 vordefinierte EU-Produktkategorien mit aktuellen Richtlinien und EN-Normen (Stand 2026)
  • EG-Konformitätserklärung mit Kategorie-Vorauswahl, Normen-Wizard und PDF-Generierung
  • Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen, Symbolen und Markdown-Editor
  • Umkarton-Etikett im Tool-Stack-Format (A4 Querformat, Barcode, Formularfelder)
  • Hersteller-Stammdaten erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
  • Hersteller duplizieren und echtes Löschen (inkl. Storage-Cleanup)
  • Einstellungen: "Marken & Hersteller" → "Produkte" mit Dokumenten-Konfiguration
  • Varianten-Support: Ein PDF für alle Varianten (Bilder im 3er-Raster, automatischer Seitenumbruch)
  • Dokumentation: Ausführliche Hilfeseite unter Artikel & Lager → Produktdokumente
v1.14.0052026-03-23
  • PROJ-116: Umkarton-Etikett PDF komplett neu geschrieben (A4 Landscape, Formularfelder, Barcode rechts)
v1.14.0042026-03-23
  • PROJ-116: Hard-Delete für Hersteller mit Logo/Signatur-Cleanup
v1.14.0022026-03-23
  • PROJ-116: Logo/Signatur-Upload, Duplizieren-Funktion, Umkarton-Etikett Null-Safety, PATCH-Validierung
v1.14.0012026-03-23
  • PROJ-116: PDF-Generatoren, Render-Dialoge und Download-Buttons verdrahtet
v1.14.000
  • PROJ-116: Produktdokumente — PDF-Generator & Dokumentenverwaltung
  • Neuer Tab "Dokumente" in Produktdetailseite
  • EG-Konformitätserklärung mit 18 EU-Produktkategorien und Normen-Wizard
  • Bedienungsanleitung (DE/EN) mit Sicherheits-/Pflegehinweisen
  • Umkarton-Etikett (Ein-Klick PDF)
  • Hersteller erweitert: Logo, Geschäftsführer, USt-ID, Handelsregister, Unterschrift
  • Einstellungen: Marken & Hersteller → Produkte mit Dokumenten-Konfiguration
v1.13.0372026-03-22
  • PROJ-115: Integration-Kategorie von 'Sonstiges' in 'Cloud-Speicher' umbenannt
v1.13.0362026-03-22
  • PROJ-115: Status auf Deployed gesetzt
v1.13.0352026-03-22
  • PROJ-115: type=button auf allen Cloud-Buttons (verhindert ungewolltes Form-Submit und 'Produkt aktualisiert'-Spam)
v1.13.0342026-03-22
  • PROJ-115: Cloud-Speicher von eigenem Settings-Tab in Integrationen-Seite verschoben (OneDrive-Karte)
v1.13.0332026-03-22
  • PROJ-115: Unterordner werden jetzt in allen Ordnerebenen als Kacheln angezeigt (nicht nur im Root)
v1.13.0322026-03-22
  • PROJ-115: Sidebar zeigt immer alle Root-Ordner (auch in Unterordnern), HTML-Entities in Dateinamen werden korrekt dekodiert
v1.13.0312026-03-22
  • PROJ-115: Rekursive SKU-Ordner-Suche beim Auto-Match (bis 3 Ebenen tief in Unterordnern)
v1.13.0302026-03-22
  • PROJ-115: Manufacturer-Join auf Produkt-Detailseite für Cloud Auto-Match Button
v1.13.0292026-03-22
  • PROJ-115: Lint-Fixes in Cloud-Komponenten (next/image, setState-in-Effect, useEffect-Dependencies)
v1.13.0282026-03-22
  • PROJ-115: Env-Vars Dokumentation, Feature-Index und Implementation Plan
v1.13.0272026-03-22
  • PROJ-115 Tasks 12-16: Cloud-Speicher Settings-Seite, Folder Picker, Dateien-Tab im Produktformular, File Browser mit Sidebar/Grid/List, Lightbox-Vorschau, Upload-Zone
v1.13.0262026-03-22
  • PROJ-115: Dateien-Tab in Produktdetails + Cloud File Browser (Sidebar, Ordner-Kacheln, Thumbnail-Grid, Dateiliste)
v1.13.0252026-03-22
  • PROJ-115: Cloud Folder Picker Dialog (Breadcrumb-Navigation, Ordner-Auswahl per Klick/Doppelklick)
v1.13.0242026-03-22
  • PROJ-115: Cloud-Speicher Einstellungsseite (OneDrive-Verbindung, Basis-Ordner, Ordner-Vorlagen, Bulk Auto-Match)
v1.13.0232026-03-22
  • PROJ-115: TanStack Query Hooks für Cloud Storage (Connections, Files, Folders, Templates, Product-Folder)
v1.13.0222026-03-22
  • PROJ-115: Bulk Auto-Match API (alle Produkte automatisch per Marke + SKU mit Cloud-Ordnern verknüpfen)
v1.13.0212026-03-22
  • PROJ-115: Ordner-Vorlagen API (CRUD + Drag & Drop Sortierung)
v1.13.0202026-03-22
  • PROJ-115: Product-Cloud-Folder API (Verknüpfung, Auto-Match per Marke/SKU, Ordnerstruktur erstellen)
v1.13.0192026-03-22
  • PROJ-115: Cloud File & Folder API Routes (List, Create, Upload, Download, Rename, Move, Delete, Thumbnail, Preview) + get-provider Helper mit Auto-Token-Refresh
v1.13.0182026-03-22
  • PROJ-115: OAuth2 Flow (CSRF-State, Token-Verschlüsselung) + Connection Management API (CRUD, Root-Folder-Update)
v1.13.0172026-03-22
  • PROJ-115: Zod-Validierungsschemas + DB-Row-Types für Cloud Storage (Folder-Templates, Connections, Product-Folder-Links)
v1.13.0162026-03-22
  • PROJ-115: OneDrive Provider (Microsoft Graph API) + Provider Factory für Cloud-Storage-Modul
v1.13.002
  • PROJ-113: Nicht-Admin-Nutzer sehen Firmendaten-Formular jetzt als schreibgeschützt (alle Felder deaktiviert, Speichern-Button ausgeblendet, Logo-Aktionen ausgeblendet)
  • PROJ-113: Logo-Upload zeigt jetzt eine Warnung wenn das Bild kleiner als die empfohlene Mindestgröße von 600×200 Pixeln ist
v1.13.0012026-03-22
  • PROJ-113: Sender-Snapshot wendet Override-Logik (company_overrides) jetzt auch auf Finanzfelder an (vat_id, tax_number, trade_register, managing_director, bank_name, bank_iban, bank_bic, bank_account_holder)
v1.12.0142026-03-22
  • PROJ-113: LB-PDF neues Header-Layout — Logo, Absenderzeile, Liefer-/Rechnungsanschrift, Bearbeiter, zentrierter Titel
v1.12.0132026-03-22
  • PROJ-113: Billkom PDF-Generator company_overrides & Logo-Fallback (billkom-logos → workspace-logos)
v1.12.0122026-03-22
  • PROJ-113: Billkom Setup-Wizard — Button 'Firmendaten aus Workspace übernehmen' zum Prefill aller Felder
v1.12.0112026-03-22
  • PROJ-113: Billkom Company-Tab Override-UI — OverridableField-Pattern mit Workspace-Werten als Read-Only, Per-Field Override mit Badges, Logo-Override
v1.12.0102026-03-22
  • PROJ-113: Billkom Override-Logik — companyOverridesSchema, company_overrides in UpdateSettingsSchema, workspace_company im GET-Response
v1.12.0092026-03-22
  • PROJ-113: Workspace-Einstellungen mit Tab-Struktur (Firmendaten + Nummernkreise), Logo-Upload, Firmendetails, Steuerdaten, Bankverbindung
v1.12.006
  • PROJ-113 Task 1: DB-Migration — Workspace-Firmenprofil (company_name, Adresse, Bankdaten, USt-ID, Logo-URL), billkom company_overrides JSONB, Storage Bucket workspace-logos mit RLS
v1.12.0052026-03-22
  • PROJ-24: SKU + EAN als Textzeile unter jedem Produktnamen im Bestell-PDF
v1.12.0042026-03-22
  • PROJ-24: Ländernamen im englischen PDF übersetzen (Deutschland → Germany etc.)
v1.12.0032026-03-22
  • PROJ-24: Ziellager-Auswahl auf Bestellungen, Firmendaten (Absender) + Lager-Lieferadresse im PDF nebeneinander
v1.12.0022026-03-22
  • PROJ-24: Bestellungssprache pro Lieferant (DE/EN) für PDF-Export, Produktbilder in jeder Position
v1.12.0012026-03-22
  • PROJ-112: Fix column name unit_price → price_per_unit in migration index
v1.12.0002026-03-22
  • PROJ-112: Phase 3 complete — Profitbutler Statistik mit Dashboard, Fixkosten, Kanal-Aufschlüsselung, CSV/PDF-Export
v1.11.0132026-03-22
  • PROJ-112: PDF-Export — Server-side PDF-Generierung mit jsPDF/autotable, API-Route /api/profitbutler/stats/export
v1.11.0122026-03-22
  • PROJ-112: CSV-Export — Client-side CSV-Generierung mit deutschem Zahlenformat, UTF-8 BOM, Exportieren-Dropdown in Filterleiste
v1.11.0112026-03-22
  • PROJ-112: Profitbutler Tagesstatistik Cron-Job-Eintrag in Settings-Seite
v1.11.0102026-03-22
  • PROJ-112: Daily Stats Aggregation — Tagesstatistiken vorberechnen mit Backfill-Support, Aggregate-Shortcut in Stats API für schnellere Ladezeiten
v1.11.0092026-03-22
  • PROJ-112: Konfigurierbare Zeiträume — User Preferences API, Period Config Dialog mit Drag-Reihenfolge, Custom-Zeitraum-Eingabe, max 10 Spalten
v1.11.0082026-03-22
  • PROJ-112: Quartal-, Jahres- und Custom-Zeitraum-Parser mit TDD (quarter, year, custom:YYYY-MM-DD:YYYY-MM-DD)
v1.11.0072026-03-22
  • PROJ-112: Empty States für nicht konfigurierte Profitbutler-Settings und inaktives Billkom-Modul, Channel-Dropdown in Fixkosten-Dialog zeigt jetzt alle Kanäle aus Bestellungen
v1.11.0062026-03-22
  • PROJ-112: Echte Versand-/Verpackungs-/PickPack-Kosten in Stats API — shipping_method_country_costs, shipping_packagings und product_profitbutler_settings für reale Kostenberechnung statt Nullen
v1.11.0052026-03-22
  • PROJ-112: Kostenberechnungsmodul extrahiert — Pure Functions für Versand, Verpackung, Pick&Pack, Wareneinsatz, Provision, Werbung, MwSt mit 18 Unit-Tests
v1.11.0032026-03-22
  • PROJ-112: Profitbutler Tests — 14d/90d/unknown Period Resolution, negative netRevenue, Leap Year 366d, Weekly due_date, Channel-Scoped Fixed Cost, Partial Period Validity
v1.11.0022026-03-22
  • PROJ-112: Rechnungsansicht ignoriert Kanal- und Produkt-Filter nicht mehr — Filter werden über Auftragsverknüpfung angewendet
  • PROJ-112: Kanalaufschlüsselung zeigt jetzt Daten für Rechnungsansicht (über billkom_documents → orders Join)
  • PROJ-112: Kanal-Profit und Marge werden mit dynamischem Profitfaktor berechnet statt hartcodierter 0
  • PROJ-112: Query-Limits erhöht (50k Bestellungen, 100k Positionen, 50k Belege) mit Truncation-Warnungen bei Überschreitung
v1.10.0322026-03-22
  • PROJ-112: Pick & Pack Kosten in Workspace-Standardwerten und Produkt-Overrides — neuer Standardwerte-Tab in Profitbutler-Settings, EUR-Eingabe pro Stück, produktspezifische Überschreibung mit Workspace-Default als Placeholder
v1.10.0312026-03-22
  • PROJ-112: Revenue/Profit Chart mit Recharts — Umsatz als Balken, Gewinn als Linie, 7T/14T/30T/90T Zeitraumwahl, Orders/Invoices View, Dark-Theme-Tooltip
v1.10.0302026-03-22
  • PROJ-112: Fixkosten Settings Tab — Summary Cards, Add/Edit Dialog mit Zod-Validierung, CRUD-Tabelle mit Pause/Resume/Löschen, Kanalzuweisung, Abschreibungsmodi
v1.10.0292026-03-22
  • PROJ-112: Fixed Costs CRUD API — GET/POST Liste & Erstellen, PATCH/DELETE Einzeleintrag, Pause/Resume Toggle
v1.10.0272026-03-22
  • PROJ-112: Profitbutler KPI-Widgets auf Dashboard (admin-only) — Tagesumsatz, Tagesgewinn, Marge mit Link zu /dashboard/profitbutler
v1.10.0262026-03-22
  • PROJ-112: Artikelsuche mit Autocomplete und Multi-Select — debounced Suche gegen /api/products, Produkt-Badges mit Entfernen, Filter Bar Integration
v1.10.0252026-03-22
  • PROJ-112: Kanal-Aufschlüsselung — Collapsible Section mit Kanal-Cards (Umsatz, Anteil, Gewinn, Marge), responsive Grid
v1.10.0242026-03-22
  • PROJ-112: Sellerboard-Tabelle mit aufklappbaren Kostengruppen (Warenkosten, Logistik, Vertrieb, Steuern, Fixkosten), Gewinn/Marge/Bestellungen, formatCents Helper
v1.10.0232026-03-22
  • PROJ-112: Profitbutler Filter Bar — Kanal-Dropdown (Alle Kanäle + Einzelkanäle), Aufträge/Rechnungen-Toggle mit Tabs
v1.10.0222026-03-22
  • PROJ-112: React Query Hook für Stats API — useProfitbutlerStats mit View/Periods/Channel/ProductIds Params
v1.10.0212026-03-22
  • PROJ-112: Profitbutler Stats Page Shell — Server Component mit Admin-Guard, Client Shell mit View/Channel/Period State
v1.10.0202026-03-22
  • PROJ-112: Profitbutler Sidebar-Navigation — Admin-only Nav Item mit TrendingUp Icon, adminOnly-Flag im NavItem Interface
v1.10.0192026-03-22
  • PROJ-112: Stats API Endpoint — /api/profitbutler/stats mit Revenue, Kosten, Gewinn pro Periode, Kanal-Aufschlüsselung, Orders/Invoices-View
v1.10.0182026-03-22
  • PROJ-112: Profitbutler Stats-Berechnungslogik mit TDD (resolvePeriodToDateRange, calculatePeriodStats, calculateGroupedCosts, calculateMarginPct)
v1.10.0172026-03-22
  • PROJ-112: Fixed-Cost-Berechnung mit TDD — calculateDailyFixedCost (distributed/due_date), calculateFixedCostsForPeriod, 12 Unit-Tests
v1.10.0162026-03-22
  • PROJ-112: Stats-Types & Interfaces für Profitbutler Statistik-Modul (PeriodStats, FixedCost, StatsResponse etc.)
v1.10.0142026-03-21
  • PROJ-98: Versand-/Service-Positionen werden in Auftragsdetails immer als letzte Positionen angezeigt
v1.10.0132026-03-21
  • PROJ-98: Shopify shipping_lines als Versandpositionen importieren — Versandkosten kommen bei Shopify nicht in line_items sondern in shipping_lines, werden jetzt mit Shipping Detection verarbeitet
v1.10.0122026-03-21
  • PROJ-98: Ziel-Artikel-Dropdown in Versandpositions-Erkennung war leer — data.products → data.data korrigiert
v1.10.0112026-03-21
  • PROJ-53: Fix Reverse Carrier Matching — is_default → is_base_method Spaltenname korrigiert, Debug-Logs entfernt
v1.10.0092026-03-21
  • PROJ-53: Reverse Carrier Matching — Shopify tracking_company wird über shopify_carrier_mappings rückwärts auf WMS-Versandart gemappt, damit Retoure-Button und Carrier-Features bei importierten Bestellungen funktionieren
v1.10.0082026-03-21
  • PROJ-53: Shopify Fulfillment-Daten beim Import übernehmen — Tracking-Nummern und shipped_at für bereits versendete Bestellungen als completed shipping_tasks importieren
v1.10.0072026-03-21
  • PROJ-107: Ländercodes bei Import normalisieren — Shopify/Amazon FBM/FBA nutzen jetzt normalizeCountryCode(), ~60 neue Länder-Mappings (EN+DE), 10 neue Dropdown-Einträge
v1.10.0012026-03-20
  • PROJ-111: FreeScout-Flowkom Connector — Read-only Lookup-API, API-Key-Authentifizierung, Marketplace-URL-Builder, Integration-Registry (freescout + support-Kategorie), DB-Migration
v1.09.035
  • Auftragsstornierung mit Beleg-Aktionen: Rechnung stornieren oder Gutschrift erstellen bei Auftragsstornierung (PROJ-110)
  • Void-Logik in wiederverwendbare Funktionen extrahiert (void-document.ts, create-credit-note.ts)
v1.09.0342026-03-20
  • PROJ-110: Erweiterter Stornierungsdialog in Auftragsübersicht — gleiche Cancel-Preview mit Belegaktionen wie im Detaildialog (Rechnungen stornieren/gutschreiben, weitere Belege, Entwurf-Löschung)
v1.09.0332026-03-20
  • PROJ-110: Erweiterter Stornierungsdialog — Rechnungs-Aktionen (Stornieren/Gutschrift/Nichts), Checkbox für weitere Belege, automatische Entwurf-Löschung, Cancel-Preview-API
v1.09.0322026-03-20
  • PROJ-110: Cancel-Route mit optionalen Document Actions — Belege vor Stornierung löschen/stornieren/gutschreiben (void/credit_note/delete), Validierung aller Aktionen vor Ausführung, Audit-Trail mit document_actions
v1.09.0302026-03-20
  • PROJ-110: Void-Route nutzt extrahierte voidDocument-Funktion (Refactoring für Wiederverwendung in cancel-with-documents)
v1.09.0292026-03-20
  • PROJ-110: createFullCreditNote-Funktion — erzeugt vollständige Gutschrift aus Rechnung ohne Stornierung (für versendete Bestellungen)
v1.09.0282026-03-20
  • PROJ-110: Extract voidDocument function into reusable lib (Billkom Phase 3)
v1.09.026
  • Gutschrift-Dialog erweitert: Dual-Modus (Positionen/Betrag) mit Brutto/Netto-Toggle
  • Verbleibender Rechnungsbetrag wird im Gutschrift-Dialog angezeigt
  • Übersteigung-Warnung mit Pflicht-Begründung statt Hard-Block
  • Belegübersicht in Auftrags-Details zeigt Rechnungen, Gutschriften und effektiven Umsatz
  • Preisnachlass-Feature komplett entfernt (ersetzt durch erweiterte Gutschrift)
v1.09.0252026-03-20
  • PROJ-109: Belegübersicht im Auftragsdetail-Dialog — Rechnungen mit Gutschriften und effektivem Umsatz (brutto), klickbare Belegnummern öffnen DocumentDetailDialog
v1.09.0232026-03-20
  • PROJ-109: Dual-Mode Gutschriftdialog — Umschaltung Positionen/Betrag, Restrechnungsinfo-Box mit Rechnungsbetrag/Gutschriften/Verbleibend, Betragseingabe (brutto/netto) mit Live-Berechnung, Überschreitungs-AlertDialog mit Pflicht-Begründung (min. 10 Zeichen)
v1.09.0222026-03-20
  • PROJ-109: Preisnachlass-Button und BillkomDiscountDialog aus documents-tab entfernt, calculateRemainingBalance integriert, activeInvoice und remainingBalance an DocumentFormDialog übergeben
v1.09.0212026-03-20
  • PROJ-109: Amount-mode Gutschriften mit Concurrency-Lock, Betragsberechnung (gross/net), Überschreitungsvalidierung und Audit-Trail (exceeding_reason Event)
  • PROJ-109: Positions-mode Gutschriften mit related_document_id, Überschreitungsvalidierung und exceeding Event-Logging
v1.09.0202026-03-20
  • PROJ-109: useRemainingInvoiceBalance-Hook hinzugefügt — leitet Restbetrag aus useBillkomDocumentsByOrder via calculateRemainingBalance ab
  • PROJ-109: useCreateDiscount (Preisnachlass) aus use-billkom.ts entfernt
v1.09.0182026-03-20
  • PROJ-109: CreditNoteAmountSchema (Betragsmodus mit gross/net-Refinement) und CreditNotePositionsSchema (Positionsmodus via CreateDocumentSchema.extend) hinzugefügt
  • PROJ-109: DiscountSchema (Preisnachlass) entfernt
v1.09.016
  • Auftragslöschung mit Belegen: Vollständige Löschung inkl. Billkom-Dokumente & Nummern-Rückgabe (PROJ-108)
  • Umlaute in Bestätigungsdialogen und Orders-API korrigiert
v1.09.0142026-03-20
  • PROJ-108: Zweistufiger Lösch-Dialog in Auftragsübersicht — optionale Beleglöschung mit Checkbox, Dokumentenliste, GoBD-Warnung, Bestätigungseingabe; Umlaut-Korrekturen
v1.09.0132026-03-20
  • PROJ-108: Zweistufiger Lösch-Dialog in Auftragsdetails — optionale Beleglöschung, Dokumentenliste mit Zahlungsstatus, Bestätigungseingabe bei Beleglöschung (GoBD-Warnung)
v1.09.0112026-03-20
  • PROJ-108: DELETE /api/orders/:id ruft bei includeDocuments=true die RPC delete_order_with_documents auf (atomische Löschung mit Belegen & Nummernkreis-Rückgabe)
v1.09.0082026-03-20
  • PROJ-108: RPC delete_order_with_documents — atomische Auftragslöschung mit Belegen, Nummernkreis-Rückgabe, Quotation-Reset, FOR UPDATE Locks
v1.09.0072026-03-20
  • PROJ-107: QA Cleanup — Test für logo_url-Feld korrigiert, doppelte Ländercodes entfernt, || 19 Falsy-Bug in Angebots-/Konvertierungslogik behoben, TS-Fehler behoben
v1.09.0032026-03-20
  • Shopify-Import: Rechnungsadresse + Lieferanschrift werden jetzt beide importiert (billing_address + shipping_address)
v1.09.0012026-03-20
  • PROJ-107: Fehlende shipping_country-Normalisierung nachgeholt (35 Länder-Mappings die in der ursprünglichen Migration fehlten)
  • PROJ-107: Gesamt-Spalte im Auftragsdetail berücksichtigt jetzt den Rabatt (discount_percent)
v1.08.0462026-03-20
  • PROJ-107: Steuerprüfung ist jetzt Pflicht vor Rechnungserstellung — bei fehlgeschlagener Prüfung Toast-Fehler statt Dialog-Öffnung; 'Erstellen & Finalisieren' in DocumentFormDialog gesperrt bis Steuer-Szenario ermittelt, Hinweistext unter dem Button
v1.08.0452026-03-20
  • PROJ-107: Billkom-Belegstatus-Badge im Auftragsdetail-Dialog (Entwurf/Rechnungsnummer/Bezahlt/Teilzahlung), ORDER_DETAIL_SELECT um billkom_documents!order_id erweitert
v1.08.0442026-03-20
  • PROJ-107: SKU wird beim Erstellen von Billkom-Belegen aus Auftragsposition in billkom_document_items übernommen (DocumentItemSchema, document-form-dialog, documents API)
v1.08.0432026-03-20
  • PROJ-107: Auftragsdetail-Dialog auf 8 Spalten erweitert (Art.-Nr., Bezeichnung, Menge, Einheit, E.-Preis, MwSt %, Rabatt %, Gesamt) + Summenblock mit Netto/MwSt-Aufschlüsselung pro Steuersatz
v1.08.0422026-03-20
  • PROJ-107: Auto-MwSt im Auftragsformular basierend auf Kundenland (Tax-Preview-Banner, automatische Steuersatz-Setzung, Read-Only MwSt bei aktivem Szenario)
v1.08.0412026-03-20
  • PROJ-107: GET /api/billkom/tax-preview Endpoint + useTaxPreview Hook (vereinfachte Steuer-Vorschau per customer_id, Standard- & Ermäßigter Satz)
v1.08.0392026-03-20
  • PROJ-107: Länder-Freitext durch Combobox-Dropdown ersetzt (34 Länder, Suche nach Name/Code, Warnung bei unbekannten Werten)
v1.08.0382026-03-20
  • PROJ-107: COUNTRY_LIST für Länder-Dropdown-Combobox exportiert (34 Länder mit deutschen Labels)
v1.08.0372026-03-20
  • SKU (Art.-Nr.) immer leer auf Rechnungen — product_id wurde nicht von Auftrags-Positionen an Beleg-Positionen übergeben
  • 7% MwSt wird als 19% gespeichert — fehlende Felder (tax_rate_percent, unit, discount_percent) in order_line_items SELECT
  • Schweizer Kunde bekommt deutsche USt — billing_country 'Schweiz' wird jetzt zu 'CH' normalisiert (zentrale normalizeCountryCode Utility)
  • Country-Normalisierung in allen 5 Finalize/Dunning-Endpoints + Queue Processor
v1.08.0342026-03-20
  • PROJ-103: DIN 5008 Form B Layout für PDF-Rechnungen (korrekte Abstände, Falz-/Lochmarken, Logo proportional skaliert in fester Box)
v1.08.0302026-03-20
  • PROJ-103: ZUGFeRD-PDF auf Deutsch (locale de-DE), Logo-Einbindung aus Billkom-Settings, Artikelnummer (SKU) in Positionstabelle
v1.08.0282026-03-20
  • PROJ-103: Ländernamen→ISO-Code Normalisierung für ZUGFeRD — 'Deutschland' statt 'DE' im customer_snapshot verursachte Profil-Validierungsfehler
  • PROJ-103: DB-Snapshot Feldnamen-Mapping für ZUGFeRD/XRechnung — sender_snapshot nutzt Settings-Keys (zip, address_line1, bank_iban) statt Mapper-Keys (postal_code, street, iban)
  • PROJ-103: Diagnostik-Daten in ZUGFeRD-Fehlermeldung für schnelleres Debugging
v1.08.024
  • PROJ-106: Billkom Positions-Integration & PDF-Overhaul — Einheitliche Positionskette Angebot→Auftrag→Rechnung
  • PROJ-106: Pixkom-Style PDF-Layout mit Logo, Artikelnummer, dreispaltiger Fußzeile, Zahlungsstatus
  • PROJ-106: Logo-Upload in Billkom-Einstellungen (Drag & Drop)
  • PROJ-106: Freiposition-Support in Kundenaufträgen und Angeboten
  • PROJ-106: Abweichungswarnungen und Teilrechnungen im Beleg-Dialog
  • PROJ-106: Shopify/Amazon Import mit Netto-Preisen und erweiterten Positionsfeldern
  • PROJ-106: Rückwärts-Tracking zwischen Angebot, Auftrag und Rechnung
  • PROJ-106: order_line_items Preise von Brutto auf Netto umgestellt
  • PROJ-106: Produkte um default_tax_category und default_unit erweitert
v1.08.0202026-03-20
  • PROJ-103: Umfassender Empty-String-Schutz im ZUGFeRD-Mapper — Pflichtfeld-Validierung + nonEmpty()-Guard für alle optionalen Felder
v1.08.0192026-03-20
  • TypeScript-Fehler in Etikettenformat-Dialog behoben (z.coerce.number → z.number + valueAsNumber)
  • TypeScript-Fehler in Auftragsdetail-Dialog behoben (Shopify-Fulfillment-Felder in OrderMetadata explizit typisiert)
v1.08.0182026-03-20
  • PROJ-103: ZUGFeRD-Download bei leerem vat_id gefixt — leere Strings verursachten 'Unknown Profile'-Fehler in factur-x-kit
v1.08.0172026-03-20
  • PROJ-98: Bestandsführung-Toggle von Tab Lieferant & Kosten nach Basisdaten verschoben
v1.08.0072026-03-20
  • PROJ-102: Nummernkreise verschwinden nach Bearbeitung — Default-Sequences werden jetzt mit DB-Einträgen gemergt statt nur bei leerer DB angezeigt
v1.08.0022026-03-20
  • PROJ-104: Produkt-Suche im Angebots-/Proforma-Formular — Artikel direkt aus Produktstamm hinzufügen mit SKU, Preis (Profitbutler VK), product_id-Verknüpfung für Auftragskonvertierung
  • PROJ-104: "Neuer Auftrag"-Button im Angebote-Tab ausgeblendet
v1.08.000
  • Billkom Phase 3: Angebote & Proforma-Rechnungen (CRUD, Finalisieren, Auftrag erstellen)
  • Billkom Phase 3: Mahnwesen mit 3 Stufen (Einzel + Batch, pg_cron Überfälligkeitserkennung)
  • Billkom Phase 3: GoBD-konforme Korrekturbearbeitung mit Concurrent Locking
  • Mahnwesen-Settings-Tab (Fristen + Gebühren pro Stufe)
  • Angebote-Tab auf Auftragsseite (nur bei billkom_enabled)
v1.07.0322026-03-20
  • PROJ-21: Auftragspositionen verschiebbar — Reihenfolge per Hoch/Runter-Buttons, persistiert über position-Spalte in DB
v1.07.0312026-03-19
  • PROJ-103: Konfigurierbares Belegnummernformat — Mit/Ohne Jahreszahl, Kurzjahr, Trennzeichen und Stellenanzahl pro Dokumenttyp einstellbar
v1.07.0292026-03-19
  • PROJ-103: Auftragspositionen werden jetzt automatisch in die Rechnungserstellung übernommen (orderLineItems Prop fehlte)
  • PROJ-103: Validierungsfehler bei leeren optionalen Feldern (E-Mail, Website, HRB, USt-ID, etc.) behoben — leere Strings werden zu null transformiert
v1.07.0282026-03-19
  • PROJ-103: Kanäle-Tab zeigt jetzt alle verbundenen Integrationen (auch ohne gespeicherte Config) — Merge von Integrations-API + Channel-Configs mit Defaults, tax_handling-Enum-Mismatch behoben
  • PROJ-103: Nummernkreise-Präfix editierbar — PUT /api/billkom/sequences (admin-only, nur wenn current_value=0), Inline-Edit-UI mit Vorschau
v1.07.0242026-03-19
  • PROJ-102: TypeScript-Fehler in tax-engine.test.ts behoben — Cast via unknown für Record<string, unknown>
v1.07.0232026-03-19
  • PROJ-103: TypeScript-Fehler behoben — Buffer/Uint8Array BodyInit-Kompatibilität, FacturX.fromObject() statt nicht-exportiertem ComfortProfileConverter, profile-Feld aus TotalsCalculatorInputType entfernt, null→undefined Coercion für customerId
v1.07.0212026-03-19
  • PROJ-103: Phase-2-Integration in Belege-Tab — BillkomDownloadButtons (PDF/ZUGFeRD/XRechnung) ersetzt Einzel-Download, canCreateInvoice-Guard mit Tooltip, Tax-Preview vor manueller Rechnungserstellung, Preisnachlass-Button + Discount-Dialog für aktive Rechnungen
v1.07.0202026-03-19
  • PROJ-103: Tax-Info-Komponente (Steuer-Szenario-Badge, Warnungen), Download-Buttons (PDF/ZUGFeRD/XRechnung mit Tooltip), Preisnachlass-Dialog (Live-Berechnung, Validierung, useCreateDiscount)
v1.07.0192026-03-19
  • PROJ-103: Kanäle-Tab in Billkom-Einstellungen mit Channel-Config-Cards (Steuerbehandlung, Absenderland, Zahlungsart, Auto-Rechnung, Auto-Bezahlt pro Kanal)
v1.07.0182026-03-19
  • PROJ-103: Job Queue Processor (processJobQueue) mit Batch-Claim, Workspace-Advisory-Lock, paralleler Workspace-Verarbeitung, Tax-Engine-Integration, Duplikatschutz, Auto-Finalisierung, Auto-Paid-Markierung und Cron API Route (POST /api/billkom/queue/process)
v1.07.0172026-03-19
  • PROJ-103: Discount (Preisnachlass) API-Endpoint mit Row-Locking, Teilgutschrift-Erstellung, Betragsvalidierung, Invoice-Status-Update und useCreateDiscount Hook
v1.07.0162026-03-19
  • PROJ-103: Channel Config GET/PUT API Routes (authenticateRequest/authenticateAdmin, rateLimitAsync, Zod-Validierung) und TanStack Query Hooks (useChannelConfigs, useUpdateChannelConfig)
v1.07.0152026-03-19
  • PROJ-103: Download-Endpoint um ZUGFeRD- und XRechnung-Formate erweitert (format Query-Parameter, Status-Prüfung auf finalisierte Belege, buyer_reference-Validierung für XRechnung, TaxResult aus Snapshot)
v1.07.0142026-03-19
  • PROJ-103: E-Invoice Adapter (EInvoiceGenerator) mit dynamic import für factur-x-kit (ZUGFeRD Comfort PDF/A-3) und xrechnung-generator (XRechnung UBL 2.1 XML), Singleton-Export, 7 Tests
v1.07.0132026-03-19
  • PROJ-103: XRechnung UBL 2.1 Mapper (mapToXRechnungInput) für xrechnung-generator Library, cents→decimal Konvertierung, buyer_reference Pflichtvalidierung, Supplier/Customer/Payment/LineItems Mapping, Reverse-Charge Notes, 57 Tests
v1.07.0122026-03-19
  • PROJ-103: ZUGFeRD ComfortProfile Mapper (mapToZugferdInput) mit TotalsCalculatorInputType-Ziel, cents→decimal Konvertierung, Discount-Allowances, Reverse-Charge taxExemptionReason, SEPA-Bankdaten, 41 Tests + Shared Fixtures
v1.07.0112026-03-19
  • PROJ-103: factur-x-kit@0.3.1 und xrechnung-generator@1.1.0 als Dependencies installiert (ZUGFeRD/Factur-X PDF-Einbettung + XRechnung UBL-XML-Generierung)
v1.07.0082026-03-19
  • E-Invoice Types, Unit Codes & Tax Category Mappings (PROJ-103): BillkomDocumentForInvoice/ItemForInvoice Interfaces, EInvoiceGenerator Interface, INVOICE_TYPE_CODES (380/381/325), UN/ECE Unit Code Map (11 WMS-Einheiten → CEFACT), Tax Category Map (7 Szenarien → ZUGFeRD-Codes S/AE/G/O)
v1.07.006
  • PROJ-102 Billkom Phase 1 als Deployed markiert
v1.07.005
  • Settings: Steuern-Tab (EU-Steuersätze, OSS-Status)
  • Settings: Nummernkreise-Tab (Präfix, Nächste-Nummer)
  • Corrective Edit Dialog (GoBD-Warnung)
  • Tax Preview (Live-Steuervorschau im Formular)
  • API: /tax-rates und /sequences Endpoints
v1.07.004
  • Bugfixes: 4 kritische + 6 wichtige Fehler behoben (DB-Spaltennamen, Corrective Edit Beträge, Search-Injection, Tax-Kategorie)
v1.07.002
  • PROJ-102: Billkom-Integrationspoints verdrahtet — konditionaler "Belege"-Tab im Auftragsdetail-Dialog (lazy-loaded, billkom_enabled-Flag), Phase-3-Kommentar in Auftragsübersicht
  • PRD aktualisiert: Rechnungsmodul (Billkom) aus Non-Goals herausgenommen, Billkom Phase 1-3 in Roadmap-Tabelle aufgenommen
v1.07.0012026-03-19
  • Billkom Document UI Components (PROJ-102): Belege-Tab für Auftragsdetails, Beleg-Detail-Dialog mit Positionen/Zahlungen/Aktionen, Beleg-Formular-Dialog mit dynamischen Positionen und Live-Summenberechnung, Zahlungsbuchungs-Dialog, Stornierungs-Dialog mit Gutschrift-Hinweis
v1.07.0002026-03-19
  • Billkom Settings-Seiten & Setup-Wizard (PROJ-102): Settings-Navigation-Eintrag, Hauptseite mit Tab-Navigation (Unternehmen, Zahlungen, Vorlagen), 3-Schritt-Setup-Wizard mit Firmen- und Bankdaten, Skonto-Konfiguration, Accordion-Vorlagen-Editor für 6 Belegtypen
v1.06.012
  • src/hooks/use-billkom.ts — TanStack Query hooks für alle Billkom-Endpunkte (Settings, Dokumente, Zahlungen, Tax/VIES)
  • src/components/billkom/status-badge.tsx — BillkomStatusBadge-Komponente mit 7 Status-Konfigurationen (Entwurf, Finalisiert, Teilbezahlt, Bezahlt, Überfällig, Storniert, Umgewandelt)
v1.06.011
  • pdf-generator.ts — Billkom PDF-Generator mit jsPDF + jspdf-autotable; rendert aus Snapshots (customer_snapshot, sender_snapshot, tax_rate_snapshot)
  • GET /api/billkom/documents/[id]/download — PDF-Download-Endpoint aktiviert, gibt echtes PDF statt 501 zurück
v1.06.010
  • POST /api/billkom/payments — Zahlung an Beleg buchen, DB-Trigger aktualisiert Status
  • DELETE /api/billkom/payments/[id] — Zahlung löschen (Admin only)
  • POST /api/billkom/tax/check — Steuervorschau ohne Belegerststellung
  • POST /api/billkom/tax/vies-validate — USt-IdNr. via EU VIES API validieren mit Caching
v1.06.0092026-03-19
  • Billkom Document Action APIs (PROJ-102): Finalize (Tax Engine + Snapshot + RPC), Void (Admin-only + Auto-Gutschrift), Corrective Edit (GoBD SET LOCAL bypass), Download (501-Platzhalter für Task 13), billkom_apply_corrective_edit SQL-Funktion
v1.06.008
  • PROJ-102: Billkom Settings API (GET/PUT) mit EU-Steuerrate-Seeding (27 Länder)
  • PROJ-102: Billkom Documents CRUD API (POST, GET Liste mit Cursor-Pagination)
  • PROJ-102: Billkom Document Detail & PATCH API (Entwurf bearbeiten)
  • PROJ-102: Billkom Documents by-Order API (GET nach Order-ID)
v1.06.0072026-03-19
  • Billkom Phase 1 DB-Migration (PROJ-102): Komplettes Datenbankschema — 11 Tabellen, 3 ENUMs, 6 Funktionen (inkl. GoBD-Trigger, gap-free Nummernvergabe, atomische Finalisierung), 13 Indexes, RLS-Policies
v1.06.0042026-03-19
  • Billkom Document Lifecycle Helpers (PROJ-102): Pure-Function-Bibliothek für Zeilenposten-Berechnung, Dokumentsummen, Aufbewahrungsfristen (§147 AO), Zahlungszieldaten, Status-Transitionen und Kunden-/Absender-Snapshots
v1.06.003
  • PROJ-102: VIES-Validierungsmodul (vat-validation.ts) mit Cache-Logik, API-Isolation und Override-Validierung
  • PROJ-102: lookupTaxRate() in tax-engine.ts für Steuerssatz-Lookup aus billkom_tax_rates
v1.06.0002026-03-19
  • Billkom Foundation (PROJ-102): TypeScript-Typen, EU-Länderliste und Konstanten für das Rechnungsmodul — TaxContext, TaxResult, TaxScenario, DocumentTypeAllowed, TaxEngineError, ALLOWED_TRANSITIONS, DOCUMENT_PREFIXES, RETENTION_YEARS
v1.05.0082026-03-19
  • Vitest Test-Framework eingerichtet (PROJ-102 Billkom-Vorbereitung): node-Umgebung, globals, @-Alias
v1.05.0072026-03-19
  • Profitbutler Settings: Dropdown durch Tab-Page ersetzt (konsistent mit Versand-Pattern), alte URLs redirecten automatisch, HelpLink-Pfade auf neue Docs-Struktur aktualisiert
v1.05.0062026-03-19
  • Profitbutler Settings-Restrukturierung (PROJ-105): USt-Sätze und Wechselkurse unter neuer Profitbutler Tab-Page in den Settings zusammengefasst
v1.05.0052026-03-19
  • Billkom Rechnungsmodul Specs (PROJ-102/103/104): Vollständige Feature-Spezifikationen für 3-phasiges Rechnungsmodul — Tax Engine, GoBD-Compliance, E-Rechnung, Angebote, Mahnwesen
v1.05.0012026-03-19
  • Server-seitige Validierung für is_one_of/is_none_of Operatoren und sales_channel Feld ergänzt
  • Value-Reset beim Wechsel zwischen Single/Multi-Operator im Workflow-Builder
v1.05.0002026-03-19
  • Mehrfachauswahl-Operatoren für Workflow-Bedingungen (PROJ-101): IST EINES VON / IST KEINES VON für Versandart, Verkaufskanal und Lieferland — z.B. 'WENN Kanal = Otto UND Versandart ist eines von [Brief, Kompaktbrief, Großbrief] DANN Versandart = DHL Kleinpaket'
  • Multi-Select UI mit Checkbox-Popover und Chip-Badges im Workflow-Builder
v1.04.0022026-03-19
  • Workflow-Tabelle: Drag & Drop für Prioritätsreihenfolge mit GripVertical-Handle und Prioritätsnummer
  • Cross-Workflow Conflict Resolution: First-Write-Wins pro Feld — spätere Workflows überspringen bereits geänderte Felder
  • Workflow Audit-Trail: Übersprungene Aktionen werden mit skipped_reason dokumentiert
  • Verkaufskanal-Badge im Auftragsdetail-Dialog
  • Kanal-Filter und Workflow-Builder Dropdowns dynamisch aus DB statt hardcoded
  • Batch-Zuweisung: Bestehende Bestellungen nachträglich einem Verkaufskanal zuordnen
  • Aktiv/Inaktiv-Toggle für Channel-Rules
  • Verkaufskanal als konfigurierbare Spalte im Spalten-Picker
v1.04.0002026-03-19
  • Verkaufskanal-Erkennung (PROJ-100): Tag-basiertes Channel-Mapping pro Shopify-Integration (Otto, Temu, eBay, Kaufland, TikTok, Zalando etc.)
  • Channel-Rules UI: Drag & Drop Reihenfolge, Preset-Farben, Tag-Vorschläge, Kanal-Badges in Auftragsliste
  • Verkaufskanal-Filter: Neue Filterleiste in der Auftragsliste nach Verkaufskanal
  • Workflow-Condition 'Verkaufskanal': Regeln wie 'WENN Kanal = Otto DANN Versandart DHL' möglich
  • Workflow-Priorität: sort_order für Workflows, Ausführungsreihenfolge steuerbar, first-match-wins bei Konflikten
v1.03.0032026-03-19
  • HelpLink-Pfad für Nachfüll-Profile korrigiert (nachfüllung → nachfuellung in URL)
v1.03.0012026-03-19
  • Service-Artikel & Versandpositions-Erkennung (PROJ-98): inventory_tracking Flag auf Produktebene, automatische Keyword-Erkennung beim Import (Shopify/Amazon), Service-Badge in Produktliste und Aufträgen, ShippingDetectionSection pro Integration, Systemausschlüsse (Picklisten, Wareneingang, Bestandsübersicht, Bestellvorschlag)
  • Shopify OAuth Callback überschreibt User-konfigurierte Versandpositions-Keywords nicht mehr
  • Korrekter Hinweistext für Versandpositions-Erkennung (Freiposition statt Überspringen)
v1.02.011
  • PROJ-99: Etikettendruck-Modul (Formate, Vorlagen, Barcode-Druck für Lagerplätze & Produkte)
  • Lint-Fehler behoben: Date.now() in currency-rates Seite, setState in useEffect in use-column-config Hook
v1.02.007
  • PROJ-99: Storage-Cleanup für Etiketten-Labels in print-job-result – temporäre Label-PDFs (storage_label, product_label) werden nach erfolgreichem Druck automatisch aus dem Supabase Storage gelöscht
v1.02.005
  • PROJ-99: PDF-Renderer für Etikettendruck – renderLabelPdf() mit dynamischer Skalierung, EAN-13-Validierung, HRI-Text und optionalem Label-Text
v1.02.004
  • Barcode-Adapter für Etikettendruck-Modul (PROJ-99): EAN-13-Validierung mit Prüfziffer, Code128/Code39-Rendering, dynamische Skalierung auf verfügbare Labelgröße, 300-DPI-Auflösung
v1.02.000
  • PROJ-99: Etikettendruck-Modul — label_formats und label_templates Tabellen mit System-Presets (7 Templates, 2 Formate), RLS, label_type Enum-Erweiterung (storage_label, product_label, return_label)
v1.01.0182026-03-18
  • PROJ-97 Code Cleanup: Duplizierte GraphQL Mutation, No-Op Code, unused Variables, redundanter Ship-Route Call entfernt
v1.01.0172026-03-18
  • Shopify Return-Tracking: Inline GraphQL-Call statt fire-and-forget (behebt still fehlschlagenden separaten Aufruf)
v1.01.0162026-03-18
  • Shopify Return-Tracking: GraphQL API statt REST (REST unterstützt nur 1 Trackingnummer)
  • Outbound + Return Trackingnummern werden als Array via GraphQL fulfillmentTrackingInfoUpdate übergeben
v1.01.0152026-03-18
  • Shopify Return-Tracking: Überschreibt nicht mehr das Outbound-Tracking (beide Nummern werden zusammen gesendet)
  • Shopify Carrier: Wird aus dem Carrier-Mapping geladen statt hardcoded "DHL Express"
v1.01.0142026-03-18
  • Shopify DHL Carrier: "DHL Germany" als korrekter Shopify tracking_company Wert bestätigt
v1.01.0132026-03-18
  • Shopify DHL Carrier-Code: "DHL" statt "DHL Germany" — korrekter offizieller Shopify tracking_company Wert
v1.01.0122026-03-18
  • Shopify Carrier-Liste: DHL Germany, DPD Germany, Hermes Germany hinzugefügt
  • Shopify Retour-Tracking: Wird nach Fulfillment-Retry automatisch mitgesendet
v1.01.0112026-03-18
  • Shopify Fulfillment Scopes: read/write_merchant_managed_fulfillment_orders hinzugefügt (API 2023-01+)
  • Shopify 403 Handler: Fehlende Scopes setzen Integration nicht mehr auf error
v1.01.0102026-03-18
  • Shopify confirm-shipment: Falscher Spaltenname (external_source → source) behoben
  • Shopify manueller Retry: pending Status als retryable hinzugefügt
v1.01.0092026-03-18
  • Shopify OAuth Reconnect nach Disconnect/Deinstallation funktioniert jetzt zuverlässig
  • Reconnect-Banner in UI für getrennte/fehlerhafte Shopify-Verbindungen
  • Fulfillment Service erkennt ungültige Tokens (401/403) und markiert Integration als fehlerhaft
v1.01.0022026-03-18
  • Shopify Metafeld-Sync: Flexibler Builder zum Befüllen von Shopify-Metafeldern mit WMS-Daten (Auftragsnummer, Tracking, Retour-Tracking, Tags, etc.)
v1.01.0002026-03-18
  • Shopify Versandrückmeldung: Trackingnummer + Carrier automatisch an Shopify senden (Fulfillment API)
  • Carrier-Mapping: WMS-Versandart → Shopify Carrier konfigurierbar (DHL Express, Deutsche Post, etc.)
  • Retour-Tracking: Auto-Return Trackingnummer als zusätzliche Trackingnummer an Shopify senden
  • Fulfillment-Toggle pro Integration, Retry-Queue mit Cron, Status-Badge im Auftragsdetail
v1.00.0252026-03-18
  • Shopify-Import löschen Button in Multi-Integration Detailseite hinzugefügt — ermöglicht erneuten Import für Tests
v1.00.0242026-03-18
  • Aufträge mit Picklist-Zuweisungen können jetzt gelöscht werden — FK-Constraint von RESTRICT auf CASCADE geändert
v1.00.0232026-03-18
  • Auto-Retourenlabel nutzt jetzt die separate DHL Retoure API statt dhlRetoure VAS — behebt 'The service entered is unknown' Fehler
v1.00.0222026-03-18
  • Freipositionen im Auftrags-Bearbeiten-Dialog sichtbar und löschbar — vorher konnten Shop-Artikel ohne WMS-Zuordnung nicht entfernt werden
v1.00.0212026-03-18
  • Shopify Produkt-Import Button fehlte in der Multi-Integration Detailseite — bei PROJ-50-52 Migration vergessen
v1.00.0202026-03-18
  • Settings-Tabs: Layout-Shift bei Tab-Wechsel behoben — Tabs springen nicht mehr durch Bold-Font-Wechsel
v1.00.0192026-03-18
  • DHL Retoure: Locations ohne billingNumber-Filter abfragen — Empfänger ist kontogebunden, nicht BN-gebunden
v1.00.0182026-03-18
  • DHL Retoure: Einheitliche Retoure API für alle Länder — ReceiverID ist der Empfänger (dein Lager), Kundenland wird über shipper.country übergeben
v1.00.0162026-03-17
  • DHL Retoure: ReceiverID wird automatisch per Abrechnungsnummer aufgelöst (GET /locations?billingNumber=...) — kein manuelles Konfigurieren nötig
  • DHL Retoure: fehlende DB-Spalte "currency" blockierte alle Retourenlabel-Erstellungen
  • Code-Cleanup: Shipping API v2 dhlRetoure-VAS-Pfad und Debug-Logging entfernt
v1.00.0072026-03-17
  • DHL Retoure International: Zollinhaltsangaben für Nicht-EU Retouren (Schweiz etc.)
v1.00.0062026-03-17
  • DHL Retoure International: Auslands-Retouren über Shipping API mit dhlRetoure VAS statt Retoure API
v1.00.0052026-03-17
  • DHL Retoure: Receiver-ID automatisch nach Kundenland auflösen (internationale Retouren)
v1.00.0042026-03-17
  • DHL Retoure API: Straße und Hausnummer korrekt als separate Felder splitten
v1.00.0032026-03-17
  • DHL Retoure API Auth: nur Bearer Token, kein dhl-api-key Header (DHL akzeptiert nicht beides gleichzeitig)
v1.00.0022026-03-17
  • DHL Retoure API Auth-Fix: dhl-api-key Header + diagnostisches Error-Logging
v1.00.0012026-03-17
  • Echte DHL RETOURE ONLINE Labels statt normale Paketlabels mit getauschten Adressen (DHL Retoure API)
v1.00.0002026-03-01
  • Produktverwaltung mit Varianten, Bundles und Tags (PROJ-2, 15, 16, 78, 79, 88, 89)
  • Lagerverwaltung mit 5-stufiger Hierarchie und Standort-Wizard (PROJ-3, 4, 34-36)
  • Bestandsführung mit Bewegungshistorie und FIFO-Bewertung (PROJ-5, 14, 73, 74)
  • Wareneingang frei und gegen Bestellung (PROJ-6)
  • Kundenauftrags-Verwaltung mit Audit-Trail (PROJ-21, 59, 90)
  • Sammelkommissionierung mit Picklisten-Profilen (PROJ-9, 10, 92)
  • Versandprozess mit Label-Generierung und Zollinhaltserklärung (PROJ-11, 70)
  • Lieferanten- und Einkaufsbestellungen mit Kanban-Board (PROJ-18-24, 75, 76, 81)
  • Shopify-Integration mit Multi-Shop und SKU-Matching (PROJ-7, 8, 50-55)
  • Amazon SP-API Integration (FBM + FBA) mit Carrier-Mapping (PROJ-60-64, 67-69, 71, 72)
  • DHL und Deutsche Post Internetmarke Integration (PROJ-12, 27, 40)
  • Print Broker mit Workstation-Pairing und Job-Queue (PROJ-25, 37-39, 41)
  • Nachfüllung / Replenishment mit Profilen und Berichten (PROJ-94)
  • Daten-Hub mit CSV Import/Export und Templates (PROJ-84-87)
  • Workflow-Engine mit Trigger, Bedingungen und Aktionen (PROJ-56-58, 93)
  • Einstandspreis und Profitbutler-Integration (PROJ-73, 74, 82, 83)
  • Team-Verwaltung mit Rollen und PIN für Mobile (PROJ-32, 33, 80)
  • Sortiernummer pro Lagerplatz für Picking-Routen (PROJ-91)
  • Performance: Trigram-Indexe, JWT-Claims, Batch-Operationen (PROJ-40-49)
  • Datenbereinigung mit TTL-Policies (60d Print-Jobs, 90d Sync-Logs) (PROJ-47)
Flowkom Mobilev1.9.2
v1.9.2Latest2026-07-11
  • Doppelter Update-Button in den Einstellungen: der alte expo-updates/OTA-Check (toter Kanal) wurde samt Paket entfernt — der Server-APK-Updater ist der einzige Update-Weg (Button „Auf Updates prüfen“).
v1.9.12026-07-11
  • CI-Release-APK trug versionCode 1 (expo prebuild ohne android.versionCode in app.json) und ließ sich nicht über installierte 1.8.x installieren (Android-Downgrade-Sperre, Meldung „Paket ungültig“). versionCode jetzt in app.json gepflegt (16).
v1.9.02026-07-05
  • Sync-Screen: ausstehende/fehlgeschlagene Offline-Buchungen einsehen, erneut versuchen oder verwerfen (Drawer-Eintrag mit Zähler-Badge)
  • Offline-Status überall sichtbar: globaler Banner (amber = ausstehend, rot = dauerhaft fehlgeschlagen, antippbar), 'GEMERKT (OFFLINE)' statt 'GEBUCHT' bei gequeuten Buchungen
  • Display bleibt in allen Buchungs-Flows an (Keep-Awake)
  • Freier Wareneingang bucht wieder (korrektes Server-Format; ehrliche Meldung bei unbekanntem Artikel statt nie funktionierender Auto-Anlage)
  • Batch-Nachfüllaufträge funktionieren (Sammeln/Verteilen-Phasen; Platz-Scan akzeptiert Barcode und Namen) — benötigt Web-Deploy PROJ-525
  • Offline-Warteschlange verliert keine Buchungen mehr (Race beim Sync behoben, kill-sicheres Speichern, klare Fehlerklassifikation)
  • Doppelbuchungs-Schutz: eindeutige Idempotency-Keys; Server-Dedup via Web-Deploy PROJ-526
  • Kein Zwangs-Logout mehr bei kurzen Netz-Aussetzern; saubere Abmeldung mit Redirect bei echtem Session-Ablauf
  • Server-URL wird durch Ändern anderer Einstellungen nicht mehr zurückgesetzt; kein Kaltstart-Request mehr an die falsche Instanz
  • Scanner-Erkennung stabilisiert (keine abgeschnittenen/Phantom-Scans mehr, funktioniert auch ohne Enter-Suffix)
  • Picking: Teilmengen bleiben in der Runde, ehrlicher Abschluss-Screen, Scan-Sperre während Buchung, korrekte Status-Badges
  • Bestands-Flows: Bestandscheck auch im Buchen-Button, ehrliches Mengen-Cap-Feedback, Rescan nach Tap-Auswahl, Live-Lagerfilter in der Inventur
  • Deutsche Fehlermeldungen bei Verbindungsproblemen + 15s-Timeout statt endlosem Hänger
  • Schnellerer Bild-Lade-Pfad (expo-image) und weniger Re-Renders; Picklisten öffnen schneller
  • Einheitliches Theme und Modul-Namen ('Nachfüllen', 'Sammelkommissionierung'); Listen aktualisieren sich bei Rückkehr automatisch
v1.8.152026-07-05
  • Pick-Schritt zeigt bei Boxen-Picking-Picklisten das Box-Ziel ('→ Box 5', Sammelbox als 'Box S') inkl. Sprachansage
v1.8.142026-06-01
  • PROJ-343 Mobile — Scanner verlieren die Kopplung nicht mehr unnötig: ApiError trägt jetzt den Server-code; Heartbeat alle ~60s + bei Foreground branched auf SESSION_EXPIRED → nur neu einloggen (Kopplung bleibt) vs DEVICE_UNPAIRED → Wiederverbinden-Screen. „Gerät verbinden“-Flow (Code → Worker → PIN) aus activate+reconnect zusammengeführt, Einmal-Aktivierung entfernt. Selbst-Wiederverbindung ohne Admin über den aufgeklebten Geräte-Code + PIN. Prominenter Reset-Button entschärft, Login-Screen bietet „Gerät erneut verbinden“. Signierte APK v1.8.14 (versionCode 13).
v1.8.122026-05-08
  • Drawer-Navigation nutzt jetzt durchgängig router.replace statt router.push für Modul-Wechsel. Vorher stackten sich Module übereinander wenn der Worker übers Burger-Menü zwischen Plus, Minus, Umlagern etc. wechselte — Wisch-zurück lief dann durch jedes je-geöffnete Modul. Jetzt: Modul-zu-Modul-Wechsel ersetzt den Stack-Eintrag, Wisch-zurück geht direkt zu Home. Innerhalb eines Moduls (z.B. Picking → Picklist-Detail) bleibt push aktiv, damit Wisch-zurück sauber zur Liste führt.
v1.8.102026-05-08
  • PROJ-305 (intern PROJ-304 wegen ID-Race): Pickliste am Scanner-Gerät erstellen. Plus-Button '+ Neue Pickliste erstellen' über der Picklisten-Liste im Picking-Modul. Tap öffnet ein Bottom-Sheet mit aktiven Picklisten-Profilen + 'X pickbare Aufträge'-Counter pro Profil. Tap auf Profil mit Aufträgen → POST /api/picklists → 'PICKLISTE ERSTELLT'-Vollbild-Overlay → Modal schließt → Liste refreshed. Profile mit 0 Aufträgen ausgegraut. Keine Auto-Navigation — User entscheidet selbst was als nächstes. Kein Backend-Change, alle Endpoints existierten schon. Pattern 1:1 vom Replenishment-Modul (inline NewOrderModal).
v1.8.82026-05-07
  • (A) GEBUCHT-Bestätigung in Plusbuchung-by_location-Buchen-Button-Pfad: stock-increase resetFlow() rief setFeedback(null), was durch React-Batching die success-Animation überschrieb — ScanFeedback sah nie status=success. Andere Module hatten den Bug nicht. Fix: setFeedback(null) aus resetFlow entfernt, onAnimationEnd resettet sauber.
  • (B) Tap auf Lagerplatz in by_article-Modus (Plus + Minus) löste sofort Buchung aus — User-Feedback 'sehr fehleranfällig'. Fix: handleSourceSelect setzt nur noch State, Banner 'Ausgewählt: {Lagerplatz}' + großer 'Buchen auf X'-Button erscheint, User klickt explizit Buchen. Lagerplatz-Scan bleibt der schnelle Power-User-Pfad.
v1.8.62026-05-07
  • Prominentes Buchungs-Bestätigungs-Overlay 'GEBUCHT' nach jeder erfolgreichen Buchung in allen 5 Buchungs-Modulen (LB-WE, Frei-WE, Umlagern, Plus, Minus). Bisheriges ScanFeedback war mit opacity 0.4 / 400ms / ohne Text viel zu subtil — User-Feedback 'wenn ich etwas buche bekomme ich keinerlei bestätigung angezeigt'. ScanFeedback erweitert um optionales text-Prop: mit Text → big mode (opacity 0.92, 1200ms, fontSize 48 fett mit Schatten, klar als Buchungs-Bestätigung lesbar), ohne Text → small mode wie bisher (für reine Scan-Events).
v1.8.42026-05-07
  • PROJ-295: Universal-Post-Scan-Card jetzt auch in Umlagern, Plusbuchung und Minusbuchung. Im by_article-Modus zeigt die App nach Artikel-Scan die ProductLocationsList aus PROJ-291 — jetzt mit Tap-to-select für Quell-Lagerplatz, FBA gefiltert, Sperr-Pill bei Sperrlager (ersetzt die bestehende inline-stockLocations-Implementierung, die FBA nicht filterte). Im by_location-Modus zeigt nach Lagerplatz-Scan eine neue LocationContentsList die Artikel mit Bild (32×32) + Tap-to-select. Tap setzt Menge=1 + Step=ready (einheitlich über alle Module per Memory-Regel). Max-Button neben QuantityInput füllt vollen Lagerplatz-Bestand (besonders nützlich bei Minusbuchung 'Lagerplatz leerräumen'). FBA-Lagerplatz-Scan bekommt 403 mit klarer Fehlermeldung. Wareneingang/Inventur/Picking/Replenishment unangetastet.
v1.8.22026-05-06
  • PROJ-291: Im Wareneingang (LB + Frei) zeigt die App nach dem Artikel-Scan eine Bestandsliste pro Lagerplatz (Top 3 + '+ N weitere'-Chip, sortiert nach Menge desc). FBA-Pool gefiltert via warehouses.is_read_only, Sperrlager bleibt drin mit '[Sperr]'-Pill in Amber. Bei Multi-Warehouse-Workspace kommt ein Lager-Präfix vor den Lagerplatznamen. Freier WE bekommt zusätzlich einen Artikel-Lookup-Step über /api/products/by-barcode — bei bekanntem Artikel volle Card mit Bild + Bestandsliste, bei unbekanntem Barcode bleibt der bisherige Flow als Fallback. Branch + Commit-Tag tragen historisch PROJ-290 wegen ID-Race mit der Cost-Breakdown-PR im Web-Repo.
v1.7.02026-03-17
  • Responsive Scaling für alle Android-Geräte (26 Dateien)
  • Auto-Logout nach konfigurierbarer Zeit
  • ConnectionContext — ein einziger Netzwerk-Listener statt pro Screen
  • Nachschub-Modul im Drawer-Menü ergänzt
  • ModuleCard mit optionaler Beschreibung
  • Token-Refresh Race Condition behoben (Promise-Lock)
  • Idempotency-Keys aus Buchungsdaten statt Date.now()
  • Bestätigungsdialog vor Gerät zurücksetzen
  • OTA-Update unterbricht laufende Buchungen nicht mehr
  • processQueue Concurrency-Lock gegen Doppelverarbeitung
  • JSON.parse Safety in Auth, Settings und Offline-Queue
  • ScanFeedback useEffect Dependencies korrigiert
  • Unnötige Android-Permissions blockiert (RECORD_AUDIO, SYSTEM_ALERT_WINDOW)
  • Cache-Cleanup bei vollem In-Memory-Cache
  • advanceToNext Deklarationsreihenfolge in Picking korrigiert
  • Release-Build mit eigenem Production-Keystore statt Debug-Key
v1.4.02026-02-15
  • Nachfüllung / Replenishment Workflow (PROJ-94)
  • Auto-Confirm Picking ohne Mengenbestätigung
  • Text-to-Speech für Lagerplatz-Ansage
  • Kompakter Homescreen mit 2-Spalten Grid
  • Picking-Einstellungen (Mengenbestätigung, TTS)
  • Android-Navigationsleiste im Dark Theme
  • ScanInput OK-Button Verhalten korrigiert
  • Scanner-Erkennung und Picking Skip-Logik
  • Bottom-Padding für Navbar auf allen Workflow-Screens
v1.3.02026-02-01
  • Wareneingang gegen Lieferantenbestellung (LB)
  • Picking komplett neu geschrieben (Scanner-optimiert)
  • Custom NumPad für Mengeneingabe
  • Produktbild-Anzeige
  • Lagerplatz-Vorschläge bei Einlagerung
  • Rescan für Menge +1, Lagerplatz-Scan bucht automatisch
  • API-Feldnamen korrigiert (ean → barcode)
  • Grund-Buttons durch optionales Textfeld ersetzt
v1.2.02026-01-20
  • Dual-Mode Flows (nach Lagerplatz / nach Artikel)
  • Burger-Menü Navigation
  • Scan-Validierung in allen Workflows
  • Konfigurierbarer Server-URL bei Aktivierung
  • Versionsbadge auf allen Screens
  • OTA-Update Check beim App-Start
  • Enter-Taste nutzt Input-Text direkt
  • Auto-Focus auf ScanInput
  • expo-av Import für Expo Go abgesichert
v1.0.02026-01-01
  • Geräte-Aktivierung mit Pairing-Code
  • Worker-Login mit PIN
  • HID-Scanner-Integration (Timing-basiert)
  • Sammelkommissionierung / Picking
  • Umlagern zwischen Lagerplätzen
  • Plusbuchung (Bestandserhöhung)
  • Minusbuchung (Bestandsreduzierung)
  • Freier Wareneingang
  • Offline-Queue mit Auto-Sync bei Reconnect
  • Sound- und Vibrations-Feedback beim Scannen
  • Einstellungen (Sound, Vibration, Lautstärke, Tastatur)
v0.0.0-fix-double-submit2026-04-14
  • Double-Submit-Schutz für Plusbuchung, Minusbuchung und Umlagerung (Native App) — synchroner useRef-Guard verhindert Mehrfachbuchungen
Flowkom Print Agentv1.2.3
v1.2.3Latest2026-07-10
  • Ein-Code-Kopplung über die WMS-Domain (z.B. web.flowkom.de-483921) — der Kopplungscode enthält keine Server-Interna mehr; Broker-Adresse wird beim Koppeln automatisch ermittelt
  • Bisherige Kopplungscodes und bestehende Kopplungen funktionieren unverändert weiter
v1.1.0
  • Auto-Updater: Update-Hinweis im Tray, Installation per Klick mit Fortschrittsbalken, automatischer Neustart
  • Ein-Code-Kopplung: kombinierter Kopplungscode befüllt die Broker-URL automatisch
  • Broadcast-Aufweck-Kanal: Sofort-Druck per Push, Polling nur noch als Fallback
  • Update-Integritätsprüfung (SHA256 + Quellen-Allowlist) vor jeder Installation
  • Fallback-/Reconnect-Modi pollen mit 500ms statt 30s — nie langsamer als bisher
v1.0.12026-03-17
  • Rebranding zu Flowkom Print Agent
  • Alle Abhängigkeiten in EXE eingebettet (pdfium.dll)
  • Automatische Versionierung bei jedem Build
  • Cross-Compilation von macOS ermöglicht
v1.0.02026-02-01
  • Silent ZPL Label Printing auf lokale Drucker
  • Silent PDF Label Printing via PdfiumViewer
  • Supabase Edge Function Integration (Polling)
  • Device Pairing mit 6-stelligem Code
  • Heartbeat und automatische Printer-Discovery
  • Windows Installer mit Inno Setup (Autostart, Voraussetzungsprüfung)
  • Self-contained EXE ohne .NET-Installation
  • GitHub Actions CI/CD Pipeline
Flowkom Docsv1.1.57
v1.14.020Latest2026-04-27
  • Neue Architektur-Sektion mit Seite "Bestandssynchronisation" — beschreibt Queue-Modell, DB-Trigger, App-Hook-Defense-in-Depth, Safety-Sync und Drift-Diagnose. Mermaid-Diagramm zeigt den Flow Stock-Change/Order-Lifecycle → Queue → Cron → Shopify/Amazon.
v1.14.019
  • Versandarten-Hilfeseite: Vollständige Anleitung mit Priorität, Drag & Drop, Workflows, Fallback-Logik
v1.14.006
  • Neue Hilfeseite: Produktdokumente (Konformitätserklärung, Bedienungsanleitung, Umkarton-Etikett)
  • Dokumentation aller 18 EU-Produktkategorien mit Richtlinien und Normen
  • Anleitung für Hersteller-Stammdaten, Varianten-Support und FAQ
v1.1.342026-07-06
  • Shopify-Anbindung: komplette Schritt-für-Schritt-Anleitung für Mandanten (eigene Custom App erstellen, Client-ID/Secret hinterlegen, verbinden) inkl. Bestellstatus-Sync, Zahlungsstatus-Rückmeldung, Produkt-Auto-Import und DSGVO-Compliance-Webhooks
v1.1.262026-07-11
  • PROJ-614–630: Neue Hilfeseite „Bestandsbewertung & Stichtag“ (artikel-und-lager/bestandsbewertung) — FIFO-Bewertung und Coverage, Stichtags-Rekonstruktion inkl. „heutiger Wissensstand“-Semantik, bezahlter Zulauf mit Zahlungsmodus-Verweis, Bestandswert-Verlaufs-Chart, Stichtags-Vergleich, PDF-Inventurliste mit Festschreibungs-Hinweis, Ladenhüter/Reichweite. Im WMS per HelpLink von der Bestandsbewertungsseite verlinkt.
v1.1.252026-04-19
  • PROJ-237: Neue Hilfeseite 'Nachlaufkosten' (einkauf/nachlaufkosten) — Was sind Nachlaufkosten (Fracht/Zoll/Sonstige EUR+Fremdwährung), Karten im Kosten-Tab, Vergleichstabelle der drei Verteilmethoden (Volumen/Warenwert/Menge) mit Empfehlungen pro Szenario (Container→Volumen, Versicherung→Warenwert, Handling→Menge), Wechselkurs-Semantik (1 EUR = X Fremdwährung, Quelle api/manual), retroaktive FIFO-Korrektur mit Mermaid-Flowchart (DB-Trigger → calculate_landed_costs → goods_receipt_items + stock_movements), typischer Workflow (Container-Import aus China mit CNY+EUR-Kosten) als Mermaid-Sequenz, FAQ (Division bei Kurs, Verteilmethoden-Wechsel, LB-übergreifende Fracht, Rechnungen), aufklappbare Technik-Details (calculate_landed_costs-RPC, Trigger, purchase_orders/goods_receipt_items/stock_movements).
v1.1.232026-04-19
  • PROJ-232: Neue Hilfeseite 'Versandinfo-Tags' (einkauf/versandinfo-tags) — Vollständige Incoterms-2020-Referenz (alle 11 Codes EXW/FCA/FAS/FOB/CFR/CIF/CPT/CIP/DAP/DPU/DDP mit Kosten/Risikoübergang/Use-Case), Transportart-Tabelle (Schiff/Luft/Zug/LKW mit Laufzeiten aus Asien), Händler-Entscheidungsvergleich FOB vs. CIF vs. DDP, Mermaid-Flowchart für den Tag-Setzen-Workflow beim LB-Anlegen, Gantt-Diagramm für Laufzeitvergleich, aufklappbare technische Details (DB-Spalten `incoterm`/`transport_mode`, Zod-Schemas, Audit Trail), FAQ zu rechtlicher Relevanz und Incoterms-2010-Altbegriffen (DAT→DPU, DDU→DAP). Neuer Top-Level-Bereich 'Einkauf' im Sidebar-Meta.
v1.1.222026-04-18
  • PROJ-223: Dokuseite 'Bestellungen' überarbeitet — alte Filterleisten-Beschreibung ersetzt durch drei klar getrennte Abschnitte: Unified Search mit Scope-Dropdown-Tabelle (Überall/Auftrag+Kunde/Artikel/Notiz/Externe Nr.) inkl. konkreten Beispielen (Amazon-Nr. findet externe Bestellnr., eBay-Nr. findet Notiz, SKU/EAN/ASIN/FNSKU findet Artikel), kompakte Status-Pipeline-Tabs, Filter-Drawer mit sekundären Filtern und Aktive-Filter-Chipleiste mit prominentem 'Alle zurücksetzen'-Button.
v1.1.202026-04-09
  • PROJ-177: Neue Dokuseite 'Amazon FBA-Bestand' (integrationen/amazon-fba-bestand) — Mermaid-Flowchart des FBA-Stock-Sync-Pfads (SP-API → pullFbaInventory → sync_amazon_fba_stock RPC → public.stock + stock_movements), Erklärung von FBA-POOL als virtueller Sammel-Location, read-only Warehouse-Semantik, Bewertung/Bestellvorschlag-Effekte, Tabelle der bekannten Einschränkungen (Doppelzählung, Cost-Approximation, Retouren-Semantik, Unmapped SKUs) mit Verweis auf PROJ-178, technische Referenz (RPC-Signaturen, Movement-Type, Code-Pfade).
v1.1.192026-04-08
  • PROJ-172: Neuer Abschnitt 'Nächtlicher automatischer Refresh' auf der Amazon-Angebote-verwalten-Doku. Enthält Mermaid-Flowchart des Cron-Pfads (Scheduler → Integrations-Loop → advanceListingsJob → per-MP-Isolation → Cross-MP-Propagation → finishLog), Vergleichstabelle der Amazon-Cron-Zeiten (Listings 02:00, FBA-Inventory 03:15), Opt-Out-Erklärung, Anleitung für manuelles Testen (Cron-Jobs-Tab-Trigger + 'Jetzt starten'-Button pro Integration), aufklappbare Technik-Details zu 'Warum kein pg_cron?' und 'Warum kein wöchentlicher Force-Full?'.
v1.1.182026-04-08
  • Amazon-Angebote verwalten: Neuer Abschnitt 'FBA-Bestand' mit Mermaid-Flow, Ereignis-Tabelle und Technik-Details zum Trigger-basierten Sync (PROJ-171).
v1.1.172026-04-08
  • PROJ-170: Neue Dokuseite 'Amazon-Angebote verwalten' — Mermaid-Workflow-Flowchart (Filter → Selektion → Bulk-Aktion), FBA/FBM-Vergleichstabelle, Filter-Übersicht, Beispiel-Workflow '50 unzugeordnete FBA-DE-Angebote auf einmal mappen', Spalten-Konfiguration, CSV-Export, aufklappbare Technik-Details (API-Endpoints, Indizes, Selektions-Modell).
v1.1.162026-04-08
  • Amazon-Integration: Vollständige Dokumentation ersetzt den Stub — Mermaid-Flowchart, FBM/FBA-Vergleichstabelle, Filter-Übersicht, Status-Mapping Amazon → Flowkom, FAQ (PROJ-167)
v1.1.152026-04-02
  • Shopify-Integration: Vollständige Dokumentation (Verbindung, Import, Fulfillment, Erstattungen, Fehlerbehebung)
  • Bestellungen: Zahlstatus-Erklärung und Erstattungs-Anleitung ergänzt
v1.1.142026-04-01
  • FreeScout-Integration Doku überarbeitet: Matching-Logik mit Mermaid-Flowchart, eBay-Username-Lookup, Carrier-Erkennung, Deeplinks, marktplatzspezifische Fehlerbehebung
v1.1.82026-03-22
  • Cloud-Speicher Dokumentation: Übersichtsseite (Funktionen, unterstützte Anbieter, Ordnerstruktur) + ausführliche OneDrive-Einrichtungsanleitung (Azure App-Registrierung, Berechtigungen, Env-Vars, Fehlerbehebung)
v1.1.72026-03-20
  • FreeScout-Integration: Ausführliche Einrichtungsanleitung (Flowkom + FreeScout Modul), Sidebar-Funktionen, Fehlerbehebung, Sicherheitsübersicht
v1.1.62026-03-19
  • Profitbutler Restrukturierung: USt-Sätze und Wechselkurse von einstellungen/ nach einstellungen/profitbutler/ verschoben, neue Profitbutler-Unternavigation
v1.1.42026-03-19
  • Druckvorlagen-Dokumentation (PROJ-99): Etikettenvorlagen, Etikettenformate, Druckflow, Barcode-Typen, Layout-Erklärung, FAQ
  • Service-Artikel-Dokumentation (PROJ-98): Versandpositions-Erkennung und inventory_tracking Flag
v1.1.22026-03-15
  • Automatische Versionierung mit Bump-Script
  • Drucker-Dokumentation (Einrichtung, Fehlerbehebung)
  • Nachfüllung komplett dokumentiert (5 Seiten: Übersicht, Profile, Bericht, Mobile, Prozess)
  • Picklisten-Dokumentation erweitert (Profile, Mobile Picking, Prozessdetails)
  • Tags-Dokumentation
  • Sortiernummer-Dokumentation
  • Flowkom Mobile Dokumentation (5 Seiten: Übersicht, Einrichtung, Bedienung, Einstellungen, Fehlerbehebung)
  • Deutsche Umlaute in allen Dokumentationsseiten korrigiert
v1.0.02026-01-15
  • Erste Schritte Guide (Workspace einrichten, Benutzer anlegen, erste Bestellung)
  • Artikel und Lager Dokumentation (Produkte, Lagerplätze, Bestände, Systemlagerplätze)
  • Aufträge und Versand Dokumentation (Bestellungen, Picklisten, Versand, Retouren)
  • Daten-Hub Dokumentation (CSV Import/Export, Vorlagen, Feldreferenz)
  • Einstellungen Dokumentation (13 Seiten)
  • Integrationen Dokumentation (Shopify, Amazon)
v2026-07-052026-07-05
  • Neue Seite 'Bestellvorschlag': Bedienung und Rechenweg verständlich erklärt, inkl. Retourenquote und Mindestbestellmengen.
  • Neue Seite 'Einstandspreis & FIFO': von der Beispielrechnung beim Wareneingang über Wechselkurse und Frachtverteilung bis FIFO-Bewertung und Festschreiben — komplette Referenz.
  • Seite 'Nachlaufkosten' auf den aktuellen Stand gebracht (flexible Kostenzeilen, Wechselkurse-Karte, Verteilung pro Zeile, Festschreiben).
v2026-07-102026-07-10
  • Amazon-Custom Personalisierung: neue Hilfeseite (Aktivieren, FBM-only, Anzeige im Auftrag, kein Cron noetig). Amazon Verkaeufer-Bestellnummer: Abschnitt zum Suchen der Nummer ergaenzt.
v2026-07-162026-07-16
  • Shopify-Doku überarbeitet: kopierfertiger Rechte-Block (alle 10 exakten Scopes) für die eigene Shopify-App inkl. Erklärtabelle, neue Sektion „Produkt-Push (Flowkom → Shopify)“ mit Bildergalerie/Varianten-Bildern und „Bilder nachträglich übertragen“, plus Korrekturen (Re-Autorisierungs-Hinweis, kanal-scharfe Kundenbenachrichtigung).