Le cerveau du centre de commande (eh-agent) : il comprend, agit (lecture/écriture), et demande votre validation avant toute action sensible.
🗺️ Plans & décisions (votes)
💰 Dépenses
💬 Dites-le à l'IA
📱 Statuts WhatsApp — ligne 53
Quota : /jour
Programmer un statut
Programmés
Historique
🔁 Bascules
Verrou 53 :
Render = instance principale du 53. La box n’est plus qu’un dernier recours (elle ne prend le 53 que si Render est muet > 5 min) et ne reprend plus le 53 automatiquement.
📱 Reconnecter le 53 (QR code)
Si le 53 est connecté, la re-liaison est refusée (sécurité). WhatsApp Business → Appareils connectés → Connecter un appareil. La nouvelle session est enregistrée dans Supabase.
🔔 Alertes personnalisées
Créez-les par le chat : « alerte-moi si moins de 5 messages sur le 53 en 24 h ».
⬇️ Export CSV
jours
🎯 Prospection email
Chargement du lot de prospection…
/* ================= Prospection — ajout v5.1 (fonctions nouvelles uniquement, rien d'existant modifié) ================= */
const PROSP_KEY='eh_prosp_v1';
let PROSP=null, PROSP_CHOIX={};
function prospLoadChoix(){try{PROSP_CHOIX=JSON.parse(localStorage.getItem(PROSP_KEY)||'{}')}catch(e){PROSP_CHOIX={}}}
function prospSaveChoix(){try{localStorage.setItem(PROSP_KEY,JSON.stringify(PROSP_CHOIX))}catch(e){}}
function prospKey(i){return 'p'+i}
async function prospInit(){
if(PROSP&&PROSP._done)return prospRender();
if(typeof EH_BATCH_1!=='undefined'&&EH_BATCH_1){PROSP=EH_BATCH_1;PROSP._done=true;prospLoadChoix();prospRender();return;}
try{
const r=await fetch('batches/batch_1.json');
if(!r.ok)throw new Error('lot introuvable');
PROSP=await r.json();PROSP._done=true;prospLoadChoix();prospRender();
}catch(e){
document.getElementById('prosp-intro').textContent='Aucun lot de prospection pour le moment.';
document.getElementById('prosp-list').innerHTML='';
document.getElementById('prosp-counters').innerHTML='';
}
}
function prospEmails(){const m={};(PROSP.emails_rediges||[]).forEach(e=>{m[e.prospect]=e});return m}
function prospRender(){
const P=PROSP.prospects||[],EM=prospEmails();
document.getElementById('prosp-intro').innerHTML='Lot '+esc(PROSP.batch||'batch_1')+' — '+P.length+' prospects. Valide les emails ici : Horyon les enverra depuis electronichouze@gmail.com.';
let na=0,nr=0,nw=0,ne=0;
document.getElementById('prosp-list').innerHTML=P.map((p,i)=>{
const em=EM[p.entreprise],ch=PROSP_CHOIX[prospKey(i)];
let badge,actions='',cls='';
if(!em){ne++;badge='pas d\u2019email public \u2192 WhatsApp'}
else{
if(ch==='approuve'){na++;cls='approuve';badge='Approuv\u00e9'}
else if(ch==='refuse'){nr++;cls='refuse';badge='Refus\u00e9'}
else{nw++;badge='En attente'}
actions='';
}
const mail=em?'\u2709\ufe0f Voir l\u2019email r\u00e9dig\u00e9
';
}
function prospSet(i,v){PROSP_CHOIX[prospKey(i)]=v;prospSaveChoix();prospRender()}
function prospAll(v){const EM=prospEmails();(PROSP.prospects||[]).forEach((p,i)=>{if(EM[p.entreprise])PROSP_CHOIX[prospKey(i)]=v});prospSaveChoix();prospRender()}
function prospReset(){PROSP_CHOIX={};prospSaveChoix();prospRender()}
function prospCopy(){
const P=PROSP.prospects||[],EM=prospEmails(),ap=[],rf=[],pe=[],wa=[];
P.forEach((p,i)=>{
const em=EM[p.entreprise];
if(!em){wa.push(p.entreprise);return}
const c=PROSP_CHOIX[prospKey(i)];
if(c==='approuve')ap.push(p.entreprise+' <'+(p.email||em.email_destinataire||'')+'>');
else if(c==='refuse')rf.push(p.entreprise);
else pe.push(p.entreprise);
});
const sec=(t,a)=>t+' ('+a.length+') :\n'+(a.map(x=>'- '+x).join('\n')||'- aucun');
const txt='VALIDATION PROSPECTION \u2014 lot '+(PROSP.batch||'batch_1')+'\n'
+sec('APPROUV\u00c9S',ap)+'\n'+sec('REFUS\u00c9S',rf)+'\n'
+sec('EN ATTENTE',pe)+'\n'+sec('SANS EMAIL PUBLIC \u2014 \u00e0 contacter via WhatsApp',wa);
const done=()=>{document.getElementById('prosp-hint').innerHTML='\u2705 Validation copi\u00e9e ! Colle ce texte \u00e0 Horyon dans le chat \u2014 il enverra les emails approuv\u00e9s depuis electronichouze@gmail.com. (Aucun envoi n\u2019est fait depuis le centre de contr\u00f4le.)'};
const fb=()=>{const ta=document.createElement('textarea');ta.value=txt;ta.style.position='fixed';ta.style.opacity='0';document.body.appendChild(ta);ta.select();try{document.execCommand('copy');done()}catch(e){document.getElementById('prosp-hint').textContent='Copie impossible automatiquement : recopie le texte manuellement.'}document.body.removeChild(ta)};
if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(txt).then(done,fb);else fb();
}
/* Charge l'onglet quand il devient visible — sans modifier tab() ni load() */
new MutationObserver(()=>{const s=document.getElementById('t-prosp');if(s&&s.classList.contains('on'))prospInit()})
.observe(document.getElementById('t-prosp'),{attributes:true,attributeFilter:['class']});