Marcel0123 commited on
Commit
29f66fc
·
verified ·
1 Parent(s): 57c2662

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +21 -11
index.html CHANGED
@@ -829,7 +829,7 @@ function drawImportedChart(result){
829
  loc.visits.forEach((v,j)=>{const x=72+(loc.visits.length===1?0:j*(w-105)/(loc.visits.length-1)),y=205-(v/max)*180;j===0?ctx.moveTo(x,y):ctx.lineTo(x,y)});ctx.stroke();
830
  loc.visits.forEach((v,j)=>{const x=72+(loc.visits.length===1?0:j*(w-105)/(loc.visits.length-1)),y=205-(v/max)*180;ctx.fillStyle=colors[li];ctx.beginPath();ctx.arc(x,y,4,0,Math.PI*2);ctx.fill()});
831
  });ctx.fillStyle='#a6b9d0';ctx.textAlign='center';
832
- result.months.forEach((m,i)=>ctx.fillText(m,72+(3===1?0:i*(w-105)/2),239));
833
  const legend=document.querySelector('.legend');
834
  legend.innerHTML=series.map((loc,i)=>`<span><i style="background:${colors[i]}"></i> ${escapeHTML(loc.name)}</span>`).join('');
835
  document.querySelector('.chart-panel .subtle').textContent=result.months.join(' · ')+(result.locations.length>4?' · 4 van '+result.locations.length+' locaties':'');
