RITMEOS
9:41
●●●
Goedemorgen
=3||sc<=3) return 'critical'; const today2=new Date().toISOString().split('T')[0]; if(c.lastScan.scan_date!==today2) return 'missing'; if(sc<=5) return 'warning'; if(hist.length>=3&&(hist[0].score||0)-(hist[2].score||0)<-2) return 'declining'; return 'ok'; } function riskBadgeHtml(level){ var cfg={ critical:{bg:'var(--rose-soft)',c:'var(--rose)',l:'Kritiek'}, warning:{bg:'var(--amber-soft)',c:'var(--amber)',l:'Let op'}, missing:{bg:'#EEF2FF',c:'#4F46E5',l:'Scan gemist'}, declining:{bg:'var(--amber-soft)',c:'var(--amber)',l:'Dalende trend'}, ok:{bg:'var(--green-soft)',c:'var(--green)',l:'Stabiel'}, unknown:{bg:'var(--line)',c:'var(--faint)',l:'Nog geen data'}, }; var r=cfg[level]||cfg.unknown; return ''+r.l+''; } async function saveNote(clientId){ var ta=document.getElementById('note-ta'); if(!ta) return; var note=ta.value; var r=await db.from('behandelaar_clients').update({notes:note}).eq('behandelaar_id',user.id).eq('client_id',clientId); if(r.error){showToast('Opslaan mislukt','err');return;} var c=PS.clients.find(function(x){return x.id===clientId;}); if(c) c.notes=note; showToast('Notitie opgeslagen','ok'); } function generatePDFReport(clientId){ var c=PS.clients.find(function(x){return x.id===clientId;}); var d=PS.clientDetail; if(!c||!d){showToast('Laad eerst de cliëntdetails','err');return;} var dims=['Slaap','Hoofd','Energie','Prikkels','Loslaten','Drive','Ruimte']; var dkeys=['sleep','cognition','tank','sensory','detach','drive','social']; var dinv=[false,false,false,true,false,false,false]; var ls=d.scans&&d.scans[0]; var dateStr=new Date().toLocaleDateString('nl-NL',{year:'numeric',month:'long',day:'numeric'}); var sc=ls&&ls.score; var scColor=sc?(sc>=7?'#0A9E72':sc>=5?'#F59E0B':'#EF4444'):'#94A8BE'; var trendRows=(d.scans||[]).slice(0,14).map(function(x){ var cl=x.score>=7?'#0A9E72':x.score>=5?'#F59E0B':'#EF4444'; return ''+x.scan_date+''+x.score+'/10'; }).join(''); var dimRows=ls?dims.map(function(l,i){ var raw=ls[dkeys[i]]||0;var v=dinv[i]?6-raw:raw; var pct=Math.round(v/5*100);var cl=v>=4?'#0A9E72':v>=3?'#F59E0B':'#EF4444'; return ''+l+'
'+raw+'/5'; }).join(''):''; var ciRows=(d.checkins||[]).slice(0,10).map(function(ci){ var dt=new Date(ci.created_at).toLocaleString('nl-NL',{month:'short',day:'numeric',hour:'2-digit',minute:'2-digit'}); return ''+dt+''+ci.state+''+(ci.energy||'–')+'/10'; }).join(''); var rf=d.reflections&&d.reflections[0]; var rfHtml=rf?'

Energie gegeven: '+(rf.gaf||[]).join(', ')+'

Energie geroofd: '+(rf.roofde||[]).join(', ')+'

Pre-sleep: '+(rf.night_wind||'–')+'/5

':'

Geen reflectie

'; var parts=[ 'RitmeOS – '+c.name+'', '', '', '

RitmeOS Behandelrapport

', '

Cliënt: '+c.name+' | Datum: '+dateStr+'

', '

Score: '+(sc||'–')+'/10 ('+((ls&&ls.scan_date)||'–')+')

', '

Scores 14 dagen

'+trendRows+'
DatumScore
', '

Dimensies

'+dimRows+'
OnderdeelBalansScore
', '

Check-ins

'+(ciRows||'')+'
TijdstipStaatEnergie
Geen
', '

Avondreflectie

'+rfHtml, c.notes?'

Notities

'+c.notes+'
':'', '

RitmeOS · Vertrouwelijk

', '' ]; var w=window.open('','_blank'); if(!w){showToast('Pop-ups geblokkeerd','err');return;} w.document.write(parts.join('')); w.document.close(); setTimeout(function(){w.print();},500); } // Overschrijf renderPortalClients met verbeterde versie var _origRenderPortalClients=renderPortalClients; function renderPortalClients(){ PS.clients.forEach(function(c){c.riskLevel=riskLevel(c);}); var sorted=PS.clients.slice().sort(function(a,b){ var o={critical:0,missing:1,declining:1,warning:2,ok:3,unknown:4}; return (o[a.riskLevel]||9)-(o[b.riskLevel]||9); }); var alerts=sorted.filter(function(c){return c.riskLevel==='critical';}); var alertHtml=alerts.length?'
Aandacht vereist ('+alerts.length+')
'+alerts.map(function(c){return '
'+c.name[0].toUpperCase()+'
'+c.name+'
'+((c.lastScan&&c.lastScan.score)||'–')+'
';}).join('')+'
':''; var rows=sorted.length?sorted.map(function(c){ var sc=c.lastScan&&c.lastScan.score; return '
'+c.name[0].toUpperCase()+'
'+c.name+'
'+(c.lastScan?'Scan: '+c.lastScan.scan_date:'Nog geen scan')+' · '+c.todayCheckins.length+' check-ins
'+riskBadgeHtml(c.riskLevel)+'
'+(sc||'–')+'
'; }).join(''):'
Nog geen cliënten gekoppeld.
Genereer een koppelcode.
'; return '

Cliëntoverzicht

'+alertHtml+(PS.loading?'
':rows)+'

Koppelcode

Genereer een code en deel die met je cliënt.

'+(PS.inviteCode?'
'+PS.inviteCode+'

Stuur naar je cliënt

':'')+'
'; } // Overschrijf renderPortalDetail met versie met notities en PDF var _origRenderPortalDetail=renderPortalDetail; function renderPortalDetail(){ var c=PS.clients.find(function(x){return x.id===PS.selectedId;}); if(!c) return''; var base=_origRenderPortalDetail(); var notesSection='
Notities behandelaar
'; var pdfBtn=''; return base.replace('',''+pdfBtn)+notesSection; }