Files
patrick 9a24ea29e1 FDN-01: repository & projektgerüst
Git-Repository für bestehenden archivdms-Code initialisiert, Branch-/Commit-Konvention (feature/<ticket>-<slug>-Branches, Ticket-Prefix in Commit-Nachricht) etabliert.
2026-08-11 21:27:53 +02:00

58 lines
2.8 KiB
SQL

-- PROJ: workflows / Consumption-Regeln
-- Doku-only (siehe README.md in diesem Verzeichnis) — die tatsächliche
-- Ausführung passiert idempotent über internal/storage/workflows.go
-- initWorkflowsSchema(), aufgerufen aus (*Store).initSchema() NACH
-- initClassificationTemplatesSchema (eine Workflow-Action kann eine
-- Klassifizierungsvorlage referenzieren: apply_classification_template).
--
-- Workflows (Consumption-Regeln): tenant-skopierte Automatisierungsregeln, die
-- an einem Trigger-Punkt (MVP: on_upload) ausgewertet werden. Ein passender
-- Workflow führt seine geordneten Actions auf dem Dokument aus. Die
-- Bedingung ist ein JSONB-Condition-Tree (bool. Gruppen and/or + Leaf-Knoten
-- mit Feld/Algorithmus/Pattern, MVP-Verschachtelungstiefe 2). Jede Auswertung
-- wird dokument-skopiert in workflow_runs protokolliert (GoBD-Reproduzierbarkeit
-- parallel zum globalen internal/audit-Log).
--
-- Best-effort-Ausführung: eine fehlgeschlagene Action bricht den Upload niemals
-- ab — Fehler werden in workflow_runs.error festgehalten und die Schleife läuft
-- weiter (spiegelt die "never fail the upload"-Philosophie der OCR-/
-- Auto-Assign-Schritte in storeUploadedFile).
CREATE TABLE IF NOT EXISTS workflows (
id BIGSERIAL PRIMARY KEY,
tenant_id BIGINT NOT NULL,
name TEXT NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT true,
trigger_type TEXT NOT NULL CHECK (trigger_type IN ('on_upload')),
condition_tree JSONB NOT NULL,
priority INT NOT NULL DEFAULT 100,
created_by BIGINT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE(tenant_id, name)
);
CREATE INDEX IF NOT EXISTS idx_workflows_tenant ON workflows(tenant_id);
CREATE TABLE IF NOT EXISTS workflow_actions (
id BIGSERIAL PRIMARY KEY,
workflow_id BIGINT NOT NULL REFERENCES workflows(id) ON DELETE CASCADE,
step_order INT NOT NULL,
action_type TEXT NOT NULL CHECK (action_type IN
('add_tag','set_doc_type','set_correspondent','apply_classification_template','set_custom_field')),
action_config JSONB NOT NULL DEFAULT '{}'
);
CREATE INDEX IF NOT EXISTS idx_workflow_actions_workflow ON workflow_actions(workflow_id, step_order);
CREATE TABLE IF NOT EXISTS workflow_runs (
id BIGSERIAL PRIMARY KEY,
workflow_id BIGINT NOT NULL REFERENCES workflows(id) ON DELETE CASCADE,
tenant_id BIGINT NOT NULL,
document_id BIGINT,
triggered_at TIMESTAMPTZ NOT NULL DEFAULT now(),
matched BOOLEAN NOT NULL,
actions_applied JSONB,
error TEXT
);
CREATE INDEX IF NOT EXISTS idx_workflow_runs_workflow ON workflow_runs(workflow_id);
CREATE INDEX IF NOT EXISTS idx_workflow_runs_document ON workflow_runs(document_id);