-- AP1.4b: Gate-Checkliste (Prüfplan pro RoadmapItem) CREATE TABLE roadmap_item_criteria ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, roadmap_item_id UUID NOT NULL REFERENCES roadmap_items(id) ON DELETE CASCADE, sort_order INT NOT NULL DEFAULT 0, title TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', criterion_kind VARCHAR(32) NOT NULL DEFAULT 'evidence_required' CHECK (criterion_kind IN ('manual', 'evidence_required', 'review_required', 'metric')), verification_hint TEXT NOT NULL DEFAULT '', status VARCHAR(32) NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'satisfied', 'waived', 'deferred', 'failed')), waived_or_deferred_decision_id UUID NULL REFERENCES decisions(id) ON DELETE SET NULL, satisfied_by_evidence_id UUID NULL REFERENCES evidence(id) ON DELETE SET NULL, satisfied_at TIMESTAMPTZ NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_roadmap_criteria_item ON roadmap_item_criteria(tenant_id, roadmap_item_id); CREATE INDEX idx_roadmap_criteria_status ON roadmap_item_criteria(tenant_id, status); -- Compat: Default-Kriterium pro bestehendem Plan-Element INSERT INTO roadmap_item_criteria ( tenant_id, roadmap_item_id, sort_order, title, description, criterion_kind, status ) SELECT ri.tenant_id, ri.id, 0, 'Gate allgemein', COALESCE(NULLIF(ri.goal_description, ''), 'Akzeptierter Nachweis oder abgeschlossenes Review am Plan-Element.'), 'evidence_required', 'open' FROM roadmap_items ri; -- Bereits vorhandene accepted Evidence → Default-Kriterium satisfied UPDATE roadmap_item_criteria ric SET status = 'satisfied', satisfied_at = NOW(), satisfied_by_evidence_id = sub.evidence_id FROM ( SELECT DISTINCT ON (ric2.id) ric2.id AS criterion_id, e.id AS evidence_id FROM roadmap_item_criteria ric2 JOIN evidence e ON e.tenant_id = ric2.tenant_id AND e.roadmap_item_id = ric2.roadmap_item_id AND e.status = 'accepted' WHERE ric2.title = 'Gate allgemein' ORDER BY ric2.id, e.updated_at DESC ) sub WHERE ric.id = sub.criterion_id; -- Bereits reached Gates ohne Evidence: Review completed UPDATE roadmap_item_criteria ric SET status = 'satisfied', satisfied_at = NOW() FROM roadmap_items ri WHERE ric.roadmap_item_id = ri.id AND ric.tenant_id = ri.tenant_id AND ric.title = 'Gate allgemein' AND ric.status = 'open' AND ri.status = 'reached' AND EXISTS ( SELECT 1 FROM reviews rev WHERE rev.tenant_id = ri.tenant_id AND rev.initiative_id IN ( SELECT r.initiative_id FROM roadmaps r WHERE r.id = ri.roadmap_id ) AND rev.status = 'completed' AND (rev.roadmap_item_id = ri.id OR rev.milestone_id = ri.id) );