@@ -1156,8 +1156,9 @@ controllerDefs.forEach(([,id])=>$(id).addEventListener('input',()=>{if(controlle
1156
 
1157
  // ORCHESTRA NEXT — echte statusovergangen gekoppeld aan bestaande berekeningen.
1158
  // Geen nieuwe externe AI-call en geen wijziging aan XLSX-, KPI- of rapportagerekenregels.
1159
- const nextRoutes=[['conductor','data'],['data','identity'],['data','history'],['identity','analysis'],['history','analysis'],['analysis','insight'],['analysis','verify'],['insight','report'],['verify','report'],['privacy','quality'],['report','quality'],['verify','analysis'],['identity','history'],['conductor','privacy']];
1160
  const nextAgents={data:'Bronregels beschikbaar',identity:'Pas- en cliëntkoppelingen',history:'Historische referentie',analysis:'KPI-berekeningen',insight:'Trendgegevens',verify:'Interne onafhankelijke telling',privacy:'Lokale browserroute',report:'Dashboard en rapportage',quality:'Status en kwaliteitsmelding'};
 
1161
  let nextActiveRoutes=[],nextGraphReady=false;
1162
  function nextEl(id){return id==='conductor'?$('conductor'):$('agent-'+id)}
1163
  function nextGraph(){
@@ -1195,30 +1196,39 @@ async function nextStartImported(){
1195
  document.querySelector('.orchestra').classList.add('running');$('conductorStatus').textContent='Verwerkingsstappen en overdrachten';$('logStatus').textContent='Actief';
1196
  for(const id of ids){nextAgentState(id,'standby');const e=$('agent-'+id);e.classList.remove('has-steps');e.querySelector('.agent-steps').replaceChildren()}
1197
  $('completed').textContent='0';nextGraph();
 
1198
  const t0=performance.now();
 
1199
  try{
1200
- nextLog('data',`${importedData.all.length.toLocaleString('nl-NL')} bruikbare scans eerder lokaal ingelezen`,'done',[['conductor','data']]);await sleep(180);
1201
  // Privacy-agent beschrijft alleen de feitelijke implementatieroute; geen juridische certificering.
1202
- nextLog('privacy','Rekenwerk in deze browser; geen AI-API. Privacytoetsing blijft organisatieverantwoordelijkheid.','done',[['conductor','privacy']]);await sleep(180);
1203
  nextAgentState('identity','active','Koppelingen worden in bestaande telroute toegepast');nextRoutesActive([['data','identity']]);
1204
  // Zelfde oorspronkelijke rekenfunctie: 2025-historie, pasregels, datums en KPI-definities blijven ongewijzigd.
 
1205
  const result=calculateImported($('siteSelect').value);
1206
- nextLog('identity',`${result.multiPassClients} cliënten met meerdere passen gesignaleerd`,'done',[['data','identity'],['identity','history']]);await sleep(180);
 
1207
  if(result.historyLoaded)nextLog('history',`${result.correctedExisting} eerdere cliënten vanuit 2025 herkend`,'done',[['data','history'],['history','analysis']]);
1208
  else nextLog('history','Geen 2025-referentie: instroom voorlopig','warning',[['data','history']]);
1209
- nextLog('analysis',`${result.visits.toLocaleString('nl-NL')} unieke bezoekdagen en ${result.newIntake} nieuwe instromers berekend`,'done',[['identity','analysis'],['history','analysis']]);await sleep(180);
1210
- nextLog('insight',`${result.months.length} maandperioden beschikbaar; geen automatisch gegenereerde AI-duiding`,'done',[['analysis','insight']]);await sleep(180);
 
1211
  nextAgentState('verify','active','Onafhankelijke tweede telroute loopt');nextRoutesActive([['analysis','verify']]);
 
1212
  result.verification=independentlyVerify(result);importedData.last=result;
1213
- nextLog('verify',`${result.verification.checks.length} interne controles; ${result.verification.mismatches} telverschillen`,result.verification.mismatches?'warning':'done',[['analysis','verify'],['verify','analysis']]);await sleep(180);
 
1214
  resetControllerComparison(true);updateControllerContext();
 
1215
  renderImported(result);
1216
- nextLog('report','Bestaand dashboard en rapportagepreview bijgewerkt','done',[['verify','report'],['insight','report']]);await sleep(180);
 
1217
  const concern=result.verification.mismatches>0||!result.historyLoaded;
1218
- nextLog('quality',concern?'Concept: controle of historische referentie vraagt aandacht':'Intern gecontroleerd; niet extern gevalideerd',concern?'warning':'done',[['report','quality'],['privacy','quality']]);await sleep(180);
1219
  $('conductor').classList.add('attention');$('conductorStatus').textContent='Verwerking afgerond';
1220
  $('flowState').textContent='Concept beschikbaar · NIET EXTERN GEVALIDEERD';$('logStatus').textContent='Afgerond';
1221
- log(`KPI-berekening, interne verificatie en dashboardrendering: ${((performance.now()-t0)/1000).toFixed(2)} sec (exclusief XLSX-import)`);
1222
  }catch(err){log('FOUT: '+err.message);$('flowState').textContent='Verwerking mislukt';$('conductorStatus').textContent='Procesfout'}
1223
  finally{nextRoutesActive([]);running=false;$('startBtn').disabled=false;$('resetBtn').disabled=false;$('conductor').classList.remove('running');document.querySelector('.orchestra').classList.remove('running')}
1224
  }
 
829
  loc.visits.forEach((v,j)=>{const x=72+(loc.visits.length===1?0:j*(w-105)/(loc.visits.length-1)),y=205-(v/max)*180;j===0?ctx.moveTo(x,y):ctx.lineTo(x,y)});ctx.stroke();
830
  loc.visits.forEach((v,j)=>{const x=72+(loc.visits.length===1?0:j*(w-105)/(loc.visits.length-1)),y=205-(v/max)*180;ctx.fillStyle=colors[li];ctx.beginPath();ctx.arc(x,y,4,0,Math.PI*2);ctx.fill()});
831
  });ctx.fillStyle='#a6b9d0';ctx.textAlign='center';
832
+ result.months.forEach((m,i)=>ctx.fillText(m,72+(result.months.length===1?0:i*(w-105)/(result.months.length-1)),239));
833
  const legend=document.querySelector('.legend');
834
  legend.innerHTML=series.map((loc,i)=>`<span><i style="background:${colors[i]}"></i> ${escapeHTML(loc.name)}</span>`).join('');
835
  document.querySelector('.chart-panel .subtle').textContent=result.months.join(' · ')+(result.locations.length>4?' · 4 van '+result.locations.length+' locaties':'');
 
1156
 
1157
  // ORCHESTRA NEXT — echte statusovergangen gekoppeld aan bestaande berekeningen.
1158
  // Geen nieuwe externe AI-call en geen wijziging aan XLSX-, KPI- of rapportagerekenregels.
1159
+ const nextRoutes=[['data','identity'],['data','history'],['identity','analysis'],['history','analysis'],['analysis','insight'],['analysis','verify'],['insight','report'],['verify','report'],['privacy','quality'],['report','quality'],['verify','analysis'],['identity','history'],['conductor','privacy']];
1160
  const nextAgents={data:'Bronregels beschikbaar',identity:'Pas- en cliëntkoppelingen',history:'Historische referentie',analysis:'KPI-berekeningen',insight:'Trendgegevens',verify:'Interne onafhankelijke telling',privacy:'Lokale browserroute',report:'Dashboard en rapportage',quality:'Status en kwaliteitsmelding'};
1161
+ function nextWorkflowDelay(){return $('paceSelect').value==='fast'?650:3300;}
1162
  let nextActiveRoutes=[],nextGraphReady=false;
1163
  function nextEl(id){return id==='conductor'?$('conductor'):$('agent-'+id)}
1164
  function nextGraph(){
 
1196
  document.querySelector('.orchestra').classList.add('running');$('conductorStatus').textContent='Verwerkingsstappen en overdrachten';$('logStatus').textContent='Actief';
1197
  for(const id of ids){nextAgentState(id,'standby');const e=$('agent-'+id);e.classList.remove('has-steps');e.querySelector('.agent-steps').replaceChildren()}
1198
  $('completed').textContent='0';nextGraph();
1199
+ const modeDelay=nextWorkflowDelay();
1200
  const t0=performance.now();
1201
+ let calculationMs=0; // Houd echte verwerkingstijd gescheiden van de gekozen presentatieduur.
1202
  try{
1203
+ nextLog('data',`${importedData.all.length.toLocaleString('nl-NL')} bruikbare scans eerder lokaal ingelezen`,'done',[]);await sleep(modeDelay);
1204
  // Privacy-agent beschrijft alleen de feitelijke implementatieroute; geen juridische certificering.
1205
+ nextLog('privacy','Rekenwerk in deze browser; geen AI-API. Privacytoetsing blijft organisatieverantwoordelijkheid.','done',[['conductor','privacy']]);await sleep(modeDelay);
1206
  nextAgentState('identity','active','Koppelingen worden in bestaande telroute toegepast');nextRoutesActive([['data','identity']]);
1207
  // Zelfde oorspronkelijke rekenfunctie: 2025-historie, pasregels, datums en KPI-definities blijven ongewijzigd.
1208
+ const calcStart=performance.now();
1209
  const result=calculateImported($('siteSelect').value);
1210
+ calculationMs+=performance.now()-calcStart;
1211
+ nextLog('identity',`${result.multiPassClients} cliënten met meerdere passen gesignaleerd`,'done',[['data','identity'],['identity','history']]);await sleep(modeDelay);
1212
  if(result.historyLoaded)nextLog('history',`${result.correctedExisting} eerdere cliënten vanuit 2025 herkend`,'done',[['data','history'],['history','analysis']]);
1213
  else nextLog('history','Geen 2025-referentie: instroom voorlopig','warning',[['data','history']]);
1214
+ await sleep(modeDelay);
1215
+ nextLog('analysis',`${result.visits.toLocaleString('nl-NL')} unieke bezoekdagen en ${result.newIntake} nieuwe instromers berekend`,'done',[['identity','analysis'],['history','analysis']]);await sleep(modeDelay);
1216
+ nextLog('insight',`${result.months.length} maandperioden beschikbaar; geen automatisch gegenereerde AI-duiding`,'done',[['analysis','insight']]);await sleep(modeDelay);
1217
  nextAgentState('verify','active','Onafhankelijke tweede telroute loopt');nextRoutesActive([['analysis','verify']]);
1218
+ const verifyStart=performance.now();
1219
  result.verification=independentlyVerify(result);importedData.last=result;
1220
+ calculationMs+=performance.now()-verifyStart;
1221
+ nextLog('verify',`${result.verification.checks.length} interne controles; ${result.verification.mismatches} telverschillen`,result.verification.mismatches?'warning':'done',[['analysis','verify'],['verify','analysis']]);await sleep(modeDelay);
1222
  resetControllerComparison(true);updateControllerContext();
1223
+ const renderStart=performance.now();
1224
  renderImported(result);
1225
+ calculationMs+=performance.now()-renderStart;
1226
+ nextLog('report','Bestaand dashboard en rapportagepreview bijgewerkt','done',[['verify','report'],['insight','report']]);await sleep(modeDelay);
1227
  const concern=result.verification.mismatches>0||!result.historyLoaded;
1228
+ nextLog('quality',concern?'Concept: controle of historische referentie vraagt aandacht':'Intern gecontroleerd; niet extern gevalideerd',concern?'warning':'done',[['report','quality'],['privacy','quality']]);await sleep(modeDelay);
1229
  $('conductor').classList.add('attention');$('conductorStatus').textContent='Verwerking afgerond';
1230
  $('flowState').textContent='Concept beschikbaar · NIET EXTERN GEVALIDEERD';$('logStatus').textContent='Afgerond';
1231
+ log(`Echte KPI-berekening, verificatie en dashboardopbouw: ${(calculationMs/1000).toFixed(2)} sec. Totale workflowweergave: ${((performance.now()-t0)/1000).toFixed(1)} sec (exclusief XLSX-import).`);
1232
  }catch(err){log('FOUT: '+err.message);$('flowState').textContent='Verwerking mislukt';$('conductorStatus').textContent='Procesfout'}
1233
  finally{nextRoutesActive([]);running=false;$('startBtn').disabled=false;$('resetBtn').disabled=false;$('conductor').classList.remove('running');document.querySelector('.orchestra').classList.remove('running')}
1234
  }