- docker-compose.yml (directus): SKRIFT_VERSAND_TOKEN: ${SKRIFT_VERSAND_TOKEN}
ergaenzt. Ohne diese Zeile landete der .env-Wert nie im Container -> die
Versand-Seite blieb 404.
- Board FTP-Upload: gesamten Fehler ausgeben (nicht gekuerzt), leere Auswahl
klar melden, 90s-Timeout gegen Haengen, console-Log. Proxy /batch-build
kuerzt den Fehler nicht mehr auf 300 Zeichen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Uebernommene Uebermittlungen bekommen api_client gesetzt und werden im
Board (renderGruppiert) wie API-Auftraege als Charge gruppiert (bildeChargen:
Kunde+Produkt+Tag). Quelle bleibt 'operator' (keine Kundenmail). So liegen
alle uebernommenen Auftraege eines Zugangs/Tages unter einer Charge und
lassen sich dort wie gewohnt sammeldrucken.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- "Per FTP hochladen" als Primär-Aktion (wirkt auf Auswahl, ids an
/skrift-orders/batch-build -> Backend), "In Produktion übernehmen"
sekundär; dazu Versendet/Nicht versendet/Löschen.
- Gruppierung Tag → Kunde, beide aufklappbar, Gruppen-Kopf mit Haken
(wählt alle in der Gruppe).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Uebermittlungen-Reiter neu: nach Tag gruppiert, Mehrfachauswahl (Strg/
Shift, board-weit auch fuer Auftragskarten). Aktionen auf Auswahl:
- "In Produktion uebernehmen" -> neuer /skrift-orders/batch-uebernehmen:
PDF -> Datei-Auftrag (PDF = Druckdatei), Text -> Handschrift-Brief
(Text + 5-Zeilen-Adresse), Kuvert mit Empfaenger; Status uebernommen;
Generierung angestossen. Danach in "Neu" (dort wie bisher buendeln).
- "Versendet" / "Nicht versendet" (neues Feld batch_submissions.versendet).
- "Loeschen" (mit Rueckfrage).
FTP-"Jetzt buendeln"-Knopf entfernt (FTP-Weg entfaellt). Bootstrap:
Status 'uebernommen' + Feld versendet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /v1/batch nun in der HTML-Doku und in der OpenAPI-Spezifikation.
- Neue oeffentliche Seite an EINER kryptischen URL
/v1/versand/<SKRIFT_VERSAND_TOKEN> (ohne Login): zeigt ALLE offenen
Auftraege (Nummer, Status, Menge, Datum) in einer Uebersicht; pro Auftrag
ein "Versendet"-Knopf setzt production_status 'versendet' + versandt_am
(Status-API liefert dann 'shipped', Versandbenachrichtigung geht raus).
Schutz = geheimer Pfad-Token (ENV); ohne Token 404.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Produktions-Board: neuer Reiter "Uebermittlungen" (getrennt vom
Auftragsboard). Offene batch_submissions je Zugang gruppiert; Knopf
"Jetzt buendeln & hochladen" pro Zugang loest die Backend-Buendelung
(xlsx + Sammel-PDF + FTP) sofort aus. Text-Uebermittlungen bekommen einen
"Schreibvorlage"-Knopf, der Text + 5-Zeilen-Adressblock (Firma / Vorname
Nachname / Zeile1-3 / PLZ Stadt / Land, max 5) in den manuellen Druck
uebernimmt. skrift-orders: Proxy-Route /batch-build -> Backend.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Alternativer Uebermittlungsweg neben /v1/orders (unveraendert). Neue
Collection batch_submissions (Empfaengerschema Firma/Vorname/Nachname/
Zeile1-3/PLZ/Stadt/Land + Text ODER Druck-PDF, je Kunde ueber api_client).
Neuer Endpunkt POST /v1/batch: ein Empfaenger je Aufruf, PDF via
pdf_file_id (aus /v1/files) oder pdf_base64, oder text; Zeichen-Warnung
wie /v1/orders. Service-Policy darf batch_submissions lesen/als gebuendelt
markieren. Buendelung (xlsx+PDF+FTP) folgt in Phase 2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Additiv, ohne Aenderung der bestehenden Antwortstruktur:
- Nicht erlaubte Zeichen werden wie bisher entfernt; zusaetzlich meldet
die Antwort ein optionales "warnings":[{code:"unsupported_characters",
characters:[...]}] (Brieftext + Empfaengerfelder).
- Nur EINSEITIGE Formate (A6 hoch/quer): passt der Brieftext nicht auf
eine Karte, wird der Auftrag mit HTTP 422 abgelehnt (Backend-Umbruch-
zaehlung /api/order/pagecount, kein Scriptalizer). A4 fliesst mehrseitig
und wird nie abgelehnt. Backend nicht erreichbar => fail-open.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Default proReihe/group auf 1 gesenkt: bei aktivem rollenschonendem Druck
wird streng spaltenweise ein Zeichen nach dem anderen geschrieben (ein
Zeichen, Zeile tiefer, dann naechste Spalte), damit die Rolle minimal
faehrt. Weiterhin ueber ?group=N uebersteuerbar.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Default proReihe/group von 10 auf 5 gesenkt (kleinere Bahnen → noch
weniger Rollenweg). Weiterhin über ?group=N übersteuerbar.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Statt jede Glyphe einzeln umzusortieren (Rolle rückt pro Zeichen), wird
jetzt in senkrechten Bahnen von ~10 Zeichen Breite gearbeitet: je Zeile
~10 Zeichen als Reihe, dann eine Zeile tiefer in derselben Bahn, erst
danach die nächste Bahn. Rolle spult höchstens eine Bahnbreite zurück,
10er-Blöcke bleiben zusammen (natürlicher, schneller). Zeichenbreite wird
aus dem SVG geschätzt; Bahnbreite über ?group=N einstellbar (Default 10).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Checkbox „Rollenschonend drucken" im Druck-Popup (nur bei A6). Setzt am
Job das Feld spaltenweise. Der Agent lädt das Schriftstück-SVG dann über
den Download-Endpunkt mit ?reorder=column: die Glyph-<path>-Elemente
werden nach x (Spalte) und y (oben→unten) permutiert – Signatur-<g>,
Hintergrund und Trennstrich bleiben unangetastet. Sichtbares Ergebnis
identisch, aber der rollengeführte Plotter fährt monoton in Vorschub-
richtung statt je Zeile die Rolle zurückzuspulen. Nur Schriftstücke,
nicht Kuverts.
Neues Job-Feld jobs.spaltenweise (Bootstrap).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der Suche-Reiter nutzt jetzt ein eigenes Such-Feld (sucheText) getrennt
vom globalen Filter – die Eingabe wird nicht mehr in die anderen Reiter
(Neu, Warteschlange …) übernommen und beim Verlassen des Reiters
geleert. Das globale Filter-Feld ist im Suche-Reiter ausgeblendet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der Button „PDF öffnen" im Suche-Reiter (Typ Druckobjekt) öffnet jetzt
den Datei-Dialog mit den hochgeladenen Auftragsdateien (die echte PDF)
statt der SVG-Schriftstück-Vorschau. Der Datei-Dialog lädt die erste PDF
(sonst erste Datei) direkt in die Vorschau – ohne weiteren Klick.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Neues Boolean-Feld search_default an format_templates: je ein Brief- und
ein Kuvert-Template als Standard für den Schnelldruck im Suche-Reiter
markieren. Der Schnelldruck bevorzugt dieses Template, sonst das dem
Auftragsformat zugeordnete Standard (default_format), sonst den Fallback.
Kann bewusst dasselbe Template wie das normale Standard sein.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Hoher Kontrast für die Bedienung: große, eindeutige Typ-Auswahlknöpfe
(Schriftstück/Kuvert/Druckobjekt, aktiv blau, sonst weiß mit Rahmen)
direkt über einem unverkennbar weißen, großen Suchfeld. Standard-
Templates werden nicht mehr im Reiter gewählt, sondern in den
Einstellungen den Formaten zugeordnet (format_templates.default_format);
der Schnelldruck leitet das Template daraus ab. Ergebnisse zeigen die
vollständige Anschrift über der Auftragsnummer – ohne Status/Produkttyp.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Suche-Reiter (ganz oben, vor Neu): großes Suchfeld über alle aktiven
Stufen (Neu, Warteschlange, Im Druck, Kuvertierung, Versandfertig),
empfängergenau – Einzelaufträge zeigen den Namen, Mehrfachaufträge den
Empfänger an der richtigen Briefnummer. Über dem Feld ein Typ-Umschalter
(Schriftstück / Kuvert / Druckobjekte) mit je eigenem, im Reiter
einstellbarem Standard-Template + Maschine (lokal gespeichert). Der
Druck-Button gibt genau diesen Empfänger mit dem Standard-Template in die
Warteschlange; Druckobjekte öffnet die Dateien zum Herunterladen.
Sammel-Druck (Mass-Select): pro Format nicht nur Template + Maschine,
sondern auch Maße/Position (Breite, Höhe, X, Y, Scale, Rotation)
editierbar – übersteuert die Template-Werte wie beim Einzeldruck
(enqueue-bulk reicht die params jetzt an die Jobs durch).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ohne Kuvert (kein Postkarten-Format, „Kuverts generieren" aus) und ohne
eigene [[Platzhalter]] im Brieftext sind alle Schriftstücke identisch –
Empfängeradressen sind dort unnötig. Statt N Zeilen anzulegen, gibt es
jetzt ein Feld „Anzahl identischer Schriftstücke"; beim Anlegen werden
entsprechend viele gleiche Schriftstücke erzeugt. Sobald Kuverts aktiv
sind oder der Text eigene Platzhalter enthält, erscheint wieder die
Empfängertabelle.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der Wechsel auf production_status='versendet' im Produktions-Board löst jetzt die
„versendet"-Vorlage (Versandbenachrichtigung) an den Kunden aus – für alle Aufträge
inkl. manuelle. Nur beim ersten Versand (Guard über versandt_am), keine Doppel-Mail.
Bestellbestätigung bleibt bei manuellen Aufträgen (source=operator) unterdrückt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Manuell im Admin angelegte Aufträge lösen keine Bestellbestätigung an den Kunden
und keine Team-Benachrichtigung mehr aus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Muster- und Angebotsanfragen (App sample/offer-request + WordPress inbound) senden
jetzt den kompletten Inhalt als Feld-Tabelle (Name, Kontakt, Adresse, Produkt,
Menge, Nachricht/Vorhaben) – bei WordPress zusätzlich alle weiteren übermittelten
Formularfelder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Motiv-A6-Layout: Motiv vollständig in 148×105 eingepasst (meet, mittig) auf
weißem A6-Grund statt randabfallend beschnitten (slice).
- skrift-sevdesk: Lade-Log (Token gesetzt/fehlt) + Logs je Auftrag (source-Gate,
bereits erstellt) zur Diagnose, warum ggf. nichts erzeugt wird.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Chargen trennen jetzt zusätzlich nach dem Druck-Durchgang (Zeitpunkt „in den
Druck gegeben", Minute) – zwei Druckläufe desselben Tages mischen sich nicht mehr.
- Charge-Karte: Chip „🖨 gedruckt <Datum/Zeit>".
- „Weiteres" je Auftrag: „In den Druck: <Datum/Zeit>" sowie Erster/Letzter
Empfänger (nach Briefnummer) zum Auseinandersortieren.
- druckIndex (frühester/letzter Job-Zeitpunkt) + empfNamen aus order_entries.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- skrift-orders: bei Konfigurator-Bestellung mit Motiv-Upload wird ein A6-
Drucklayout (152×109 mm, 2 mm Beschnitt, Motiv mittig/randabfallend) erzeugt
und als orders.motif_layout abgelegt; approval_status='pending' + Token gesetzt;
Freigabe-Mail (motiv_freigabe) mit Einmal-Link verschickt. Öffentliche
Endpunkte /freigabe/:token (Info), /:token/layout (SVG), POST (freigeben/ändern).
- bootstrap: orders.approval_status/approval_token/approval_note/motif_layout,
users.sevdesk_contact_id (bereits), Mailvorlage motiv_freigabe.
- Produktion: Chip „wartet auf Freigabe / freigegeben / Änderungswunsch".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neue Hook-Extension skrift-sevdesk: legt bei orders.items.create (source=
configurator) eine sevDesk-Rechnung als ENTWURF an – Kontakt wird angelegt/
wiederverwendet (sevdesk_contact_id am Konto), Positionen aus price_lines
(Produkt mit Menge; Versand/Motiv/Zusatz je eigene Position), 19% USt.
Nicht-blockierend, per SEVDESK_API_TOKEN aktiviert; Versand NICHT über sevDesk.
- orders.price_lines (JSON) speichert die Positionsaufstellung bei Bestellung
(Konfigurator + manueller Auftrag).
- bootstrap: orders.price_lines/sevdesk_invoice_id/sevdesk_invoice_number,
directus_users.sevdesk_contact_id.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- email_templates: neues Feld bcc_team (Checkbox).
- Mailer: ist bcc_team gesetzt, geht die Mail zusätzlich als BCC an
email_settings.team_email (Kunde sieht die Kopie nicht).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der WP-Webhook schickt vorname + name(=Nachname) getrennt und die Stadt als „ort".
Bisher wurde nur body.name als kompletter Name genommen (nur Nachname), city aus
body.city gelesen (leer) und kein first_name/last_name gespeichert – daher stand
beim Übernehmen der Nachname im Vornamen und Ort blieb leer.
- Anzeigename = vorname + name; address bekommt first_name/last_name.
- Stadt aus „ort" (Aliase stadt/city), plus robuste Feld-Aliase via feldWert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- skrift-orders: sample-/offer-request nehmen viele Feldnamen-Varianten an
(feldWert-Helfer) und loggen eingehende + gefüllte Feldnamen zur Diagnose.
- skrift-produktion: „Direkt drucken" bei Musteranfragen entfernt (nur noch
„In manuellen Druck übernehmen").
- skrift-kontakte: Bulk-Status-Dropdown lesbar (weiße Schrift auf weiß behoben);
Shift-Klick wählt den ganzen Bereich zwischen zwei Checkboxen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /preview: leerer Text ist erlaubt, wenn envelope_labeling != 'keine' → nur die
Kuverts werden erzeugt.
- Postkarte in der Vorschau nur bei vorhandenem Brieftext erzeugen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vorname→first_name, name→last_name, telefon→phone, zipcode→zip, ort→city,
produkt_interesse→product. App-Feldnamen behalten Vorrang. So kann ein
WordPress-Formular direkt Muster-/Angebotsanfragen anlegen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Produktion: Button „✍ In manuellen Druck“ auf der Musteranfrage übernimmt die
Adresse als Einzelfelder (Vorname/Nachname/Straße/Nr./PLZ/Ort/Land) in den
manuellen Druck; die Platzhalter [[Vorname]]/[[Nachname]]/[[Ort]] … ziehen sich
daraus. „🖨 Direkt drucken“ (Modal) bleibt als Schnellweg.
- neuauftrag: Übernahme trägt die Einzelfelder mit (nicht nur free_text/placeholders).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
sample-request und offer-request akzeptieren first_name/last_name, bilden daraus
den Anzeigenamen und legen sie in address ab (für Kuvert/Platzhalter im Muster-
Workflow). „name" bleibt als Fallback.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Produktion-Muster-Dialog: benannten Mustertext (muster_texts) wählen; Platzhalter
([[Vorname]]/[[Nachname]]/[[Ort]]/[[Strasse]]/[[PLZ]]/[[Land]]) aus der Anfrage-
Adresse automatisch füllen; Text vor dem Anlegen bearbeitbar; „Adresse aufs
Kuvert" (Standard an) mit Format/Template-Wahl.
- manual-print: erzeugt optional zusätzlich ein Kuvert (Umschlag-Job) mit der Adresse.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Mustertext-Auswahl ersetzt den bisherigen Brieftext (statt anzuhängen).
- Vorschau: [[Zeile1]]..[[Zeile5]] aus den 5 Adresszeilen verfügbar; Tipp im UI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- bootstrap: Collections agent_logs (Logs/Fehler von Agent & AutoRecover) und
agent_commands (Befehle an den Agenten, Typ restart; Agent arbeitet „pending“ ab).
- Produktion: Button „🔄 Programm neustarten“ legt einen restart-Befehl für die
aktive Maschine an.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neues Modul „Statistik": versendete Briefe je Kunde/Monat, getrennt Inland/
Ausland, Zeilen aufklappbar (Auftragsliste), mit Suche. Raus aus dem Board.
- Produktion: Auto-Refresh pausiert, während ein Feld bearbeitet wird (Notizen
gingen sonst beim 15-s-Reload/Statuswechsel verloren). „Neu generieren“/
„In manuellen Druck“ aus dem Empfänger-Dialog entfernt (liegen unter Weiteres).
Unter Weiteres jetzt auch Kontakt/Kunde verknüpfen (per E-Mail) und mit × lösen
– ohne Kundenmail.
- Ausland-Erkennung (zielInland) mit Wortgrenzen (\b) + unbekannter Ländertext →
Inland: „Schweizer Straße“, „Neusass“, „Polenz“ werden nicht mehr als Ausland
geflaggt (orders + produktion).
- Kontakte-Modul: Mehrfachauswahl → Status ändern / löschen.
- contacts-Hook: Abwahl von „In Kontakte speichern“ löscht die Kontakte wieder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- bootstrap: render_formats a6_postkarte + dinlang_postkarte (kind 'postkarte'),
passende formats-Einträge (active=false → nicht in der App, nur manueller Druck),
kind-Dropdown um 'postkarte' erweitert.
- skrift-orders: Vorschau erkennt Postkarten (render_formats.kind) und baut EIN
Dokument mit Text + Absender + Empfänger (Marker [[pk_abs]]/[[pk_adr]]).
- neuauftrag: Postkarten-Formate erkannt; Absenderfeld direkt (unabhängig von
Kuverts), Kuvert-Optionen ausgeblendet, Hinweis aufs Kartenlayout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- bootstrap: format_templates nur bei LEERER Collection anlegen (Betreiber
pflegt sie selbst; kein Wieder-Anlegen bei jedem Bootstrap).
- Unterschriftenservice: Inline-Kuverts ("Kuverts mitdrucken") + Verknüpfen im
Signatur-Tab wieder entfernt; signature-order auf Seiten-only zurückgesetzt.
- Produktion: Verknüpfen, In Kontakte speichern, Neu generieren und In manuellen
Druck übernehmen hinter "Weiteres"-Button gebündelt; Notiz bleibt vorne.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Produktion: Statistik-Tab (versendete Briefe je Kunde/Monat), verknüpfter
Auftrag je Karte anzeigen/ändern/entfernen, Datei-Aufträge werden beim
Übernehmen wieder in den Signatur-Tab überführt.
- Unterschriftenservice (neuauftrag): optionale Kuverts (je Empfänger ein
Umschlag, Absender möglich) und Verknüpfung mit vorhandenem Auftrag.
- orders: signature-order erzeugt Kuverts über die Standard-Pipeline
(Datei-Produkt -> nur Umschläge, Seiten bleiben erhalten) und speichert
linked_order; nachträgliches Verknüpfen im Board.
- bootstrap: orders.linked_order (Self-Relation).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
format_templates.default_format (Format-Key) -> Druck-Dialog waehlt das als Standard
markierte Template vor, unabhaengig von fest verdrahteten Keys.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
orders.internal_note + neue Collection charge_notes (charge_key). Editierbare
Notizfelder in Auftrags- und Charge-Karte, speichern beim Verlassen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Auftragskarte: Chip 'DE N / Welt M weltweit' (aus count_inland/count_ausland).
- Empfaenger-Dialog: Auslands-Empfaenger mit 'weltweit' markiert.
- Druck-Dialog: Schnellwahl 'nur Deutschland' / 'nur Welt' fuellt die Nummern je
Gruppe -> Schriftstuecke und Kuverts getrennt druckbar, Auftrag bleibt einer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>