Test | Denef Cardio                     Deze website gebruikt cookies

Wij gebruiken cookies om de website goed te laten werken, het gebruik te analyseren en inhoud af te stemmen op jouw voorkeuren. Je kiest zelf welke cookies je toestaat.

 Voorkeuren Alleen noodzakelijk Alles accepteren 

Cookievoorkeuren

 × 

Kies per categorie welke cookies je toestaat. Noodzakelijke cookies staan altijd aan.

- Noodzakelijk Nodig om de website te laten werken, zoals navigatie, formulieren en beveiliging. Kunnen niet worden uitgeschakeld.
- Voorkeuren Onthouden keuzes zoals taal of regio zodat de website zich aan jou aanpast.
- Statistieken Helpen ons begrijpen hoe bezoekers de website gebruiken door anonieme informatie te verzamelen.
- Marketing Volgen bezoekers over websites heen om relevante advertenties en ingesloten inhoud te tonen.

 Alleen noodzakelijk Keuze opslaan Alles accepteren 

Inhoud geblokkeerd

Deze inhoud wordt pas geladen als je marketingcookies toestaat.

 Toestaan en laden 

   [ ![Denef Cardio](https://cdn.surfking.app/cardio-denef/d4e6c245-799b-4fe6-8dbf-a4a9d5086f07/cardio-denef.png)](/nl) - [ Home ](/nl)
- [ Wie zijn wij ](/nl/wie-zijn-wij)
- [ Cardiologisch onderzoek ](/nl/cardiologisch-onderzoek)
- [ Informatie voor patiënten ](/nl/informatie-voor-patienten)
- [ Praktische info ](/nl/praktische-info)
- [ Contact ](/nl/contact)

  [    016/22.61.62](tel:016226162) [ Online afspraak](https://www.doctena.be/nl/praktijk/leuven/denef-cardio-406325) [   ](tel:016226162)         

 - [ Home ](/nl)
- [ Wie zijn wij ](/nl/wie-zijn-wij)
- [ Cardiologisch onderzoek ](/nl/cardiologisch-onderzoek)
- [ Informatie voor patiënten ](/nl/informatie-voor-patienten)
- [ Praktische info ](/nl/praktische-info)
- [ Contact ](/nl/contact)

  [ Online afspraak](https://www.doctena.be/nl/praktijk/leuven/denef-cardio-406325) [ 016/22.61.62](tel:016226162) 

   Test 
------

&lt;!doctype html&gt; &lt;html lang="nl"&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;meta name="viewport" content="width=device-width,initial-scale=1"&gt; &lt;title&gt;Denef Cardio · Toestelplanning Prototype&lt;/title&gt; &lt;style&gt; :root{--blue:#1f4e78;--line:#d9e2f3;--text:#1f2937;--rr:#ef8f8f;--ho:#fff200;--hn1:#f39a55;--hnm:#b98ad6;--vascular:#b9dcff;--pacemaker:#bfe8c3} \*{box-sizing:border-box}body{margin:0;font-family:Segoe UI,Arial,sans-serif;background:#eef3f8;color:var(--text)} .app{max-width:1500px;margin:0 auto;padding:18px}.header{background:var(--blue);color:white;border-radius:14px;padding:18px 22px;display:flex;justify-content:space-between;align-items:center;gap:16px} .header h1{margin:0;font-size:23px}.header small{opacity:.85}.controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap} button{border:0;border-radius:9px;padding:9px 13px;font-weight:600;cursor:pointer}.light{background:white;color:var(--blue)}.primary{background:var(--blue);color:white} .weeklabel{font-weight:700;background:#fff2cc;color:#7a4e00;padding:9px 12px;border-radius:9px}.notice{margin:12px 0;background:#fff;padding:10px 14px;border-radius:10px;border-left:4px solid #e4b000} .gridwrap{background:white;border-radius:14px;overflow:auto}.grid{display:grid;grid-template-columns:90px repeat(5,minmax(210px,1fr));min-width:1150px} .cell,.head,.time{border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.head{position:sticky;top:0;z-index:5;background:#d9eaf7;padding:12px;text-align:center;font-weight:700} .time{background:#f8fafc;font-weight:700;text-align:center;padding:12px 5px}.slot{min-height:70px;padding:6px;background:white;cursor:pointer} .slot:hover{background:#f6fbff;box-shadow:inset 0 0 0 2px #8db8d8}.appt{border-radius:9px;padding:7px 8px;margin:2px 0;font-size:13px;line-height:1.25;border:1px solid #0001}.appt strong{display:block} .rr{background:var(--rr)}.ho{background:var(--ho)}.hn1{background:var(--hn1)}.hnm{background:var(--hnm)}.vascular{background:var(--vascular)}.pacemaker{background:var(--pacemaker)} .modalback{position:fixed;inset:0;background:#0007;display:none;align-items:center;justify-content:center;z-index:50}.modal{width:min(520px,94vw);max-height:90vh;overflow-y:auto;background:white;border-radius:16px;padding:20px} .modal h2{margin:0 0 4px}.sub{color:#64748b;margin-bottom:16px}.formgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px} label{font-size:12px;font-weight:700;color:#475569;display:block;margin-bottom:5px}input,select{width:100%;padding:10px;border:1px solid #cbd5e1;border-radius:8px;font:inherit} .full{grid-column:1/-1}.actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}.danger{background:#c00000;color:white}.legend{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}.tag{padding:5px 9px;border-radius:8px;font-size:12px;font-weight:700} .footerhint{font-size:12px;color:#64748b;margin-top:10px} .availability{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}.stockcard{background:white;border-radius:10px;padding:9px 12px;font-size:13px} .okmsg{margin-top:10px;padding:9px 10px;border-radius:8px;background:#e2f0d9;font-size:13px}.errmsg{margin-top:10px;padding:9px 10px;border-radius:8px;background:#fde8e8;color:#8a0000;font-size:13px;font-weight:700} .appt{cursor:pointer;position:relative}.appt:hover{outline:2px solid #1f4e78} .statuspill{display:inline-block;margin-top:4px;padding:2px 6px;border-radius:10px;background:#ffffffaa;font-size:11px;font-weight:700} .editnote{font-size:11px;color:#64748b;margin-top:4px} .returnbox{display:none;margin-top:12px;padding:12px;background:#f8fafc;border-radius:10px;border:1px solid #d9e2f3} .returngrid{display:grid;grid-template-columns:1fr 1fr;gap:10px} @media print{ body{background:white!important} .header,.notice,.legend,.availability,.gridwrap,.footerhint,#toggleTotals{display:none!important} .app{max-width:none;padding:0} #totalsPanel{display:block!important;box-shadow:none!important;margin:0!important;padding:0!important} #totalsPanel h3{font-size:20px;margin-bottom:4px} #printPeriod{display:block!important;margin-bottom:14px;font-weight:700} #totalsPanel table{font-size:12px} #totalsPanel button{display:none!important} } &lt;/style&gt;&lt;/head&gt; &lt;body&gt; &lt;div class="app"&gt; &lt;div class="header"&gt;&lt;div&gt;&lt;h1&gt;DENEF CARDIO · Toestelplanning&lt;/h1&gt;&lt;small&gt;Webprototype 4P · statistieken gecorrigeerd + maand op plaatsingsdatum&lt;/small&gt;&lt;/div&gt; &lt;div class="controls"&gt;&lt;button class="light" id="prev"&gt;← Vorige week&lt;/button&gt;&lt;div class="weeklabel" id="weekLabel"&gt;&lt;/div&gt;&lt;button class="light" id="next"&gt;Volgende week →&lt;/button&gt;&lt;button class="light" id="today"&gt;Deze week&lt;/button&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="notice"&gt;&lt;b&gt;Testdoel:&lt;/b&gt; een HN 3 dagen geplaatst op maandag 10:00 staat maandag, dinsdag en woensdag als dag 1/3, 2/3 en 3/3, en verschijnt donderdag 10:00 apart als TERUG. Het toestel blijft daarna nog 30 minuten geblokkeerd voor uitlezen/programmeren.&lt;/div&gt; &lt;div class="legend"&gt;&lt;span class="tag rr"&gt;BD&lt;/span&gt;&lt;span class="tag ho"&gt;HO&lt;/span&gt;&lt;span class="tag hn1"&gt;HN 1 dag&lt;/span&gt;&lt;span class="tag hnm"&gt;HN meerdere dagen&lt;/span&gt;&lt;span class="tag vascular"&gt;Vaatchirurg&lt;/span&gt;&lt;span class="tag pacemaker"&gt;Pacemaker&lt;/span&gt;&lt;/div&gt; &lt;div class="availability"&gt;&lt;div class="stockcard"&gt;&lt;b&gt;2&lt;/b&gt; BD&lt;/div&gt;&lt;div class="stockcard"&gt;&lt;b&gt;3&lt;/b&gt; HO&lt;/div&gt;&lt;div class="stockcard"&gt;&lt;b&gt;3&lt;/b&gt; HN&lt;/div&gt;&lt;div class="stockcard"&gt;&lt;b&gt;30 min&lt;/b&gt; uitlezen/programmeren na terugkomst&lt;/div&gt;&lt;/div&gt; &lt;div style="margin:12px 0"&gt; &lt;button class="primary" id="toggleTotals"&gt;Toon totalen voor Koen&lt;/button&gt; &lt;/div&gt; &lt;div id="totalsPanel" style="display:none;background:white;border-radius:14px;padding:16px;margin:12px 0;box-shadow:0 8px 24px #0001"&gt; &lt;div style="display:flex;justify-content:space-between;align-items:center;gap:12px"&gt; &lt;h3 style="margin:0"&gt;Denef Cardio · Toestelstatistieken&lt;/h3&gt; &lt;button class="primary" id="printTotals"&gt;Afdrukken&lt;/button&gt; &lt;/div&gt; &lt;div id="printPeriod" style="margin-top:6px;font-weight:700"&gt;&lt;/div&gt; &lt;div class="editnote"&gt;Tellingen zijn gebaseerd op de plaatsingsdatum van de afspraak.&lt;/div&gt; &lt;div style="display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:12px"&gt; &lt;div&gt; &lt;h4 style="margin:0 0 8px"&gt;Per toestel&lt;/h4&gt; &lt;table style="width:100%;border-collapse:collapse" id="deviceTotals"&gt;&lt;/table&gt; &lt;/div&gt; &lt;div&gt; &lt;h4 style="margin:0 0 8px"&gt;Per arts&lt;/h4&gt; &lt;table style="width:100%;border-collapse:collapse" id="doctorTotals"&gt;&lt;/table&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top:20px"&gt; &lt;h4 style="margin:0 0 5px"&gt;Weekoverzicht per arts en toestel&lt;/h4&gt; &lt;div class="editnote"&gt;BDM apart · 1-dags Holters = HO + HN1 · meerdaagse Holters = HN2 t/m HN7.&lt;/div&gt; &lt;table style="width:100%;border-collapse:collapse;margin-top:8px" id="doctorDeviceWeek"&gt;&lt;/table&gt; &lt;/div&gt; &lt;div style="margin-top:20px"&gt; &lt;h4 style="margin:0 0 5px"&gt;Maandoverzicht per arts en toestel&lt;/h4&gt; &lt;div class="editnote"&gt;HO = gewone HO + HN 1 dag. HN = HN vanaf 2 t/m 7 dagen.&lt;/div&gt; &lt;table style="width:100%;border-collapse:collapse;margin-top:8px" id="doctorDeviceMonth"&gt;&lt;/table&gt; &lt;/div&gt; &lt;div style="margin-top:22px"&gt; &lt;h4 style="margin:0 0 5px"&gt;Maandoverzicht analyses HO / HN&lt;/h4&gt; &lt;div class="editnote"&gt;1 toestel = 1 analyse. HO = gewone HO + HN 1 dag. HN = HN vanaf 2 t/m 7 dagen. BD wordt hier niet meegeteld.&lt;/div&gt; &lt;table style="width:100%;border-collapse:collapse;margin-top:8px" id="analysisMonth"&gt;&lt;/table&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="gridwrap"&gt;&lt;div class="grid" id="grid"&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="footerhint"&gt;Afspraken worden voorlopig alleen op deze computer in de browser bewaard. Dit is nog geen definitieve praktijkdatabase.&lt;/div&gt; &lt;/div&gt; &lt;div class="modalback" id="modalBack"&gt;&lt;div class="modal"&gt;&lt;h2&gt;Nieuwe afspraak&lt;/h2&gt;&lt;div class="sub" id="chosenSlot"&gt;&lt;/div&gt; &lt;div class="formgrid"&gt; &lt;div&gt;&lt;label&gt;Toestel&lt;/label&gt;&lt;select id="device"&gt;&lt;option&gt;BD&lt;/option&gt;&lt;option&gt;HO&lt;/option&gt;&lt;option&gt;HN 1 dag&lt;/option&gt;&lt;option&gt;HN 2 dagen&lt;/option&gt;&lt;option&gt;HN 3 dagen&lt;/option&gt;&lt;option&gt;HN 4 dagen&lt;/option&gt;&lt;option&gt;HN 5 dagen&lt;/option&gt;&lt;option&gt;HN 6 dagen&lt;/option&gt;&lt;option&gt;HN 7 dagen&lt;/option&gt;&lt;option&gt;Vaatchirurg&lt;/option&gt;&lt;option&gt;Pacemaker&lt;/option&gt;&lt;/select&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Status&lt;/label&gt;&lt;select id="status"&gt;&lt;option&gt;Gepland&lt;/option&gt;&lt;option&gt;Geplaatst&lt;/option&gt;&lt;option&gt;Terug&lt;/option&gt;&lt;/select&gt;&lt;/div&gt; &lt;div class="full"&gt;&lt;label&gt;Naam patiënt&lt;/label&gt;&lt;input id="patient"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Geboortedatum&lt;/label&gt;&lt;input id="dob" type="date"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Arts&lt;/label&gt;&lt;select id="doctor"&gt;&lt;option&gt;KD&lt;/option&gt;&lt;option&gt;GVT&lt;/option&gt;&lt;option&gt;AV&lt;/option&gt;&lt;option&gt;JE&lt;/option&gt;&lt;option&gt;LC&lt;/option&gt;&lt;option&gt;Andere&lt;/option&gt;&lt;/select&gt;&lt;/div&gt; &lt;div class="full returnbox"&gt; &lt;b&gt;Afgesproken retour&lt;/b&gt; &lt;div class="editnote"&gt;Automatisch ingevuld volgens het toestel. Pas dit meteen aan als de patiënt later of vroeger terugkomt. Het toestel blijft daarna nog 30 minuten geblokkeerd.&lt;/div&gt; &lt;div class="returngrid" style="margin-top:10px"&gt; &lt;div&gt;&lt;label&gt;Retourdatum&lt;/label&gt;&lt;input id="newReturnDate" type="date"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Retourtijd&lt;/label&gt;&lt;input id="newReturnTime" type="time" step="1800"&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div id="availabilityMsg" class="okmsg"&gt;Beschikbaarheid wordt gecontroleerd.&lt;/div&gt;&lt;div class="actions"&gt;&lt;button id="cancel"&gt;Annuleren&lt;/button&gt;&lt;button class="primary" id="save"&gt;Opslaan&lt;/button&gt;&lt;/div&gt; &lt;/div&gt;&lt;/div&gt; &lt;div class="modalback" id="editBack"&gt; &lt;div class="modal"&gt; &lt;h2&gt;Afspraak wijzigen / verplaatsen&lt;/h2&gt; &lt;div class="sub" id="editInfo"&gt;&lt;/div&gt; &lt;div class="formgrid"&gt; &lt;div&gt;&lt;label&gt;Datum&lt;/label&gt;&lt;input id="editDate" type="date"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Tijd&lt;/label&gt; &lt;select id="editTime"&gt; &lt;option&gt;08:00&lt;/option&gt;&lt;option&gt;08:30&lt;/option&gt;&lt;option&gt;09:00&lt;/option&gt;&lt;option&gt;09:30&lt;/option&gt;&lt;option&gt;10:00&lt;/option&gt; &lt;option&gt;10:30&lt;/option&gt;&lt;option&gt;11:00&lt;/option&gt;&lt;option&gt;11:30&lt;/option&gt;&lt;option&gt;12:00&lt;/option&gt; &lt;option&gt;12:30&lt;/option&gt;&lt;option&gt;13:00&lt;/option&gt;&lt;option&gt;13:30&lt;/option&gt;&lt;option&gt;14:00&lt;/option&gt; &lt;option&gt;14:30&lt;/option&gt;&lt;option&gt;15:00&lt;/option&gt;&lt;option&gt;15:30&lt;/option&gt;&lt;option&gt;16:00&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;div&gt;&lt;label&gt;Toestel&lt;/label&gt; &lt;select id="editDevice"&gt; &lt;option&gt;BD&lt;/option&gt;&lt;option&gt;HO&lt;/option&gt;&lt;option&gt;HN 1 dag&lt;/option&gt;&lt;option&gt;HN 2 dagen&lt;/option&gt; &lt;option&gt;HN 3 dagen&lt;/option&gt;&lt;option&gt;HN 4 dagen&lt;/option&gt;&lt;option&gt;HN 5 dagen&lt;/option&gt;&lt;option&gt;HN 6 dagen&lt;/option&gt;&lt;option&gt;HN 7 dagen&lt;/option&gt;&lt;option&gt;Vaatchirurg&lt;/option&gt;&lt;option&gt;Pacemaker&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;div&gt;&lt;label&gt;Status&lt;/label&gt; &lt;select id="editStatus"&gt; &lt;option&gt;Gepland&lt;/option&gt;&lt;option&gt;Geplaatst&lt;/option&gt;&lt;option&gt;Terug&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;div class="full"&gt;&lt;label&gt;Naam patiënt&lt;/label&gt;&lt;input id="editPatient"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Geboortedatum&lt;/label&gt;&lt;input id="editDob" type="date"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Arts&lt;/label&gt; &lt;select id="editDoctor"&gt; &lt;option&gt;KD&lt;/option&gt;&lt;option&gt;GVT&lt;/option&gt;&lt;option&gt;AV&lt;/option&gt;&lt;option&gt;JE&lt;/option&gt;&lt;option&gt;LC&lt;/option&gt;&lt;option&gt;Andere&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;div id="analysisField"&gt;&lt;label&gt;Geanalyseerd door&lt;/label&gt; &lt;select id="editAnalyzedBy"&gt; &lt;option value=""&gt;Nog niet geanalyseerd&lt;/option&gt; &lt;option&gt;KD&lt;/option&gt;&lt;option&gt;GVT&lt;/option&gt;&lt;option&gt;AV&lt;/option&gt;&lt;option&gt;JE&lt;/option&gt;&lt;option&gt;LC&lt;/option&gt; &lt;option&gt;Papa Denef&lt;/option&gt;&lt;option&gt;Andere&lt;/option&gt; &lt;/select&gt; &lt;/div&gt; &lt;/div&gt; &lt;div id="editAvailability" class="okmsg" style="margin-top:12px"&gt;&lt;/div&gt; &lt;div class="returnbox" id="returnBox"&gt; &lt;b&gt;Afgesproken retour&lt;/b&gt; &lt;div class="editnote"&gt;Standaard wordt de retour automatisch berekend. Pas datum/tijd alleen aan als de patiënt op een ander moment terugbrengt. Daarna blijft het toestel nog 30 minuten geblokkeerd voor uitlezen/programmeren.&lt;/div&gt; &lt;div class="returngrid" style="margin-top:10px"&gt; &lt;div&gt;&lt;label&gt;Retourdatum&lt;/label&gt;&lt;input id="returnDate" type="date"&gt;&lt;/div&gt; &lt;div&gt;&lt;label&gt;Retourtijd&lt;/label&gt;&lt;input id="returnTime" type="time" step="1800"&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="actions" style="justify-content:space-between"&gt; &lt;button class="danger" id="deleteAppt"&gt;Verwijderen&lt;/button&gt; &lt;div style="display:flex;gap:8px"&gt; &lt;button id="editCancel"&gt;Annuleren&lt;/button&gt; &lt;button class="primary" id="editSave"&gt;Wijziging opslaan&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;script&gt; const times=\["08:00","08:30","09:00","09:30","10:00","10:30","11:00","11:30","12:00","12:30","13:00","13:30","14:00","14:30","15:00","15:30","16:00"\], days=\["Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag"\], KEY="denef\_cardio\_proto\_v4h", OLDKEY="denef\_cardio\_proto\_v4g", STOCK={BD:2,HO:3,HN:3}; let creatingNew=false; let appointments=JSON.parse(localStorage.getItem(KEY)||localStorage.getItem(OLDKEY)||"\[\]"); appointments=appointments.map(a=&gt;({...a,device:a.device==="RR"?"BD":a.device,analyzedBy:a.analyzedBy||""})); localStorage.setItem(KEY,JSON.stringify(appointments)); let currentMonday=getMonday(new Date()),selected=null,editingId=null; function getMonday(d){d=new Date(d);d.setHours(0,0,0,0);const x=d.getDay()||7;d.setDate(d.getDate()-x+1);return d} function iso(d){const y=d.getFullYear(),m=String(d.getMonth()+1).padStart(2,"0"),x=String(d.getDate()).padStart(2,"0");return `${y}-${m}-${x}`} function fd(d){return d.toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit",year:"numeric"})} function fs(d){return d.toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit"})} function isSpecial(x){return x==="Vaatchirurg"||x==="Pacemaker"} function cls(x){return x==="BD"?"rr":x==="HO"?"ho":x==="HN 1 dag"?"hn1":x==="Vaatchirurg"?"vascular":x==="Pacemaker"?"pacemaker":"hnm"} function grp(x){return x==="BD"?"BD":x==="HO"?"HO":x.startsWith("HN")?"HN":"SPECIAL"} function dur(x){const m=x.match(/HN (\\d+) dag/);return m?+m\[1\]:1} function esc(s){return String(s||"").replace(/\[&amp;&lt;&gt;"'\]/g,m=&gt;({"&amp;":"&amp;amp;","&lt;":"&amp;lt;","&gt;":"&amp;gt;",'"':"&amp;quot;","'":"&amp;#39;"}\[m\]))} function dob(s){if(!s)return"";const \[y,m,d\]=s.split("-");return`${d}/${m}/${y}`} function dt(d,t){return new Date(`${d}T${t}:00`)} function plannedEnd(a){ const e=dt(a.date,a.time); if(isSpecial(a.device)){e.setMinutes(e.getMinutes()+30);return e} e.setDate(e.getDate()+dur(a.device));e.setMinutes(e.getMinutes()+30);return e } function actualEnd(a){ if(a.returnDate&amp;&amp;a.returnTime){ const e=dt(a.returnDate,a.returnTime);e.setMinutes(e.getMinutes()+30);return e } return plannedEnd(a) } function candidateEnd(dev,date,time,returnDate="",returnTime=""){ return actualEnd({date,time,device:dev,returnDate,returnTime}) } function overlap(s1,e1,s2,e2){return s1&lt;e2&amp;&amp;s2&lt;e1} /\* Controleer de echte capaciteit op elk relevant moment. Een kandidaat bezet 1 toestel van plaatsing tot retour + 30 min. We bekijken alle start/eindmomenten binnen die periode en tellen hoeveel bestaande afspraken tegelijk actief zijn. \*/ function capacityCheck(dev,date,time,returnDate="",returnTime="",excludeId=null){ if(isSpecial(dev)) return {ok:true,freeAtWorst:0,stock:0,conflictAt:null,end:dt(date,time)}; const g=grp(dev), stock=STOCK\[g\]; const start=dt(date,time), end=candidateEnd(dev,date,time,returnDate,returnTime); const same=appointments.filter(a=&gt; a.id!==excludeId &amp;&amp; grp(a.device)===g &amp;&amp; overlap(start,end,dt(a.date,a.time),actualEnd(a)) ); const points=\[start,end\]; for(const a of same){ const as=dt(a.date,a.time), ae=actualEnd(a); if(as&gt;start &amp;&amp; as&lt;end) points.push(as); if(ae&gt;start &amp;&amp; ae&lt;end) points.push(ae); } points.sort((a,b)=&gt;a-b); let worstUsed=0, conflictAt=null; for(const p of points){ if(p&gt;=end) continue; const used=same.filter(a=&gt;dt(a.date,a.time)&lt;=p &amp;&amp; actualEnd(a)&gt;p).length; if(used&gt;worstUsed){worstUsed=used;conflictAt=new Date(p)} } return{ ok: worstUsed &lt; stock, freeAtWorst: stock-worstUsed, stock, conflictAt, end } } function avail(dev,date,time,excludeId=null){ const c=capacityCheck(dev,date,time,"","",excludeId); return{free:c.freeAtWorst,stock:c.stock,ok:c.ok,conflictAt:c.conflictAt} } function dayNumber(dateStr){ const \[y,m,d\]=dateStr.split("-").map(Number); return Date.UTC(y,m-1,d)/86400000 } function occ(a,date){ const diff=dayNumber(date)-dayNumber(a.date); return diff&gt;=0&amp;&amp;diff&lt;dur(a.device)?diff+1:0 } function plannedReturnDate(a){ const d=dt(a.date,a.time); d.setDate(d.getDate()+dur(a.device)); return iso(d) } function render(){ const g=document.getElementById("grid");g.innerHTML='&lt;div class="head"&gt;Tijd&lt;/div&gt;'; for(let i=0;i&lt;5;i++){const d=new Date(currentMonday);d.setDate(d.getDate()+i);g.innerHTML+=`&lt;div class="head"&gt;${days\[i\]}&lt;br&gt;${fs(d)}&lt;/div&gt;`} for(const t of times){ g.innerHTML+=`&lt;div class="time"&gt;${t}&lt;/div&gt;`; for(let i=0;i&lt;5;i++){ const d=new Date(currentMonday);d.setDate(d.getDate()+i);const date=iso(d); const apps=appointments.filter(a=&gt;a.time===t&amp;&amp;occ(a,date)&gt;0); const returns=appointments.filter(a=&gt;{if(isSpecial(a.device))return false;const rd=a.returnDate||plannedReturnDate(a),rt=a.returnTime||a.time;return rt===t&amp;&amp;dur(a.device)&gt;1&amp;&amp;rd===date}); let h=`&lt;div class="slot" data-date="${date}" data-time="${t}"&gt;`; for(const a of apps){ const n=occ(a,date),du=dur(a.device); const retour=a.returnDate&amp;&amp;a.returnTime?`&lt;br&gt;&lt;small&gt;Werkelijk terug: ${a.returnDate.split("-").reverse().join("/")} ${a.returnTime} · vrij ${formatFreeTime(a)}&lt;/small&gt;`:""; if(isSpecial(a.device)){ h+=`&lt;div class="appt ${cls(a.device)}" data-id="${a.id}"&gt;&lt;strong&gt;${a.device}&lt;/strong&gt;&lt;span class="statuspill"&gt;Reminder&lt;/span&gt;&lt;/div&gt;`; continue; } const analyse=a.device!=="BD"?(a.analyzedBy?`&lt;br&gt;&lt;small&gt;&lt;b&gt;Analyse: ${esc(a.analyzedBy)} ✓&lt;/b&gt;&lt;/small&gt;`:`&lt;br&gt;&lt;small&gt;Analyse: nog open&lt;/small&gt;`):""; h+=`&lt;div class="appt ${cls(a.device)}" data-id="${a.id}"&gt;&lt;strong&gt;${a.device}${du&gt;1?` · dag ${n}/${du}`:""}&lt;/strong&gt;${esc(a.patient)} · ${dob(a.dob)} · ${esc(a.doctor)}&lt;br&gt;&lt;span class="statuspill"&gt;${a.status}&lt;/span&gt;${retour}${analyse}&lt;/div&gt;` } for(const a of returns){ h+=`&lt;div class="appt ${cls(a.device)}" data-id="${a.id}" style="border-style:dashed"&gt;&lt;strong&gt;${a.device} · TERUG&lt;/strong&gt;${esc(a.patient)} · ${esc(a.doctor)}&lt;br&gt;&lt;small&gt;${a.returnDate&amp;&amp;a.returnTime?"Afgesproken terug":"Gepland terug"} ${a.returnTime||a.time} · toestel vrij vanaf ${(()=&gt;{const x=dt(date,a.returnTime||a.time);x.setMinutes(x.getMinutes()+30);return x.toLocaleTimeString("nl-BE",{hour:"2-digit",minute:"2-digit"})})()}&lt;/small&gt;&lt;/div&gt;` } g.innerHTML+=h+"&lt;/div&gt;" } } document.querySelectorAll(".slot").forEach(e=&gt;e.onclick=ev=&gt;{if(!ev.target.closest(".appt"))openM(e.dataset.date,e.dataset.time)}); document.querySelectorAll(".appt").forEach(e=&gt;e.onclick=ev=&gt;{ev.stopPropagation();openEdit(Number(e.dataset.id))}); const z=new Date(currentMonday);z.setDate(z.getDate()+4); document.getElementById("weekLabel").textContent=`${fd(currentMonday)} – ${fd(z)}`; renderTotals(); } function formatFreeTime(a){ const e=actualEnd(a); return e.toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit"})+" "+e.toLocaleTimeString("nl-BE",{hour:"2-digit",minute:"2-digit"}) } function defaultReturnForNew(){ if(!selected)return; const dev=document.getElementById("device").value; const e=dt(selected.date,selected.time); e.setDate(e.getDate()+dur(dev)); document.getElementById("newReturnDate").value=iso(e); document.getElementById("newReturnTime").value=selected.time; } function msg(){ if(!selected)return; const dev=document.getElementById("device").value, rd=document.getElementById("newReturnDate").value, rt=document.getElementById("newReturnTime").value, a=capacityCheck(dev,selected.date,selected.time,rd,rt), e=document.getElementById("availabilityMsg"); if(!rd||!rt){e.className="errmsg";e.textContent="Vul retourdatum en retourtijd in.";return} if(dt(rd,rt)&lt;dt(selected.date,selected.time)){e.className="errmsg";e.textContent="De retourtijd kan niet vóór de plaatsing liggen.";return} if(!a.ok){e.className="errmsg";e.textContent=`Geen ${grp(dev)}-toestel beschikbaar gedurende de volledige reservatieperiode.`} else{e.className="okmsg";e.textContent=a.freeAtWorst===1?`Nog 1 ${grp(dev)}-toestel beschikbaar gedurende de volledige reservatieperiode.`:`${a.freeAtWorst} ${grp(dev)}-toestellen beschikbaar gedurende de volledige reservatieperiode.`} } function openM(date,time){ selected={date,time}; creatingNew=true; editingId=null; document.querySelector("#editBack h2").textContent="Nieuwe afspraak"; document.getElementById("editInfo").textContent=`${date.split("-").reverse().join("/")} om ${time}`; document.getElementById("editDate").value=date; document.getElementById("editTime").value=time; document.getElementById("editDevice").value="BD"; document.getElementById("editStatus").value="Gepland"; document.getElementById("editPatient").value=""; document.getElementById("editDob").value=""; document.getElementById("editDoctor").value="KD"; document.getElementById("editAnalyzedBy").value=""; const tmp={date,time,device:"BD"}; document.getElementById("returnDate").value=plannedReturnDate(tmp); document.getElementById("returnTime").value=time; document.getElementById("deleteAppt").style.display="none"; document.getElementById("editSave").textContent="Opslaan"; toggleReturn();toggleAnalysis();editAvailMessage(); document.getElementById("editBack").style.display="flex" } function closeM(){document.getElementById("modalBack").style.display="none";selected=null} document.getElementById("device").onchange=()=&gt;{defaultReturnForNew();msg()}; document.getElementById("newReturnDate").onchange=msg; document.getElementById("newReturnTime").onchange=msg; document.getElementById("save").onclick=()=&gt;{ const p=document.getElementById("patient").value.trim(), d=document.getElementById("dob").value, dev=document.getElementById("device").value; if(!p||!d){alert("Vul naam patiënt en geboortedatum in.");return} const rd=document.getElementById("newReturnDate").value, rt=document.getElementById("newReturnTime").value; if(!rd||!rt){alert("Vul retourdatum en retourtijd in.");return} if(dt(rd,rt)&lt;dt(selected.date,selected.time)){alert("De retourtijd kan niet vóór de plaatsing liggen.");return} const a=capacityCheck(dev,selected.date,selected.time,rd,rt); if(!a.ok){alert(`Geen ${grp(dev)}-toestel beschikbaar gedurende de volledige reservatieperiode. De afspraak wordt niet opgeslagen.`);return} const auto=new Date(dt(selected.date,selected.time)); auto.setDate(auto.getDate()+dur(dev)); const autoDate=iso(auto); appointments.push({id:Date.now(),date:selected.date,time:selected.time,device:dev,patient:p,dob:d,doctor:document.getElementById("doctor").value,status:document.getElementById("status").value,returnDate:(rd===autoDate&amp;&amp;rt===selected.time)?"":rd,returnTime:(rd===autoDate&amp;&amp;rt===selected.time)?"":rt}); saveAll();closeM();render() }; document.getElementById("cancel").onclick=closeM; document.getElementById("modalBack").onclick=e=&gt;{if(e.target.id==="modalBack")closeM()}; function editAvailMessage(){ if(!editingId&amp;&amp;!creatingNew)return; const dev=document.getElementById("editDevice").value; const date=document.getElementById("editDate").value; const time=document.getElementById("editTime").value; const rd=document.getElementById("returnDate").value; const rt=document.getElementById("returnTime").value; const el=document.getElementById("editAvailability"); if(!date||!time){el.className="errmsg";el.textContent="Kies datum en tijd.";return} if(isSpecial(dev)){el.className="okmsg";el.textContent="Reminder: telt niet mee als toestel en heeft geen capaciteitscontrole.";return} const a=capacityCheck(dev,date,time,rd,rt,editingId); if(!a.ok){el.className="errmsg";el.textContent=`Niet mogelijk: alle ${a.stock} ${grp(dev)}-toestellen zijn tegelijk bezet binnen deze reservatieperiode.`} else if(a.freeAtWorst===1){el.className="okmsg";el.textContent=`Nog 1 ${grp(dev)}-toestel beschikbaar gedurende deze reservatieperiode.`} else{el.className="okmsg";el.textContent=`${a.freeAtWorst} ${grp(dev)}-toestellen beschikbaar gedurende deze reservatieperiode.`} } function openEdit(id){ creatingNew=false; const a=appointments.find(x=&gt;x.id===id);if(!a)return;editingId=id; document.querySelector("#editBack h2").textContent="Afspraak wijzigen / verplaatsen"; document.getElementById("deleteAppt").style.display=""; document.getElementById("editSave").textContent="Wijziging opslaan"; document.getElementById("editInfo").textContent=`${a.device} · ${a.patient}`; document.getElementById("editDate").value=a.date; document.getElementById("editTime").value=a.time; document.getElementById("editDevice").value=a.device; document.getElementById("editPatient").value=a.patient; document.getElementById("editDob").value=a.dob; document.getElementById("editDoctor").value=a.doctor; document.getElementById("editStatus").value=a.status; document.getElementById("editAnalyzedBy").value=a.analyzedBy||""; document.getElementById("returnDate").value=isSpecial(a.device)?"":(a.returnDate||plannedReturnDate(a)); document.getElementById("returnTime").value=isSpecial(a.device)?"":(a.returnTime||a.time); toggleReturn();toggleAnalysis();editAvailMessage(); document.getElementById("editBack").style.display="flex" } function toggleReturn(){ const dev=document.getElementById("editDevice").value; document.getElementById("returnBox").style.display=isSpecial(dev)?"none":"block" } function toggleAnalysis(){ const dev=document.getElementById("editDevice").value; const show=dev!=="BD" &amp;&amp; !isSpecial(dev); document.getElementById("analysisField").style.display=show?"block":"none"; if(!show)document.getElementById("editAnalyzedBy").value=""; } function resetCreateReturn(){ if(!creatingNew)return; const date=document.getElementById("editDate").value,time=document.getElementById("editTime").value,dev=document.getElementById("editDevice").value; if(!date||!time)return; document.getElementById("returnDate").value=plannedReturnDate({date,time,device:dev}); document.getElementById("returnTime").value=time; } function closeEdit(){document.getElementById("editBack").style.display="none";editingId=null;creatingNew=false;selected=null} document.getElementById("editStatus").onchange=toggleReturn; document.getElementById("editDate").onchange=()=&gt;{if(creatingNew)resetCreateReturn();editAvailMessage()}; document.getElementById("editTime").onchange=()=&gt;{if(creatingNew)resetCreateReturn();editAvailMessage()}; document.getElementById("editDevice").onchange=()=&gt;{if(creatingNew&amp;&amp;!isSpecial(document.getElementById("editDevice").value))resetCreateReturn();editAvailMessage();toggleAnalysis();toggleReturn()}; document.getElementById("returnDate").onchange=editAvailMessage; document.getElementById("returnTime").onchange=editAvailMessage; document.getElementById("editCancel").onclick=closeEdit; document.getElementById("editBack").onclick=e=&gt;{if(e.target.id==="editBack")closeEdit()}; document.getElementById("editSave").onclick=()=&gt;{ const newDate=document.getElementById("editDate").value; const newTime=document.getElementById("editTime").value; const newDevice=document.getElementById("editDevice").value; const newPatient=document.getElementById("editPatient").value.trim(); const newDob=document.getElementById("editDob").value; const newDoctor=document.getElementById("editDoctor").value; const st=document.getElementById("editStatus").value; if(!newDate||!newTime){alert("Vul datum en tijd in.");return} const special=isSpecial(newDevice); if(!special &amp;&amp; (!newPatient||!newDob)){alert("Vul patiënt en geboortedatum in.");return} const rd=document.getElementById("returnDate").value,rt=document.getElementById("returnTime").value; if(!special){ if(!rd||!rt){alert("Vul retourdatum en retourtijd in.");return} if(dt(rd,rt)&lt;dt(newDate,newTime)){alert("De retourtijd kan niet vóór de plaatsing liggen.");return} const exclude=creatingNew?null:editingId; const check=capacityCheck(newDevice,newDate,newTime,rd,rt,exclude); if(!check.ok){alert(`Niet mogelijk: alle ${check.stock} ${grp(newDevice)}-toestellen zijn tegelijk bezet binnen de gekozen reservatieperiode.`);return} } const data={ date:newDate,time:newTime,device:newDevice, patient:special?newDevice:newPatient,dob:special?"":newDob,doctor:special?"":newDoctor,status:special?"Gepland":st, analyzedBy:special||newDevice==="BD"?"":document.getElementById("editAnalyzedBy").value }; if(special){data.returnDate="";data.returnTime=""} else{ const autoDate=plannedReturnDate(data); data.returnDate=(rd===autoDate&amp;&amp;rt===newTime)?"":rd; data.returnTime=(rd===autoDate&amp;&amp;rt===newTime)?"":rt; } if(creatingNew){ appointments.push({id:Date.now(),...data}); }else{ const a=appointments.find(x=&gt;x.id===editingId);if(!a)return; Object.assign(a,data); } saveAll();closeEdit();render() }; document.getElementById("deleteAppt").onclick=()=&gt;{ const a=appointments.find(x=&gt;x.id===editingId);if(!a)return; if(!confirm(`Afspraak van ${a.patient} verwijderen?`))return; appointments=appointments.filter(x=&gt;x.id!==editingId); saveAll();closeEdit();render() }; function inRange(date,start,end){const x=new Date(`${date}T00:00:00`);return x&gt;=start&amp;&amp;x&lt;end} function startOfMonth(d){return new Date(d.getFullYear(),d.getMonth(),1)} function nextMonth(d){return new Date(d.getFullYear(),d.getMonth()+1,1)} function countFor(filter,start,end){return appointments.filter(a=&gt;filter(a)&amp;&amp;inRange(a.date,start,end)).length} function statCat(a){ if(isSpecial(a.device)) return "SPECIAL"; if(a.device==="BD") return "BD"; if(a.device==="HO" || a.device==="HN 1 dag") return "ONE"; if(/^HN \[2-7\] dag/.test(a.device)) return "MULTI"; return "OTHER"; } function renderDoctorDeviceTable(start,end){ const doctors=\["KD","GVT","AV","JE","LC","Andere"\]; let h='&lt;tr&gt;&lt;th style="text-align:left;padding:7px;border-bottom:1px solid #ddd"&gt;Arts&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;BD&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;1-dags Holters&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;Meerdaagse Holters&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;Totaal&lt;/th&gt;&lt;/tr&gt;'; for(const doc of doctors){ const bd=countFor(a=&gt;a.doctor===doc &amp;&amp; statCat(a)==="BD",start,end); const one=countFor(a=&gt;a.doctor===doc &amp;&amp; statCat(a)==="ONE",start,end); const multi=countFor(a=&gt;a.doctor===doc &amp;&amp; statCat(a)==="MULTI",start,end); h+=`&lt;tr&gt;&lt;td style="padding:7px;border-bottom:1px solid #eee;font-weight:700"&gt;${doc}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${bd}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${one}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${multi}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee;font-weight:700"&gt;${bd+one+multi}&lt;/td&gt;&lt;/tr&gt;`; } return h; } function renderTotals(){ const weekStart=new Date(currentMonday),weekEnd=new Date(currentMonday);weekEnd.setDate(weekEnd.getDate()+7); /\* Een overgangsweek hoort voor de maandstatistiek bij de maand waarin de meeste werkdagen (ma-vr) van die week vallen. 31/08–06/09 =&gt; september. \*/ // Maandstatistieken volgen de kalendermaand van de plaatsingsdatum. // Bij een overgangsweek (bv. 31/08–06/09) blijft 31/08 dus augustus; // september wordt als maand getoond vanaf de week die in september start. const monthStart=startOfMonth(currentMonday),monthEnd=nextMonth(currentMonday); const doctors=\["KD","GVT","AV","JE","LC","Andere"\]; /\* Eén bron voor ALLE statistieken: alleen echte plaatsingen, geteld op plaatsingsdatum. Zo kunnen weektabel, per toestel en per arts nooit verschillende logica gebruiken. \*/ const realAppointments=appointments.filter(a=&gt;!isSpecial(a.device)); const slice=(start,end)=&gt;realAppointments.filter(a=&gt;inRange(a.date,start,end)); const weekApps=slice(weekStart,weekEnd), monthApps=slice(monthStart,monthEnd); const catCount=(arr,cat)=&gt;arr.filter(a=&gt;statCat(a)===cat).length; const docCount=(arr,doc)=&gt;arr.filter(a=&gt;a.doctor===doc).length; let t='&lt;tr&gt;&lt;th style="text-align:left;padding:6px;border-bottom:1px solid #ddd"&gt;Categorie&lt;/th&gt;&lt;th style="padding:6px;border-bottom:1px solid #ddd"&gt;Week&lt;/th&gt;&lt;th style="padding:6px;border-bottom:1px solid #ddd"&gt;Maand&lt;/th&gt;&lt;/tr&gt;'; const groups=\[\["BDM","BD"\],\["1-dags Holters (HO + HN1)","ONE"\],\["Meerdaagse Holters (HN2–HN7)","MULTI"\]\]; for(const \[label,cat\] of groups){ t+=`&lt;tr&gt;&lt;td style="padding:7px;border-bottom:1px solid #eee;font-weight:700"&gt;${label}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${catCount(weekApps,cat)}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${catCount(monthApps,cat)}&lt;/td&gt;&lt;/tr&gt;`; } const weekTotal=weekApps.length, monthTotal=monthApps.length; t+=`&lt;tr style="font-weight:700;background:#eef6ff"&gt;&lt;td style="padding:7px"&gt;Totaal&lt;/td&gt;&lt;td style="text-align:center"&gt;${weekTotal}&lt;/td&gt;&lt;td style="text-align:center"&gt;${monthTotal}&lt;/td&gt;&lt;/tr&gt;`; document.getElementById("deviceTotals").innerHTML=t; document.getElementById("printPeriod").textContent=`Week: ${fd(weekStart)} – ${fd(new Date(weekEnd.getTime()-86400000))} · Maand: ${monthStart.toLocaleDateString("nl-BE",{month:"long",year:"numeric"})}`; let d='&lt;tr&gt;&lt;th style="text-align:left;padding:6px;border-bottom:1px solid #ddd"&gt;Arts&lt;/th&gt;&lt;th style="padding:6px;border-bottom:1px solid #ddd"&gt;Week&lt;/th&gt;&lt;th style="padding:6px;border-bottom:1px solid #ddd"&gt;Maand&lt;/th&gt;&lt;/tr&gt;'; for(const doc of doctors){ d+=`&lt;tr&gt;&lt;td style="padding:6px;border-bottom:1px solid #eee"&gt;${doc}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${docCount(weekApps,doc)}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${docCount(monthApps,doc)}&lt;/td&gt;&lt;/tr&gt;`; } d+=`&lt;tr style="font-weight:700;background:#eef6ff"&gt;&lt;td style="padding:7px"&gt;Totaal&lt;/td&gt;&lt;td style="text-align:center"&gt;${weekTotal}&lt;/td&gt;&lt;td style="text-align:center"&gt;${monthTotal}&lt;/td&gt;&lt;/tr&gt;`; document.getElementById("doctorTotals").innerHTML=d; document.getElementById("doctorDeviceWeek").innerHTML=renderDoctorDeviceTable(weekStart,weekEnd); document.getElementById("doctorDeviceMonth").innerHTML=renderDoctorDeviceTable(monthStart,monthEnd); const analyzers=\["KD","GVT","AV","JE","LC","Papa Denef","Andere"\]; let an='&lt;tr&gt;&lt;th style="text-align:left;padding:7px;border-bottom:1px solid #ddd"&gt;Geanalyseerd door&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;HO&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;HN&lt;/th&gt;&lt;th style="padding:7px;border-bottom:1px solid #ddd"&gt;Totaal analyses&lt;/th&gt;&lt;/tr&gt;'; let totalHO=0,totalHN=0; for(const who of analyzers){ const ho=monthApps.filter(a=&gt;a.analyzedBy===who &amp;&amp; statCat(a)==="ONE").length; const hn=monthApps.filter(a=&gt;a.analyzedBy===who &amp;&amp; statCat(a)==="MULTI").length; if(ho+hn&gt;0){ an+=`&lt;tr&gt;&lt;td style="padding:7px;border-bottom:1px solid #eee;font-weight:700"&gt;${who}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${ho}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee"&gt;${hn}&lt;/td&gt;&lt;td style="text-align:center;border-bottom:1px solid #eee;font-weight:700"&gt;${ho+hn}&lt;/td&gt;&lt;/tr&gt;`; } totalHO+=ho;totalHN+=hn; } const open=monthApps.filter(a=&gt;a.device!=="BD" &amp;&amp; !a.analyzedBy).length; an+=`&lt;tr style="font-weight:700;background:#eef6ff"&gt;&lt;td style="padding:7px"&gt;Totaal geanalyseerd&lt;/td&gt;&lt;td style="text-align:center"&gt;${totalHO}&lt;/td&gt;&lt;td style="text-align:center"&gt;${totalHN}&lt;/td&gt;&lt;td style="text-align:center"&gt;${totalHO+totalHN}&lt;/td&gt;&lt;/tr&gt;`; an+=`&lt;tr&gt;&lt;td style="padding:7px"&gt;&lt;b&gt;Nog open&lt;/b&gt;&lt;/td&gt;&lt;td colspan="3" style="text-align:center"&gt;&lt;b&gt;${open}&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;`; document.getElementById("analysisMonth").innerHTML=an; } function saveAll(){localStorage.setItem(KEY,JSON.stringify(appointments))} document.getElementById("printTotals").onclick=()=&gt;{renderTotals();window.print()}; document.getElementById("toggleTotals").onclick=()=&gt;{ const p=document.getElementById("totalsPanel"); p.style.display=p.style.display==="none"?"block":"none"; document.getElementById("toggleTotals").textContent=p.style.display==="none"?"Toon totalen voor Koen":"Verberg totalen"; renderTotals() }; document.getElementById("prev").onclick=()=&gt;{currentMonday.setDate(currentMonday.getDate()-7);render()}; document.getElementById("next").onclick=()=&gt;{currentMonday.setDate(currentMonday.getDate()+7);render()}; document.getElementById("today").onclick=()=&gt;{currentMonday=getMonday(new Date());render()}; render(); &lt;/script&gt;&lt;/body&gt;&lt;/html&gt;

   [ ![Denef Cardio](https://cdn.surfking.app/cardio-denef/79bb5253-9317-4842-a44e-1adf1e241824/Symphonie-(6).png)](/nl) 

Contact
-------

  Adres  Justus Lipsiusstraat 12, 3000 Leuven  

 Telefoon [ 016/22.61.62 ](tel:016226162) 

 - [ Home ](/nl)
- [ Wie zijn wij ](/nl/wie-zijn-wij)
- [ Cardiologisch onderzoek ](/nl/cardiologisch-onderzoek)
- [ Informatie voor patiënten ](/nl/informatie-voor-patienten)
- [ Praktische info ](/nl/praktische-info)
- [ Contact ](/nl/contact)

© 2026 Denef Cardio

 Gemaakt met ❤️ door [ Surf King ](https://surfking.be?ref=denefcardio.be)

 [Cookie-instellingen](#)
