Git-Repository für bestehenden archivdms-Code initialisiert, Branch-/Commit-Konvention (feature/<ticket>-<slug>-Branches, Ticket-Prefix in Commit-Nachricht) etabliert.
58 lines
2.8 KiB
SQL
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);
|