import Link from "next/link"; import type { ExpertBeoordeling } from "../../../lib/db"; import { BONUS_MALUS_OPTIONS, EXPERT_CRITERIA } from "../../../lib/rikxCalculatie"; export type BeoordelingMetNaam = ExpertBeoordeling & { expert_name: string }; const getal = new Intl.NumberFormat("nl-NL", { maximumFractionDigits: 2 }); const fmt = (v: number | null) => (v === null ? "—" : getal.format(v)); function gemiddelde(b: BeoordelingMetNaam): number | null { const scores = [b.duur_impact, b.levensdomeinen, b.basissituatie].filter((v): v is number => v !== null); return scores.length ? scores.reduce((a, c) => a + c, 0) / scores.length : null; } function bonusMalusLabel(id: string | null): string { if (!id) return "Geen"; return BONUS_MALUS_OPTIONS.find((o) => o.id === id)?.label ?? id; } // Alleen-lezen overzicht van de beoordelingen die experts via hun eigen pagina hebben ingevuld. // Impactscore M in de Rikx calculatie is het gemiddelde van de kolom "Gemiddelde". export function ExpertBeoordelingen({ beoordelingen }: { beoordelingen: BeoordelingMetNaam[] }) { if (beoordelingen.length === 0) { return (

Nog geen beoordelingen. Experts vullen hun scores in op hun eigen pagina; beheer de experts bij{" "} CRM → Experts .

); } const cell = "py-2 px-3 text-right tabular-nums"; return (
{beoordelingen.map((b) => ( ))} {EXPERT_CRITERIA.map((c) => ( {beoordelingen.map((b) => ( ))} ))} {beoordelingen.map((b) => ( ))} {beoordelingen.map((b) => ( ))}
Criterium {b.expert_name}
{c.label} {c.schaal} {fmt(b[c.id])}
Gemiddelde {fmt(gemiddelde(b))}
Advies Bonus / Malus {bonusMalusLabel(b.bonus_malus_advies)}
{beoordelingen.some((b) => b.toelichting) && (

Toelichting van de experts

{beoordelingen .filter((b) => b.toelichting) .map((b) => (
{b.expert_name} {b.toelichting}
))}
)}
); }