auto-sync-0245

This commit is contained in:
opus
2026-04-18 02:45:01 +02:00
parent d813008589
commit b5ef6e2000
5 changed files with 462 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-18T02:35:01.707830",
"generated_at": "2026-04-18T02:45:01.262935",
"stats": {
"total": 47,
"pending": 57,

View File

@@ -70,6 +70,7 @@ $modules = [
'color' => '#10b981',
'tagline' => 'CRM, leads, opportunities, pipeline, candidates',
'submodules' => [
['id' => 'sales_hub', 'label' => '🚀 Sales Hub (V72)', 'desc' => 'Cockpit commercial: opps urgent + SDR messages + ROI Simulator + Board Pack + pitch + templates', 'pages' => ['sales-hub.html', 'pitch.html'], 'apis' => ['/api/wevia-v72-intents-include.php', '/api/v72-sdr-outreach.sh', '/api/v72-pipeline-status.sh'], 'downloads' => ['/downloads/weval-board-pack-2026-04-18.pdf', '/downloads/weval-sdr-outreach-20260418.md']],
['id' => 'crm_maison', 'label' => 'CRM Maison', 'desc' => 'Schema PG crm sur S204 + CRM subdomain', 'pages' => ['crm.html', 'crm-audit.html', 'crm-dashboard-live.html', 'crm-pipeline-live.html'], 'apis' => ['https://crm.weval-consulting.com/']],
['id' => 'twenty_crm', 'label' => 'Twenty CRM OSS', 'desc' => 'Docker twenty + twenty-redis', 'apis' => ['http://127.0.0.1:3000/'], 'docker' => 'twenty'],
['id' => 'candidates_pool', 'label' => 'Candidates Pool', 'desc' => 'Recruteurs, talents', 'pages' => ['candidates-pool.html', 'candidate-detail.html', 'consultants-list.html']],

View File

@@ -1,29 +1,33 @@
<?php
// V72 — Commercial intents (SDR / Pitch / Board / Pipeline)
// Included by wevia-sse-orchestrator.php
// V72 — Commercial intents V2 (simplifiés)
if (!isset($msg) || !isset($intents)) return;
// INTENT: outreach_daily → regenerate daily outreach messages from V71 opps
// SDR outreach
if (preg_match('/\b(outreach|sdr|linkedin.?message|daily.?outreach|cold.?outreach|messages?.?linkedin|contact.*prospects?)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_outreach_daily', 'cmd'=>'bash /var/www/html/api/v72-sdr-outreach.sh && echo --- && ls -la /var/www/html/downloads/weval-sdr-outreach-$(date +%Y%m%d).md && echo --- && echo "URL: https://weval-consulting.com/downloads/weval-sdr-outreach-$(date +%Y%m%d).md"'];
$intents[] = ['id'=>'v72_outreach_daily', 'cmd'=>'bash /var/www/html/api/v72-sdr-outreach.sh 2>&1 | tail -5 && echo "URL: https://weval-consulting.com/downloads/weval-sdr-outreach-$(date +%Y%m%d).md"'];
}
// INTENT: show_pitch → confirm pitch page live + stats
if (preg_match('/\b(pitch|landing|hero.?page|one.?screen|page.?commercial)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_pitch_status', 'cmd'=>'echo "PITCH: https://weval-consulting.com/pitch.html" && curl -sk --max-time 4 -o /dev/null -w "HTTP:%{http_code} size:%{size_download}\\n" https://weval-consulting.com/pitch.html'];
// Pitch page
if (preg_match('/\b(pitch|landing|hero.?page|one.?screen|page.?commercial|sell.?page)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_pitch_status', 'cmd'=>'bash /var/www/html/api/v72-pitch-check.sh'];
}
// INTENT: show_board_pack → share board pack PDF
if (preg_match('/\b(board.?pack|slides?.?board|pdf.?board|5.?slides|pack.?ceo|presentation)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_board_pack', 'cmd'=>'ls -la /var/www/html/downloads/weval-board-pack*.pdf 2>/dev/null | tail -1 && echo "URL: https://weval-consulting.com/downloads/weval-board-pack-2026-04-18.pdf"'];
// Board pack
if (preg_match('/\b(board.?pack|board|slides?|pdf.?pack|pack.?ceo|presentation|deck)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_board_pack', 'cmd'=>'bash /var/www/html/api/v72-board-check.sh'];
}
// INTENT: show_pipeline → quick pipeline status (opps + alerts DG)
// Pipeline status
if (preg_match('/\b(pipeline|opportunities?|opps?|pipeline.?commercial|deals|pipe.?status)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_pipeline_status', 'cmd'=>'curl -sk --max-time 4 http://127.0.0.1:5890/api/wevia-v71-intelligence-growth.php -H "Host: weval-consulting.com" 2>/dev/null | python3 -c "import json,sys;d=json.load(sys.stdin);s=d[\"summary\"];print(f\"PIPELINE: {s[\"opportunities_total_value_keur\"]}k€ · {s[\"opportunities_high_urgency\"]} urgent\");[print(\" \"+o[\"urgency\"].upper()+\" \"+o[\"id\"]+\": \"+o[\"signal\"][:60]+\" (\"+str(o[\"estimated_value_keur\"])+\"k€)\") for o in sorted(d[\"opportunities_watch\"][\"opportunities\"], key=lambda x: {\"critical\":0,\"high\":1,\"medium\":2}.get(x[\"urgency\"],3))]"'];
$intents[] = ['id'=>'v72_pipeline_status', 'cmd'=>'bash /var/www/html/api/v72-pipeline-status.sh'];
}
// INTENT: show_stop_build → reminder of P1 recommendation
if (preg_match('/\b(stop.?build|start.?sell|sell.?mode|mode.?commercial|priorit[eé].?commerciale?)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_stop_build_reminder', 'cmd'=>'echo "=== MODE SELL — Rappel Opus ===" && echo "P1: Contacter 4 urgent = 1.1M€" && echo " 🔴 Marjane SAP RFP (150k€) CRITICAL" && echo " 🟡 CTO OCP (380k€) warm intro Vistex" && echo " 🟡 Attijariwafa AI (450k€) LinkedIn direct" && echo " 🟡 Ex-Ethica CTO → Sanofi (280k€) warm" && echo "" && echo "Tools prêts:" && echo " 📅 /pitch.html — landing 1 écran" && echo " 🧮 /agent-roi-simulator.html — ROI live" && echo " 📊 /downloads/weval-board-pack-2026-04-18.pdf" && echo " 💬 /downloads/weval-sdr-outreach-$(date +%Y%m%d).md"'];
// Stop build / Start sell
if (preg_match('/\b(stop.?build|start.?sell|sell.?mode|mode.?commercial|mode.?sell|priorit[eé].?commerciale?|passe.?en.?sell|bascule.?sell)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_stop_build_reminder', 'cmd'=>'bash /var/www/html/api/v72-stop-build.sh'];
}
// Sales Hub (new nav module)
if (preg_match('/\b(sales.?hub|hub.?sales|hub.?commercial|sell.?hub|commercial.?center)\b/iu', $msg)) {
$intents[] = ['id'=>'v72_sales_hub_status', 'cmd'=>'bash /var/www/html/api/v72-sales-hub.sh'];
}

View File

@@ -1,4 +1,4 @@
# WEVAL SDR — Outreach daily (2026-04-18 02:32)
# WEVAL SDR — Outreach daily (2026-04-18 02:40)
**Source** : V71 Opportunities Watch · 7 opportunities tracked
**Doctrine** : Messages générés pour review Yacine · ZERO send auto · Copy-paste manuel

440
sales-hub.html Normal file
View File

@@ -0,0 +1,440 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>WEVAL · Sales Hub — Tout piloter depuis ici</title>
<style>
:root{--bg-0:#05060a;--bg-1:#0b0d15;--bg-2:#11141f;--bg-3:#171b2a;--border:rgba(99,102,241,0.18);--border-h:rgba(99,102,241,0.38);--text:#e2e8f0;--dim:#94a3b8;--mute:#64748b;--accent:#14b8a6;--accent2:#6366f1;--purple:#a855f7;--cyan:#06b6d4;--ok:#22c55e;--warn:#f59e0b;--err:#ef4444;--rose:#f43f5e;--gold:#eab308}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Inter',system-ui,sans-serif;background:radial-gradient(ellipse at top,#0f1420,#05060a 60%);color:var(--text);min-height:100vh;font-size:13px;line-height:1.5}
.container{max-width:1760px;margin:0 auto;padding:22px 26px 80px}
/* Header */
header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:14px;border-bottom:1px solid var(--border)}
h1{font-size:24px;font-weight:800;background:linear-gradient(90deg,#22d3ee,#a855f7,#eab308);-webkit-background-clip:text;background-clip:text;color:transparent}
.sub{color:var(--dim);font-size:12.5px;margin-top:4px}
.clock{font-family:'JetBrains Mono',monospace;color:var(--accent);font-size:11px;margin-top:3px}
.actions{display:flex;gap:8px}
.btn{padding:7px 13px;background:var(--bg-2);border:1px solid var(--border);color:var(--text);border-radius:8px;font-size:11.5px;cursor:pointer;text-decoration:none;font-family:inherit;transition:all .2s}
.btn:hover{border-color:var(--accent);color:var(--accent)}
.pulse{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 0 rgba(34,197,94,.7);animation:pulse 2s infinite;margin-right:6px}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(34,197,94,.7)}70%{box-shadow:0 0 0 8px rgba(34,197,94,0)}}
/* Priority strip */
.prio-banner{background:linear-gradient(135deg,rgba(239,68,68,0.1),rgba(245,158,11,0.08));border:1px solid rgba(239,68,68,0.3);border-radius:12px;padding:14px 18px;margin-bottom:18px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}
.prio-banner .title{font-weight:800;color:#fca5a5;font-size:13px}
.prio-banner .stat{font-size:22px;font-weight:800;color:var(--gold);font-family:'JetBrains Mono',monospace}
.prio-banner .sub{color:var(--dim);font-size:11.5px}
/* KPI strip */
.kpi-strip{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-bottom:18px}
@media(max-width:1100px){.kpi-strip{grid-template-columns:repeat(2,1fr)}}
.kpi{background:var(--bg-1);border:1px solid var(--border);border-radius:10px;padding:13px 15px;border-left:3px solid var(--accent)}
.kpi.gold{border-left-color:var(--gold)}
.kpi.danger{border-left-color:var(--err)}
.kpi.cyan{border-left-color:var(--cyan)}
.kpi.purple{border-left-color:var(--purple)}
.kpi-lbl{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:0.5px;font-weight:600}
.kpi-val{font-size:22px;font-weight:800;margin-top:4px;line-height:1;font-family:'JetBrains Mono',monospace}
.kpi-val.gold{background:linear-gradient(135deg,var(--gold),var(--warn));-webkit-background-clip:text;background-clip:text;color:transparent}
.kpi-sub{font-size:10px;color:var(--mute);margin-top:2px}
/* Main layout */
.layout{display:grid;grid-template-columns:1.3fr 1fr;gap:16px}
@media(max-width:1200px){.layout{grid-template-columns:1fr}}
/* Card */
.card{background:var(--bg-1);border:1px solid var(--border);border-radius:12px;padding:16px;margin-bottom:16px}
.card-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid var(--bg-3)}
.card-title{font-size:14px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:8px}
.card-badge{font-size:10px;padding:3px 8px;border-radius:8px;font-weight:700;background:rgba(20,184,166,0.15);color:#5eead4}
.card-badge.gold{background:rgba(234,179,8,0.18);color:#fde047}
.card-badge.danger{background:rgba(239,68,68,0.2);color:#fca5a5}
/* Opps urgent cards */
.opps-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
@media(max-width:900px){.opps-grid{grid-template-columns:1fr}}
.opp{background:var(--bg-2);border-radius:10px;padding:14px;border-left:3px solid var(--dim);transition:all .2s}
.opp.critical{border-left-color:var(--err);background:linear-gradient(135deg,rgba(239,68,68,0.06),var(--bg-2))}
.opp.high{border-left-color:var(--warn)}
.opp:hover{transform:translateY(-2px);border-color:var(--border-h)}
.opp-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px}
.opp-src{font-size:9.5px;padding:1px 6px;border-radius:4px;background:rgba(168,85,247,0.15);color:#d4a7fa;text-transform:uppercase;letter-spacing:0.3px;font-weight:700}
.opp-val{font-family:'JetBrains Mono',monospace;font-size:15px;font-weight:800;background:linear-gradient(135deg,var(--gold),var(--warn));-webkit-background-clip:text;background-clip:text;color:transparent}
.opp-signal{font-weight:600;font-size:12.5px;color:var(--text);margin-top:6px}
.opp-action{font-size:11px;color:var(--dim);margin-top:4px;line-height:1.4}
.opp-action::before{content:'→ ';color:var(--accent)}
.opp-cta{display:flex;gap:6px;margin-top:10px}
.opp-cta a,.opp-cta button{padding:5px 10px;background:var(--bg-3);border:1px solid var(--border);color:var(--text);border-radius:5px;font-size:10.5px;cursor:pointer;text-decoration:none;font-family:inherit;transition:all .2s}
.opp-cta a:hover,.opp-cta button:hover{border-color:var(--accent);color:var(--accent)}
.opp-cta .primary{background:linear-gradient(135deg,var(--accent),var(--cyan));color:white;border:none;font-weight:600}
/* Quick actions */
.qa-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
@media(max-width:800px){.qa-grid{grid-template-columns:1fr 1fr}}
.qa{background:var(--bg-2);border-radius:10px;padding:12px;border-top:2px solid var(--accent);transition:all .2s;cursor:pointer;text-decoration:none;color:var(--text);display:block}
.qa:hover{background:var(--bg-3);transform:translateY(-2px)}
.qa.gold{border-top-color:var(--gold)}
.qa.purple{border-top-color:var(--purple)}
.qa.cyan{border-top-color:var(--cyan)}
.qa-icon{font-size:24px;margin-bottom:6px}
.qa-title{font-size:13px;font-weight:700;color:var(--text);margin-bottom:3px}
.qa-desc{font-size:11px;color:var(--dim);line-height:1.4}
/* SDR messages preview */
.sdr-msg{background:var(--bg-2);border-radius:8px;padding:10px 12px;margin-bottom:6px;border-left:2px solid var(--cyan);cursor:pointer;transition:all .2s}
.sdr-msg:hover{background:var(--bg-3);border-left-color:var(--accent)}
.sdr-head{display:flex;justify-content:space-between;font-size:11px}
.sdr-target{font-weight:700;color:var(--text)}
.sdr-val{color:var(--gold);font-family:'JetBrains Mono',monospace;font-weight:700}
.sdr-preview{font-size:10.5px;color:var(--dim);margin-top:4px;line-height:1.4;max-height:3em;overflow:hidden}
/* Templates */
.tpl{background:var(--bg-2);border-radius:8px;padding:12px;margin-bottom:8px}
.tpl-head{font-weight:700;color:var(--accent);font-size:11.5px;margin-bottom:6px;text-transform:uppercase;letter-spacing:0.4px}
.tpl-body{font-size:11px;color:var(--dim);line-height:1.5;white-space:pre-line;font-family:'JetBrains Mono',monospace;background:var(--bg-3);padding:8px 10px;border-radius:5px;max-height:200px;overflow:auto}
.tpl-copy{background:var(--accent);color:white;border:none;padding:5px 10px;border-radius:5px;font-size:10.5px;cursor:pointer;margin-top:6px;font-family:inherit;font-weight:600;transition:all .2s}
.tpl-copy:hover{background:var(--cyan)}
.tpl-copy.copied{background:var(--ok)}
/* Iframe roi */
.roi-wrap{position:relative;background:var(--bg-2);border-radius:10px;overflow:hidden}
.roi-frame{width:100%;height:540px;border:none;display:block}
/* Stats table */
.stats-tbl{width:100%;border-collapse:collapse;font-size:11.5px}
.stats-tbl td{padding:6px 8px;border-bottom:1px solid var(--bg-3)}
.stats-tbl td:first-child{color:var(--dim);width:60%}
.stats-tbl td:last-child{color:var(--text);font-family:'JetBrains Mono',monospace;font-weight:700;text-align:right}
/* Loading */
.loading{text-align:center;padding:30px;color:var(--dim)}
.spinner{width:32px;height:32px;border:3px solid var(--bg-3);border-top-color:var(--accent);border-radius:50%;margin:0 auto 10px;animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* Toast */
.toast{position:fixed;bottom:20px;right:20px;background:var(--ok);color:white;padding:10px 18px;border-radius:8px;font-size:12px;font-weight:700;z-index:1000;opacity:0;transition:opacity .3s;pointer-events:none;box-shadow:0 4px 20px rgba(34,197,94,0.3)}
.toast.show{opacity:1}
</style>
</head>
<body>
<div class="container">
<header>
<div>
<h1><span class="pulse"></span>💼 Sales Hub — Tout piloter depuis ici</h1>
<div class="sub">Opportunities urgent · SDR messages prêts · ROI Simulator · Board Pack · Templates · Pipeline live</div>
<div class="clock" id="clock"></div>
</div>
<div class="actions">
<a href="/weval-technology-platform.html" class="btn">🏠 WTP</a>
<a href="/dg-command-center.html" class="btn">🎖 DG Center</a>
<a href="/intelligence-growth.html" class="btn">🌐 Intel&Growth</a>
<a href="/pitch.html" class="btn" target="_blank">📄 Pitch public</a>
<button class="btn" onclick="load()"></button>
</div>
</header>
<!-- PRIO BANNER -->
<div class="prio-banner">
<div>
<div class="title">🚨 PRIORITÉ ABSOLUE — Cette semaine</div>
<div class="sub" style="margin-top:3px">Contacter les 4 opportunities urgent. Utiliser le ROI Simulator en discovery.</div>
</div>
<div style="text-align:right">
<div class="stat" id="urgent-val"></div>
<div class="sub">pipeline urgent à activer</div>
</div>
</div>
<!-- KPI STRIP -->
<div class="kpi-strip">
<div class="kpi gold"><div class="kpi-lbl">💰 Pipeline total</div><div class="kpi-val gold" id="k-pipe"></div><div class="kpi-sub">opps watch</div></div>
<div class="kpi danger"><div class="kpi-lbl">🔴 Urgent</div><div class="kpi-val" id="k-urg"></div><div class="kpi-sub">critical + high</div></div>
<div class="kpi cyan"><div class="kpi-lbl">💬 Messages SDR prêts</div><div class="kpi-val" id="k-sdr"></div><div class="kpi-sub">copy-paste manuel</div></div>
<div class="kpi purple"><div class="kpi-lbl">🎖 Competitors trackés</div><div class="kpi-val" id="k-comp"></div><div class="kpi-sub">DarkScout live</div></div>
<div class="kpi"><div class="kpi-lbl">⚡ Innovations 24h</div><div class="kpi-val" id="k-innov"></div><div class="kpi-sub">WEVL Predict</div></div>
</div>
<!-- QUICK ACTIONS -->
<div class="card">
<div class="card-head"><div class="card-title">⚡ Quick Actions</div><div class="card-badge">6 assets prêts</div></div>
<div class="qa-grid">
<a href="/pitch.html" target="_blank" class="qa gold">
<div class="qa-icon">📄</div>
<div class="qa-title">Pitch 1 écran</div>
<div class="qa-desc">Landing page prospect · V67 simulator embedded</div>
</a>
<a href="/agent-roi-simulator.html" target="_blank" class="qa">
<div class="qa-icon">🧮</div>
<div class="qa-title">ROI Simulator</div>
<div class="qa-desc">Discovery call live · scaling par prospect</div>
</a>
<a href="/downloads/weval-board-pack-2026-04-18.pdf" target="_blank" class="qa purple">
<div class="qa-icon">📊</div>
<div class="qa-title">Board Pack PDF</div>
<div class="qa-desc">5 slides · Problème · Solution · Différenciateurs</div>
</a>
<a href="#" class="qa cyan" onclick="loadSDR();return false;">
<div class="qa-icon">💬</div>
<div class="qa-title">Messages SDR</div>
<div class="qa-desc">7 messages personnalisés · copy-paste manuel</div>
</a>
<a href="/pain-points-atlas.html" target="_blank" class="qa">
<div class="qa-icon">🗺️</div>
<div class="qa-title">Pain Points Atlas</div>
<div class="qa-desc">25 ERPs · 35 pain points · commercial assets</div>
</a>
<a href="/erp-gap-fill-offer.html" target="_blank" class="qa gold">
<div class="qa-icon">💰</div>
<div class="qa-title">Offre ERP Gap-Fill</div>
<div class="qa-desc">Matrice 5×5 · 4 services pricing · 7 verticaux</div>
</a>
</div>
</div>
<!-- MAIN LAYOUT -->
<div class="layout">
<div>
<!-- OPPS URGENT -->
<div class="card">
<div class="card-head">
<div class="card-title">🎯 Opportunities Urgent — Action cette semaine</div>
<div class="card-badge danger" id="opps-count"></div>
</div>
<div class="opps-grid" id="opps-grid"><div class="loading"><div class="spinner"></div></div></div>
</div>
<!-- ROI SIMULATOR inline -->
<div class="card">
<div class="card-head"><div class="card-title">🧮 ROI Simulator (interactif) — partager écran en call</div><div class="card-badge">iframe live</div></div>
<div class="roi-wrap">
<iframe class="roi-frame" src="/agent-roi-simulator.html" loading="lazy"></iframe>
</div>
</div>
<!-- Templates -->
<div class="card">
<div class="card-head"><div class="card-title">📧 Email Templates WEVAL</div><div class="card-badge">3 prêts</div></div>
<div id="templates"></div>
</div>
</div>
<div>
<!-- SDR preview -->
<div class="card">
<div class="card-head">
<div class="card-title">💬 Messages SDR du jour</div>
<div class="card-badge" id="sdr-count"></div>
</div>
<div style="font-size:10.5px;color:var(--dim);margin-bottom:10px;padding:6px 10px;background:rgba(234,179,8,0.08);border-radius:4px">⚠️ Doctrine : copy-paste manuel · ZERO send auto · personnalisation 1 phrase obligatoire</div>
<div id="sdr-list"><div class="loading"><div class="spinner"></div></div></div>
<div style="margin-top:10px;text-align:center">
<a href="/downloads/weval-sdr-outreach-20260418.md" target="_blank" style="color:var(--accent);font-size:11.5px;font-weight:700;text-decoration:none">📄 Voir fichier complet des messages →</a>
</div>
</div>
<!-- Commercial stats -->
<div class="card">
<div class="card-head"><div class="card-title">📊 Commercial Live Stats</div><div class="card-badge">auto-refresh 60s</div></div>
<table class="stats-tbl" id="stats-tbl"></table>
</div>
<!-- DarkScout quick -->
<div class="card">
<div class="card-head"><div class="card-title">🎖 DarkScout — 3 threats majeures</div><div class="card-badge">live</div></div>
<div id="darkscout-top"></div>
<div style="margin-top:10px;text-align:center">
<a href="/intelligence-growth.html#darkscout" target="_blank" style="color:var(--accent);font-size:11.5px;font-weight:700;text-decoration:none">→ Voir les 8 compétiteurs complets</a>
</div>
</div>
</div>
</div>
</div>
<div class="toast" id="toast">Copié !</div>
<script>
const API_V71 = '/api/wevia-v71-intelligence-growth.php';
let DATA = null;
function clockTick(){const d=new Date();document.getElementById('clock').textContent=d.toLocaleDateString('fr-FR')+' · '+d.toLocaleTimeString('fr-FR')+' · auto-refresh 60s';}
setInterval(clockTick,1000); clockTick();
function fmt(n){if(!n&&n!==0)return'—';if(Math.abs(n)>=1000000)return(n/1000000).toFixed(1)+'M';if(Math.abs(n)>=1000)return(n/1000).toFixed(1)+'k';return Math.round(n);}
function toast(msg){const t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');setTimeout(()=>t.classList.remove('show'),2000);}
async function load(){
try {
const r = await fetch(API_V71+'?t='+Date.now());
DATA = await r.json();
render();
} catch(e) { console.error(e); }
}
function render(){
if(!DATA) return;
const s = DATA.summary;
// KPIs
document.getElementById('k-pipe').textContent = fmt(s.opportunities_total_value_keur*1000)+'€';
document.getElementById('k-urg').textContent = s.opportunities_high_urgency;
document.getElementById('k-sdr').textContent = s.opportunities_total_value_keur > 0 ? DATA.opportunities_watch.opportunities.length : 0;
document.getElementById('k-comp').textContent = s.competitors_tracked;
document.getElementById('k-innov').textContent = s.innovations_last_24h;
// Urgent pipeline value
const urgOpps = DATA.opportunities_watch.opportunities.filter(o=>['critical','high'].includes(o.urgency));
const urgVal = urgOpps.reduce((sum,o)=>sum+(o.estimated_value_keur||0),0);
document.getElementById('urgent-val').textContent = fmt(urgVal*1000)+'€';
// Opps urgent cards
document.getElementById('opps-count').textContent = urgOpps.length + ' urgent';
document.getElementById('opps-grid').innerHTML = urgOpps.map(o => `
<div class="opp ${o.urgency}">
<div class="opp-head">
<div class="opp-src">${o.source}</div>
<div class="opp-val">${o.estimated_value_keur ? fmt(o.estimated_value_keur*1000)+'€' : '—'}</div>
</div>
<div class="opp-signal">${o.signal}</div>
<div class="opp-action">${o.action}</div>
<div class="opp-cta">
<a href="https://www.linkedin.com/search/results/people/?keywords=${encodeURIComponent(o.signal)}" target="_blank">🔍 LinkedIn</a>
<button onclick="copyTpl('${o.id}','${o.source}')">📋 Message</button>
<a href="/pitch.html" target="_blank" class="primary">Envoyer pitch</a>
</div>
</div>
`).join('');
// SDR list (use V71 opps as source)
const allOpps = DATA.opportunities_watch.opportunities;
document.getElementById('sdr-count').textContent = allOpps.length + ' messages';
document.getElementById('sdr-list').innerHTML = allOpps.slice(0,7).map(o => `
<div class="sdr-msg" onclick="copyTpl('${o.id}','${o.source}')">
<div class="sdr-head">
<span class="sdr-target">${o.id} · ${o.signal.substring(0,40)}${o.signal.length>40?'...':''}</span>
<span class="sdr-val">${o.estimated_value_keur?fmt(o.estimated_value_keur*1000)+'€':'—'}</span>
</div>
<div class="sdr-preview">→ ${o.action} · Click pour copier le template</div>
</div>
`).join('');
// Stats tbl
const tpl = document.querySelector('.roi-frame').src;
document.getElementById('stats-tbl').innerHTML = `
<tr><td>Pipeline total</td><td>${fmt(s.opportunities_total_value_keur*1000)}€</td></tr>
<tr><td>Pipeline urgent (crit+high)</td><td>${fmt(urgVal*1000)}€</td></tr>
<tr><td>Opportunities totales</td><td>${allOpps.length}</td></tr>
<tr><td>Competitors DarkScout</td><td>${s.competitors_tracked}</td></tr>
<tr><td>Compétiteurs HIGH threat</td><td>${s.competitors_high_threat}</td></tr>
<tr><td>Innovations 24h</td><td>${s.innovations_last_24h}</td></tr>
<tr><td>Chatbots déployés</td><td>${s.chatbots_deployed}/${s.chatbots_total}</td></tr>
<tr><td>Agility agents gap</td><td>${s.agility_agents_gap} (${s.agility_fte_savings_year} FTE)</td></tr>
`;
// DarkScout top 3 high threat
const highThreat = DATA.darkscout_competitors.competitors.filter(c=>c.threat_level==='high').slice(0,3);
document.getElementById('darkscout-top').innerHTML = highThreat.map(c => `
<div style="background:var(--bg-2);border-radius:6px;padding:10px;margin-bottom:6px;border-left:3px solid var(--err)">
<div style="font-weight:700;font-size:12px">🎯 vs ${c.name}</div>
<div style="font-size:10.5px;color:#5eead4;margin-top:4px">${c.weval_differentiator}</div>
</div>
`).join('');
}
// Email templates (3 templates WEVAL)
const TEMPLATES = [
{
name: 'LinkedIn Intro Froid',
body: `Bonjour [Prénom],
[Signal spécifique à eux] — WEVAL a construit une plateforme de 35 agents IA souverains qui comblent exactement ce type de gap sur votre ERP.
3 points concrets :
• Déployé en 4 semaines (vs 12 mois Palantir)
• ROI contractuel : 17M€ savings/an (ref Ethica · 146k HCPs live)
• Souveraineté EU/Maghreb · 13 providers LLM
Simulateur ROI (2 min) : https://weval-consulting.com/agent-roi-simulator.html
30 min cette semaine ?
Yacine Mahboub
WEVAL Consulting · https://weval-consulting.com/pitch.html`
},
{
name: 'Email Follow-up RFP',
body: `Bonjour [Prénom],
J'ai vu votre appel d'offres [ERP/sujet] — WEVAL peut y répondre avec une approche différente :
• Pas de consulting facturé au jour-homme
• Agents métier prêts à plugger (35 au catalogue)
• Savings contractuels, pas estimés
• Déploiement 4 sem vs 6-12 mois standard
Je vous joins :
- Pitch 1 écran : https://weval-consulting.com/pitch.html
- Pain Points Atlas : https://weval-consulting.com/pain-points-atlas.html
- Board Pack 5 slides : https://weval-consulting.com/downloads/weval-board-pack-2026-04-18.pdf
30 min pour vous présenter le dossier ?
Yacine`
},
{
name: 'Warm Intro Referral',
body: `Bonjour [Prénom],
[Contact commun] m'a parlé de vos enjeux — rapidement :
WEVAL = 35 agents IA souverains compatibles SAP/Oracle/Sage/tous ERPs.
Savings documentés : 17M€/an par client. ROI 4 mois.
ROI Simulator direct : https://weval-consulting.com/agent-roi-simulator.html
Pitch complet : https://weval-consulting.com/pitch.html
Dispo 30 min quand vous voulez.
Yacine`
}
];
function renderTemplates(){
const wrap = document.getElementById('templates');
wrap.innerHTML = TEMPLATES.map((t,i) => `
<div class="tpl">
<div class="tpl-head">${t.name}</div>
<div class="tpl-body">${t.body}</div>
<button class="tpl-copy" onclick="copyToClipboard(\`${t.body.replace(/`/g,'\\`')}\`, this)">📋 Copier</button>
</div>
`).join('');
}
function copyToClipboard(text, btn){
navigator.clipboard.writeText(text).then(()=>{
if(btn){btn.textContent='✓ Copié';btn.classList.add('copied');setTimeout(()=>{btn.textContent='📋 Copier';btn.classList.remove('copied');},2000);}
toast('Copié dans le presse-papier');
});
}
function copyTpl(oppId, source){
const o = DATA.opportunities_watch.opportunities.find(x=>x.id===oppId);
if(!o) return;
const tpl = TEMPLATES[source==='Referral'?2:(source==='Web'?1:0)];
const msg = tpl.body.replace('[Signal spécifique à eux]', o.signal).replace('[ERP/sujet]', o.signal);
copyToClipboard(msg);
}
function loadSDR(){
window.open('/downloads/weval-sdr-outreach-20260418.md', '_blank');
}
renderTemplates();
load();
setInterval(load, 60000);
</script>
</body>
</html>