-- 0026_delivery_report_jobs.sql -- -- Zustandsanker für die Übertragung des PDF-Lieferreports an DOCUframe. -- Beim Abschluss wird der Report erzeugt und in DOCUframe abgelegt; das ist -- ein mehrstufiger, netzabhängiger Vorgang (Upload → ~ObjectID → Makro -- `_SV_assignDeliveryReport`). Damit nichts verloren geht und fehlgeschlagene -- Übertragungen per Cron wiederholt werden können, hält diese Tabelle den -- Fortschritt **hart** in Postgres. -- -- Genau eine Zeile pro Lieferung (PK = delivery_id). `status` ist die -- Resume-Marke; ein Retry führt nur die noch offenen Schritte aus: -- * 'pending' — angelegt, noch nichts übertragen -- * 'uploaded' — PDF liegt in DOCUframe, `docuframe_object_id` gesetzt, -- Makro-Zuordnung steht noch aus -- * 'done' — Makro erfolgreich; lokale Dateien wurden aufgeräumt -- -- Fehlersemantik: schlägt ein Schritt fehl, bleibt `status` auf der erreichten -- Stufe, `last_error`/`attempts`/`last_attempt_at` werden gesetzt. Der Cron -- greift alle Zeilen mit status <> 'done' erneut auf. CREATE TABLE delivery_report_jobs ( delivery_id UUID PRIMARY KEY REFERENCES deliveries(id) ON DELETE CASCADE, belegnummer TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'uploaded', 'done')), -- DOCUframe ~ObjectID des hochgeladenen Reports — hart gespeichert nach -- dem Upload, damit ein Retry nicht doppelt hochlädt. docuframe_object_id TEXT, -- Zeitpunkt der erfolgreichen Makro-Zuordnung (= „Report hochgeladen"). report_uploaded_at TIMESTAMPTZ, attempts INT NOT NULL DEFAULT 0, last_error TEXT, last_attempt_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- Schneller Zugriff des Retry-Cron auf offene Jobs. CREATE INDEX delivery_report_jobs_open ON delivery_report_jobs (status) WHERE status <> 'done';