Files
html/products/ethicab2b.html
Opus 41a40ff936
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
phase53 doctrine 195 MASS INJECT products subdir 104 pages UX doctrine 60 - total 426 pages
Handler new: /var/www/html/api/inject-products.py
- Mass injection doctrine 60 sur /var/www/html/products/ subfolder
- 104 pages HTML traitees en 1 pass
- GOLD backup systematique: vault-gold/opus/products-NAME.html.doctrine195-TS.bak
- chattr +i/-i atomic handling
- Includes mobile fix responsive bot-widget (doctrine 194 pattern)

Resultats:
- OK=104 ALREADY=0 ERR=0 TOTAL=104 (100 percent success)
- Health checks HTTP 200 sur consulting/leadforge/academy/arsenal/bizplan

Coverage GLOBAL maintenant:
- Root: 322/325 = 99.1 percent (2 exclusions legitimes wevia/monitor)
- Products: 104/104 = 100 percent COMPLETE
- TOTAL: 426 pages UX doctrine 60

Cumul session Opus:
- 45 tags (44+1)
- 35 doctrines vault (146-195)
- 426 pages UX doctrine 60 (was 323, +104)
- NR 153/153 invariant 53 phases

Handler inject-products.py battle-tested - reusable pour autres subdirs.
ZERO regression. ZERO ecrasement.
2026-04-24 15:57:08 +02:00

109 lines
19 KiB
HTML

