DatastratègeDatastratège Studio
Datastratège Studio · mégamodule de rapports

Atelier des rapports · Avni Nou

📊 ObservatoireMon espace
Nouveau commentaire
—
Datastratège · Datastratège Studio
','application/msword'); else if(x==='html')telecharger(nomFichier('html'),''+esc(CUR.titre)+''+docHtml()+'','text/html'); else{const t=[...document.querySelectorAll('#corps .sec')].map(s=>'## '+s.querySelector('h2').textContent.trim()+'\n\n'+[...s.querySelector('.txt').querySelectorAll('p,h3,li,blockquote,tr')].map(e=>e.tagName==='H3'?'### '+e.innerText:e.tagName==='LI'?'- '+e.innerText:e.tagName==='BLOCKQUOTE'?'> '+e.innerText:e.tagName==='TR'?'| '+[...e.children].map(c=>c.innerText.trim()).join(' | ')+' |':e.innerText).join('\n\n')).join('\n\n');telecharger(nomFichier('md'),'# '+CUR.titre+'\n\n*Datastratège · Datastratège Studio — Évaluation finale Avni Nou — '+CUR.version+'*\n\n'+t,'text/markdown')}}); /* ---------------- structure du document (PAR-877) ---------------- */ const MOTSV=new Set('les des une dans pour avec sur par que qui est sont aux du de la le et en au ou plus pas ces cette leur leurs ont été être sera ainsi entre comme dont mais elle ils elles nous vous son ses sa tout tous toutes très peut doit fait faire selon chaque autres autre afin lors sous vers chez aussi même deux trois'.split(' ')); function sections(){return [...document.querySelectorAll('#corps .sec')]} function motsDe(t){return (t.match(/[\p{L}\p{N}’'-]+/gu)||[]).length} let STT=null;function structure(){clearTimeout(STT);STT=setTimeout(structureMaint,250)} function structureMaint(){const S=sections();if(!S.length)return;const num=$('st-num').checked;$('corps').classList.toggle('num',num); let c1=0,c2=0;const lignes=S.map((s,i)=>{const h=s.querySelector('h2'),n=+h.dataset.n||1;if(n===1){c1++;c2=0}else c2++;const w=motsDe(s.innerText);return{s,i,n,no:num?(n===1?c1+'.':c1+'.'+c2):'',t:h.textContent.trim(),w}}); const tot=lignes.reduce((a,b)=>a+b.w,0),max=Math.max(...lignes.map(l=>l.w),1),H=$('corps').offsetHeight,P=1060,pages=Math.max(1,Math.ceil(H/P)); const tab=S.reduce((a,s)=>a+s.querySelectorAll('table').length,0),fig=S.reduce((a,s)=>a+s.querySelectorAll('canvas,img').length,0),viv=document.querySelectorAll('#corps .bloc[data-b]').length,fig2=document.querySelectorAll('#corps .fige').length,cit=document.querySelectorAll('#corps blockquote').length; $('st-stats').innerHTML=`${tot.toLocaleString('fr-CA')} mots · ${($('corps').innerText.length).toLocaleString('fr-CA')} caractères
≈ ${pages} pages A4 (+ couverture${$('st-som').checked?' et sommaire':''}) · lecture ≈ ${Math.max(1,Math.round(tot/230))} min
${S.length} sections · ${tab} tableaux · ${fig} figures · ${cit} citations
${viv} blocs vivants · ${fig2} blocs figés`; $('st-toc').innerHTML=lignes.map(l=>`
${l.no}${esc(l.t)}${l.w}
`).join(''); $('st-toc').querySelectorAll('[data-i]').forEach(d=>d.onclick=()=>S[+d.dataset.i].scrollIntoView({behavior:'smooth'})); const idx={};lignes.forEach(l=>{(l.s.innerText.toLowerCase().match(/[\p{L}’'-]{5,}/gu)||[]).forEach(m=>{m=m.replace(/^[’'-]+|[’'-]+$/g,'');if(MOTSV.has(m))return;(idx[m]=idx[m]||{n:0,sec:new Set()}).n++;idx[m].sec.add(l.no||String(l.i+1))})}); const top=Object.entries(idx).filter(e=>e[1].n>=3).sort((a,b)=>b[1].n-a[1].n).slice(0,80).sort((a,b)=>a[0].localeCompare(b[0],'fr')); $('st-idx').innerHTML=top.map(([m,o])=>`${esc(m)} ${[...o.sec].slice(0,6).join(', ')}${o.sec.size>6?'…':''}`).join(' · '); $('st-idx').querySelectorAll('[data-m]').forEach(x=>x.onclick=()=>{const m=x.dataset.m;const s=S.find(z=>z.innerText.toLowerCase().includes(m));if(s){s.scrollIntoView({behavior:'smooth'});s.style.outline='2px solid #F2C27A';setTimeout(()=>s.style.outline='',1500)}}); let nt=0,nf=0;const TF=[];lignes.forEach(l=>{l.s.querySelectorAll('table,canvas,img,.bloc[data-b]').forEach(e=>{const est=e.tagName==='TABLE';if(e.closest('.bloc[data-b]')&&e.tagName!=='DIV')return;const lab=(e.previousElementSibling&&/H3|P/.test(e.previousElementSibling.tagName)?e.previousElementSibling.textContent:(e.dataset&&e.dataset.b&&BLOCS[e.dataset.b]?BLOCS[e.dataset.b][0]:l.t)).trim().slice(0,70);TF.push({e,k:est?'Tableau '+(++nt):'Figure '+(++nf),lab,sec:l.no||String(l.i+1)})})}); $('st-tf').innerHTML=TF.length?TF.map((x,i)=>`
${x.k} · ${esc(x.lab)} §${x.sec}
`).join(''):'Aucun tableau ni figure.';$('st-tf').querySelectorAll('[data-tf]').forEach(d=>d.onclick=()=>TF[+d.dataset.tf].e.scrollIntoView({behavior:'smooth',block:'center'})); const SG={};lignes.forEach(l=>{(l.s.innerText.match(/\b[A-ZÉÈ][A-ZÉÈ0-9@&]{1,7}\b/g)||[]).forEach(m=>{if(/^\d/.test(m))return;(SG[m]=SG[m]||{n:0,sec:new Set()}).n++;SG[m].sec.add(l.no||String(l.i+1))})}); const sg=Object.entries(SG).filter(e=>e[1].n>=2).sort((a,b)=>a[0].localeCompare(b[0]));$('st-sig').innerHTML=sg.length?sg.map(([m,o])=>`${esc(m)} ×${o.n} ${[...o.sec].slice(0,5).join(', ')}`).join(' · ')+'
Les définitions se saisissent dans une section « Glossaire » : elles seront reprises ici.':'Aucun sigle détecté.'; document.querySelectorAll('#corps .repere-page').forEach(r=>r.remove());if($('st-pages').checked){for(let k=1;kpage '+(k+1)+'';$('corps').appendChild(r)}} let som=document.querySelector('#doc .sommaire');if($('st-som').checked){if(!som){som=document.createElement('div');som.className='page sommaire';$('corps').before(som)}som.innerHTML='

Sommaire

'+lignes.map(l=>`
${l.no} ${esc(l.t)}${Math.floor(l.s.offsetTop/P)+1}
`).join('');som.querySelectorAll('[data-i]').forEach(d=>d.onclick=()=>S[+d.dataset.i].scrollIntoView({behavior:'smooth'}))}else if(som)som.remove(); $('main-planche')&&0;document.querySelector('main').classList.toggle('planche',$('st-planche').checked); const mc=$('minicarte');mc.innerHTML=lignes.map(l=>`
`).join('')+'
';window._L=lignes;window._P=P;window._TOT=tot;window._PAGES=pages;position()} function position(){const m=document.querySelector('main'),c=$('corps');if(!c||!window._L)return;const y=m.scrollTop-c.offsetTop+120,H=c.offsetHeight;const L=window._L;let cur=L[0];L.forEach(l=>{if(l.s.offsetTop<=y)cur=l}); const pg=Math.min(window._PAGES,Math.max(1,Math.floor(Math.max(0,y)/window._P)+1));$('etat').textContent=`§ ${cur.no||cur.i+1} ${cur.t.slice(0,48)}${cur.t.length>48?'…':''} · section ${cur.i+1}/${L.length} · page ≈ ${pg}/${window._PAGES} · ${window._TOT.toLocaleString('fr-CA')} mots · ${Math.round(Math.min(100,Math.max(0,y/H*100)))} %`; const vu=$('mc-vu');if(vu){vu.style.top=Math.max(0,(m.scrollTop-c.offsetTop)/H*100)+'%';vu.style.height=Math.min(100,m.clientHeight/H*100)+'%'}} document.querySelector('main').addEventListener('scroll',position);$('minicarte').onclick=e=>{const r=$('minicarte').getBoundingClientRect(),f=(e.clientY-r.top)/r.height;document.querySelector('main').scrollTo({top:$('corps').offsetTop+f*$('corps').offsetHeight-80,behavior:'smooth'})}; ['st-num','st-pages','st-som','st-planche'].forEach(i=>$(i).onchange=structureMaint);document.addEventListener('input',e=>{if(e.target.closest&&e.target.closest('#corps'))structure()}); /* ---------------- PAR-884 · affichage, révision, commentaires, historique, résumé exécutif ---------------- */ const MOI=(()=>{try{const t=jeton().split('.')[1].replace(/-/g,'+').replace(/_/g,'/');return (JSON.parse(decodeURIComponent(escape(atob(t)))).email||'').toLowerCase()}catch(e){return ''}})();const QUI=MOI.split('@')[0]||'moi'; function vue(k){const c=document.querySelector('.corps');if(k==='g')c.classList.toggle('sans-g');if(k==='d')c.classList.toggle('sans-d');if(k==='f'){const on=!document.body.classList.contains('focus');document.body.classList.toggle('focus',on);try{on?document.documentElement.requestFullscreen&&document.documentElement.requestFullscreen():document.fullscreenElement&&document.exitFullscreen()}catch(e){}} $('v-g').classList.toggle('on',c.classList.contains('sans-g'));$('v-d').classList.toggle('on',c.classList.contains('sans-d'));try{localStorage.setItem('atelier-vue',JSON.stringify({g:c.classList.contains('sans-g'),d:c.classList.contains('sans-d')}))}catch(e){}setTimeout(()=>{try{structureMaint()}catch(e){}},300)} $('v-g').onclick=()=>vue('g');$('v-d').onclick=()=>vue('d');$('v-f').onclick=()=>vue('f');$('sortie-focus').onclick=()=>vue('f'); document.addEventListener('keydown',e=>{if(e.altKey&&e.key==='1'){e.preventDefault();vue('g')}if(e.altKey&&e.key==='2'){e.preventDefault();vue('d')}if(e.altKey&&e.key==='3'){e.preventDefault();vue('f')}if(e.key==='Escape'&&document.body.classList.contains('focus'))vue('f')}); document.addEventListener('fullscreenchange',()=>{if(!document.fullscreenElement&&document.body.classList.contains('focus'))document.body.classList.remove('focus')}); try{const v=JSON.parse(localStorage.getItem('atelier-vue')||'{}');if(v.g)document.querySelector('.corps').classList.add('sans-g');if(v.d)document.querySelector('.corps').classList.add('sans-d');$('v-g').classList.toggle('on',!!v.g);$('v-d').classList.toggle('on',!!v.d)}catch(e){} /* -- suggestions (suivi des modifications) -- */ let SUG=false;const hor=()=>new Date().toISOString(); function modeSug(on){SUG=on;$('m-edit').classList.toggle('on',!on);$('m-sug').classList.toggle('on',on);toast(on?'Mode Suggérer : vos modifications seront proposées':'Mode Éditer')} $('m-edit').onclick=()=>modeSug(false);$('m-sug').onclick=()=>modeSug(true); function nouv(tag){const e=document.createElement(tag);e.className='sug';e.dataset.auteur=QUI;e.dataset.le=hor();e.title=(tag==='ins'?'Ajout':'Suppression')+' proposé par '+QUI;return e} document.addEventListener('beforeinput',e=>{if(!SUG||!EDIT)return;const z=e.target.closest&&e.target.closest('#corps [contenteditable="true"]');if(!z)return;const sel=getSelection();if(!sel.rangeCount)return;const t=e.inputType; if(t==='insertText'||t==='insertFromPaste'||t==='insertReplacementText'){const txt=e.data??(e.dataTransfer&&e.dataTransfer.getData('text/plain'))??'';if(!txt)return;e.preventDefault();let r=sel.getRangeAt(0); if(!r.collapsed){const d=nouv('del');try{d.appendChild(r.extractContents());r.insertNode(d);r=document.createRange();r.setStartAfter(d);r.collapse(true)}catch(x){}} const anc=r.startContainer.nodeType===3?r.startContainer.parentNode:r.startContainer;const own=anc.closest&&anc.closest('ins.sug'); if(own&&own.dataset.auteur===QUI){r.insertNode(document.createTextNode(txt));r.collapse(false)}else{const i=nouv('ins');i.textContent=txt;r.insertNode(i);r=document.createRange();r.selectNodeContents(i);r.collapse(false)} sel.removeAllRanges();sel.addRange(r);sale();majSug();return} if(t==='deleteContentBackward'||t==='deleteContentForward'||t==='deleteByCut'){e.preventDefault();if(sel.isCollapsed&&sel.modify)sel.modify('extend',t==='deleteContentForward'?'forward':'backward','character');const r=sel.getRangeAt(0);if(r.collapsed)return; const anc=r.commonAncestorContainer.nodeType===3?r.commonAncestorContainer.parentNode:r.commonAncestorContainer;const own=anc.closest&&anc.closest('ins.sug'); if(own&&own.dataset.auteur===QUI){r.deleteContents();if(!own.textContent)own.remove()}else{const d=nouv('del');d.appendChild(r.extractContents());r.insertNode(d);const r2=document.createRange();if(t==='deleteContentForward')r2.setStartAfter(d);else r2.setStartBefore(d);r2.collapse(true);sel.removeAllRanges();sel.addRange(r2)} sale();majSug();return} if(t==='insertParagraph'||t==='insertLineBreak')return}); function majSug(){const L=[...document.querySelectorAll('#corps ins.sug,#corps del.sug')];$('sug-n').textContent=L.length?'('+L.length+')':'';$('rev-n').style.display=L.length+COMS.filter(c=>!c.resolu&&!c.parent_id).length?'inline-block':'none';$('rev-n').textContent=L.length+COMS.filter(c=>!c.resolu&&!c.parent_id).length; $('sug-l').innerHTML=L.length?L.map((x,i)=>`
${x.tagName==='INS'?'+':'−'} «${esc(x.textContent.slice(0,70))}» ${esc(x.dataset.auteur||'')} · ${esc((x.dataset.le||'').slice(0,16).replace('T',' '))}${EDIT?``:''}
`).join(''):'Aucune suggestion.'; $('sug-l').querySelectorAll('[data-sa]').forEach(b=>b.onclick=()=>{trancher(L[+b.dataset.sa],true)});$('sug-l').querySelectorAll('[data-sr]').forEach(b=>b.onclick=()=>{trancher(L[+b.dataset.sr],false)}); L.forEach((x,i)=>{x.onclick=()=>{$('sug-l').querySelectorAll('.sg')[i]&&$('sug-l').querySelectorAll('.sg')[i].scrollIntoView({block:'nearest'})}})} function trancher(x,ok){if(!x)return;if((x.tagName==='INS')===ok)x.replaceWith(...x.childNodes);else x.remove();sale();majSug()} $('sug-ok').onclick=()=>{if(!EDIT)return;document.querySelectorAll('#corps ins.sug,#corps del.sug').forEach(x=>trancher(x,true));toast('Toutes les suggestions acceptées')}; $('sug-ko').onclick=()=>{if(!EDIT)return;document.querySelectorAll('#corps ins.sug,#corps del.sug').forEach(x=>trancher(x,false));toast('Toutes les suggestions refusées')}; /* -- commentaires ancrés et @mentions -- */ let COMS=[],ANN=[],CF='ouverts',SELC=null; async function chargerComs(){if(!CUR)return;try{COMS=await rpc('avni_commentaires',{p_rapport:String(CUR.id)})}catch(e){COMS=[]}marquer();rendreComs();majSug()} function demarquer(){document.querySelectorAll('#corps mark.com').forEach(m=>m.replaceWith(...m.childNodes))} function marquer(){demarquer();COMS.filter(c=>!c.parent_id&&!c.resolu&&c.ancre).forEach(c=>{const sec=document.querySelector(`#corps .sec[data-id="${CSS.escape(c.section_id||'')}"]`)||document.getElementById('corps');if(!sec)return; const w=document.createTreeWalker(sec,NodeFilter.SHOW_TEXT);let n;while(n=w.nextNode()){const i=n.nodeValue.indexOf(c.ancre.slice(0,120));if(i>=0){const r=document.createRange();r.setStart(n,i);r.setEnd(n,Math.min(n.nodeValue.length,i+c.ancre.length));const m=document.createElement('mark');m.className='com';m.dataset.com=c.id;m.title='Commentaire de '+(c.auteur||'');try{r.surroundContents(m)}catch(x){}m.onclick=()=>{vueDroite();montrerCom(c.id)};break}}})} function vueDroite(){document.querySelector('.corps').classList.remove('sans-d');document.querySelector('[data-p="revision"]').click()} function fmtT(t){return esc(t).replace(/@([A-Za-z0-9._-]+)/g,'@$1')} function rendreComs(){const R0=COMS.filter(c=>!c.parent_id).filter(c=>CF==='tous'||(CF==='ouverts'&&!c.resolu)||(CF==='moi'&&((c.mentions||[]).includes(QUI.toLowerCase())||COMS.some(r=>r.parent_id===c.id&&(r.mentions||[]).includes(QUI.toLowerCase()))))); $('com-l').innerHTML=R0.length?R0.map(c=>`
${esc(c.auteur||'')} · ${esc(new Date(c.le).toLocaleString('fr-CA'))}${c.resolu?' · résolu':''}
${c.ancre?`
« ${esc(c.ancre.slice(0,140))} »
`:''}
${fmtT(c.texte)}
${COMS.filter(r=>r.parent_id===c.id).map(r=>`
${esc(r.auteur||'')} · ${esc(new Date(r.le).toLocaleString('fr-CA'))}
${fmtT(r.texte)}
`).join('')}
`).join(''):'

Aucun commentaire.

'; $('com-l').querySelectorAll('[data-rep]').forEach(b=>b.onclick=()=>{const box=b.closest('.cm');if(box.querySelector('textarea'))return;box.insertAdjacentHTML('beforeend','
');const ta=box.querySelector('textarea');brancherMentions(ta);ta.focus();box.querySelector('.btn.p').onclick=async()=>{if(!ta.value.trim())return;try{await rpc('avni_commenter',{p:{rapport_id:String(CUR.id),texte:ta.value,parent_id:String(b.dataset.rep)}});await chargerComs()}catch(e){toast(e.message)}}}); $('com-l').querySelectorAll('[data-res]').forEach(b=>b.onclick=async()=>{const c=COMS.find(x=>String(x.id)===b.dataset.res);try{await rpc('avni_commentaire_resoudre',{p_id:+b.dataset.res,p_resolu:!c.resolu});await chargerComs()}catch(e){toast(e.message)}}); $('com-l').querySelectorAll('.cm').forEach(d=>d.addEventListener('mouseenter',()=>{document.querySelectorAll('mark.com').forEach(m=>m.classList.toggle('sel',m.dataset.com===d.dataset.cm))}))} function montrerCom(id){CF='tous';document.querySelectorAll('[data-cf]').forEach(x=>x.classList.toggle('on',x.dataset.cf==='tous'));rendreComs();const d=document.querySelector(`.cm[data-cm="${id}"]`);if(d){d.scrollIntoView({block:'center'});d.style.outline='2px solid #F2C27A';setTimeout(()=>d.style.outline='',1500)}} document.querySelectorAll('[data-cf]').forEach(b=>b.onclick=()=>{CF=b.dataset.cf;document.querySelectorAll('[data-cf]').forEach(x=>x.classList.toggle('on',x===b));rendreComs()}); function brancherMentions(ta){const mn=$('mn');ta.addEventListener('input',()=>{const v=ta.value.slice(0,ta.selectionStart),m=v.match(/@([A-Za-z0-9._-]*)$/);if(!m){mn.style.display='none';return} const L=ANN.filter(a=>a.cle.toLowerCase().includes(m[1].toLowerCase())||a.courriel.includes(m[1].toLowerCase())).slice(0,8);if(!L.length){mn.style.display='none';return} ta.after(mn);mn.innerHTML=L.map(a=>`
@${esc(a.cle)} ${esc(a.courriel)}
`).join('');mn.style.display='block'; mn.querySelectorAll('[data-k]').forEach(d=>d.onmousedown=ev=>{ev.preventDefault();const p=ta.selectionStart,av=ta.value.slice(0,p).replace(/@([A-Za-z0-9._-]*)$/,'@'+d.dataset.k+' ');ta.value=av+ta.value.slice(p);ta.selectionStart=ta.selectionEnd=av.length;mn.style.display='none';ta.focus()})})} brancherMentions($('cp-t')); document.addEventListener('selectionchange',()=>{const s=getSelection(),b=$('btn-com');if(!s.rangeCount||s.isCollapsed||!CUR){b.style.display='none';return}const r=s.getRangeAt(0);const anc=r.commonAncestorContainer.nodeType===3?r.commonAncestorContainer.parentNode:r.commonAncestorContainer;if(!anc.closest||!anc.closest('#corps')){b.style.display='none';return} const txt=s.toString().trim();if(txt.length<2){b.style.display='none';return}const q=r.getBoundingClientRect();b.style.left=Math.min(innerWidth-130,q.right+6)+'px';b.style.top=Math.max(8,q.top-34)+'px';b.style.display='block';SELC={ancre:txt.replace(/\s+/g,' ').slice(0,400),section:(anc.closest('.sec')||{dataset:{}}).dataset.id||''}}); $('btn-com').onmousedown=e=>{e.preventDefault();if(!SELC)return;const p=$('com-pop');$('cp-q').textContent='« '+SELC.ancre.slice(0,120)+' »';p.style.left=Math.min(innerWidth-340,parseInt($('btn-com').style.left))+'px';p.style.top=(parseInt($('btn-com').style.top)+36)+'px';p.style.display='block';$('btn-com').style.display='none';$('cp-t').value='';setTimeout(()=>$('cp-t').focus(),30)}; $('cp-x').onclick=()=>{$('com-pop').style.display='none';$('mn').style.display='none'}; $('cp-ok').onclick=async()=>{const t=$('cp-t').value.trim();if(!t||!SELC)return;try{await rpc('avni_commenter',{p:{rapport_id:String(CUR.id),section_id:SELC.section,ancre:SELC.ancre,texte:t}});$('com-pop').style.display='none';await chargerComs();vueDroite();toast('Commentaire publié')}catch(e){toast(e.message)}}; /* -- historique et restauration -- */ async function chargerHist(){if(!CUR)return;try{const H=await rpc('avni_rapport_historique',{p_rapport:String(CUR.id)});$('hist-l').innerHTML=H.length?H.map(h=>`
${esc(new Date(h.le).toLocaleString('fr-CA'))}
${esc(h.par||'')} · v${esc(h.version||'')} · ${h.sections} sections · ${Math.round(h.taille/1024)} Ko
${EDIT?``:''}
`).join(''):'Aucun instantané pour l’instant.'; $('hist-l').querySelectorAll('[data-hr]').forEach(b=>b.onclick=async()=>{if(!confirm('Rétablir cet état du rapport ? L’état actuel sera conservé dans l’historique.'))return;try{await sauver(true);const c=await rpc('avni_rapport_instantane',{p_id:+b.dataset.hr});const r=Object.assign({},CUR,{contenu:c});SALE=false;ouvrir(r);SALE=true;await sauver(true);toast('Version rétablie et enregistrée');chargerHist()}catch(e){toast(e.message)}})}catch(e){$('hist-l').textContent=e.message}} document.querySelector('[data-p="revision"]').addEventListener('click',()=>{chargerHist();rendreComs();majSug()}); /* -- résumé exécutif transversal -- */ function phrases(html){const d=document.createElement('div');d.innerHTML=html||'';d.querySelectorAll('table,.bloc,canvas,img').forEach(x=>x.remove());return (d.innerText||'').replace(/\s+/g,' ').split(/(?<=[.!?])\s+(?=[A-ZÉÈÀ«"])/).map(x=>x.trim()).filter(x=>x.length>=45&&x.length<=330)} $('r-exec').onclick=()=>{if(!EDIT){toast('Réservé aux éditeurs');return}if(!CUR){toast('Ouvrez d’abord un rapport');return} const POS=/(point fort|atout|réussi|réussite|amélior|progress|atteint|dépass|positi|efficac|pertinen|appropri|satisfa|renforc|bonne pratique|engagement|apprécié)/i,VIG=/(risque|limite|faible|retard|écart|insuffis|manque|difficult|contrainte|vigilance|fragil|absence|non atteint|ne permet pas|inquiét)/i,REC=/(recommand|il convient|devrait|devraient|proposons|prioris|il est suggéré|à envisager|nécessaire de)/i; const src=RAP.slice().sort((a,b)=>({initial:0,intermediaire:1,final:2}[a.niveau]??1)-({initial:0,intermediaire:1,final:2}[b.niveau]??1));const F=[],V=[],Rc=[];let objet='';const vus=new Set(); src.forEach(r=>{const S=(r.id===CUR.id?lireSections():((r.contenu&&r.contenu.sections)||[]));S.forEach(sec=>{if(/résumé exécutif/i.test(sec.titre||''))return;phrases(sec.html).forEach(p=>{const k=p.slice(0,60).toLowerCase();if(vus.has(k))return;const ref=` (${esc(r.titre)} · ${esc((sec.titre||'').slice(0,50))})`; if(!objet&&r.niveau==='initial'&&/(objet|objectif|vise|mandat|évaluation finale)/i.test(p)){objet=p;vus.add(k);return} if(REC.test(p)&&Rc.length<12){Rc.push(esc(p)+ref);vus.add(k)}else if(VIG.test(p)&&V.length<12){V.push(esc(p)+ref);vus.add(k)}else if(POS.test(p)&&F.length<14){F.push(esc(p)+ref);vus.add(k)}})})}); const D=(typeof DATA!=='undefined'&&DATA)||[];const nb=(f)=>new Set(D.map(f).filter(Boolean)).size; const kpi=D.length?`

