'use client' /** * ResultSummary — Audit-Kopf: Titel + check_id + 4 KPI-Kacheln über den * Dokument-Tabs. Co-Pilot-Ton (grün wenn gut, rot nur bei echten offenen * Punkten, gelb für „zu prüfen"). Rechnet aus result.results (Haupt-Engine). */ import React from 'react' import type { CheckItem, DocResult } from './ChecklistView' type Tone = 'gray' | 'green' | 'red' | 'amber' const TONE: Record = { gray: 'text-gray-800', green: 'text-green-700', red: 'text-red-700', amber: 'text-amber-700', } function Tile({ label, value, tone }: { label: string; value: React.ReactNode; tone: Tone }) { return (
{value}
{label}
) } function isReview(c: CheckItem): boolean { return c.severity === 'INFO' && !c.passed && !c.skipped } export function ResultSummary({ results }: { results: any }) { const docs: DocResult[] = results.results || [] const company = results.extracted_profile?.company_profile?.companyName as string | undefined let offen = 0 let zuPruefen = 0 let konform = 0 let checked = 0 for (const d of docs) { if (d.error) continue checked++ const l1Score = d.checks.filter(c => (c.level ?? 1) === 1 && c.severity !== 'INFO') const l1Failed = l1Score.filter(c => !c.passed).length const l2Failed = d.checks.filter( c => (c.level ?? 1) === 2 && !c.skipped && !c.passed && c.severity !== 'INFO', ).length offen += l1Failed + l2Failed zuPruefen += d.checks.filter(isReview).length if (l1Failed === 0 && (d.completeness_pct ?? 0) === 100) konform++ } return (

Compliance-Check{company ? `: ${company}` : ''}

{results.check_id && ( <>ID {results.check_id} · )} {docs.length} Dokument{docs.length !== 1 ? 'e' : ''} geprüft

0 && konform === checked ? 'green' : 'gray'} /> 0 ? 'red' : 'green'} /> 0 ? 'amber' : 'gray'} />
) }