Files
html/products/dashboardai.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

380 lines
27 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 http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>WEVADS - CEO Dashboard — WEVADS</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root{--bg:#060a14;--s:#0c1220;--c:#111827;--b:#1e293b;--ac:#3d8bfd;--gn:#060a14;--rd:#ef4444;--or:#f59e0b;--cy:#22d3ee;--pu:#a78bfa;--t:#e2e8f0;--d:#64748b;--f:'DM Sans',sans-serif;--m:'JetBrains Mono',monospace}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:var(--f);background:#060a14;color:var(--t);min-height:100vh}
.app{max-width:1440px;margin:0 auto;padding:24px}
.hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--b)}
.hdr h1{font-size:24px;font-weight:700}.hdr h1 span{color:var(--ac)}
.hdr-right{display:flex;gap:10px;align-items:center}
.pulse{width:10px;height:10px;border-radius:50%;background:var(--gn);animation:pulse 2s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}
.badge-live{background:rgba(16,185,129,.15);color:var(--gn);padding:4px 12px;border-radius:20px;font-size:11px;font-weight:600;display:flex;align-items:center;gap:6px}
.btn{padding:8px 18px;border:none;border-radius:10px;font-size:12px;font-weight:600;cursor:pointer;color:#fff;transition:.2s}
.btn-p{background:linear-gradient(135deg,var(--ac),#2563eb)}.btn-s{background:var(--c);border:1px solid var(--b);color:var(--t)}
.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}
.mega-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:14px;margin-bottom:24px}
.mega{background:var(--s);border:1px solid var(--b);border-radius:14px;padding:18px;text-align:center;transition:.2s}
.mega:hover{border-color:rgba(61,139,253,.3);transform:translateY(-2px)}
.mega .icon{font-size:24px;margin-bottom:8px}
.mega .val{font-family:var(--m);font-size:28px;font-weight:700;line-height:1}
.mega .lbl{font-size:10px;color:var(--d);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}
.mega .sub{font-size:11px;margin-top:6px;font-weight:500}
.mega.green .val{color:var(--gn)}.mega.blue .val{color:var(--ac)}.mega.amber .val{color:var(--or)}.mega.red .val{color:var(--rd)}.mega.cyan .val{color:var(--cy)}.mega.purple .val{color:var(--pu)}
.row{display:grid;gap:16px;margin-bottom:20px}
.r2{grid-template-columns:1fr 1fr}.r3{grid-template-columns:1fr 1fr 1fr}.r23{grid-template-columns:2fr 1fr}.r32{grid-template-columns:3fr 2fr}
.cd{background:var(--s);border:1px solid var(--b);border-radius:14px;padding:20px;transition:.2s}
.cd:hover{border-color:rgba(61,139,253,.2)}
.cd-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.cd-h h3{font-size:14px;font-weight:600}.cd-h .ct{font-size:11px;color:var(--d)}
table{width:100%;border-collapse:collapse;font-size:12px}
th{text-align:left;padding:10px 12px;color:var(--d);font-size:10px;text-transform:uppercase;border-bottom:1px solid var(--b);letter-spacing:.5px}
td{padding:10px 12px;border-bottom:1px solid rgba(30,41,59,.3)}
.badge{padding:2px 8px;border-radius:6px;font-size:10px;font-weight:600;display:inline-block}
.b-ok{background:rgba(16,185,129,.12);color:var(--gn)}
.b-w{background:rgba(245,158,11,.12);color:var(--or)}
.b-err{background:rgba(239,68,68,.12);color:var(--rd)}
.b-info{background:rgba(34,211,238,.12);color:var(--cy)}
.b-pu{background:rgba(167,139,250,.12);color:var(--pu)}
.bar{height:6px;border-radius:3px;background:var(--c);overflow:hidden;flex:1}
.bar-fill{height:100%;border-radius:3px;transition:.5s}
.progress-row{display:flex;align-items:center;gap:8px;margin:4px 0}
.progress-label{font-size:10px;color:var(--d);width:90px;text-align:right}
.progress-val{font-family:var(--m);font-size:10px;width:45px;color:var(--t)}
.section-title{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--d);margin:20px 0 12px;display:flex;align-items:center;gap:8px}
.ring{width:80px;height:80px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--m);font-size:18px;font-weight:700;margin:0 auto 8px}
.status-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
.status-item{background:var(--c);border:1px solid var(--b);border-radius:10px;padding:14px;text-align:center}
.status-item .label{font-size:10px;color:var(--d);margin-bottom:4px;text-transform:uppercase}
.status-item .value{font-family:var(--m);font-size:16px;font-weight:600}
.funnel{display:flex;align-items:center;gap:4px;margin:16px 0}
.funnel-step{flex:1;text-align:center;padding:12px 8px;border-radius:10px;position:relative}
.funnel-step .f-val{font-family:var(--m);font-size:20px;font-weight:700}
.funnel-step .f-lbl{font-size:10px;color:var(--d);margin-top:2px}
.funnel-step .f-rate{font-size:10px;font-weight:600;margin-top:4px}
.funnel-arrow{font-size:16px;color:var(--d)}
.toast{position:fixed;top:20px;right:20px;padding:12px 20px;border-radius:10px;font-size:13px;z-index:9999;display:none;animation:slideIn .3s}
.toast.show{display:block}.toast-ok{background:#060a14;color:#6ee7b7;border:1px solid #060a14}.toast-err{background:#7f1d1d;color:#fca5a5;border:1px solid #ef4444}
@keyframes slideIn{from{transform:translateX(100px);opacity:0}to{transform:translateX(0);opacity:1}}
@media(max-width:1100px){.mega-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:768px){.mega-grid{grid-template-columns:repeat(2,1fr)}.r2,.r3,.r23,.r32{grid-template-columns:1fr}}
.wv-status{position:fixed;top:12px;right:140px;z-index:9998;background:rgba(52,211,153,.15);border:1px solid #34d399;border-radius:12px;padding:3px 10px;color:#34d399;font-size:10px;font-weight:700;font-family:'JetBrains Mono',monospace}
.sc,.card,[class*="stat-card"]{transition:all .25s ease;position:relative;overflow:hidden}
.sc:hover,.card:hover,[class*="stat-card"]:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.25)}
.sc::after,.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--cy,#22d3ee);opacity:0;transition:opacity .25s}
.sc:hover::after,.card:hover::after{opacity:.7}
.btn,.button,[class*="btn-"]{transition:all .2s ease}
.btn:hover,.button:hover{transform:translateY(-1px)}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.sc,.card{animation:fadeIn .4s ease both}
.sc:nth-child(2),.card:nth-child(2){animation-delay:.05s}
.sc:nth-child(3),.card:nth-child(3){animation-delay:.1s}
.sc:nth-child(4),.card:nth-child(4){animation-delay:.15s}
.sc:nth-child(5),.card:nth-child(5){animation-delay:.2s}
.sc:nth-child(6),.card:nth-child(6){animation-delay:.25s}
.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}</style><link rel="canonical" href="https://weval-consulting.com/products/dashboardai.html">
<meta property="og:title" content="WEVADS - CEO Dashboard — WEVADS">
<meta property="og:description" content="dashboardai - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<meta property="og:url" content="https://weval-consulting.com/products/dashboardai.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="WEVADS - CEO Dashboard — WEVADS">
<meta name="twitter:description" content="dashboardai - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<meta name="description" content="dashboardai - Solutions IA souveraines pour entreprises. France · Maroc · États-Unis · International">
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/dashboardai.html">
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/dashboardai.html">
<script>if(window!==window.top)document.documentElement.classList.add("in-iframe")</script>
<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="app">
<div class="hdr">
<h1>📊 <span>CEO</span> Dashboard</h1>
<p style="font-size:12px;color:#64748b;margin:6px 0 16px;max-width:600px;line-height:1.6">Vue CEO — synthèse exécutive opérations, revenus, santé infrastructure, alertes.</p>
<div class="hdr-right">
<div class="badge-live"><div class="pulse"></div> LIVE</div>
<span style="font-size:11px;color:var(--d);font-family:var(--m)" id="lastUpdate"></span>
<button class="btn btn-s" onclick="loadAll()">🔄</button>
</div>
</div>
<!-- MEGA KPIs -->
<div class="mega-grid">
<div class="mega blue"><div class="icon">📧</div><div class="val" id="mAccounts"></div><div class="lbl">O365 Accounts</div><div class="sub" id="mAccountsSub"></div></div>
<div class="mega green"><div class="icon">🔥</div><div class="val" id="mOnboarding"></div><div class="lbl">Onboarding</div><div class="sub" id="mOnboardingSub"></div></div>
<div class="mega cyan"><div class="icon">📤</div><div class="val" id="mSent"></div><div class="lbl">Sent 24h</div><div class="sub" id="mSentSub"></div></div>
<div class="mega amber"><div class="icon">👁️</div><div class="val" id="mOpens"></div><div class="lbl">Opens 24h</div><div class="sub" id="mOpensSub"></div></div>
<div class="mega purple"><div class="icon">🖱️</div><div class="val" id="mClicks"></div><div class="lbl">Clicks 24h</div><div class="sub" id="mClicksSub"></div></div>
<div class="mega green"><div class="icon">🧠</div><div class="val" id="mBrain"></div><div class="lbl">Brain Winners</div><div class="sub" id="mBrainSub"></div></div>
</div>
<!-- EMAIL FUNNEL -->
<div class="section-title">📊 Email Funnel (24h)</div>
<div class="cd">
<div class="funnel">
<div class="funnel-step" style="background:rgba(61,139,253,.1)"><div class="f-val" style="color:var(--ac)" id="fSent"></div><div class="f-lbl">Sent</div></div>
<div class="funnel-arrow"></div>
<div class="funnel-step" style="background:rgba(34,211,238,.1)"><div class="f-val" style="color:var(--cy)" id="fDelivered"></div><div class="f-lbl">Delivered</div><div class="f-rate" style="color:var(--cy)" id="fDelRate"></div></div>
<div class="funnel-arrow"></div>
<div class="funnel-step" style="background:rgba(245,158,11,.1)"><div class="f-val" style="color:var(--or)" id="fOpens"></div><div class="f-lbl">Opens</div><div class="f-rate" style="color:var(--or)" id="fOpenRate"></div></div>
<div class="funnel-arrow"></div>
<div class="funnel-step" style="background:rgba(167,139,250,.1)"><div class="f-val" style="color:var(--pu)" id="fClicks"></div><div class="f-lbl">Clicks</div><div class="f-rate" style="color:var(--pu)" id="fClickRate"></div></div>
<div class="funnel-arrow"></div>
<div class="funnel-step" style="background:rgba(16,185,129,.1)"><div class="f-val" style="color:var(--gn)" id="fConv"></div><div class="f-lbl">Conversions</div><div class="f-rate" style="color:var(--gn)" id="fConvRate"></div></div>
</div>
</div>
<!-- SYSTEM STATUS -->
<div class="section-title">🏗️ Infrastructure Status</div>
<div class="row r3">
<div class="cd">
<div class="cd-h"><h3>🔥 Optimisation Engine</h3><span class="badge b-ok" id="optimisationBadge"></span></div>
<div class="status-grid" id="optimisationStatus">
<div class="status-item"><div class="label">Total</div><div class="value" id="wTotal"></div></div>
<div class="status-item"><div class="label">Onboarding</div><div class="value" style="color:var(--or)" id="wOnboarding"></div></div>
<div class="status-item"><div class="label">Graduated</div><div class="value" style="color:var(--gn)" id="wGrad"></div></div>
<div class="status-item"><div class="label">Capacity/Day</div><div class="value" style="color:var(--cy)" id="wCap"></div></div>
</div>
</div>
<div class="cd">
<div class="cd-h"><h3>📧 Office 365</h3><span class="badge b-info" id="o365Badge"></span></div>
<div class="status-grid" id="o365Status">
<div class="status-item"><div class="label">Total</div><div class="value" id="oTotal"></div></div>
<div class="status-item"><div class="label">Active</div><div class="value" style="color:var(--gn)" id="oActive"></div></div>
<div class="status-item"><div class="label">Healthy</div><div class="value" style="color:var(--cy)" id="oHealthy"></div></div>
<div class="status-item"><div class="label">Flagged</div><div class="value" style="color:var(--rd)" id="oFlagged"></div></div>
</div>
</div>
<div class="cd">
<div class="cd-h"><h3>🤝 Sponsors</h3><span class="badge b-pu" id="sponsorBadge"></span></div>
<div class="status-grid" id="sponsorStatus">
<div class="status-item"><div class="label">Networks</div><div class="value" id="spNetworks"></div></div>
<div class="status-item"><div class="label">Offers</div><div class="value" style="color:var(--or)" id="spOffers"></div></div>
<div class="status-item"><div class="label">Revenue</div><div class="value" style="color:var(--gn)" id="spRevenue"></div></div>
<div class="status-item"><div class="label">Clicks</div><div class="value" style="color:var(--cy)" id="spClicks"></div></div>
</div>
</div>
</div>
<!-- BRAIN & PROVIDERS -->
<div class="section-title">🧠 Brain Intelligence</div>
<div class="row r23">
<div class="cd">
<div class="cd-h"><h3>🏆 Top Winning Configurations</h3></div>
<table><thead><tr><th>ISP</th><th>Method</th><th>Inbox %</th><th>Tests</th><th>Status</th></tr></thead>
<tbody id="brainTable"><tr><td colspan="5" style="text-align:center;color:var(--d);padding:20px">Loading...</td></tr></tbody></table>
</div>
<div class="cd">
<div class="cd-h"><h3>📊 Provider Distribution</h3></div>
<div id="providerChart"><div style="text-align:center;color:var(--d);padding:20px">Loading...</div></div>
</div>
</div>
<!-- YOUTUBE & ADS -->
<div class="section-title">📈 Content & Ads</div>
<div class="row r2">
<div class="cd">
<div class="cd-h"><h3>🎬 YouTube Factory</h3><span class="badge b-info" id="ytBadge"></span></div>
<div class="status-grid">
<div class="status-item"><div class="label">Trends</div><div class="value" style="color:var(--cy)" id="ytTrends"></div></div>
<div class="status-item"><div class="label">Jobs</div><div class="value" style="color:var(--or)" id="ytJobs"></div></div>
<div class="status-item"><div class="label">Completed</div><div class="value" style="color:var(--gn)" id="ytDone"></div></div>
<div class="status-item"><div class="label">Channels</div><div class="value" id="ytChannels"></div></div>
</div>
</div>
<div class="cd">
<div class="cd-h"><h3>🎯 Ads Commander</h3><span class="badge b-pu" id="adsBadge"></span></div>
<div class="status-grid">
<div class="status-item"><div class="label">Campaigns</div><div class="value" style="color:var(--ac)" id="adCampaigns"></div></div>
<div class="status-item"><div class="label">Decisions</div><div class="value" style="color:var(--or)" id="adDecisions"></div></div>
<div class="status-item"><div class="label">Avg ROAS</div><div class="value" style="color:var(--gn)" id="adRoas"></div></div>
<div class="status-item"><div class="label">Ad Accounts</div><div class="value" id="adAccounts"></div></div>
</div>
</div>
</div>
<!-- QUICK LINKS -->
<div class="section-title">🔗 Quick Links</div>
<div style="display:flex;gap:10px;flex-wrap:wrap;margin-bottom:20px">
<a href="onboarding-engine.html" class="btn btn-s" style="text-decoration:none">🔥 Optimisation</a>
<a href="office-admins.html" class="btn btn-s" style="text-decoration:none">📧 O365</a>
<a href="office-checker.html" class="btn btn-s" style="text-decoration:none">✅ Health Check</a>
<a href="youtube-factory.html" class="btn btn-s" style="text-decoration:none">🎬 YouTube</a>
<a href="ads-commander.html" class="btn btn-s" style="text-decoration:none">🎯 Ads</a>
<a href="affiliate-monitor.html" class="btn btn-s" style="text-decoration:none">🤝 Affiliates</a>
<a href="sentinel-v4.html" class="btn btn-s" style="text-decoration:none">🛡️ Sentinel</a>
<a href="chef-boss.html" class="btn btn-s" style="text-decoration:none">👨‍🍳 Chef BOSS</a>
<a href="supply-chain.html" class="btn btn-s" style="text-decoration:none">🔗 Supply Chain</a>
</div>
</div>
<div class="toast" id="toast"></div>
<script>
async function api(url){try{const r=await fetch(url);return await r.json()}catch(e){return null}}
async function loadAll(){
document.getElementById('lastUpdate').textContent=new Date().toLocaleTimeString();
// Optimisation Engine
const w=await api('/api/optimisation-engine.php?action=status');
if(w){
const s=w.stats||w;
const total=(s.onboarding||0)+(s.certifiés||0)+(s.pending||0)+(s.paused||0);
document.getElementById('mOnboarding').textContent=(s.onboarding||0).toLocaleString();
document.getElementById('mOnboardingSub').textContent=`${s.certifiés||0} certifiés`;
document.getElementById('wTotal').textContent=total.toLocaleString();
document.getElementById('wOnboarding').textContent=(s.onboarding||0).toLocaleString();
document.getElementById('wGrad').textContent=(s.certifiés||0).toLocaleString();
document.getElementById('wCap').textContent=(s.total_capacity||s.daily_capacity||0).toLocaleString();
document.getElementById('optimisationBadge').textContent=`${s.onboarding||0} active`;
document.getElementById('mSent').textContent=(s.sent_today||0).toLocaleString();
document.getElementById('mSentSub').textContent=`cap: ${(s.total_capacity||0).toLocaleString()}`;
// Funnel
document.getElementById('fSent').textContent=(s.sent_today||0).toLocaleString();
// Provider chart
if(w.providers||s.providers){
const provs=w.providers||s.providers;
const entries=Array.isArray(provs)?provs:Object.entries(provs).map(([k,v])=>({provider:k,count:v}));
const mx=Math.max(...entries.map(p=>p.count||0),1);
entries.sort((a,b)=>(b.count||0)-(a.count||0));
let h='';entries.slice(0,10).forEach(p=>{
const pct=Math.round((p.count||0)/mx*100);
h+=`<div class="progress-row"><span class="progress-label">${p.provider||p.account_type||'?'}</span><div class="bar"><div class="bar-fill" style="width:${pct}%;background:var(--ac)"></div></div><span class="progress-val">${(p.count||0).toLocaleString()}</span></div>`;
});
document.getElementById('providerChart').innerHTML=h||'<div style="color:var(--d)">No data</div>';
}
}
// Office Admins
const o=await api('/api/office-admins.php?action=stats');
if(o){
document.getElementById('mAccounts').textContent=(o.total||0).toLocaleString();
document.getElementById('mAccountsSub').textContent=`${o.active||0} active`;
document.getElementById('oTotal').textContent=(o.total||0).toLocaleString();
document.getElementById('oActive').textContent=(o.active||0).toLocaleString();
document.getElementById('oHealthy').textContent=(o.healthy||o.active||0).toLocaleString();
document.getElementById('oFlagged').textContent=(o.flagged||o.error||0).toLocaleString();
document.getElementById('o365Badge').textContent=`${o.total||0} accounts`;
}
// Office Checker
const oc=await api('/api/office-checker.php?action=stats');
if(oc){
if(!o){
document.getElementById('oTotal').textContent=(oc.total||0).toLocaleString();
document.getElementById('oActive').textContent=(oc.active||oc.valid||0).toLocaleString();
}
}
// Tracking data (opens/clicks from tracking tables)
const t=await api('/api/brain-analyze.php?action=status');
if(t){
const opens=t.opens_24h||t.total_opens||0;
const clicks=t.clicks_24h||t.total_clicks||0;
document.getElementById('mOpens').textContent=opens.toLocaleString();
document.getElementById('mOpensSub').textContent='24h tracking';
document.getElementById('mClicks').textContent=clicks.toLocaleString();
document.getElementById('mClicksSub').textContent='24h tracking';
document.getElementById('fOpens').textContent=opens.toLocaleString();
document.getElementById('fClicks').textContent=clicks.toLocaleString();
const sent=parseInt(document.getElementById('fSent').textContent.replace(/,/g,''))||0;
if(sent>0){
document.getElementById('fDelivered').textContent=Math.round(sent*0.95).toLocaleString();
document.getElementById('fDelRate').textContent=`95%`;
document.getElementById('fOpenRate').textContent=sent>0?((opens/sent*100).toFixed(1)+'%'):'—';
document.getElementById('fClickRate').textContent=opens>0?((clicks/opens*100).toFixed(1)+'%'):'—';
}
document.getElementById('fConv').textContent='0';
document.getElementById('fConvRate').textContent='—';
// Brain winners
if(t.winners||t.brain_winners){
const winners=t.winners||t.brain_winners||[];
document.getElementById('mBrain').textContent=Array.isArray(winners)?winners.length:(winners||0);
document.getElementById('mBrainSub').textContent='ISP combos';
let h='';
const wArr=Array.isArray(winners)?winners:[];
wArr.slice(0,8).forEach(w=>{
const inbox=w.inbox_rate||w.inbox_pct||0;
const clr=inbox>=90?'var(--gn)':inbox>=70?'var(--or)':'var(--rd)';
h+=`<tr><td style="font-weight:600">${w.isp||w.provider||'—'}</td><td style="font-family:var(--m);font-size:11px">${w.method||w.config||'—'}</td><td style="font-family:var(--m);color:${clr}">${inbox}%</td><td style="font-family:var(--m)">${w.tests||w.count||0}</td><td><span class="badge b-ok">✓ Winner</span></td></tr>`;
});
document.getElementById('brainTable').innerHTML=h||'<tr><td colspan="5" style="text-align:center;color:var(--d);padding:20px">No winners yet</td></tr>';
}
}
// YouTube Factory
const yt=await api('/api/youtube-factory/api.php?action=status');
if(yt){
document.getElementById('ytTrends').textContent=(yt.trends||yt.total_trends||0).toLocaleString();
document.getElementById('ytJobs').textContent=(yt.jobs||yt.total_jobs||0).toLocaleString();
document.getElementById('ytDone').textContent=(yt.completed||yt.completed_today||0).toLocaleString();
document.getElementById('ytChannels').textContent=(yt.channels||0).toLocaleString();
document.getElementById('ytBadge').textContent=`${yt.jobs||0} jobs`;
}
// Ads Commander
const ad=await api('/api/ads-commander/api/ads-api.php?action=status');
if(!ad){
const ad2=await api('/api/ads-commander-api.php?action=status');
if(ad2) Object.assign(ad||{},ad2);
}
if(ad){
document.getElementById('adCampaigns').textContent=(ad.campaigns||0).toLocaleString();
document.getElementById('adDecisions').textContent=(ad.decisions||ad.total_decisions||0).toLocaleString();
document.getElementById('adRoas').textContent=(ad.avg_roas||'0')+'x';
document.getElementById('adAccounts').textContent=(ad.accounts||ad.total_accounts||0).toLocaleString();
document.getElementById('adsBadge').textContent=`${ad.campaigns||0} campaigns`;
}
// Sponsors
const sp=await api('/api/affiliate-monitor.php?action=status');
if(sp){
document.getElementById('spNetworks').textContent=(sp.networks||sp.sponsors||0).toLocaleString();
document.getElementById('spOffers').textContent=(sp.offers||sp.total_offers||0).toLocaleString();
document.getElementById('spRevenue').textContent='$'+(sp.revenue||0).toLocaleString();
document.getElementById('spClicks').textContent=(sp.clicks||sp.total_clicks||0).toLocaleString();
document.getElementById('sponsorBadge').textContent=`${sp.networks||sp.sponsors||0} networks`;
}
}
loadAll();
setInterval(loadAll,60000);
</script><script src="arsenal-common.js?v1770778169">
<div style="display:flex;gap:2rem;justify-content:center;flex-wrap:wrap;padding:1.5rem 4%;background:rgba(255,255,255,.02);border-top:1px solid rgba(255,255,255,.04);margin:2rem 0"><div style="display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5"><strong style="color:#edf2f7">44</strong> produits SaaS</div><div style="display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5"><strong style="color:#edf2f7">Cloud</strong> souverain</div><div style="display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5"><strong style="color:#edf2f7">API</strong> REST</div><div style="display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5"><strong style="color:#edf2f7">RGPD</strong> conforme</div><div style="display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5"><strong style="color:#edf2f7">France</strong> · Maroc · États-Unis · International</div></div>
</body></html>
</script>