OHSHub
v0.35.0Kennisplatform voor arbeidshygiënisten, hogere veiligheidskundigen en A&O-deskundigen. Onderzoeksgegevens worden beveiligd opgeslagen in de cloud. Inloggen is vereist voor toegang.
Over de ontwikkelaar
OHSHub wordt ontwikkeld door DiversiThijs, gevestigd te Breedenbroek. Het platform is ontstaan vanuit de praktijk: een behoefte aan toegankelijke, gestructureerde ondersteuning bij arbeidshygiënisch onderzoek conform de geldende wet- en regelgeving en normen.
- KvK
- 92899943
- Vestigingsplaats
- Breedenbroek
- info@diversithijs.nl
- Privacyverklaring
- /privacy
- Disclaimer
- /disclaimer
Vroege ontwikkelfase — maak altijd een eigen back-up
OHSHub is volop in ontwikkeling. In deze fase kan niet worden gegarandeerd dat opgeslagen onderzoeken bewaard blijven bij updates of technische problemen. Zorg daarom altijd voor een eigen back-up via de exportfunctie (JSON) binnen een onderzoek. De ontwikkelaar aanvaardt geen aansprakelijkheid voor verlies van gegevens.
Versiehistorie
Geluid: basisonderzoek (basic characterisation) als RI&E-module
- Drie nieuwe stappen vóór het volledige meetonderzoek: bronneninventarisatie, HEG-schatting en conclusie.
- Stap 1 — Bronneninventarisatie: vastleggen van geluidsbronnen met type, locatie, fabrieksopgave, piekgeluid en blootstellingsduur.
- Stap 2 — HEG's & blootstellingsschatting: per HEG geschatte L_EX,8h (energetische berekening), signaleringsvragen en bijzondere risicogroepen.
- Stap 3 — Beoordeling & conclusie: per HEG oordeel (laag / aandachtspunt / meting aangewezen / meting noodzakelijk) en RI&E-documentatie.
- Automatische suggestie voor conclusie op basis van indicatieve blootstelling, piekgeluid en signaleringsvragen.
- Beslisregels conform AI-04, AG H17 en PAV H39.
- Bestaande onderzoeken automatisch gemigreerd naar het nieuwe stappenschema (schemaversie 2).
Abonnementen: Stripe-integratie en Pro-toegangscontrole
- Stripe Checkout en Billing Portal gekoppeld voor maandelijkse Pro-abonnementen.
- Abonnementsstatus (free / active / trialing) opgeslagen in gebruikersprofiel.
- Accountpagina toont abonnementssectie met upgrade-knop of abonnementsbeheer.
- Admins krijgen automatisch volledige toegang zonder abonnement.
- Webhook-handler voor automatische statusupdates bij betaling, verlenging en opzegging.
Geluid stap 12: Word-export meetresultaten + berekeningen + apparatuur
- Nieuwe knop "Word (meetdata)" in stap 12 — Rapport.
- Word-document bevat alle meetwaarden per HEG en taak (alle velden inclusief octaafbanden, afwijkingen, uitsluiting).
- Pagina statistische berekeningen: taakbijdragen, onzekerheidsanalyse, L_EX,8h,95%, normconformiteitschecks.
- Pagina meetapparatuur en kalibratie: instrumenttabel met lab-kalibratie, veldkalibratie-data en drift-check per reeks.
Geluid: professioneel B2-rapport (lopende tekst + bijlagen)
- Nieuw rapport op B2-niveau: lopende tekst voor leken, technische data in bijlagen.
- Rapporthoofdstukken: aanleiding, werkzaamheden, methode, gezondheidscontext, resultaten, aanbevelingen, conclusie.
- Bijlagen: meetresultaten, berekeningen, instrumentatie, arbeidsmiddelen, conformiteitsverklaring.
Geluid: 11-bands octaafband (16 Hz–16 kHz) + kalibratiefix + duur-only invoer
- Octaafbanden uitgebreid van 8 naar 11 bands: 16 / 31,5 / 63 / 125 / 250 / 500 / 1k / 2k / 4k / 8k / 16k Hz.
- A-gewichten bijgewerkt conform IEC 61672-1:2013 voor alle 11 bands.
- PPE-stap (stap 6): octaafbandmethode (EN 458 §A.2) toegevoegd met m/s-invoer per band en APV-preview.
- Meetstap (stap 8): octaafbandinvoer toont alle 11 bands.
- Bug opgelost: kalibratie/meetserie verdween na opslaan door stale-closure race condition in SeriesPanel.
- Meetstap (stap 8): datum/tijdstip-velden verwijderd; alleen duur nog invoerbaar.
Geluid PDF: correcte Arbobesluit-artikelen + eerlijke conformiteitsverklaring
- Alle foutieve art. 6.6-verwijzingen in PDF gecorrigeerd naar de juiste lids van art. 6.8.
- Conformiteitsverklaring toont "met afwijkingen" als er normafwijkingen of ontbrekende HEG's zijn.
- Managementsamenvatting toont ontbrekende HEG's en normafwijkingen (complianceChecks).
- Normtitel cover pagina: "werkplek" gecorrigeerd naar "arbeidsplaats"; art. 6.5 → art. 6.7.
- PPE-referenties gecorrigeerd: art. 6.5 lid 3 / art. 6.9 → art. 6.8 lid 9 / art. 6.8.
Geluid stap 12: automatisch gegenereerde conclusie
- Knop "Genereer op basis van onderzoek" toegevoegd bij het conclusieveld.
- generateConclusion: resultaten per HEG (L_EX,8h,95%, verdict, piekgeluid, PBM-gecorrigeerd niveau).
- Normafwijkingen (fail-checks) en ontbrekende HEG's worden in de conclusie benoemd.
- Eindoordeel met actie-omschrijving per verdichtniveau (LAV/UAV/GW/voldoet).
- Openstaande maatregelen worden vermeld met verwijzing naar herbeoordeling.
Geluid stap 12: conformiteitsverklaring weerspiegelt normafwijkingen en ontbrekende HEG's
- generateComplianceStatement: "conform" → "met afwijkingen" wanneer er fail-checks of onbeoordeelde HEG's zijn.
- Normafwijkingen (fail/warning uit stap 9) nu inline per HEG-regel en als aparte sectie in de verklaring.
- Onbeoordeelde HEG's (onvoldoende meetdata) expliciet benoemd in resultatenlijst en eindoordeel.
- Eindoordeel in verklaring: "niet alle HEG's beoordeeld" wanneer data ontbreekt.
- Completeness check "Berekeningen uitgevoerd" vereist nu resultaten voor álle HEG's.
- Waarschuwingsbanner boven conformiteitsverklaring bij bekende afwijkingen of ontbrekende HEG's.
Geluid stap 10: alle Arbobesluit-artikelverwijzingen gecorrigeerd
- OBLIGATIONS en PEAK_OBLIGATIONS: Art. 6.6 (definities) vervangen door correcte Art. 6.8 leden (maatregelen).
- Art. 6.7 correct beschreven als RI&E/meting (niet audiometrie); audiometrie verwijst nu naar Art. 6.10 lid 2/3.
- Art. 6.8 correct beschreven als bronmaatregelen (niet voorlichting); voorlichting verwijst naar Art. 6.11.
- Art. 6.9 (weekgemiddelde) verwijderd uit verplichtingenlijsten; was onterecht gebruikt voor PBM-effectiviteit.
- Grenswaarde-verplichting (GW bij overschrijding) verwijst nu naar Art. 6.8 lid 11a/b/c.
- Threshold-tabel: grondslagen LAV/UAV/GW gecorrigeerd (Art. 6.8 lid 7, 9, 10).
- Voetnoot threshold-tabel: niet-bestaand Art. 6.5 lid 3 vervangen door Art. 6.8 lid 10.
- Titel en verplichtingentabel-kop: art. 6.6–6.8 → art. 6.7–6.11.
- AudiometrySection: art. 6.7/6.10 → art. 6.10 lid 3 (LAV); art. 6.10 lid 1 → art. 6.10 lid 2 (UAV).
Geluid stap 9: normcorrecties berekening en paragraafverwijzingen
- u1b-formule gecorrigeerd: deelt nu door 2×Tm (norm §C.7 Noot: u1b=0,5(Tmax−Tmin)) i.p.v. 2√3×Tm.
- §9.3.1 → §9.3.2 in alle compliance-checks en taakmeldingen (minimum metingen per taak).
- Job-based minimum N=5 i.p.v. 3; N=3 en N=4 zijn per Tabel C.4 Noot 1 uitsluitend geldig voor dagmetingen.
- Meetplan task-based: "Tabel 2" → "Tabel 1" (Tabel 1 = taakgericht nmin; Tabel 2 = functiegericht nmin).
- Meetplan job-based: §10.4 → §10.2; min. duur per steekproef 15–60 min (aanbevolen 45 min) i.p.v. volledige Te.
- Meetplan full-day: min. duur per meting = 75% van Te (i.p.v. 100%).
- Onzekerheidsrij: "Formule C.1" → "Formule C.3" (taakgericht) / "Formule C.9" (functie-/dagmeting).
- Energiegemiddelde label: full-day toont nu "Formule (7) → Formule (9)" i.p.v. "Formule 7".
Geluid: normconformiteit per HEG in stap 9 en stap 10
- Nieuw SoundCompliancePanel toont per HEG of het onderzoek voldoet aan NEN-EN-ISO 9612:2025.
- Checks: min. metingen per taak (§9.3.2), spreiding (Bijlage E), dagmeting dekking ≥ 75% (§9.4), representativiteit (§15.d.4), onzekerheid c₁u₁ (§10.4).
- Panel zichtbaar in zowel stap 9 (berekening) als stap 10 (beoordeling/conclusie).
- Baangerichte en dagmeting HEGs met 1–2 metingen produceren nu altijd een indicatief resultaat i.p.v. geen resultaat.
Stap 8 geluid: duur weergave als HH:MM:SS (enkelveld)
- Duurveld in meetregistratie toont en accepteert HH:MM:SS in plaats van aparte m/s-invoervelden.
Stap 8 geluid: begintijd/eindtijd in seconden, bewerkbaar duurveld (m + s)
- Begintijd en eindtijd invoerbaar met secondenprecisie (HH:MM:SS).
- Duurveld nu direct bewerkbaar als aparte m- en s-invoer, naast auto-berekening uit begin/eindtijd.
- Automatische duurberekening gebruikt seconden-precisie.
Stap 8 geluid: datum, begintijd, eindtijd en duur per meting (ISO 9612 §15.d.2/3)
- Datum / tijdstip kolom toegevoegd aan meetresultatentabel (taakgericht en functie-/volledigedag).
- Begintijd en eindtijd invoerbaar per meting; duur wordt automatisch berekend.
- "Medewerker / datum" kolom hernoemd naar "Medewerker" — datum staat nu in de nieuwe tijdstip-kolom.
Stap 8 geluid: medewerkerkolom conditioneel, opmerking per meting
- "Medewerker / datum" kolom alleen zichtbaar wanneer de HEG meer dan 1 medewerker heeft.
- Opmerking-veld toegevoegd per meting (taakgericht en functie-/volledigedagmeting).
PDF meetplan: opschoning §-refs, URL, handtekeningen en oranje HEG-boxes
- Oranje req-box per HEG verwijderd — werkinstructies staan al volledig uitgeschreven in de sectie bovenaan het document.
- Functie- en volledigedagmeting: HEG-specifieke aantallen (min. steekproeven, min. cumulatief, min. meting-duur) verhuisd naar de HEG-meta tabel.
- Handtekeningblok verwijderd uit meetplan-PDF.
- URL bijgewerkt: ohs-hub.vercel.app → ohshub.app.
- Onnodige §-verwijzingen verwijderd: §9/10/11 uit strategielabel, §12.2 uit calibratie-header, §15.d.4 uit opmerkingenveld, Arbobesluit art. uit footer.
Meetplan PDF: werkinstructies, kolom-fix, isCyclic; PDF-knop in stap 7; meetduur-tabel verwijderd
- PDF meetplan: "Meetprocedure & werkinstructies" sectie toegevoegd met 4 velden (Kalibratie & aantallen, Meetduur, Meetpositie, Omstandigheden).
- PDF meetplan: kolomtelling-bug opgelost — meetrijen hadden 9 cellen, koptekst 10 kolommen.
- PDF meetplan: typo "Functiomschrijving" hersteld naar "Functiebeschrijving".
- PDF meetplan: cyclische taken (isCyclic) tonen nu eigen duratie-eis (≥ 3 volledige cycli, min. 3 min) in de per-taak req-box.
- PDF meetplan: dode code `includeTask`-parameter verwijderd uit meetkoptabel.
- Meetplan PDF-knop beschikbaar in stap 7 (meetplan & taken), naast de bestaande knop in stap 8.
- Meetduur-vereisten tabel verwijderd uit stap 8; min. eisen zijn zichtbaar in het PDF-meetplan en via per-taak feedback.
Stap 8 geluid: norm-review ISO 9612:2025 — tabelbugs, deviations, §-opschoning
- Bug fix: meetduur-vereisten tabel toonde voor functiegerichte strategie de volledige werkdag als min. meetduur (was ≥ Te); nu correct: 15–60 min per steekproef, min. n uit Tabel 3.
- Bug fix: volledigedag-tabel toonde 3 × Te als min. totaal; nu: ≥ 75% per meting, min. 3 metingen.
- PDF meetplan functiegericht herschreven: juiste steekproefduur (45 min), berekend min. aantal steekproeven en cumulatieve duur uit Tabel 3.
- PDF volledigedag: spreiding- en c₁u₁-conditie voor extra metingen toegevoegd.
- ≥ 5 metingen: "aanbevolen" gecorrigeerd naar "verplicht" indien meerdere medewerkers bemeten worden (ISO 9612 §9.3.2 shall).
- isCyclic-vlag in meetduur-tabel: cyclische taken tonen ≥ 3 cycli / min. 3 min i.p.v. ≥ 5 min.
- Afwijkingen van representatieve omstandigheden: eigen sub-rij direct zichtbaar wanneer Rep. wordt uitgevinkt; niet meer verstopt achter OB-knop.
- Alle §-paragraafverwijzingen verwijderd uit de UI (labels, tooltips, tabelheaders, InfoBox). In het PDF-meetplan blijven ze staan.
- InfoBox vereenvoudigd: "aanlooptijd"-bullet verwijderd (niet normatief), subsectie-headers zonder §-nummers, volgorde logischer.
Stap 7 geluid: ISO 9612:2025 norm-review verbeteringen (§9.1, §9.3.3, §10.4)
- Cyclisch geluid: taak markeerbaar als cyclisch; toont ≥ 3 cycli / min. 3 min-waarschuwing bij T_m-invoer (§9.3.3).
- Uitgebreide InfoBox taakgericht: §9.1 guidance (handgereedschap = aparte taak), min. meetduur ≥ 5 min, verduidelijking spreiding op meetresultaten L_p,A,eqT.
- Functiegericht meetplan: §10.4-eis toegevoegd (c₁u₁ > 3,5 dB → verfijn HEG of extra steekproeven) — nieuw in ISO 9612:2025.
- Bug fix: min. cumulatieve meetduur tabel 3 (15–40 mw.) toont nu het berekende resultaat in uren.
Disclaimer — volledig versiebeheer en admin push (spiegeling privacysysteem)
- Disclaimer-versiebeheer toegevoegd: admins kunnen nieuwe versies publiceren via de disclaimerpagina.
- Admin push per gebruiker: op de gebruikersdetailpagina kan een admin herbevestiging verplichten (bell-knop) of intrekken (X-knop).
- Admin push voor alle gebruikers: knop op /disclaimer om herbevestiging voor alle gebruikers tegelijk in te stellen.
- Gebruikersmodal: bij openstaand verzoek verschijnt de disclaimertekst als sessie-modal met "Accepteren" en "Later".
- Registratie: nieuwe gebruikers moeten bij aanmaken de disclaimer accepteren (checkbox naast privacyverklaring).
- Mijn gegevens: geaccepteerde disclaimerversie en datum worden getoond.
- DisclaimerModal omgezet van localStorage-based naar DB-driven (sessionStorage voor "Later").
Disclaimer — pagina, eenmalige modal en footer
- Disclaimerpagina toegevoegd (/disclaimer) met volledige aansprakelijkheidsbeperking.
- Eenmalige onboarding-modal: nieuwe gebruikers moeten de disclaimer bevestigen voordat ze verdergaan (localStorage, geen DB).
- Footer toegevoegd op elke pagina met links naar Disclaimer, Privacyverklaring en Over OHSHub.
Stap 6/10 geluid: APF→APV, H-klasse HML-check, handmatige presets, 80–87 dB waarschuwing
- APF overal vervangen door APV (Assumed Protection Value, conform EN 458:2026 terminologie).
- HML-check (A.4): H-waarde invoerveld en H-klasse radioknop toegevoegd; klasse-omschrijvingen bijgewerkt (H < 2 dB, M 2–5 dB, L ≥ 5 dB).
- Handmatige methode: SNR-invoer + drie aanname-presets toegevoegd (Optimistisch SNR−3, Realistisch SNR−7, Conservatief SNR−10 conform AI-04); schatting-waarschuwing getoond wanneer preset actief is.
- Stap 10: PFRE-paragraaf en (SNR÷2)-annotatie verwijderd.
- Stap 10: waarschuwing toegevoegd wanneer L_EX,8h,oor in de band 80–87 dB(A) valt.
Stap 6 geluid: EN 458 selectiemethoden gehoorbescherming
- PPE-formulier uitgebreid met EN 458-selectiemethoden: HML-check (A.4), SNR-methode (A.5) en handmatig.
- HML-check: M- en L-waarden invoeren + geluidskarakter (M-klasse / L-klasse) → APF auto-berekend.
- SNR-methode: SNR + spectraalcorrectie (Lp,C − Lp,A) → APF = SNR − correctie.
- Berekende APF wordt direct opgeslagen in ppeAttenuation voor gebruik in stap 10.
- Standaard selectiemethode bij nieuw toe te voegen gehoorbescherming gewijzigd naar HML-check.
Stap 6 geluid: SNR÷2 APF-berekening verwijderd
- SNR÷2 auto-berekening van APF verwijderd — methode heeft geen normatieve basis in EN 458:2026 of Nederlandse richtlijnen.
- APF is nu een handmatig invoerveld; gebruiker bepaalt waarde zelf via EN 458-selectieprocedure (SNR-, HML- of octaafbandmethode).
- SNR-veld blijft als documentatieveld (waarde van datablad).
- PFRE-disclaimer vervangen door instructietekst: APF invoeren op basis van EN 458-selectie.
Stap 6 geluid: normreferenties en InfoBoxen verwijderd
- Staptitel "(art. 7.4a Arbobesluit)" verwijderd.
- InfoBox arbeidsmiddelen (Arbobesluit / Machinerichtlijn) verwijderd.
- InfoBox gehoorbescherming (wettelijke basis EN 458) vervangen door beknopte plaintekst.
- InfoBox dubbele gehoorbescherming vervangen door plain notitieblok; normcitaten verwijderd.
- Normreferenties verwijderd uit keuringsalerts, PFRE-disclaimer, capped-melding en sub-header gehoorbescherming.
Stap 5 geluid: meetapparatuur uitgebreid en kalibratiecontrole gecorrigeerd
- Kalibratietermijn gecorrigeerd: waarschuwing nu bij >24 maanden (was 12) conform §5.3; referentiedatum is aanmaakdatum onderzoek i.p.v. vandaag.
- Foutieve normreferentie §12.1 vervangen door §5.3 in kalibratiemeldingstekst.
- Nieuwe velden: naam kalibratielaboratorium en uitkomst verificatie (§5.3 / §15.c.3).
- Kalibratorsectie toegevoegd: type/model en serienummer kalibrator (§5.2 — IEC 60942).
- Waarschuwing bij selectie klasse-2 instrument toegevoegd (§5.1 — minder geschikt bij lage T of hoge freq.).
- InfoBox, SectionRef-chips en normreferentie in staptitel verwijderd.
Stap 4 geluid: strategie-aanbevelingen gecorrigeerd conform Tabel B.1
- STRATEGY_GUIDANCE herschreven: onderscheid tussen ✓ᵃ (Aanbevolen), ✓ (Acceptabel) en — (Niet aanbevolen) conform Tabel B.1 NEN-EN-ISO 9612:2025.
- Twee ontbrekende werkpatronen toegevoegd: "Meerdere taken — taaklengtes onbekend" en "Geen taken toegewezen" (beide S2=✓ᵃ, S3=✓).
- InfoBox §6 en SectionRef-chips verwijderd; staptitel ontdaan van §8-referentie.
- Strategie-titels vereenvoudigd (§9/§10/§11 verwijderd uit weergavetitels).
- Motivering-label ontdaan van §15.b.4-chip.
Stap 3 geluid: werkanalyse uitgebreid conform §7 / §15.b NEN-EN-ISO 9612:2025
- Staptitel en beschrijving ontdaan van §7-paragraafverwijzingen; "HBG" verwijderd (niet ISO 9612 terminologie).
- InfoBox verwijderd; SectionRef-chips (§8, Bijlage B) uit het werkpatroon-label verwijderd.
- "Geluidsbronnen & werkomschrijving" gesplitst in twee aparte velden: "Beschrijving werkzaamheden" (§7.1.a) en "Geluidsbronnen" (§7.3.b).
- Nieuw veld "Beschrijving nominale werkdag" per HEG toegevoegd (§7.3 / §15.b.3).
- Nieuw veld "Indelingscriterium HEG" toegevoegd (§7.2 — functietitel, werkzone, productieproces, beroep, anders).
- Nieuwe checkbox "Significante piekgebeurtenissen" + beschrijvingsveld toegevoegd (§7.1.e / §7.3.c); amber badge in samenvatting.
Stap 2 geluid: normreferentie, opgeruimde sectietitels
- Toegepaste norm (NEN-EN-ISO 9612:2025) vastgelegd als zichtbaar veld in stap 2 conform §15.a.6.
- Optioneel veld "Afwijkingen / aanvullende normen" toegevoegd naast de normvermelding.
- Infokader met normtitel verwijderd (was redundant naast het nieuwe normveld).
- Paragraafverwijzingen (§15.a.1 enz.) uit sectietitels en beschrijvingstekst verwijderd.
Q14/Q15 uitgeschakeld bij ontbrekende RI&E; Q13=Nee weegt mee in aanbeveling
- Q14 en Q15 worden uitgeschakeld (N.v.t.) wanneer Q13 op Nee staat — vragen zijn dan niet beantwoordbaar.
- Uitgeschakelde vragen tellen niet mee in de voortgangsteller.
- Q13=Nee is nu een expliciete trigger: altijd indicatief onderzoek; gecombineerd met geluidsklachten of blootstellingsduur ≥ 2u → volledig onderzoek.
Voorverkennende vragen geluid verbeterd (normatief)
- Cat. A — drempel verlaagd van > 85 naar ≥ 80 dB(A), conform de wettelijke ondergrens voor de beoordelingsplicht (Arbobesluit art. 6.6 lid 1).
- Cat. B — wetsreferentie gecorrigeerd: grenswaarde 87 dB(A) staat in lid 2, niet lid 1.
- Q8 (was Q9) — drempel voor arbeidsmiddelenvermogen gewijzigd van > 100 dB(A) naar L_pA ≥ 85 dB(A) op de werkpost.
- Q9 (was Q10) — PPE-vraag uitgebreid: ook geschiktheid en attenuatiewaarde (SNR/HML).
- Cat. E — Q19 (medezeggenschap, geen risico-indicator) vervangen door Q17: audiometrisch programma aanwezig (Arbobesluit art. 6.10).
- Vraagnummers hernummerd Q1–Q17 in logische volgorde per categorie.
Stapvoortgang blijft zichtbaar bij terugnavigeren
- Afgeronde stappen blijven groen gemarkeerd wanneer je terugnavigert naar een eerdere stap.
- Voortgang is nu gebaseerd op de hoogst bereikte stap in de sessie, niet de huidige positie.
Afkortingen volledig uit code — beheer via database
- Alle ingebakken afkortingen gemigreerd naar de database (migration 007_abbr_seed.sql).
- Afkortingenbeheer toont nu één vlakke lijst — geen onderscheid meer tussen standaard en eigen.
- Alle afkortingen zijn gelijkwaardig bewerkbaar en verwijderbaar via het beheerderspaneel.
Afkortingenbeheer: één gecombineerde tabel
- Eigen en standaard afkortingen samengevoegd in één alfabetische tabel.
- Badge per rij: "standaard" (grijs), "eigen" (blauw), "aangepast" (oranje).
- Alle rijen bewerkbaar; verwijderen/terugzetten alleen voor DB-vermeldingen.
FAQ zoekfunctie op /kennisportaal/faq
- Zoekbalk op /kennisportaal/faq doorzoekt alle vragen en antwoorden over alle thema's.
- Zoekresultaten tonen thema-badge en inklapbaar antwoord; wis-knop in het zoekveld.
- Gegroepeerde weergave verdwijnt tijdens het zoeken en verschijnt terug zodra het zoekveld leeg is.
- Zoekbalk verwijderd uit de per-thema FAQ op de kennisportaal-themapagina's.
Zoekfunctie in kennisportaal FAQ per thema
- Zoekveld toegevoegd bovenaan de veelgestelde vragen per thema — filtert live op vraag én antwoord.
- "Geen resultaten"-melding bij zoekopdrachten zonder treffer.
Streefwaarden op dezelfde rij als comfortwaarden
- ThemeLimit krijgt optioneel veld `targetValue` — streefwaarde naast de richtwaarde op dezelfde rij.
- Comfortwaarden-sectie toont kolomkoppen "Richtwaarde" / "Streefwaarde" wanneer streefwaarden aanwezig zijn.
- NPR 3438 geluid: streefwaarden toegevoegd (≤40 / ≤50 / ≤65 dB(A)) naast de richtwaarden.
- StructuredLimitEditor: streefwaarde-invoerveld (groen) toegevoegd per limietregel.
Streefwaarden toegevoegd aan wettelijk kader
- Nieuw veld "Streefwaarden" toegevoegd naast grenswaarden en comfortwaarden — volle breedte, groen (emerald) kleuraccent, via CMS aanpasbaar per thema.
Comfortwaarden + vereenvoudiging wettelijk kader
- Nieuw veld "Comfortwaarden (richtwaarden)" toegevoegd aan wettelijk kader — gebaseerd op NPR 3438 voor geluid, via CMS aanpasbaar per thema.
- Grenswaarden worden nu over de volle breedte weergegeven; comfortwaarden eveneens.
- "Administratieve verplichtingen" verwijderd uit het wettelijk kader-paneel.
- Grenswaarden-bewerker: invoervelden vallen niet meer buiten het kader (fix gestapeld layout).
Grenswaarden-editor layout fix
- Grenswaarden-bewerker: invoervelden vallen niet meer buiten het kader — gestapeld layout (label + verwijderknop, sublabel + waarde).
Wettelijk kader bewerken vanuit kennisportaal + formuleherstel in InlineMd
- Admins kunnen wettelijk kader & normen nu direct vanuit de kennisportaal-pagina bewerken via potloodknoppen.
- Edit-logica geconsolideerd in ThemeLegalContent (namespace-prop); ThemeLegalInfo is nu een slanke collapsible wrapper.
- InlineMd ondersteunt nu [[LaTeX]]-formulemakers (KaTeX) — formules in wetgeving- en normbeschrijvingen renderen correct.
Kennisportaal — wettelijk kader & normen uit gedeelde bron
- Nieuw `ThemeLegalContent`-component: pure weergave van wetgeving, normen, grenswaarden en administratieve verplichtingen.
- Named section-exports (`LegislationList`, `NormsList`, `LimitGroupsList`, `AdminObligationsList`) gedeeld door ThemeLegalInfo en ThemeLegalContent — geen code-duplicatie.
- Kennisportaal-themapagina's tonen nu "Wettelijk kader & normen" vanuit dezelfde databron als de investigation tab (`theme-legal.{slug}` namespace).
- Admin bewerkt juridische inhoud één keer (via investigation tab), beide pagina's worden automatisch bijgewerkt.
- Kennisportaal-secties "Normen & grenswaarden" en "Wetgeving & regelgeving" (vrije markdown) verwijderd; "Meetmethoden", "Praktische tips" en "Bronnen" blijven als vrije CMS-secties.
- Parse-helpers `parseLegalItems` en `parseLegalJson` verplaatst naar `lib/theme-legal-info.ts` voor hergebruik in server- én client-components.
Wettelijk kader & normen — gelijkgetrokken structuur, herordening en markdown
- Wetgeving-items hebben nu dezelfde structuur als normen: naam + optionele beschrijving + inspring-niveau.
- Beide secties (Wetgeving én Toepasselijke normen) ondersteunen herordening via omhoog/omlaag-knoppen.
- Beide secties ondersteunen inspring-niveaus (0–2) voor hiërarchische weergave.
- Alle tekstvelden (naam en beschrijving) ondersteunen markdown-opmaak: **vet**, *cursief*, <u>onderstreept</u>.
- Nieuwe editor-component `LegalItemsEditor` vervangt `JsonArrayEditor` (wetgeving) en `NormsEditorClient` (normen).
- Nieuwe `InlineMd`-component voor inline markdown-rendering zonder block-level wrappers.
Onderzoekstegels: geluid actief, overige thema's gedeactiveerd voor gebruikers
- Alle onderzoeksthema's behalve Geluid zijn gemarkeerd als inactief (`active: false` in lib/themes.ts).
- Niet-admins zien inactieve tegels als greyed-out (opacity-40) met "Binnenkort"-badge; tegels zijn niet klikbaar.
- Admins zien alle tegels als links met een subtiel "inactief"-label.
- Directe URL-navigatie naar een inactief thema (/themes/climate etc.) leidt niet-admins terug naar de homepagina.
Vereenvoudiging PPE-module geluid — SNR÷2 als standaard, PFRE-disclaimer
- Geluid: PPE-invoerformulier (stap 6) vereenvoudigd tot SNR-only — methode-tabs (SNR §A.5, HML §A.4, octaafband §A.2, handmatig) verwijderd.
- Geluid: APF wordt altijd berekend als SNR÷2 (conservatieve PFRE-benadering); handmatige override blijft mogelijk.
- Geluid: PFRE-disclaimer toegevoegd in stap 6 en stap 10 — legt uit dat werkelijke demping ≈ 50–60% van nominale SNR is (EN 458:2025 Annex B) en waarom SNR÷2 aansluit bij ISO 9612.
- Geluid: piekgeluid-correctie (L_p,Cpeak,oor) is niet meer berekend — SNR beschrijft de spectrale samenstelling van piekgeluid niet; uitleg toegevoegd.
- Geluid: beoordeling (stap 10) vereenvoudigd — apfFreqBased-logica verwijderd; PBM-samenvatting toont SNR÷2 als methode-label.
- Geluid: bestaande onderzoekdata met HML/octaafband-methode blijft geldig (velden worden bewaard in de database; PDF-export en rapport ongewijzigd).
SNR-methode fix + normatieve verwijzingen gehoorbescherming (EN 458:2025)
- Geluid: SNR-methode aangepast conform EN 458:2025 §A.5 — exacte formule L′_p,A = L_p,C − SNR; invoerveld voor C-gewogen niveau L_p,C toegevoegd. Zonder L_p,C wordt SNR÷2 als benadering gebruikt (niet conform norm, duidelijk aangegeven).
- Geluid: normatieve verwijzingen (EN 458:2025 §A.2/§A.4/§A.5/§6.2.4) toegevoegd aan alle PPE-methode-secties in stap 6 en stap 10.
- Geluid: afwijkingen van EN 458:2025 expliciet gedocumenteerd — HML check-methode (§A.4 i.p.v. §A.3), dubbele bescherming (schatting vs. fabricantcombinaties), 35 dB-cap (informatief).
- Geluid: code-commentaar en infoboxen bijgewerkt van EN 458:2016 naar EN 458:2025.
Fix: HML-methode gehoorbescherming (EN 458)
- Geluid: HML-waarden (H, M, L) worden nu direct als PNR gebruikt conform EN 458:2016, i.p.v. onterecht gedeeld door 2. Geldt voor enkelvoudige én dubbele bescherming.
Volledige onderzoekstegels klikbaar
- Home: volledige onderzoekstegel is klikbaar (niet alleen het kleine pijltje voor admins).
Landingspagina + naamwijziging navbar
- Home: generieke landingspagina met hero, drie feature-pillars (Kennisportaal, Onderzoeksinstrumenten, Abonnementen/binnenkort) en onderzoekengrid.
- Navbar: "Thema's" hernoemd naar "Onderzoeken".
Fix: [[formule]]-markers renderen nu correct in FAQ-vraagkoppen
- FaqAccordion + FaqInlineManager: vraagkop doorgestuurd via renderWithFormulas zodat [[L_{EX,8h}]] als KaTeX-formule verschijnt.
Kennisportaal — theoretische achtergrond, normen en FAQ per thema
- Nieuw: /kennisportaal — openbare sectie met theoretische kennisbladen per arbeidshygiënisch thema.
- Kennisblad per thema (/kennisportaal/[slug]): introductie, CMS-secties (normen, methoden, wetgeving, praktijk) inline bewerkbaar voor admins, thema-FAQ en CTA naar het onderzoeksinstrument.
- FAQ-overzicht (/kennisportaal/faq): alle gepubliceerde vragen gegroepeerd per thema.
- Kennisportaal-landing: themakaarten + teaser met 5 algemene FAQ-vragen.
- DB: faq_items-tabel met RLS (public read voor gepubliceerde items, admin schrijf) — migration 007.
- API: GET /api/faq (publiek), GET+POST /api/admin/faq, PATCH+DELETE /api/admin/faq/[id].
- Admin FAQ-beheer (/admin/faq): items toevoegen, bewerken, verwijderen, volgorde instellen en publicatiestatus togglen.
- Navbar: "Kennisportaal"-link toegevoegd tussen Home en Thema's.
- AdminNav: "FAQ"-tab toegevoegd.
Admin: één scrollbare tabel voor alle schermformaten
- Kaartweergave verwijderd; alle gebruikers staan nu in één tabel die horizontaal scrollt op smalle schermen.
Admin gebruikersoverzicht: responsieve opmaak
- Beheerderspaneel: tabel is nu horizontaal scrollbaar op smalle schermen (overflow-x-auto + min-breedte).
- Mobiele weergave (< 768px): kaartweergave per gebruiker met alle velden overzichtelijk gestapeld.
Fix: privacy modal toont na client-side inloggen
- PrivacyAcceptModal luistert nu via onAuthStateChange (SIGNED_IN) naar inloggen — de modal werkte niet na client-side navigatie via router.replace omdat de root layout niet herstartte.
Privacy-kolom in gebruikersoverzicht
- Beheerderspaneel: aparte "Privacy"-kolom in de gebruikerslijst met geaccepteerde versie, acceptatiedatum, "herbevestiging vereist"-melding én bell-/X-knop per rij.
Privacy herbevestiging — admin push + gebruikersmodal
- Admin kan per gebruiker (detailpagina) of voor alle gebruikers tegelijk een herbevestiging van de privacyverklaring verplichten.
- Gebruikers zien bij de volgende sessie een modal met de privacytekst; "Later" slaat de herinnering tot de volgende sessie op via sessionStorage.
- "Accepteren en doorgaan" slaat de versie op in user_roles en wist het verzoek.
- Beheerderspaneel: bell-icoon per gebruiker in de lijst (oranje stip) en op de detailpagina (bell- of X-knop + amber badge).
- DB: kolom privacy_required_version toegevoegd aan user_roles (migration 006).
Privacyversiegeschiedenis + inline bewerken "Over de app"
- Privacyverklaring: admin kan nu een nieuwe versie publiceren met type (major/minor/patch) en versienummer; eerdere versies zijn inklapbaar zichtbaar op /privacy.
- Versionering: semantic versioning voor privacyverklaring (1.0.0 → 1.0.1 → 1.1.0 → 2.0.0).
- Registratie: nieuw aangemaakte accounts accepteren automatisch de actuele live-versie van de privacyverklaring.
- "Over de app" pagina: ondertitel, ontwikkelaarsbeschrijving, contactgegevens (KvK, vestigingsplaats, e-mail) en disclaimer nu volledig inline bewerkbaar.
- Fix: onderzoekenaantal stond op 0 voor alle gebruikers in het beheerderspaneel — PostgREST aggregate-syntax vervangen door JS-telling.
UI-opruiming: placeholder badge + hamburgermenu vereenvoudigd
- Placeholder-pagina's: subtitel-badge verwijderd, "In ontwikkeling" badge staat nu inline naast de paginatitel.
- color.badge en color.border props verwijderd uit InvestigationPlaceholder (waren overbodig).
- Hamburgermenu: "Afkortingen beheren" en "UI-componentenbibliotheek" verwijderd — beide zijn bereikbaar via het beheerderspaneel.
- AdminNav: "UI-bibliotheek" tab toegevoegd als derde tab in het beheerderspaneel.
Placeholder stappen-layout: uitlijning cijfer en tekst gecorrigeerd
- InvestigationPlaceholder: absolute positionering van stapnummers vervangen door flex-layout — tekst staat nu correct naast het getal in plaats van erachter.
- Stapnummering gewijzigd van 0-gebaseerd naar 1-gebaseerd.
Documentatie: renderWithFormulas vs MarkdownContent keuzegids
- CLAUDE.md: formules/markdown/afkortingen sectie samengevoegd tot een keuzegids met tabel — wanneer Formula, renderWithFormulas of MarkdownContent te gebruiken.
- lib/render-with-formulas.tsx: JSDoc uitgebreid met mogelijkheden, beperkingen en gebruiksadvies.
- components/MarkdownContent.tsx: JSDoc uitgebreid met mogelijkheden, beperkingen en gebruiksadvies.
Placeholder-thema's: dode wizard-imports verwijderd + CMS inline bewerken
- wizard-configs.ts: dead imports voor bio-agents, verlichting, trillingen en straling wizards verwijderd — vervangen door lege stub-configs. Wizard-bestanden blijven bewaard als draft voor toekomstige implementatie.
- wizardConfigs export-shim verwijderd (was nergens geïmporteerd).
- InvestigationPlaceholder: InlineEdit toegevoegd voor paginatitel en -beschrijving; ThemeLegalInfo ontvangt nu ook namespace + contentOverrides.
- Placeholder-pagina's (bio-agents, verlichting, trillingen, straling): geconverteerd naar async server components; fetchen theme.{slug} en theme-legal.{slug} content — admin kan titels en beschrijvingen nu inline bewerken.
Deduplicatie: gedeelde InvestigationThemePage layout voor de 4 modules
- Nieuw: components/InvestigationThemePage.tsx — gedeelde server-component voor de layout van alle onderzoeksmodule-pagina's (back-link, header, icon, InlineEdit-titel, InlineEdit-beschrijving, ThemeLegalInfo).
- app/themes/sound, hazardous-substances, physical-load en climate page.tsx gereduceerd van 107 naar ~45 regels elk — alleen unieke metadata, fallback-strings en de module-app-component blijven per pagina.
Efficiëntie: DB-aggregaat tellling onderzoeken + gedeelde fmtFullName helper
- Admin gebruikerslijst: onderzoeken worden nu via DB COUNT-aggregaat geteld i.p.v. alle rijen op te halen — minder dataoverdracht bij grote datasets.
- fmtFullName() geëxtraheerd naar lib/utils.ts — was gedupliceerd in admin/page.tsx en admin/users/[id]/page.tsx.
Code-kwaliteit: gedeelde auth-helper, dode imports, revalidateTag-fix
- requireAdmin() geëxtraheerd naar lib/auth.ts — centrale definitie voor alle API-routes (was 4× gedupliceerd).
- generateStaticParams in app/themes/[slug]/page.tsx geeft nu [] terug — alle thema's hebben eigen pagina's, fallback-route heeft geen statische params nodig.
- Ongebruikte ReactMarkdown-import verwijderd uit app/privacy/page.tsx.
- revalidateTag('content', {}) hersteld — tweede argument is vereist in Next.js 16 (CacheLifeConfig).
Admin Content-sectie verwijderd — opruimen dode code
- Volledige /admin/content-sectie (7 pagina's) verwijderd — alle bewerkfunctionaliteit is al inline op de betreffende pagina's beschikbaar.
- Verwijderd: editor-componenten PlainEditor, TextareaEditor, MarkdownEditor (niet meer in gebruik).
- Verwijderd: AdminEditButton-component (was al dode code — nergens geïmporteerd).
- AdminNav: "Content"-tab verwijderd; navigatiebalk toont nu "Gebruikers" en "Afkortingen".
Veiligheidsfixes: datalek onderzoeken + inputvalidatie + AdminNav
- Fix: GET /api/investigations/[id] filtert nu op user_id — onderzoeken van andere gebruikers waren opvraagbaar voor ingelogde gebruikers.
- Fix: POST /api/investigations valideert nu het type-veld (toegestaan: hazardous, sound, physical, climate), het id-formaat (UUID) en de naamlengte (max 500); updated_at wordt altijd server-side gegenereerd.
- Fix: AdminNav wordt nu ingeladen in admin/layout.tsx — navigatietabs Gebruikers, Content en Afkortingen zijn nu zichtbaar op alle beheerpagina's.
Afkortingenbeheer — eigen afkortingen toevoegen en beheren via admin
- Nieuwe beheerpagina /admin/abbreviations: eigen afkortingen toevoegen, bewerken en verwijderen.
- Eigen afkortingen worden via React Context gemerged met de hardcoded tabel — beschikbaar voor [[abbr:ID]]-markers in alle CMS-tekstvelden.
- Navigatie: link in hamburgermenu + tab in AdminNav.
- Overzicht van alle standaard (hardcoded) afkortingen als referentie — overschreven entries krijgen badge.
[[abbr:ID]]-marker voor afkortingen in CMS-tekstvelden
- [[abbr:CMR]] rendert automatisch <abbr title="…"> via de gedeelde ABBR_TITLES-tabel — geen HTML meer nodig.
- [[abbr:OELV:Eigen omschrijving]] voor een afwijkende toelichting.
- InlineEdit-hint toont de abbr-markersyntax.
HTML-tags (abbr) en betere voorinvulling in inline CMS-velden
- MarkdownContent ondersteunt nu rauwe HTML via rehype-raw — <abbr title="voluit">afkorting</abbr> werkt in alle bewerkbare tekstvelden.
- Bewerkingsveld toont nu de huidige live-tekst als beginwaarde (i.p.v. leeg) wanneer er nog geen DB-override bestaat.
- InlineEdit-hint uitgebreid met abbr-voorbeeld.
Inline bewerkbare staptitels, beschrijvingen en InfoBox-inhoud in alle onderzoeksmodules
- Staptitels, intro-beschrijvingen en InfoBox-inhoud zijn nu inline bewerkbaar in alle 4 onderzoeksmodules (47 stapcomponenten).
- Admin: hover boven staptitel of beschrijving → potloodje → bewerk direct op de pagina.
- Nieuwe InlineStepHeader-component herbruikbaar voor h2-titels in alle stap-componenten.
- Namespaces: investigation.sound, investigation.hazardous-substances, investigation.physical-load, investigation.climate.
- Shell-headers tonen ook de bewerkbare staptitel (InlineEdit op de stap-nummerbalk).
- Bij InfoBox-override: markdown-rendering; bij geen override: originele JSX-opmaak (Abbr, Formula, SectionRef) als fallback.
Volledig inline CMS — alle teksten direct op de pagina bewerkbaar
- Wettelijk kader & normen bij thema's zijn nu per sectie inline bewerkbaar (potloodje per sectie: wetgeving, normen, grenswaarden, beheersverplichtingen).
- Wizardteksten (staptitels, beschrijvingen, vraagopties) inline bewerkbaar via uitvouwbaar bewerkpaneel per stap.
- Privacyverklaring inline bewerkbaar als markdown direct op /privacy.
- Versiehistorie (changelog) inline bewerkbaar op /over via admin-toggle.
- AdminEditButton-component volledig verwijderd — geen doorverwijzingen naar aparte beheerroutes meer.
Admin contentbeheer-tab verwijderd
- Content-tab verwijderd uit het admin-paneel — alle teksten zijn nu inline bewerkbaar direct op de pagina.
- Admin-layout vereenvoudigd: tabnavigatie verwijderd (niet meer nodig met één sectie).
Homepage ondertitel inline bewerkbaar
- Homepage ondertitel ("Kennisplatform voor...") is nu inline bewerkbaar voor admins via namespace page.home, key subtitle.
- Uitgelogde gebruikers zien de actuele (DB-)tekst; de standaardtekst dient als fallback.
Inline bewerken op homepage-themakaarten + markdown in beschrijvingen
- Nieuw: HomeThemesGrid-component — admins zien potloodje op naam en beschrijving van elke themakaart op de homepage; bewerken direct op de pagina zonder doorverwijzing.
- Niet-admins zien de homepage ongewijzigd: themakaarten zijn volledig klikbaar als Link.
- Alle vier thema-paginabeschrijvingen (geluid, klimaat, fysieke belasting, gevaarlijke stoffen) renderen nu als markdown via MarkdownContent.
- InlineEdit-velden voor beschrijvingen hebben nu markdown-prop: admin ziet syntaxhint bij bewerken.
- Bugfix: sound/page.tsx — onjuiste ReactMarkdown/renderWithFormulas-aanroep vervangen door MarkdownContent.
Inline bewerken direct op de pagina
- Nieuw: InlineEdit-component — hover over bewerkbare tekst en klik het potloodje om direct op de pagina te wijzigen.
- Thema-pagina's (geluid, klimaat, fysieke belasting, gevaarlijke stoffen): titel en beschrijving inline bewerkbaar via namespace theme.{slug}, keys pageTitle en pageDesc.
- Generieke thema-pagina (/themes/[slug]): naam en intro inline bewerkbaar.
- Na opslaan: router.refresh() herlaadt de server-data zonder volledige herlaad van de pagina.
- Nieuw: lib/render-with-formulas.tsx — gedeelde [[formule]]-rendering voor server- en client-componenten.
- ThemeLegalInfo importeert renderWithFormulas nu uit gedeelde lib.
Admin potloodje op alle bewerkbare UI-elementen
- AdminEditButton (potloodje) toegevoegd naast alle bewerkbare koppen en secties voor admins.
- ThemeLegalInfo: adminEditHref prop + potloodje in de inklapbare header.
- ThemeWizard: potloodje in de progress-header naast de thema-naam.
- Specifieke thema-pagina's (geluid, klimaat, fysieke belasting, gevaarlijke stoffen): potloodje naast de h1.
- Generieke thema-pagina (/themes/[slug]): potloodje naast de h1.
Admin CMS — webteksten bewerken zonder deployment
- Nieuw: content-tabel in Supabase met namespace/key/value/ctype en RLS (alleen admin mag schrijven).
- Nieuw: lib/content.ts — getNamespaceContent() en getContent() met Next.js unstable_cache en tag "content".
- Nieuw: API-route GET/PUT/DELETE /api/admin/content met admin-authenticatie en revalidateTag na mutatie.
- Nieuw: Admin tab-navigatie — "Gebruikers" en "Content" als horizontale tabs in de admin-layout.
- Nieuw: /admin/content — overzichtspagina met drie categorieën: Pagina's, Thema's, Wizards.
- Nieuw: /admin/content/pages — Privacyverklaring (MarkdownEditor) en Changelog (ChangelogEditor).
- Nieuw: /admin/content/themes — naam, beschrijving en intro per thema met PlainEditor/TextareaEditor.
- Nieuw: /admin/content/themes/[slug]/legal — wetgeving, normen, grenswaarden en administratieve verplichtingen.
- Nieuw: /admin/content/wizards + /admin/content/wizards/[slug] — WizardEditor met boom-view: stap → vraag → optie.
- Integratie: privacy/page.tsx laadt body uit DB; fallback naar hardcoded JSX.
- Integratie: over/page.tsx laadt changelog-array uit DB; fallback naar hardcoded array.
- Integratie: app/page.tsx laadt thema-naam/beschrijving uit DB.
- Integratie: ThemeLegalInfo accepteert contentOverrides prop; alle vier thema-pagina's laden legal-overrides.
- Integratie: ThemeWizard accepteert contentOverrides prop; applyWizardOverrides() past stap/vraag/optie-teksten toe.
- Installatie: react-markdown voor MarkdownEditor preview en privacy-rendering.
Bedrijfsarts als beroepsprofiel + BIG-registratienummer
- Bedrijfsarts toegevoegd als kwalificatieoptie voor uitvoerend onderzoekers in alle vier modules.
- Bij keuze Bedrijfsarts verschijnt een veld voor het BIG-registratienummer (Wet BIG art. 3).
- BasePerson uitgebreid met bigNumber?: string.
Pre-survey standaardisatie + gedeelde scope-componenten
- Nieuw: Step0_PreSurvey voor gevaarlijke stoffen — 15 ja/nee/onbekend vragen (categorie A–E), automatische aanbeveling (volledig/gericht/geen), handmatige override.
- Nieuw: lib/shared-investigation-types.ts — BasePerson en CommonScopeFields interfaces.
- Nieuw: components/shared/scope/PersonCard.tsx — gedeeld persoonskaartje met kwalificatie, AKD-registratie, anonimiteit.
- Nieuw: components/shared/scope/PersonSection.tsx — gedeelde personen-sectie met add/update/remove.
- Nieuw: components/shared/scope/ScopeFields.tsx — gedeelde onderzoeksgegevens-sectie (bedrijf, werkplek, medewerkers, doel, periode).
- SoundPerson, PhysicalPerson, ClimatePerson, PersonEntry breiden nu BasePerson uit.
- SoundInvestigationScope, PhysicalInvestigationScope, ClimateInvestigationScope en InvestigationScope breiden nu CommonScopeFields uit.
- InvestigationShell uitgebreid van 10 naar 11 stappen — stap 1 is nu de voorverkenning gevaarlijke stoffen.
- Alle vier Step1-bestanden herschreven: PersonSection + ScopeFields + module-specifieke aanvullingen.
Migratie gevaarlijke stoffen stappen naar gedeelde UI-componenten
- Alle 10 stap-bestanden in components/investigation/steps/ gemigreerd naar Button, Input, Select, Textarea, Alert en Icon uit @/components/ui.
- Raw <button>, <input>, <select> en <textarea> elementen vervangen door gedeelde UI-componenten voor consistente styling.
- Button variant="dashed" voor toevoeg-knoppen, variant="ghost"/"danger" size="xs" voor bewerken/verwijderen in stappen 1–10.
- Alert variant="warning" vervangt ad-hoc oranje/amber waarschuwingsdivs in stappen 3, 4 en 7.
Migratie climate-investigation stappen naar gedeelde UI-componenten
- Alle 13 stap-bestanden in components/climate-investigation/steps/ gemigreerd naar Button, Card, FieldLabel, FormGrid, Icon, Input, Select, Textarea en Alert uit @/components/ui.
- Raw <input>, <select>, <textarea> en <button> elementen vervangen door gedeelde UI-componenten voor consistente styling.
- Alert-component vervangt ad-hoc gekleurde waarschuwingsdivs (warning/neutral/error/success) in Steps 3, 5, 6, 7, 8, 9, 10, 11.
- Card variant="form" vervangt oranje formuliercontainers in BGForm en MeasureForm.
- Button variant="dashed" voor toevoeg-knoppen, variant="ghost"/"danger" size="xs" voor bewerken/verwijderen.
Migratie physical-investigation stappen naar gedeelde UI-componenten
- Alle 11 stap-bestanden in components/physical-investigation/steps/ gemigreerd naar Button, Card, FieldLabel, FormGrid, Icon, Input, Select, Textarea en Alert uit @/components/ui.
- Raw <input>, <select>, <textarea> en <button> elementen vervangen door gedeelde UI-componenten voor consistente styling.
- Alert-component vervangt ad-hoc gekleurde waarschuwingsdivs (amber/warning).
- Card variant="form" vervangt oranje formuliercontainers in BGForm, LiftingForm, PushPullForm, RepetitiveForm, PostureForm, ForceForm en MeasureForm.
Gebruikersprofiel: naam & bedrijf
- Nieuwe profiles-tabel (voornaam, tussenvoegsel, achternaam, bedrijf) met RLS en auto-aanmaken via trigger.
- Mijn gegevens: profielsectie met bewerkbaar formulier (voornaam / tussenvoegsel / achternaam / bedrijf).
- Navbar toont voornaam als die ingevuld is; anders het (afgekorte) e-mailadres. Avataarinitaal volgt mee.
- Admin-overzicht: naam en bedrijf zichtbaar als tweede regel onder het e-mailadres.
- Admin-detailpagina: naam en bedrijf toegevoegd aan de accountinfo-sectie.
- JSON-export bevat nu ook het volledige profiel.
Registratie van privacyakkoord per gebruiker
- Privacyversie en acceptatiedatum worden bij registratie opgeslagen in user_roles (via Supabase user-metadata + trigger).
- Admin-overzicht: waarschuwingsicoontje bij gebruikers zonder geregistreerde privacyversie.
- Admin-detailpagina: accountinfo-sectie met e-mail, rol, aanmeldatum, laatste login en privacyakkoord (versie + datum).
- Mijn gegevens: privacyversie en acceptatiedatum zichtbaar in accountgegevens.
- JSON-export bevat nu ook privacy_version_accepted en privacy_accepted_at.
Bedrijfsgegevens DiversiThijs & privacyverklaring definitief
- Over-pagina: DiversiThijs als ontwikkelaar vermeld met KvK-nummer (92899943), vestigingsplaats Breedenbroek, e-mail info@diversithijs.nl en link naar privacyverklaring.
- Privacyverklaring volledig bijgewerkt met definitieve bedrijfsnaam, contactgegevens, grondslagen, sub-verwerkers, bewaartermijnen en alle AVG-rechten.
Vergeten wachtwoord & privacyverklaring
- Nieuwe flow "Wachtwoord vergeten": e-mailformulier op /auth/forgot-password en wachtwoord-resetpagina op /auth/reset-password (via Supabase PKCE herstelmail).
- "Wachtwoord vergeten?"-link toegevoegd aan de inlogpagina naast het wachtwoordveld.
- Privacyverklaring-pagina (/privacy) aangemaakt met AVG-conforme structuur (art. 13 informatieplicht).
- Registratiepagina: verplichte checkbox waarmee gebruikers de privacyverklaring accepteren voor accountaanmaak.
AVG-pagina "Mijn gegevens"
- Nieuwe pagina /account met vier AVG-secties: inzage (accountgegevens), rectificatie (e-mail wijzigen), portabiliteit (JSON-export) en vergetelheid (account verwijderen).
- API-route DELETE /api/account verwijdert het eigen account via supabaseAdmin; CASCADE ruimt onderzoeken en rol op.
- API-route GET /api/account/export retourneert alle persoonsgegevens als JSON (user-info, rol, onderzoeken).
- Navbar: "Mijn gegevens"-link toegevoegd in het gebruikersdropdown (desktop) en in het hamburgermenu (mobiel).
Straling, wetgeving & thema-iconen
- Nieuw thema "Straling" toegevoegd als placeholder-pagina (ioniserende straling, UV, IR, laser, EMV).
- Risico-inventarisatie wizard voor Straling (3 vragen: stralingstype, stralingswerkerscategorie, vergunning/melding).
- Wetgeving, toepasselijke normen en grenswaarden nu zichtbaar op alle 8 thema-pagina's — zowel placeholders als uitgewerkte onderzoeken.
- Centrale datalaag lib/theme-legal-info.ts met juridische referentiedata voor alle thema's; geen dubbele definities meer.
- SVG-iconen (Heroicons v2) toegevoegd aan alle themakaarten op de homepagina en aan de pagina-headers.
Meetplan PDF — rijenaantal per taak op basis van HEG-grootte
- HEG met 1 medewerker: 3 genummerde invulrijen per taak (norm-minimum §9.3.2).
- HEG met meerdere medewerkers: 5 genummerde invulrijen per taak (aanbevolen aantal).
- Altijd 2 extra lege rijen zonder nummer (gestippeld) voor eventuele aanvullende metingen.
- Vereistenvak per taak toont nu ook het aanbevolen aantal bij meerdere medewerkers.
Correctie meetduur-berekening (§9.3.2) + inklapbare tabel
- Bugfix: minimale meetduur per meting was omgekeerd berekend. Correct conform §9.3.2 NEN-EN-ISO 9612: T_m ≥ 5 min → min. 5 min per meting; T_m < 5 min → volledige taak meten.
- Gecorrigeerd in stap 8 (tabel), stap 9 (HEG-kaarten) en de Meetplan PDF.
- Voetnoot aangepast: "* Taakduur < 5 min: meet de volledige taak".
- Meetduur-vereistentabel in stap 8 is nu inklapbaar.
Meetduur-vereistentabel in stap 8 (Meetresultaten)
- Tabel "Meetduur-vereisten per HEG" toegevoegd aan stap 8 (Meetresultaten), boven de HEG-accordeons.
- Toont per taak (strategie 1) of per HEG (strategie 2/3) de minimale meetduur per meting en het vereiste minimum aantal metingen.
- Werkelijk ingevoerd aantal metingen wordt live bijgehouden met groen ✓ zodra aan het minimum is voldaan.
Meetplan PDF — afdrukbaar veldregistratieformulier
- Knop "Meetplan PDF" toegevoegd aan stap 7 (Meetresultaten) van het geluidsonderzoek.
- Genereert een afdrukbaar A4-formulier per HEG met lege invulrijen voor L_p,A,eqT, L_p,Cpeak, duur, medewerker en opmerkingen.
- Per taak (strategie 1) of per HEG (strategie 2/3) staan de NEN-EN-ISO 9612-minimumeisen vermeld (§9.3.2 / §10.4 / §11.4).
- Kalibratiestabel per meetreeks met kolommen voor voor- en nakalibratie, drift en voldoet-check (< 0,5 dB).
- Ondertekeningsblok en opmerkingenregels voor afwijkingen van representatieve omstandigheden (§15.d.4).
Meetduur-overzicht per HEG en meetreeks in geluidsonderzoek
- Stap 8 (Statistieken) toont nu per HEG een meetduur-overzicht conform NEN-EN-ISO 9612 §9.3.2 / §10.4 / §11.4.
- Strategie 1 (taakgericht): vereiste minimum meetduur en aantal per taak (≥ max(T_m, 5 min) × ≥ 3), met werkelijk n en totaal per taak.
- Strategie 2/3 (functiegericht / volledige dag): vereiste minimum steekproeven (≥ 3 × T_e) met werkelijk n.
- Per meetreeks: verwachte meetduur per meting en werkelijke totaalduur (indien meetduur ingevoerd in stap 7).
- Norm-minimum-markering (*) wanneer taakduur < 5 min.
Meetprocedure-handreiking in geluidsonderzoek
- Informatievak (§9.2 / §9.3 / §12.2 / §15.d NEN-EN-ISO 9612) toegevoegd aan stap 7 (Meetreeksen) en stap 8 (Statistieken) van het geluidsonderzoek.
- Handreiking omvat: minimale meetduur (≥ 5 min), stabiliteitcriterium (0,2 dB / 30 s), microfoonpositie, representatieve meetomstandigheden en kalibratie-eisen.
Authenticatie, rollen en server-side opslag
- Inloggen en registreren via e-mail en wachtwoord (Supabase Auth).
- Drie gebruikersrollen: admin, test-gebruiker en gebruiker — rol automatisch toegewezen bij registratie.
- Alle onderzoeken (geluid, klimaat, fysieke belasting, gevaarlijke stoffen) worden voortaan opgeslagen in de cloud (Supabase PostgreSQL) in plaats van localStorage.
- Row Level Security: gebruikers zien uitsluitend eigen onderzoeken; admins kunnen alle onderzoeken inzien (alleen-lezen).
- Beheerderspaneel (/admin): gebruikersoverzicht met inline rolwijziging, verwijderactie en onderzoekaantallen.
- Gebruikersdetailpagina: alle onderzoeken van een gebruiker met uitklapbare JSON-weergave.
- Navbar uitgebreid met gebruikersindicator, uitlogknop en admin-link (alleen zichtbaar voor admins).
- Routebeveiliging via proxy.ts: niet-ingelogde bezoekers worden doorgestuurd naar de inlogpagina.
- Homepagina auth-aware: niet-ingelogde bezoekers zien een welkomstpagina met CTA.
Placeholders: Trillingen, Biologische agentia, Verlichting
- Nieuw thema "Trillingen" toegevoegd met volledige risico-inventarisatie wizard (HAV/WBV, Richtlijn 2002/44/EG, Arbobesluit art. 6.11a–6.11g).
- Placeholder-pagina voor Trillingen-onderzoeksinstrument: grenswaarden HAV/WBV, geplande 11 stappen (ISO 5349-1/2, ISO 2631-1).
- Placeholder-pagina voor Biologische agentia-onderzoeksinstrument: risicoklassen 1–4, geplande 10 stappen (Richtlijn 2000/54/EG, Arbobesluit art. 4.85–4.114).
- Placeholder-pagina voor Verlichting-onderzoeksinstrument: grenswaarden lux/UGR/Ra, geplande 11 stappen (NEN-EN-12464-1:2021, Arbobesluit art. 6.29–6.32).
Fysieke belasting onderzoek (11 stappen)
- 11-stappen workflow voor fysieke belastingonderzoek conform ISO 11228-1/2/3, EN 1005-3/4 en Arbobesluit art. 5.1–5.6.
- Vooronderzoek (18 gewogen vragen) met automatische meetaanbeveling per belastingtype.
- Belastingsgroepen (BG): definieer homogene werknemersgroepen met geslacht, uren per dag en aantallen.
- NIOSH-methode voor tillen en dragen: volledige RWL-berekening (Hf × Vf × Df × Ff × Af × Cf) met tilverzwaarende-omstandighedenvlaggen.
- ISO 11228-2 / DUTCH-methode voor duwen en trekken: referentiekrachten per hendelhoogte en rijbaangesteldheid.
- OCRA Checklist (ISO 11228-3) voor repeterende handelingen: CF + FaF × (PF + RF + AddF) met live score-preview.
- EN 1005-4 / ISO 11226 houdingsbeoordeling: verdietoets per lichaamsdeel × frequentie × statisch/dynamisch.
- EN 1005-3 krachtenbeoordeling: F_Br = F_B × m_v × m_f × m_d met referentiekrachten voor 10 veelvoorkomende handelingen.
- Automatisch gegenereerde beheersmaatregelen (TOP-principe) op basis van gevonden risico's.
- Rapport met Arbeidshygienische Strategie-toelichting en kopieerknop.
Klimaatonderzoek (13 stappen)
- 13-stappen workflow voor klimaatonderzoek conform NEN-EN-27243, ISO 7933 (PHS), ISO 7730 (PMV/PPD) en Arbobesluit art. 3.1g/6.1.
- Vooronderzoek met WBGT-schatting en geautomatiseerde meetaanbeveling.
- Meetstrategiebepaling: werkplek- of taakgericht conform NEN-EN-27243.
- Meetapparatuur registratie (kalibratie, herkalibratie, drift-controle).
- WBGT-berekening voor binnen en buiten, met metabole warmteproductie per activiteitsniveau.
- PMV/PPD-berekening conform ISO 7730 met comfort-categorie (A/B/C).
- Hittestress (PHS-methode): Dsweat, Tre, WBGT-grenswaarden per acclimatisatie en kledingfactor.
- Koude-beoordeling: IREQ (vereiste isolatiewaarde) en windchill.
- Automatisch gegenereerde beheersmaatregelen (TOP-principe).
- PDF-rapport met volledige meetdocumentatie.
Dark mode & app-menu
- Schakelaar in de header voor dag- en nachtmodus (voorkeur wordt opgeslagen).
- App-menu met "Over de app" en placeholder voor Instellingen.
- Versiebeheerpagina (deze pagina).
- Veld "Rol in onderzoek" toegevoegd aan respondenten in Stap 1.
- Adres verborgen bij anonieme respondenten (naast e-mail en telefoon).
Arbeidsmiddelen, meetreeksen & respondenten
- Nieuwe Stap 5 — Arbeidsmiddelen: registreer voertuigen, machines en gereedschap met keurings- en onderhoudsstatus (Arbobesluit art. 7.18 / Machinerichtlijn 2006/42/EG).
- Taken kunnen nu worden gekoppeld aan een of meer arbeidsmiddelen.
- Taken kopiëren van de ene HEG naar een andere met één klik.
- Stap 6 (Meetreeksen): meetreeks als eerste-klasse entiteit met voor- en nakalibratie, tussentijdse herkalibratie en automatische uitsluiting bij drift > 0,5 dB.
- Respondenten (al dan niet anoniem) toegevoegd aan Stap 1.
- E-mailadres en telefoonnummer voor alle personen (uitvoerders, opdrachtgevers, respondenten).
- Stap-nummering doorgeschoven naar 11 stappen totaal.
Volledig geluidsonderzoek (10 stappen)
- 10-stappen workflow voor geluidsonderzoek conform NEN-EN-ISO 9612:2025.
- Taakgebaseerde en functiegerichte meetstrategie.
- HEG-beheer, meetdata, statistieken, beoordeling en maatregelen.
- PDF-export van het volledige rapport.
- Opslagbeheer via localStorage.
Thema-wizards
- 6 risico-inventarisatie wizards: Geluid, Bio-agentia, Gevaarlijke stoffen, Verlichting, Fysieke belasting, Klimaat.
- Wizard-engine met conditionele vragen, vertakking en risicobeoordeling.
- Volledig uitgewerkte wizard voor Gevaarlijke stoffen (inclusief CMR-branching).
Initiële release
- Next.js 16 (App Router, Turbopack) projectstructuur.
- Basis navigatie, themaselectie en statische paginastructuur.
- Tailwind CSS dark-mode ondersteuning via OS-voorkeur.