Schema procur_fit für Projekte, Nachweise und Analysen
Status: als Referenzdateien umgesetzt am 30.09.2026. Auf der gehosteten Dev-Datenbank erst nach Freigabe durch den Nutzer angewendet.
Kontext
Der Agent-Arbeitsplatz (Spec, Abschnitt 4)
braucht Organisationstypen, Projekte, Kriterien, Nachweise und gespeicherte
Analysen in der Datenbank. Bisher lagen Projekte und Arbeitsstand der VergabeFit-Module
im localStorage des Browsers. Vergabestellen und Unternehmen arbeiten auf derselben
Plattform, dürfen aber die Daten der jeweils anderen Seite nicht sehen.
Entscheidung
- Eigenes Schema
procur_fitmit sieben Tabellen:projects,project_documents,watched_notices,requirement_sets,profiles,profile_facts,analysis_runs. Die Referenzdateien liegen indatabase/fit/, die Policies indatabase/security/rls.sql, weil sie die Mitgliedschafts-Helfer ausregx/functions.sqlbrauchen. - Vergabestellen sind Organisationen in
procur_regx.companiesmitorg_kind = 'authority'(company,authority,both). Mitgliedschaften, Einladungen, Claims und der Org-Wechsler gelten unverändert. Das öffentliche Firmenverzeichnis (list_public_companies,get_public_company) blendet Vergabestellen aus. - Ausschreibungen werden über
notice_id textohne Fremdschlüssel referenziert.complete_noticeersetzt die Lose bei jeder Neuverarbeitung. Anzeigedaten stehen alsnotice_snapshotim Projekt bzw. in der Merkliste. - Der Marktpool ist synthetisch. Pool-Profile haben
company_id is nullundis_synthetic = true(Check-Constraint). Alle freigeschalteten Nutzer lesen sie, nur Plattform-Admins schreiben sie. - Rechte pro Organisation der Zeile: Mitglieder lesen, OWNER/EDITOR schreiben.
Einzige Ausnahme ist
watched_notices, dort schreiben alle Mitglieder. Analysen sind eine reine Historie ohne Update. Eine bestätigte Kriterienrevision ist per Trigger unveränderlich, Korrekturen werden eine neue Revision. - Organisationsdokumente sind
procur_docs.user_documentsmit gesetztercompany_idunddoc_kind. Sie gehören der Organisation: Mitglieder lesen, nur OWNER/EDITOR legen an, ändern und löschen, auch wenn sie das Dokument erstellt haben. Ein VIEWER kann keine Organisationsdokumente anlegen, ein ausgeschiedenes Mitglied verliert den Zugriff. Dateien liegen im Bucketuser-documentsunterorg/<company_id>/….
Folgen
- Ein neues Schema muss in acht Freigabelisten stehen (Spec 4.4):
00_schema.sql,config.sql,REFERENCESinscripts/sync_database.py,verify_schema.sql,supabase/config.toml,selfhosted_bootstrap.sql,deploy/.env.examplesamt Frontend-Konfiguration sowie diese Dokumentation. Fehlt eine, scheitert der Zugriff erst zur Laufzeit. - Beim gehosteten Projekt muss
procur_fitin der Supabase-Oberfläche unter „Exposed schemas“ stehen, sonst antwortet PostgREST mit PGRST106. config.sqlvergibtSELECTauf künftige Tabellen der procur-Schemas automatisch. RLS ist deshalb die einzige echte Sperre, undverify_schema.sqlverlangt RLS für jede Tabelle inprocur_fit.- Die Startdaten (
database/fit/seed_demo.sql) werden von Hand eingespielt. Die E-Mail-Adresse des Demo-Kontos wird nur beim Aufruf als psql-Variable übergeben. - Geprüft wird in pglite (
database/tests/fit.test.mjsmitfit_rls.sql): Vertraulichkeit zwischen Organisationen, VIEWER-Rechte, unveränderliche Kriterien, Storage-Pfade, Verzeichnis ohne Vergabestellen und die Idempotenz von Replay und Seed.