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 (| Criterium | {beoordelingen.map((b) => ({b.expert_name} | ))}
|---|---|
| {c.label} {c.schaal} | {beoordelingen.map((b) => ({fmt(b[c.id])} | ))}
| Gemiddelde | {beoordelingen.map((b) => ({fmt(gemiddelde(b))} | ))}
| Advies Bonus / Malus | {beoordelingen.map((b) => ({bonusMalusLabel(b.bonus_malus_advies)} | ))}
{b.expert_name} {b.toelichting}))}