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>
Skrift Produktions-Agent
Schlanker lokaler Agent (Windows) neben dem Plotter. Steuerung läuft über Directus – der Agent macht nur: Heartbeat → Job holen → drucken → melden.
Einrichtung
- In Directus einen Nutzer der Rolle Service anlegen und einen statischen Token erzeugen.
- Die Maschine in Directus unter Einstellungen → Maschinen anlegen
(
base_url, ggf.mid/Login). Die numerische ID der Maschine ist diemachine_idfür die Agent-Config. config.example.json→config.jsonkopieren und ausfüllen (directus_url,directus_token,machine_id).- Abhängigkeiten installieren und starten:
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\python agent.py
Ablauf
- Der Agent meldet zyklisch
machines.status+last_seen(Heartbeat). - Er zieht den nächsten
jobs-Eintrag seiner Maschine mitstatus=queued(sortiert nachpriority, dann Alter). - Er lädt die SVGs des Auftrags passend zum Job-Typ (Schriftstück/Umschlag)
über den Directus-Datei-Endpoint (
/skrift-orders/files/...) und schickt sie mit den Template-Werten (Maße/Position/Rotation) an den Plotter. - Status zurück:
printing → printedbzw.failed(+ Fehlermeldung). - Bei Maschinenfehler (z. B. Papierende) ruft er
recover_writeauf.
Jobs entstehen
Über den Admin-Trigger POST /skrift-orders/enqueue { order, machine }
(bzw. später ein Button in der Webapp). Pro Auftrag entsteht ein Brief-Job und
– falls Kuvert beschriftet – ein Umschlag-Job, jeweils mit aufgelöstem Template.
Signaturen / AutoRecover
Der Signatur-Service bleibt vorerst unberührt. Das win32-AutoRecover
(klickt das Java-Fenster) kann weiter separat laufen; der Agent nutzt zusätzlich
den API-recover_write der Maschine.