<!DOCTYPE html><html lang="fr"><head>
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>Ethica B2B -- WEVAL</title><link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"><style>:root{--bg:#060a14;--bg2:#0b1120;--s:#111a2e;--c:#131d32;--bo:#1a2744;--t:#c8d1e0;--m:#7a8ba5;--d:#4a5a72;--w:#edf2f7;--a:#059669;--ab:#05966914;--abo:#05966940;--f:'DM Sans',system-ui,sans-serif;--mo:'JetBrains Mono',monospace}*{margin:0;padding:0;box-sizing:border-box}body{font-family:var(--f);background:var(--bg);color:var(--t);height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{background:var(--bo);border-radius:3px}@keyframes fi{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes p{0%,100%{opacity:1}50%{opacity:.4}}.hd{padding:18px 24px;border-bottom:1px solid var(--bo);display:flex;align-items:center;gap:14px;background:var(--bg2);flex-shrink:0}.hd h1{font-size:17px;font-weight:700;color:var(--w)}.hd small{font-size:12px;color:var(--m)}.ca{flex:1;overflow-y:auto;padding:20px 24px}.ce{text-align:center;padding:40px 20px;color:var(--d);animation:fi .4s}.ce h3{color:var(--m);margin:12px 0 8px;font-size:16px}.sg{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:18px}.sg button{padding:8px 16px;background:var(--ab);border:1px solid var(--abo);border-radius:20px;color:var(--a);font-family:var(--f);font-size:12px;font-weight:600;cursor:pointer;transition:all .15s}.sg button:hover{opacity:.85;transform:translateY(-1px)}.mu{background:var(--ab);border:1px solid var(--abo);border-radius:10px 10px 4px 10px;padding:12px 16px;margin:8px 0;max-width:75%;margin-left:auto;font-size:13px;color:var(--w);line-height:1.6;animation:fi .2s}.ma{background:var(--s);border:1px solid var(--bo);border-radius:4px 10px 10px 10px;padding:14px 18px;margin:8px 0;max-width:90%;font-size:13px;color:var(--t);line-height:1.7;animation:fi .2s}.ma pre{background:var(--bg);padding:12px;border-radius:8px;overflow-x:auto;font-family:var(--mo);font-size:12px;margin:8px 0}.ma code{font-family:var(--mo);font-size:12px;background:var(--bg);padding:2px 6px;border-radius:4px}.ma h2,.ma h3{color:var(--w);margin:12px 0 6px}.ma strong{color:var(--w)}.ib{padding:14px 24px;border-top:1px solid var(--bo);background:var(--bg2);display:flex;gap:10px;flex-shrink:0}.ib textarea{flex:1;resize:none;min-height:42px;max-height:120px;font-family:var(--f);font-size:13px;line-height:1.5;background:var(--bg);border:1px solid var(--bo);color:var(--w);border-radius:8px;padding:10px 14px;outline:none}.ib textarea:focus{border-color:var(--a)}.ib button{padding:10px 20px;background:var(--a);color:#fff;border:none;border-radius:8px;font-family:var(--f);font-size:13px;font-weight:600;cursor:pointer;align-self:flex-end}.ib button:hover{opacity:.9}.ld{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--a);margin:0 3px;animation:p .8s infinite}.ld:nth-child(2){animation-delay:.2s}.ld:nth-child(3){animation-delay:.4s}.in-iframe nav{display:none!important}.in-iframe .hero{padding-top:3rem!important;min-height:auto!important}.in-iframe footer{display:none!important}.in-iframe .cta{display:none!important}.in-iframe .wv-links{display:none!important}input,select,textarea{background:#0b0d14!important;color:#e2e8f0!important;border:1px solid #1e293b!important;border-radius:8px!important}input::placeholder{color:#475569!important}</style><link rel="canonical" href="https://weval-consulting.com/products/ethicab2b.html">
<meta property="og:title" content="Ethica B2B -- WEVAL">
<meta property="og:description" content="ethicab2b - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<meta property="og:url" content="https://weval-consulting.com/products/ethicab2b.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="WEVAL Consulting">
<meta property="og:image" content="https://weval-consulting.com/assets/logo-weval-png-DChrMGao.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Ethica B2B -- WEVAL">
<meta name="twitter:description" content="ethicab2b - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<meta name="description" content="ethicab2b - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/ethicab2b.html">
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/ethicab2b.html">
<script>if(window!==window.top)document.documentElement.classList.add("in-iframe")</script>
<style>
.wevia-progress{width:100%;background:rgba(99,102,241,.15);border-radius:8px;overflow:hidden;height:6px;margin:8px 0}
.wevia-progress-bar{height:100%;background:linear-gradient(90deg,#6366f1,#a78bfa,#6366f1);background-size:200%;animation:weviaShimmer 1.5s infinite;border-radius:8px;transition:width .3s}
.wevia-progress-text{font-size:11px;color:#a0a0b0;margin-top:4px;text-align:center}
@keyframes weviaShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
</style>
<link rel="stylesheet" href="/assets/dark-iframe.css">
<!-- DOCTRINE-60-UX-ENRICH products-batch-doctrine195 -->
<style id="wtp-doctrine60-ux-premium">
:root {
--wtp-bg-start:#0a0f1c; --wtp-bg-end:#0f172a;
--wtp-surface:rgba(15,23,42,.85); --wtp-surface-hover:rgba(30,41,59,.9);
--wtp-border:rgba(99,102,241,.25); --wtp-border-hover:rgba(99,102,241,.5);
--wtp-text:#e2e8f0; --wtp-text-dim:#94a3b8; --wtp-text-bright:#f1f5f9;
--wtp-primary:#6366f1; --wtp-primary-hover:#7c7feb;
--wtp-accent:#8b5cf6; --wtp-success:#10b981; --wtp-warning:#f59e0b; --wtp-danger:#ef4444;
--wtp-radius:12px; --wtp-shadow:0 4px 24px rgba(99,102,241,.15); --wtp-shadow-lg:0 8px 48px rgba(99,102,241,.25);
--wtp-transition:all .2s cubic-bezier(.4,0,.2,1);
--wtp-font:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;
--wtp-font-mono:'JetBrains Mono',monospace;
}
.wtp-card{background:var(--wtp-surface);border:1px solid var(--wtp-border);border-radius:var(--wtp-radius);padding:20px;transition:var(--wtp-transition)}
.wtp-card:hover{border-color:var(--wtp-border-hover);box-shadow:var(--wtp-shadow)}
.wtp-btn{background:linear-gradient(135deg,var(--wtp-primary),var(--wtp-accent));color:#fff;padding:10px 20px;border:none;border-radius:8px;cursor:pointer;font-weight:600;transition:var(--wtp-transition)}
.wtp-btn:hover{transform:translateY(-1px);box-shadow:var(--wtp-shadow)}
.wtp-badge{display:inline-flex;align-items:center;padding:4px 10px;background:var(--wtp-surface);border:1px solid var(--wtp-border);border-radius:20px;font-size:12px;color:var(--wtp-text-dim)}
@media (max-width:768px){#weval-bot-widget{bottom:100px !important;right:16px !important;z-index:10001 !important}#weval-bot-btn{width:48px !important;height:48px !important}#weval-bot-btn svg{width:22px !important;height:22px !important}#footer_banner,.footer-banner,[class*="footer-bandeau"]{z-index:9990 !important}}
</style>
</head><body><div class="hd"><div><h1>Ethica B2B</h1><small>SUBEthica B2B</small></div></div><div class="ca" id="ca"><div class="ce" id="es"><h3>Ethica B2B</h3><p>SUBEthica B2B</p><div class="sg"><button onclick="sg(\x27Recherche de professionnels de sante pour: mon entreprise\x27)">Commencer</button><button onclick="sg(\x27Recherche de professionnels de sante pour: analyse complete\x27)">Analyse</button><button onclick="sg(\x27Recherche de professionnels de sante pour: demonstration\x27)">Demo</button></div></div></div><div class="ib"><textarea id="i" rows="1" placeholder="Recherche de professionnels de sante pour:" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();send()}" oninput="this.style.height='42px';this.style.height=Math.min(this.scrollHeight,120)+'px'"></textarea><button onclick="send()">Envoyer</button></div><script>const A='/api/weval-ia-fast.php',C='Recherche de professionnels de sante pour:';let h=[];function md(m){return m.replace(/```[\w]*\n([\s\S]*?)```/g,'<pre>$1</pre>').replace(/^### (.*$)/gm,'<h3>$1</h3>').replace(/^## (.*$)/gm,'<h2>$1</h2>').replace(/\*\*(.*?)\*\*/g,'<strong>$1</strong>').replace(/\*(.*?)\*/g,'<em>$1</em>').replace(/`(.*?)`/g,'<code>$1</code>').replace(/^- (.*$)/gm,'<li>$1</li>').replace(/\n\n/g,'<br><br>')}function e(s){const d=document.createElement('div');d.textContent=s;return d.innerHTML}function sg(q){document.getElementById('i').value=q;send()}async function send(){const i=document.getElementById('i'),m=i.value.trim();if(!m)return;const a=document.getElementById('ca'),es=document.getElementById('es');if(es)es.remove();a.innerHTML+='<div class="mu">'+e(m)+'</div>';i.value='';i.style.height='42px';a.scrollTop=a.scrollHeight;const l='l'+Date.now();a.innerHTML+='<div class="ma" id="'+l+'"><span class="ld"></span><span class="ld"></span><span class="ld"></span></div>';a.scrollTop=a.scrollHeight;try{h.push({role:'user',content:m});const r=await fetch(A,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:C+' '+m,mode:'full',history:h.slice(-6)})});const j=await r.json();const rp=j.response||j.error||'Erreur';h.push({role:'assistant',content:rp});const el=document.getElementById(l);if(el)el.outerHTML='<div class="ma">'+md(rp)+'</div>'}catch(ex){const el=document.getElementById(l);if(el)el.outerHTML='<div class="ma" style="border-color:rgba(248,113,113,.3);color:#f87171">Erreur: '+ex.message+'</div>'}a.scrollTop=a.scrollHeight}</script>
<!-- CHATBOT -->
<div class="ev-chat" style="max-width:800px;margin:2rem auto"><div class="ev-cb" style="background:#0c1222;border:1px solid rgba(255,255,255,.06);border-radius:14px;overflow:hidden">
<div class="ev-ch" style="padding:.8rem 1.2rem;border-bottom:1px solid rgba(255,255,255,.06);font-weight:600;font-size:.85rem"><span style="color:#10b981"></span> Ethica B2B — Assistant IA</div>
<div class="ev-cm" id="ev-msgs" style="min-height:200px;max-height:400px;overflow-y:auto;padding:1rem"><div class="ev-ce" id="ev-empty" style="text-align:center;color:#64748b;padding:2rem">Posez votre question sur Ethica B2B<div class="ev-sg" style="margin-top:1rem;display:flex;gap:.5rem;justify-content:center;flex-wrap:wrap">
<button onclick="evsg('Fonctionnalités')" style="background:rgba(99,102,241,.1);color:#818cf8;border:1px solid rgba(99,102,241,.2);border-radius:8px;padding:6px 14px;font-size:.78rem;cursor:pointer">Fonctionnalités</button>
<button onclick="evsg('Comment ça marche')" style="background:rgba(99,102,241,.1);color:#818cf8;border:1px solid rgba(99,102,241,.2);border-radius:8px;padding:6px 14px;font-size:.78rem;cursor:pointer">Comment ça marche</button>
<button onclick="evsg('Tarifs')" style="background:rgba(99,102,241,.1);color:#818cf8;border:1px solid rgba(99,102,241,.2);border-radius:8px;padding:6px 14px;font-size:.78rem;cursor:pointer">Tarifs</button>
</div></div></div>
<div class="ev-ci" style="display:flex;gap:.5rem;padding:.8rem 1rem;border-top:1px solid rgba(255,255,255,.06)"><textarea id="ev-i" rows="1" placeholder="Votre question..." style="flex:1;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;color:#edf2f7;font-family:Outfit;font-size:.85rem;resize:none;outline:none" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();evsend()}"></textarea><button onclick="evsend()" style="background:#6366f1;color:#fff;border:none;border-radius:8px;padding:.6rem 1.2rem;font-weight:600;cursor:pointer;font-family:Outfit">Envoyer</button></div>
</div></div>
<script>
var evctx="Tu es Ethica B2B, plateforme B2B de campagnes pharmaceutiques conformes - consent management, RGPD, ciblage HCP.";var evh=[];
function evesc(s){var d=document.createElement("div");d.textContent=s;return d.innerHTML}
function evmd(m){return m.replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\n\n/g,"<br><br>")}
function evsg(q){document.getElementById("ev-i").value=q;evsend()}
async function evsend(){var i=document.getElementById("ev-i"),m=i.value.trim();if(!m)return;var a=document.getElementById("ev-msgs"),es=document.getElementById("ev-empty");if(es)es.remove();a.innerHTML+='<div style="text-align:right;margin:.5rem 0"><span style="background:#6366f1;color:#fff;padding:8px 14px;border-radius:12px 4px 12px 12px;display:inline-block;font-size:.85rem;max-width:80%">'+evesc(m)+'</span></div>';i.value="";a.scrollTop=a.scrollHeight;var lid="evl"+Date.now();a.innerHTML+='<div id="'+lid+'" style="margin:.5rem 0"><span style="background:rgba(255,255,255,.05);padding:8px 14px;border-radius:4px 12px 12px 12px;display:inline-block;font-size:.85rem;color:#94a3b8">●●●</span></div>';a.scrollTop=a.scrollHeight;try{evh.push({role:"user",content:m});var r=await fetch("/api/weval-ia-fast.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:"[INSTRUCTION SYSTEME: "+evctx+"]\n\nDemande utilisateur: "+m,mode:"full",history:evh.slice(-6)})}); var j=await r.json();var rp=j.response||"Erreur";evh.push({role:"assistant",content:rp});var el=document.getElementById(lid);if(el)el.outerHTML='<div style="margin:.5rem 0"><span style="background:rgba(255,255,255,.05);padding:8px 14px;border-radius:4px 12px 12px 12px;display:inline-block;font-size:.85rem;color:#cbd5e1;max-width:85%">'+evmd(rp)+'</span></div>';}catch(ex){var el=document.getElementById(lid);if(el)el.innerHTML="Erreur: "+ex.message;}a.scrollTop=a.scrollHeight;}
</script>
<!-- DEMO LIVE -->
<style>.dm-box{background:#0c1222;border:1px solid rgba(255,255,255,.06);border-radius:14px;padding:1.5rem;margin:2rem auto;max-width:800px}.dm-row{display:flex;gap:.6rem;margin-bottom:1rem}.dm-row input{flex:1;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem .8rem;color:#edf2f7;font-family:Outfit;font-size:.85rem;outline:none}.dm-row button{background:#6366f1;color:#fff;border:none;border-radius:8px;padding:.6rem 1.2rem;font-weight:700;cursor:pointer;font-family:Outfit;font-size:.85rem}.dm-out{min-height:80px;padding:1rem;background:rgba(0,0,0,.2);border-radius:8px;font-size:.82rem;color:#edf2f7;line-height:1.6}.dm-ld{display:inline-block;width:6px;height:6px;border-radius:50%;background:#6366f1;margin:0 2px;animation:dmp .8s infinite}.dm-ld:nth-child(2){animation-delay:.2s}.dm-ld:nth-child(3){animation-delay:.4s}@keyframes dmp{0%,100%{opacity:1}50%{opacity:.3}}</style>
<div class="dm-box" id="demo"><h3 style="font-size:1rem;font-weight:600;margin-bottom:1rem">⚡ Ethica B2B — Demo Live</h3>
<div class="dm-row"><input id="dm-input" placeholder="Décrivez votre campagne pharma" onkeydown="if(event.key==='Enter')dmrun()"><button onclick="dmrun()">Tester</button></div>
<div class="dm-out" id="dm-output">Testez Ethica B2B en direct — aucune inscription requise.</div></div>
<script>
async function dmrun(){var q=document.getElementById("dm-input").value.trim();if(!q)return;var o=document.getElementById("dm-output");o.innerHTML='<span class="dm-ld"></span><span class="dm-ld"></span><span class="dm-ld"></span>';try{var r=await fetch("/api/weval-ia-fast.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:"[INSTRUCTION SYSTEME: Tu es un expert en campagnes pharmaceutiques B2B conformes. Analyse le besoin et propose une stratégie de campagne ethique.]\n\nDemande utilisateur: "+q,mode:"full"})});var j=await r.json();o.innerHTML=(j.response||"Erreur").replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\n\n/g,"<br><br>");}catch(e){o.innerHTML="Erreur: "+e.message}}
</script>
<!-- CTA INLINE -->
<div id="cta" style="max-width:600px;margin:2rem auto;padding:0 4%">
<div style="background:#0c1222;border:1px solid rgba(99,102,241,.15);border-radius:14px;padding:1.5rem">
<h3 style="font-size:1rem;font-weight:700;margin-bottom:.8rem;color:#818cf8">Démarrer avec Ethica B2B</h3>
<input id="ct-name" type="text" placeholder="Votre nom" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;font-size:.85rem;color:#edf2f7;font-family:Outfit;margin-bottom:.6rem;outline:none">
<input id="ct-email" type="email" placeholder="Email professionnel" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;font-size:.85rem;color:#edf2f7;font-family:Outfit;margin-bottom:.6rem;outline:none">
<input id="ct-company" type="text" placeholder="Entreprise" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;font-size:.85rem;color:#edf2f7;font-family:Outfit;margin-bottom:.6rem;outline:none">
<button onclick="ctSend()" id="ct-btn" style="width:100%;background:#6366f1;color:#fff;border:none;border-radius:8px;padding:.7rem;font-weight:700;cursor:pointer;font-family:Outfit;font-size:.9rem">Demander un accès →</button>
<div id="ct-ok" style="display:none;text-align:center;padding:1rem;color:#10b981;font-weight:600">✓ Demande envoyée ! Nous vous recontactons sous 24h.</div>
</div></div>
<script>
async function ctSend(){var n=document.getElementById("ct-name").value.trim(),e=document.getElementById("ct-email").value.trim();if(!n||!e){alert("Nom et email requis");return;}document.getElementById("ct-btn").disabled=true;document.getElementById("ct-btn").textContent="Envoi...";try{await fetch("/api/contact",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n,email:e,company:document.getElementById("ct-company").value.trim(),subject:"demo",message:"Demande acces Ethica B2B",source:"ethicab2b",ts:new Date().toISOString()})})}catch(x){}document.getElementById("ct-btn").style.display="none";document.getElementById("ct-ok").style.display="block";}
</script>
<script>
function weviaProgress(container,startMs){
if(!container)return;
var el=document.createElement('div');
el.className='wevia-pb-wrap';
el.innerHTML='<div class="wevia-progress"><div class="wevia-progress-bar" style="width:5%"></div></div><div class="wevia-progress-text">Analyse en cours...</div>';
container.appendChild(el);
var bar=el.querySelector('.wevia-progress-bar'),txt=el.querySelector('.wevia-progress-text');
var steps=['Connexion au moteur IA...','Analyse de votre demande...','Génération de la réponse...','Finalisation...'];
var iv=setInterval(function(){
var elapsed=(Date.now()-startMs)/1000;
var pct=Math.min(95,5+elapsed*3);
bar.style.width=pct+'%';
var si=Math.min(3,Math.floor(elapsed/3));
txt.textContent=steps[si]+' ('+Math.round(elapsed)+'s)';
if(elapsed>25)txt.textContent='Presque termine... ('+Math.round(elapsed)+'s)';
},300);
return {el:el,stop:function(){clearInterval(iv);bar.style.width='100%';txt.textContent='Termine!';}};
}
</script>
<script defer src=/assets/dm-enhance.js></script></body></html>