La collecte compte ${D.length} soumissions, réalisées par ${nb(x=>x.enqueteur)} enquêteurs dans ${nb(x=>x.ecole||x.commune)} écoles ou communes, avec ${nb(x=>x.formulaire)} questionnaires.

`:'

Les chiffres de la collecte s’afficheront dès l’arrivée des premières soumissions (à partir du 3 novembre).

'; const ul=a=>a.length?'':'

Aucun élément relevé dans les rapports à ce stade.

'; const html=`

Résumé composé le ${new Date().toLocaleDateString('fr-CA')} à partir de ${src.length} document(s) ; chaque élément renvoie à sa source. Brouillon à relire et à reformuler.

Objet

${esc(objet||'Évaluation finale du projet Avni Nou.')}

Chiffres clés de la collecte

${kpi}

Points forts relevés

${ul(F)}

Points de vigilance

${ul(V)}

Recommandations

${ul(Rc)}`; const ex=[...document.querySelectorAll('#corps .sec')].find(s=>/résumé exécutif/i.test(s.querySelector('h2').textContent)); if(ex){if(!confirm('Remplacer le résumé exécutif existant ? (L’état actuel reste dans l’historique.)'))return;ex.querySelector('.txt').innerHTML=html}else{const t=document.createElement('div');t.innerHTML=secHtml({id:'resume-'+Date.now(),titre:'Résumé exécutif',niveau:1,html});$('corps').prepend(t.firstElementChild)} plan();sale();try{structureMaint()}catch(e){}$('corps').querySelector('.sec').scrollIntoView({behavior:'smooth'});toast('Résumé exécutif composé : '+F.length+' points forts, '+V.length+' vigilances, '+Rc.length+' recommandations')}; /* ---------------- démarrage ---------------- */ async function charger(garder){if(!jeton()){$('bandeau').style.display='block';$('bandeau').innerHTML='Connectez-vous à Studio pour ouvrir l’atelier. Se connecter';return} let j;try{j=await rpc('avni_rapports_lister')}catch(e){$('bandeau').style.display='block';$('bandeau').textContent=e.message;return} EDIT=!!j.editeur;RAP=j.rapports||[];rpc('avni_annuaire_mentions').then(a=>ANN=a||[]).catch(()=>{});CB=j.codebook||[];await chargerDonnees();remplirVars();rendreCB(); if($('source').value==='demo'){$('bandeau').style.display='block';$('bandeau').innerHTML='Démonstration : les blocs vivants affichent des données fictives (jamais enregistrées) pour présenter l’atelier.'}else if(!DATA.length){$('bandeau').style.display='block';$('bandeau').textContent='Aucune donnée de terrain reçue pour l’instant : les blocs vivants se rempliront automatiquement dès les premières soumissions (collecte à partir du 3 novembre 2026).'}else $('bandeau').style.display='none'; if(EDIT&&DATA.length&&$('source').value==='reel'){const s=semaineIso(new Date());if(!RAP.some(r=>r.type==='bulletin'&&r.semaine===s)){await nouveau('bulletin')}} const r=RAP.find(x=>x.id===garder)||RAP.find(x=>CUR&&x.id===CUR.id)||RAP[0];if(r)ouvrir(r);else{liste();$('doc').innerHTML='
Aucun rapport pour l’instant.
'}} $('source').onchange=async()=>{await chargerDonnees();remplirVars();if(CUR)ouvrir(RAP.find(r=>r.id===CUR.id)||CUR);rendreThemes()}; charger();