Tabs (Eingabe + Rendering):
- Tab-Taste fügt echten Tabulator ein (App-Konfigurator + Directus
manueller Druck); \t in beiden Zeichen-Whitelists erlaubt.
- Renderer: Zeilen mit führenden Tabs werden nicht mehr nach Wortbreite
umgebrochen; Tab-Spruenge an den rechten Rand geclampt; bei Ueberlauf
rechtsbuendig (Datum ganz rechts, ohne Absturz nach links). Tab-loser
Text bleibt bit-identisch.
Mailer:
- loadSettings bricht nicht mehr ab, wenn team_email fehlt (Team-
Empfaenger separat gelesen).
- Eingebaute Fallback-Vorlagen fuer order_created + Status-Mails, damit
Bestaetigung/Status auch ohne DB-Vorlage zugestellt werden.
Weitere ausstehende Arbeit:
- Abweichender Text je Schriftstueck (#5) in Generierung/Konfigurator.
- Produktions-Board: Format-Sammelgruppen (Bulk) + Bootstrap-Feld.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- render_formats: Upsert statt nur-anlegen → korrekte A6-Maße werden beim
Bootstrap erzwungen (behebt „Postkarten passen nicht, weder quer noch hoch")
- Sammelversand-Staffel: bis 5 Schriftstücke 1,80 € (neues Preisitem
sammelversand_klein), ab 6 der reguläre Satz – Backend + App-Option
- Extern-Modus: Postkarten-Format (hoch/quer) wieder wählbar; optionaler
?format=-Parameter; kein Auto-Vorbelegen bei mehreren Formaten
- Unbegrenzte Mustertexte: neue Collection muster_texts (Dropdown im
„Manueller Druck", Du/Sie als Fallback + Seeds)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
skrift-app (Konfigurator):
- Datei-Produkte (Unterschriftenservice): Mehrfach-Upload (PDF/Word/Excel),
komplett preisfrei (keine Preisleiste/Aufpreise/Kostenübersicht/Zahlung)
- Extern-/Etsy-Modus (?extern=1&versand&kuvert&beschriftung&menge): vom Betreiber
vorkonfiguriert, Kunde füllt nur Empfänger/Text/Rechnungsdaten/Übersicht,
keine Preise/Zahlung; Menge greift immer (auch >25 / ohne Empfänger); eigener
Danke-Text
- Adressmodell: zwei feste Adressen (Rechnung/Lieferung) ohne Namen statt
Dropdown; Auto-Vorbefüllung; Lieferadresse nur bei Sammelversand; abweichende
Lieferadresse per Default aus; Pflichtfelder erzwungen
- Platzhalter-Tabelle immer im Text-Schritt (auch Sammelversand ohne Kuvert) +
Excel; Tabellen-Eingabe nur bis 25, „Ab 26"-Hinweis entfernt
- Stammdaten: zwei Adressblöcke + Erfolgsmeldung
Directus/Backend:
- Signatur-Endpunkte /signature-preview + /signature-render (Proxy zum
signature-service, Marker + Konto-Offsets), Modul-Reiter „Unterschriften"
(aus Auftrag oder manuell), Tabelle über volle Breite
- Generierung läuft bei jeder Bestellung; Kuverts immer (Datei-Produkt: nur
Kuvert, DIN Lang als Default); source_files am Auftrag
- Produktions-Board: „Dateien"-Button (hochgeladene Originale, keine SVGs)
- Alt-Mail-Login: Zweit-Mails melden im selben Konto an (skrift-auth)
- Team-Mails schlank + konfigurierbar (email_settings.team_email) für
Bestellung/Muster/Anfrage; keine Bestellbestätigung bei Datei-Produkten,
separate Vorlagen unterschriften_eingang/extern_eingang
- Rechnungsadresse wird ins Konto übernommen, wenn dort noch keine steht
- Kunden-Policy: directus_files create/read (Upload); Bootstrap: users
billing_address/shipping_address/alt_emails, orders.source_files/source=extern,
signatures marker/offsets, unterschriftenservice input_mode=datei/pricing_mode=formel
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Produktions-Board:
- Massenauswahl (+ "Alle auswählen") mit Sammel-Druck und Sammel-Status
- Warteschlange je Maschine nach Format gebündelt; Formatabfrage
(machines.current_format) statt automatischem Anschluss
- resiliente Ladeabfragen (Board bleibt ohne neue Felder nutzbar)
Agent (skrift-agent):
- druckt strikt ein Dokument nach dem anderen (Idle-Gate) -> behebt
Verlust von Folgejobs während eines laufenden Drucks
- druckt nur Jobs des eingelegten Formats (current_format), kein Auto-Anschluss
- Heartbeat gedrosselt (nur bei Statuswechsel / alle 60 s)
Neues Modul "Manueller Druck" (skrift-neuauftrag):
- interner Auftrag ohne Zahlung, Vorschau, Platzhalter/Excel-Import,
Felder bleiben nach dem Absenden stehen
Backend/Endpunkte (skrift-orders):
- jobs tragen format/format_label; /enqueue-bulk für Sammeldruck
- Webhook /inbound/:kind (JetFormBuilder) mit Token + tolerantem Body-Parser
- Kleinmengen-Aufschlag je Produkt über Faktoren a (Deckel) und e (Exponent)
- Fix: norm()-Shadowing in calculatePrice (norm is not a function)
Bootstrap:
- jobs.format/format_label, machines.current_format
- products.price_factor_a/e; Multiplikator-Formel auf a/e umgestellt inkl.
verhaltensneutraler Migration bestehender Formel/Produkte
skrift-app (Konfigurator):
- Zeilenumbrüche im Textfeld erlaubt; Umschlag-Individualtext als Textfeld
- Platzhalter-Tabelle im Text-Schritt immer verfügbar (auch Sammelversand
ohne Kuvert) inkl. Excel-Upload nur für Platzhalterwerte
- Danke-Seite: Button zurück zu skrift.de
- z-index-Fix: Platzhalter-Tabelle überlagert die Vorschau nicht mehr
WordPress-Preisrechner: a/e-Faktoren in PHP- und JS-Rechnung
Directus: SKRIFT_WEBHOOK_TOKEN in compose/.env.example
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Formate zentralisiert (Phase 1)
- Neue Collection render_formats (Seitengröße, Ränder, Zeilenhöhe/-limit +
Plotter-Template) als einzige Quelle. Backend liest sie gecacht (Start +
stündlich, synchroner Zugriff → keine Latenz) mit eingebauten Defaults als
Fallback; manueller Trigger via POST /api/formats/refresh.
- Ermöglicht frei definierbare Formate ohne Codeänderung.
Kuvert-Templates
- Werte 1:1 aus dem alten Job-Manager übernommen (falsche/vertauschte Maße
korrigiert, per Upsert) und je Format die zweite Variante ergänzt
(individuelle Beschriftung). Druck-Popup schlägt bei freiem Text Variante 2 vor.
Produktions-Agent
- Datei-Endpunkt liefert {files} ohne data-Hülle → eigener get_raw statt des
data-auspackenden get; Dokumentauswahl positionsbasiert (robust gegen 0-/1-
basierte Dateinamen).
Bootstrap
- Ungültiger DIRECTUS_TOKEN wird erkannt und fällt auf ADMIN_EMAIL/PASSWORD
zurück, statt mit einem 401 abzubrechen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ensurePermission brach ab, sobald für eine Collection bereits ein
Berechtigungseintrag existierte. Dadurch blieben einmal angelegte, zu enge
Feldlisten dauerhaft bestehen und spätere Erweiterungen kamen nie an --
der Produktions-Agent lief deshalb in 403-Fehler beim Zurückschreiben von
jobs.status und orders.production_status.
Vorhandene Einträge werden jetzt per PATCH auf die im Bootstrap definierten
Felder und Filter nachgezogen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Directus
- Neues Modul „Produktion": Board mit Neu/Warteschlange/Im Druck/
Kuvertierung/Versandfertig/Versendet/Archiv, zentraler Suche, Druck-Popup
(Maschine, Template, Maße, Nummernbereich, Direktdruck vs. Warteschlange)
und Empfängerliste mit Vorschau von Schriftstück und Kuvert.
- Interface-Plugins: Auftragsdateien, Drucken, Testdruck, Empfängersuche.
- Mailer-Hook für Auftrags- und Statusmails inkl. Signatur und AGB-Anhang.
- Auftrag: Empfängerzeilen inline, Produktionsstatus (inkl. storniert),
Versanddatum, Brief-/Kuvert-Indikatoren, Insights-Dashboard.
- Absender aller Mails ist Skrift (Projektname + email_settings); die
Angebotsanfrage nennt jetzt das angefragte Produkt.
Preislogik
- Eine gemeinsame Multiplikator-Formel; Normalpreis-Menge je Produkt
(products.norm_qty). Alte B2B/B2C-Fallback-Felder entfernt.
- Mengenrabatt-Staffel (ab X Stück Y %) in den Preis-Einstellungen.
- Preis pro Stück ohne einmalige Kosten (unit_net_total).
- Einzelversand rechnet Kuvert und Beschriftung nicht mehr doppelt.
- Fehlerhafte Grundpreis-Formel legt die Preisauskunft nicht mehr lahm.
- Briefnummern 1-basiert: Dateiname entspricht der Briefnummer.
app.skrift.de
- Direktlinks für Muster, Unterschriftenservice und Follow-ups; Muster als
eigene Seite, Kontaktprodukte direkt im Anfrageformular.
- Mehrere Adressen in den Stammdaten plus Adressauswahl im Konfigurator.
- Verbotene Zeichen werden bei der Eingabe entfernt und gemeldet.
- Zeilenüberlauf als Fehlerkasten vor „Weiter"; Mengenfeld leerbar,
Standardmenge 100; Checkout-Checkboxen im Kartenstil.
Produktion
- skrift-agent: Poll-Modell je Maschine, Maß-Übersteuerung, Nummernfilter
und automatischer Übergang in die Kuvertierung.
WordPress
- Neues Plugin „Skrift Preisrechner": Shortcodes inkl./exkl. MwSt,
stündlicher Abgleich der Preisdaten in WordPress und ein sicherer
Formel-Interpreter, damit Formeländerungen automatisch greifen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Directus (Postgres, hinter NPM) wird die zentrale Datenquelle für Kunden,
Aufträge, Produkte, Preise und Gutscheine; das skrift-backend bleibt reine
Generierungs-Engine.
- Docker/directus: docker-compose (Directus 11 + Postgres), Bootstrap-Skript
legt Collections, Rollen/Policies/Rechte und Seed idempotent an.
- Extension skrift-auth: passwortloser Login per E-Mail-Code (Codes nur als
Hash, Ablauf, Versuchslimit) sowie Kontoanlage aus dem Checkout.
- Extension skrift-orders: kontrollierter Bestell-Endpunkt für Gäste und
eingeloggte Kunden; Preis wird immer serverseitig berechnet (editierbare
Formel via sicherem Interpreter, Werte aus price_items).
- skrift-backend: neuer Endpunkt /api/order/from-directus erzeugt SVGs aus
einem Directus-Auftrag und schreibt Status + artifact_path zurück. Dafür
wurde die Kernlogik aus generateOrder als runGeneration herausgelöst
(Verhalten unverändert); generateOrder ist jetzt ein HTTP-Wrapper.
- compose: NPM-Netz ergänzt, API_TOKEN/DIRECTUS_* werden durchgereicht.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>