Upload index.html
Browse files- 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+(
|
| 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=[['
|
| 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',[
|
| 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(
|
| 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 |
-
|
|
|
|
| 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 |
-
|
| 1210 |
-
nextLog('
|
|
|
|
| 1211 |
nextAgentState('verify','active','Onafhankelijke tweede telroute loopt');nextRoutesActive([['analysis','verify']]);
|
|
|
|
| 1212 |
result.verification=independentlyVerify(result);importedData.last=result;
|
| 1213 |
-
|
|
|
|
| 1214 |
resetControllerComparison(true);updateControllerContext();
|
|
|
|
| 1215 |
renderImported(result);
|
| 1216 |
-
|
|
|
|
| 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(
|
| 1219 |
$('conductor').classList.add('attention');$('conductorStatus').textContent='Verwerking afgerond';
|
| 1220 |
$('flowState').textContent='Concept beschikbaar · NIET EXTERN GEVALIDEERD';$('logStatus').textContent='Afgerond';
|
| 1221 |
-
log(`KPI-berekening,
|
| 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 |
}
|