system-prompts-and-models-o.../dealix/landing/command-center.html
Sami Assiri e1c629bacf feat(dealix): role-based Revenue Command Cards API and factory
Add cards schema (max 3 buttons, forbidden automation patterns), deterministic card_factory per CEO/Sales/Growth/Agency/Support/Delivery, FastAPI routes GET /api/v1/cards/feed, GET whatsapp daily-brief (no auto-send), POST decision (draft_only). Wire router in main, extend smoke_inprocess, enrich command-center.html with role switcher + live feed. Tests: test_role_based_cards.py.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-02 16:05:57 +03:00

649 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ar" dir="rtl" data-theme="light">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Dealix Revenue Command Center — لوحة قيادة الإيرادات السعودية</title>
<meta name="description" content="لوحة قيادة واحدة لكل B2B السعودي — Growth Radar، Why-Now، Pipeline Autopilot، AI Agents، Revenue Leak Detector، Proof Pack، Compliance، Forecast." />
<meta name="theme-color" content="#0f172a" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+Arabic:wght@300;400;500;600;700&family=Inter:wght@400;500;600;700;800&display=swap" />
<style>
*{box-sizing:border-box;margin:0;padding:0}
:root{
--brand:#0f172a;--brand-2:#1e3a8a;--accent:#22d3ee;--accent-2:#06b6d4;
--success:#10b981;--warning:#f59e0b;--danger:#dc2626;
--muted:#64748b;--border:#e2e8f0;--bg:#f1f5f9;--card:#fff;
--gradient-primary:linear-gradient(135deg,#0f172a,#1e3a8a);
--gradient-accent:linear-gradient(135deg,#22d3ee,#0891b2);
--gradient-purple:linear-gradient(135deg,#8b5cf6,#6d28d9);
}
body{font-family:'IBM Plex Sans Arabic','Inter',sans-serif;background:var(--bg);color:var(--brand);line-height:1.6;min-height:100vh}
.topbar{background:var(--gradient-primary);color:#fff;padding:18px 32px;display:flex;align-items:center;justify-content:space-between;box-shadow:0 4px 20px rgba(15,23,42,0.15);position:sticky;top:0;z-index:100}
.topbar-left{display:flex;align-items:center;gap:14px}
.logo{width:36px;height:36px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.3);border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;color:var(--accent)}
.topbar h1{font-size:18px;font-weight:700;margin:0}
.topbar-stats{display:flex;gap:24px;font-size:13px}
.topbar-stat{display:flex;flex-direction:column;align-items:flex-start}
.topbar-stat .v{font-weight:700;color:var(--accent);font-size:16px}
.topbar-stat .l{opacity:0.85;font-size:11px}
.back{color:rgba(255,255,255,0.85);text-decoration:none;font-size:13px}
.back:hover{color:#fff}
.wrap{max-width:1500px;margin:0 auto;padding:24px}
.hero-strip{background:var(--card);border:1px solid var(--border);border-radius:18px;padding:24px 28px;margin-bottom:20px;display:grid;grid-template-columns:1fr auto;gap:24px;align-items:center}
.hero-strip h2{font-size:22px;color:var(--brand);margin:0 0 4px}
.hero-strip p{color:var(--muted);font-size:14px;margin:0}
.hero-strip .day{background:var(--gradient-primary);color:#fff;padding:10px 18px;border-radius:10px;font-weight:600;font-size:14px}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px}
.card{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:22px;transition:transform 0.2s,box-shadow 0.2s}
.card:hover{box-shadow:0 8px 24px rgba(15,23,42,0.06)}
.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px}
.card-title{display:flex;align-items:center;gap:10px}
.card-icon{width:38px;height:38px;border-radius:10px;background:var(--gradient-accent);display:flex;align-items:center;justify-content:center;color:#fff;font-size:18px;font-weight:700;flex-shrink:0}
.card-icon.purple{background:var(--gradient-purple)}
.card-icon.danger{background:linear-gradient(135deg,#ef4444,#b91c1c)}
.card-icon.warn{background:linear-gradient(135deg,#f59e0b,#b45309)}
.card-icon.success{background:linear-gradient(135deg,#10b981,#047857)}
.card-title h3{font-size:16px;font-weight:600;color:var(--brand);margin:0}
.card-tag{font-size:11px;font-weight:600;padding:4px 9px;border-radius:6px;text-transform:uppercase;letter-spacing:0.5px}
.tag-live{background:#ecfdf5;color:#047857}
.tag-new{background:#dbeafe;color:#1e40af}
.tag-hot{background:#fee2e2;color:#991b1b}
/* layout helpers */
.col-12{grid-column:span 12}
.col-8{grid-column:span 8}
.col-6{grid-column:span 6}
.col-4{grid-column:span 4}
.col-3{grid-column:span 3}
@media(max-width:1100px){
.col-8,.col-6,.col-4,.col-3{grid-column:span 12}
}
/* Growth Radar */
.radar-list{display:flex;flex-direction:column;gap:10px;max-height:380px;overflow-y:auto}
.radar-item{display:grid;grid-template-columns:auto 1fr auto;gap:14px;padding:12px;background:#f8fafc;border-radius:10px;align-items:center;border-right:3px solid var(--accent)}
.radar-item.high{border-color:var(--danger)}
.radar-item.medium{border-color:var(--warning)}
.radar-rank{font-weight:700;font-size:18px;color:var(--brand);width:32px;text-align:center}
.radar-body .name{font-weight:600;font-size:14px;color:var(--brand)}
.radar-body .why{font-size:12px;color:var(--muted);margin-top:2px}
.radar-score{text-align:center}
.radar-score .num{font-size:18px;font-weight:700;color:var(--brand)}
.radar-score .lbl{font-size:10px;color:var(--muted);text-transform:uppercase}
/* KPI strip */
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px}
.kpi{background:#f8fafc;border:1px solid var(--border);border-radius:12px;padding:18px;text-align:center}
.kpi .v{font-size:30px;font-weight:700;color:var(--brand)}
.kpi .l{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:0.5px;margin-top:4px}
.kpi .delta{font-size:12px;font-weight:600;margin-top:4px}
.kpi .delta.up{color:var(--success)}
.kpi .delta.down{color:var(--danger)}
/* Pipeline stages */
.pipeline{display:grid;grid-template-columns:repeat(11,1fr);gap:6px;align-items:end}
.stage{padding:10px 6px;background:#f8fafc;border-radius:8px;text-align:center;border-bottom:3px solid var(--accent)}
.stage .n{font-size:18px;font-weight:700;color:var(--brand)}
.stage .l{font-size:10px;color:var(--muted);margin-top:2px}
@media(max-width:900px){
.pipeline{grid-template-columns:repeat(4,1fr)}
}
/* Agents */
.agents-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}
.agent{background:#f8fafc;border:1px solid var(--border);border-radius:10px;padding:14px}
.agent .ico{font-size:22px;margin-bottom:6px}
.agent .nm{font-weight:700;font-size:13px;color:var(--brand)}
.agent .rl{font-size:11px;color:var(--muted);margin-top:2px;line-height:1.5}
.agent .badge{display:inline-block;font-size:9px;background:var(--accent);color:var(--brand);padding:2px 6px;border-radius:4px;margin-top:6px;font-weight:700;letter-spacing:0.5px;text-transform:uppercase}
.agent .badge.adv{background:#fef3c7;color:#92400e}
.agent .badge.appr{background:#ddd6fe;color:#5b21b6}
/* Leak detector */
.leak{display:grid;grid-template-columns:auto 1fr auto;gap:14px;padding:14px;background:#fef2f2;border:1px solid #fecaca;border-radius:10px;margin-bottom:10px;align-items:center}
.leak.medium{background:#fffbeb;border-color:#fde68a}
.leak.low{background:#f1f5f9;border-color:var(--border)}
.leak-sev{padding:4px 10px;border-radius:6px;font-size:11px;font-weight:700;text-transform:uppercase}
.leak-sev.critical{background:var(--danger);color:#fff}
.leak-sev.high{background:#dc2626;color:#fff}
.leak-sev.medium{background:#f59e0b;color:#fff}
.leak-sev.low{background:#64748b;color:#fff}
.leak-body .h{font-weight:600;font-size:14px;color:var(--brand)}
.leak-body .d{font-size:12px;color:#7f1d1d;margin-top:2px}
.leak-impact{text-align:center;color:var(--danger);font-weight:700;font-size:14px}
/* WhatsApp performance */
.wa-providers{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.wa-provider{padding:12px 8px;background:#f8fafc;border:1px solid var(--border);border-radius:10px;text-align:center}
.wa-provider .nm{font-weight:600;font-size:13px;color:var(--brand)}
.wa-provider .st{font-size:11px;margin-top:4px}
.wa-provider.healthy .st{color:var(--success)}
.wa-provider.degraded .st{color:var(--warning)}
.wa-provider.down .st{color:var(--danger)}
.wa-bar{margin-top:6px;height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden}
.wa-bar-fill{height:100%;background:var(--success);border-radius:2px}
/* Saudi map heatmap */
.map{background:linear-gradient(135deg,#0f172a,#1e3a8a);border-radius:14px;padding:20px;color:#fff;min-height:200px;display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.city{padding:14px 10px;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.15);border-radius:10px;text-align:center;cursor:pointer;transition:all 0.15s;position:relative;overflow:hidden}
.city:hover{background:rgba(255,255,255,0.1);transform:translateY(-2px)}
.city .nm{font-weight:600;font-size:13px;margin-bottom:4px}
.city .vl{font-size:18px;font-weight:700;color:var(--accent)}
.city .lvl{font-size:10px;opacity:0.7;margin-top:2px}
.city.hot::before{content:"";position:absolute;inset:0;background:radial-gradient(circle,rgba(220,38,38,0.25),transparent 60%);pointer-events:none}
.city.warm::before{content:"";position:absolute;inset:0;background:radial-gradient(circle,rgba(245,158,11,0.2),transparent 60%);pointer-events:none}
/* Forecast */
.forecast-row{display:flex;align-items:center;gap:14px;padding:10px 0;border-bottom:1px solid var(--border)}
.forecast-row:last-child{border-bottom:0}
.forecast-deal{flex:1}
.forecast-deal .n{font-weight:600;color:var(--brand);font-size:14px}
.forecast-deal .m{font-size:11px;color:var(--muted)}
.forecast-prob{width:80px;height:8px;background:#e2e8f0;border-radius:4px;overflow:hidden}
.forecast-prob-fill{height:100%;background:var(--gradient-accent);border-radius:4px}
.forecast-val{font-weight:700;color:var(--brand);font-size:14px;width:90px;text-align:left}
/* Health gauge */
.gauge{position:relative;width:160px;height:80px;margin:0 auto 12px;overflow:hidden}
.gauge svg{width:100%;display:block}
.gauge-val{position:absolute;bottom:0;left:50%;transform:translateX(-50%);text-align:center}
.gauge-val .v{font-size:32px;font-weight:700;color:var(--brand)}
.gauge-val .l{font-size:11px;color:var(--muted);margin-top:-4px}
/* Compliance gates */
.gates{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px}
.gate{padding:10px;background:#ecfdf5;border:1px solid #a7f3d0;border-radius:8px;font-size:12px;color:#047857;text-align:center;font-weight:600}
.gate.warn{background:#fffbeb;border-color:#fde68a;color:#92400e}
/* Action ribbon */
.actions-ribbon{background:var(--gradient-primary);color:#fff;border-radius:16px;padding:24px;margin-top:20px}
.actions-ribbon h3{margin:0 0 14px;font-size:18px}
.actions-list{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.action-card{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.15);border-radius:10px;padding:14px}
.action-card .num{display:inline-block;width:24px;height:24px;background:var(--accent);color:var(--brand);border-radius:50%;text-align:center;line-height:24px;font-weight:700;font-size:12px;margin-bottom:6px}
.action-card .h{font-weight:600;font-size:14px}
.action-card .d{font-size:12px;opacity:0.85;margin-top:3px}
@media(max-width:900px){.actions-list{grid-template-columns:1fr}}
/* Disclaimer */
.disclaimer{background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:16px;margin-top:20px;font-size:13px;color:#92400e;line-height:1.7}
.disclaimer strong{color:#713f12}
</style>
</head>
<body>
<div class="topbar">
<div class="topbar-left">
<div class="logo">D</div>
<div>
<h1>Dealix Revenue Command Center</h1>
<div style="font-size:12px;opacity:0.85">شركة المثال للتطوير العقاري · الرياض</div>
</div>
</div>
<div class="topbar-stats">
<div class="topbar-stat"><span class="v">1.2M ريال</span><span class="l">Pipeline هذا الشهر</span></div>
<div class="topbar-stat"><span class="v">14</span><span class="l">اجتماع محجوز</span></div>
<div class="topbar-stat"><span class="v">7.4×</span><span class="l">عائد على Dealix</span></div>
<a href="/" class="back">← العودة للموقع</a>
<a href="command-center-en.html" class="back" hreflang="en" style="margin-inline-start:10px">English</a>
</div>
</div>
<div class="wrap">
<div class="hero-strip">
<div>
<h2>صباح الخير سامي 👋</h2>
<p>3 قرارات تنتظرك اليوم. 8 leads ذات priority عالي. 1 تسريب يحتاج تدخل خلال 24 ساعة.</p>
</div>
<div class="day">الثلاثاء · 28 إبريل 2026</div>
</div>
<!-- ROW 1: Founder/CEO View + Why Now -->
<div class="grid">
<div class="card col-8">
<div class="card-header">
<div class="card-title">
<div class="card-icon">📊</div>
<h3>Founder View — كم ريال جبتلك Dealix هذا الشهر</h3>
</div>
<span class="card-tag tag-live">● Live</span>
</div>
<div class="kpi-row">
<div class="kpi"><div class="v">1.24M</div><div class="l">Pipeline ريال</div><div class="delta up">↑ +32% MoM</div></div>
<div class="kpi"><div class="v">14</div><div class="l">اجتماعات</div><div class="delta up">↑ +4 vs target</div></div>
<div class="kpi"><div class="v">SAR 89</div><div class="l">تكلفة كل lead مؤهل</div><div class="delta up">↓ -22%</div></div>
<div class="kpi"><div class="v">7.4×</div><div class="l">ROI من Dealix</div><div class="delta up">↑ vs 5.1× في مارس</div></div>
</div>
<div style="margin-top:16px;padding:14px;background:#fef3c7;border-radius:10px;font-size:13px;color:#713f12">
💡 <strong>القرار الأهم اليوم:</strong> 3 صفقات بقيمة 480K ريال جامدة منذ 14+ يوم — بحاجة لتدخلك المباشر.
</div>
</div>
<div class="card col-4">
<div class="card-header">
<div class="card-title">
<div class="card-icon warn">🎯</div>
<h3>Why Now? — الأولوية اليوم</h3>
</div>
<span class="card-tag tag-hot">8 شركات</span>
</div>
<div class="radar-list">
<div class="radar-item high">
<div class="radar-rank">1</div>
<div class="radar-body">
<div class="name">شركة العقار الذهبي</div>
<div class="why">يوظفون SDR منذ 3 أيام · افتتحوا فرع جديد</div>
</div>
<div class="radar-score"><div class="num">94</div><div class="lbl">score</div></div>
</div>
<div class="radar-item high">
<div class="radar-rank">2</div>
<div class="radar-body">
<div class="name">عمار المدينة للتطوير</div>
<div class="why">نشروا مناقصة بـ 8M ريال · تنتهي 12 يوم</div>
</div>
<div class="radar-score"><div class="num">91</div><div class="lbl">score</div></div>
</div>
<div class="radar-item medium">
<div class="radar-rank">3</div>
<div class="radar-body">
<div class="name">رؤى المستقبل</div>
<div class="why">أضافوا booking page · زادوا إعلاناتهم 60%</div>
</div>
<div class="radar-score"><div class="num">82</div><div class="lbl">score</div></div>
</div>
<div class="radar-item medium">
<div class="radar-rank">4</div>
<div class="radar-body">
<div class="name">إعمار البلاد</div>
<div class="why">leadership change قبل 8 أيام</div>
</div>
<div class="radar-score"><div class="num">76</div><div class="lbl">score</div></div>
</div>
<div class="radar-item">
<div class="radar-rank">5</div>
<div class="radar-body">
<div class="name">عقارات الخليج</div>
<div class="why">funding round 12M ريال قبل أسبوعين</div>
</div>
<div class="radar-score"><div class="num">71</div><div class="lbl">score</div></div>
</div>
</div>
</div>
</div>
<!-- ROW 2: Pipeline Autopilot -->
<div class="grid" style="margin-top:18px">
<div class="card col-12">
<div class="card-header">
<div class="card-title">
<div class="card-icon purple">⚙️</div>
<h3>Pipeline Autopilot — كل صفقة في مرحلتها</h3>
</div>
<span class="card-tag tag-live">● 11 stages</span>
</div>
<div class="pipeline">
<div class="stage"><div class="n">142</div><div class="l">New Signal</div></div>
<div class="stage"><div class="n">98</div><div class="l">Enriched</div></div>
<div class="stage"><div class="n">76</div><div class="l">Drafted</div></div>
<div class="stage"><div class="n">62</div><div class="l">Approved</div></div>
<div class="stage"><div class="n">58</div><div class="l">Sent</div></div>
<div class="stage"><div class="n">21</div><div class="l">Replied</div></div>
<div class="stage"><div class="n">14</div><div class="l">Meeting</div></div>
<div class="stage"><div class="n">9</div><div class="l">Demo</div></div>
<div class="stage"><div class="n">6</div><div class="l">Proposal</div></div>
<div class="stage"><div class="n">3</div><div class="l">Won</div></div>
<div class="stage" style="border-color:var(--danger)"><div class="n">2</div><div class="l">At Risk</div></div>
</div>
<div style="margin-top:14px;display:flex;gap:8px;flex-wrap:wrap">
<span style="font-size:12px;color:var(--muted)"></span>
<span style="font-size:12px;color:var(--muted)">conversion rates: signal→meeting <strong style="color:var(--brand)">9.8%</strong> · meeting→won <strong style="color:var(--brand)">21.4%</strong> · cycle <strong style="color:var(--brand)">38 يوم</strong></span>
</div>
</div>
</div>
<!-- ROW 3: Saudi Map + Forecast -->
<div class="grid" style="margin-top:18px">
<div class="card col-6">
<div class="card-header">
<div class="card-title">
<div class="card-icon">🗺</div>
<h3>Saudi Buying Intent Map</h3>
</div>
<span class="card-tag tag-new">9 قطاعات</span>
</div>
<div class="map">
<div class="city hot"><div class="nm">الرياض</div><div class="vl">87</div><div class="lvl">heat: ساخن</div></div>
<div class="city hot"><div class="nm">جدة</div><div class="vl">71</div><div class="lvl">heat: ساخن</div></div>
<div class="city warm"><div class="nm">الدمام</div><div class="vl">52</div><div class="lvl">heat: دافئ</div></div>
<div class="city warm"><div class="nm">الخبر</div><div class="vl">48</div><div class="lvl">heat: دافئ</div></div>
<div class="city warm"><div class="nm">مكة</div><div class="vl">34</div><div class="lvl">heat: دافئ</div></div>
<div class="city"><div class="nm">المدينة</div><div class="vl">22</div><div class="lvl">heat: عادي</div></div>
<div class="city"><div class="nm">القصيم</div><div class="vl">18</div><div class="lvl">heat: عادي</div></div>
<div class="city"><div class="nm">أبها</div><div class="vl">14</div><div class="lvl">heat: عادي</div></div>
</div>
<div style="margin-top:12px;font-size:13px;color:var(--muted)">
💡 <strong style="color:var(--brand)">القطاع الأنشط هذا الأسبوع:</strong> تطوير عقاري في الرياض — 32 شركة تظهر إشارات شراء.
</div>
</div>
<div class="card col-6">
<div class="card-header">
<div class="card-title">
<div class="card-icon success">📈</div>
<h3>Sales Forecast — هذا الشهر</h3>
</div>
<span class="card-tag tag-live">● Live</span>
</div>
<div class="forecast-row">
<div class="forecast-deal">
<div class="n">شركة العقار الذهبي</div>
<div class="m">demo held · proposal sent</div>
</div>
<div class="forecast-prob"><div class="forecast-prob-fill" style="width:78%"></div></div>
<div class="forecast-val">340K ريال</div>
</div>
<div class="forecast-row">
<div class="forecast-deal">
<div class="n">عمار المدينة</div>
<div class="m">meeting booked · prep stage</div>
</div>
<div class="forecast-prob"><div class="forecast-prob-fill" style="width:62%"></div></div>
<div class="forecast-val">280K ريال</div>
</div>
<div class="forecast-row">
<div class="forecast-deal">
<div class="n">رؤى المستقبل</div>
<div class="m">positive reply · scheduling</div>
</div>
<div class="forecast-prob"><div class="forecast-prob-fill" style="width:48%"></div></div>
<div class="forecast-val">175K ريال</div>
</div>
<div class="forecast-row">
<div class="forecast-deal">
<div class="n">إعمار البلاد</div>
<div class="m">stalled — 16 يوم</div>
</div>
<div class="forecast-prob"><div class="forecast-prob-fill" style="width:18%;background:var(--warning)"></div></div>
<div class="forecast-val">220K ريال</div>
</div>
<div style="margin-top:14px;padding:10px;background:#f0fdf4;border-radius:8px;font-size:13px;color:#166534">
<strong>Best case:</strong> 1.01M ريال · <strong>Likely:</strong> 615K ريال · <strong>Worst:</strong> 280K ريال
</div>
</div>
</div>
<!-- ROW 4: AI Agents -->
<div class="grid" style="margin-top:18px">
<div class="card col-12">
<div class="card-header">
<div class="card-title">
<div class="card-icon purple">🤖</div>
<h3>11 AI Agents — فريق نمو آلي يعمل لك 24/7</h3>
</div>
<span class="card-tag tag-live">● 7 active</span>
</div>
<div class="agents-grid">
<div class="agent"><div class="ico">🚀</div><div class="nm">Prospecting Agent</div><div class="rl">يكتشف 50+ شركة جديدة يومياً</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">📡</div><div class="nm">Signal Agent</div><div class="rl">يرصد إشارات الشراء كل ساعة</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">📋</div><div class="nm">Enrichment Agent</div><div class="rl">يكمّل بيانات الشركات + DMs</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">✍️</div><div class="nm">Personalization</div><div class="rl">يكتب رسالة فريدة لكل lead</div><span class="badge appr">approval</span></div>
<div class="agent"><div class="ico">🛡</div><div class="nm">Compliance Agent</div><div class="rl">يفحص PDPL + consent قبل الإرسال</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">📤</div><div class="nm">Outreach Agent</div><div class="rl">يرسل عبر القناة المثلى</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">💬</div><div class="nm">Reply Agent</div><div class="rl">يصنف كل رد فوراً</div><span class="badge">safe auto</span></div>
<div class="agent"><div class="ico">📅</div><div class="nm">Meeting Agent</div><div class="rl">يحجز اجتماعات تلقائياً</div><span class="badge appr">approval</span></div>
<div class="agent"><div class="ico">🎯</div><div class="nm">Deal Coach</div><div class="rl">next step + objections لكل صفقة</div><span class="badge adv">advisory</span></div>
<div class="agent"><div class="ico">❤️</div><div class="nm">Customer Success</div><div class="rl">health · QBR · upsell · churn</div><span class="badge adv">advisory</span></div>
<div class="agent"><div class="ico">📊</div><div class="nm">Executive Analyst</div><div class="rl">تقرير أسبوعي للـ CEO</div><span class="badge adv">advisory</span></div>
<div class="agent" style="background:linear-gradient(135deg,#0f172a,#1e3a8a);color:#fff;border:0">
<div class="ico"></div>
<div class="nm" style="color:var(--accent)">إجمالي</div>
<div class="rl" style="color:rgba(255,255,255,0.85)">11 agent · 7 safe-auto · 2 approval · 3 advisory</div>
</div>
</div>
</div>
</div>
<!-- ROW 5: Revenue Leak Detector -->
<div class="grid" style="margin-top:18px">
<div class="card col-8">
<div class="card-header">
<div class="card-title">
<div class="card-icon danger">🚨</div>
<h3>Revenue Leak Detector — أين المال يتسرب</h3>
</div>
<span class="card-tag tag-hot">3 leaks</span>
</div>
<div class="leak">
<div class="leak-sev critical">Critical</div>
<div class="leak-body">
<div class="h">صفقة "إعمار البلاد" — جامدة منذ 16 يوم</div>
<div class="d">آخر نشاط 12 إبريل. عند 21+ يوم، احتمال الإغلاق ينخفض من 38% إلى 11%. يحتاج multi-thread.</div>
</div>
<div class="leak-impact">220K ريال<br><span style="font-size:11px;font-weight:400">معرّض للخطر</span></div>
</div>
<div class="leak medium">
<div class="leak-sev medium">Medium</div>
<div class="leak-body">
<div class="h">حملة "Q2 Real Estate" — يفتحون لكن لا يردّون</div>
<div class="d">معدل الفتح 47% (ممتاز) ومعدل الرد 1.2% (ضعيف). المشكلة في الـ CTA.</div>
</div>
<div class="leak-impact">~5K ريال<br><span style="font-size:11px;font-weight:400">إعادة كتابة</span></div>
</div>
<div class="leak low">
<div class="leak-sev low">Low</div>
<div class="leak-body">
<div class="h">المندوب أحمد — وقت الرد الوسطي 4 ساعات</div>
<div class="d">المعيار 60 دقيقة. كل ساعة تأخير = 14% انخفاض احتمال الحجز.</div>
</div>
<div class="leak-impact">~12K ريال<br><span style="font-size:11px;font-weight:400">شهرياً</span></div>
</div>
<div style="margin-top:14px;padding:12px;background:#fee2e2;border-radius:10px;font-size:13px;color:#991b1b">
💸 <strong>إجمالي المال المعرّض للخطر:</strong> 237K ريال — قابل للاسترداد بـ 3 إجراءات هذا الأسبوع.
</div>
</div>
<div class="card col-4">
<div class="card-header">
<div class="card-title">
<div class="card-icon success">❤️</div>
<h3>Customer Health Score</h3>
</div>
<span class="card-tag tag-live">3 أبعاد</span>
</div>
<div class="gauge">
<svg viewBox="0 0 200 110">
<path d="M 20 100 A 80 80 0 0 1 180 100" fill="none" stroke="#e2e8f0" stroke-width="14" stroke-linecap="round"/>
<path d="M 20 100 A 80 80 0 0 1 180 100" fill="none" stroke="url(#g)" stroke-width="14" stroke-linecap="round" stroke-dasharray="251" stroke-dashoffset="50"/>
<defs>
<linearGradient id="g">
<stop offset="0" stop-color="#dc2626"/><stop offset="0.5" stop-color="#f59e0b"/><stop offset="1" stop-color="#10b981"/>
</linearGradient>
</defs>
</svg>
<div class="gauge-val"><div class="v">82</div><div class="l">/ 100</div></div>
</div>
<div style="text-align:center;color:var(--success);font-weight:600;font-size:14px;margin-bottom:14px">healthy · upsell candidate</div>
<div style="display:flex;justify-content:space-between;font-size:12px;color:var(--muted);padding:10px 0;border-top:1px solid var(--border)">
<span>Engagement</span><strong style="color:var(--brand)">88</strong>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;color:var(--muted);padding:10px 0;border-top:1px solid var(--border)">
<span>Outcomes</span><strong style="color:var(--brand)">79</strong>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;color:var(--muted);padding:10px 0;border-top:1px solid var(--border)">
<span>Adoption</span><strong style="color:var(--brand)">76</strong>
</div>
<div style="display:flex;justify-content:space-between;font-size:12px;color:var(--muted);padding:10px 0;border-top:1px solid var(--border)">
<span>Sentiment</span><strong style="color:var(--brand)">85</strong>
</div>
</div>
</div>
<!-- ROW 6: WhatsApp Performance + Compliance -->
<div class="grid" style="margin-top:18px">
<div class="card col-6">
<div class="card-header">
<div class="card-title">
<div class="card-icon">💬</div>
<h3>WhatsApp Smart-Chain Performance</h3>
</div>
<span class="card-tag tag-live">4 providers</span>
</div>
<div class="kpi-row" style="margin-bottom:14px">
<div class="kpi"><div class="v">94.2%</div><div class="l">Delivery rate</div></div>
<div class="kpi"><div class="v">71%</div><div class="l">Read rate</div></div>
<div class="kpi"><div class="v">11.4%</div><div class="l">Reply rate</div></div>
<div class="kpi"><div class="v">38s</div><div class="l">متوسط وقت الرد</div></div>
</div>
<div class="wa-providers">
<div class="wa-provider healthy">
<div class="nm">Green API</div>
<div class="st">● Healthy</div>
<div class="wa-bar"><div class="wa-bar-fill" style="width:98%"></div></div>
</div>
<div class="wa-provider healthy">
<div class="nm">Ultramsg</div>
<div class="st">● Healthy</div>
<div class="wa-bar"><div class="wa-bar-fill" style="width:96%"></div></div>
</div>
<div class="wa-provider degraded">
<div class="nm">Fonnte</div>
<div class="st">⚠ Slow</div>
<div class="wa-bar"><div class="wa-bar-fill" style="width:71%;background:var(--warning)"></div></div>
</div>
<div class="wa-provider healthy">
<div class="nm">Meta Cloud</div>
<div class="st">● Healthy</div>
<div class="wa-bar"><div class="wa-bar-fill" style="width:100%"></div></div>
</div>
</div>
<div style="margin-top:12px;padding:10px;background:#f0fdf4;border-radius:8px;font-size:12px;color:#166534">
✅ Smart-chain يحوّل تلقائياً عند فشل أي provider — لا انقطاع للعميل.
</div>
</div>
<div class="card col-6">
<div class="card-header">
<div class="card-title">
<div class="card-icon">🛡</div>
<h3>Compliance & Trust Center — PDPL</h3>
</div>
<span class="card-tag tag-live">11 gates</span>
</div>
<div class="gates">
<div class="gate">✓ Consent ledger</div>
<div class="gate">✓ Opt-out tracking</div>
<div class="gate">✓ List-Unsubscribe</div>
<div class="gate">✓ Purpose limitation</div>
<div class="gate">✓ Data minimization</div>
<div class="gate">✓ Audit log</div>
<div class="gate">✓ Retention policy</div>
<div class="gate">✓ RoPA documented</div>
<div class="gate">✓ DPA template</div>
<div class="gate">✓ Breach response</div>
<div class="gate warn">⚠ DPO assigned</div>
</div>
<div style="margin-top:14px;padding:12px;background:#f1f5f9;border-radius:10px;font-size:12px;color:var(--muted);line-height:1.7">
<strong style="color:var(--brand)">آخر فحص:</strong> اليوم · <strong style="color:var(--brand)">PDPL risk score:</strong> 12/100 (منخفض)<br>
<strong style="color:var(--brand)">Records of Processing:</strong> 47 نشاط موثق · <strong style="color:var(--brand)">Data subjects requests:</strong> 0 معلقة
</div>
</div>
</div>
<!-- ROW 6b: Role-Based Command Cards (live from /api/v1/cards/feed) -->
<div class="wrap" style="padding-top:0">
<div class="hero-strip" style="margin-top:8px">
<div>
<h2 style="margin:0 0 6px">كروت القرار حسب الدور — Revenue Command</h2>
<p style="margin:0;color:var(--muted);font-size:14px">واجهة واحدة، تغذية مختلفة لكل دور. البيانات من API (عند تشغيل الخادم على نفس النطاق).</p>
</div>
<div class="day" id="roleCardsStatus">جاري التحميل…</div>
</div>
<div style="display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 18px">
<button type="button" class="day" data-role="ceo" style="cursor:pointer;border:none">CEO</button>
<button type="button" class="day" data-role="sales_manager" style="cursor:pointer;border:none;opacity:.9">مبيعات</button>
<button type="button" class="day" data-role="growth_manager" style="cursor:pointer;border:none;opacity:.9">نمو</button>
<button type="button" class="day" data-role="agency_partner" style="cursor:pointer;border:none;opacity:.9">وكالة</button>
<button type="button" class="day" data-role="support" style="cursor:pointer;border:none;opacity:.9">دعم</button>
<button type="button" class="day" data-role="service_delivery" style="cursor:pointer;border:none;opacity:.9">تشغيل</button>
</div>
<div id="roleCardsMount" class="grid"></div>
</div>
<!-- ROW 7: Today's Decisions -->
<div class="actions-ribbon">
<h3>🎯 3 قرارات يجب اتخاذها اليوم</h3>
<div class="actions-list">
<div class="action-card">
<div class="num">1</div>
<div class="h">تدخل في صفقة "إعمار البلاد"</div>
<div class="d">220K ريال جامدة 16 يوم. اتصل بالـ CEO مباشرة + multi-thread إلى VP Operations.</div>
</div>
<div class="action-card">
<div class="num">2</div>
<div class="h">أعد كتابة CTA حملة Q2 Real Estate</div>
<div class="d">people open but don't reply. اختبر "هل تريد رؤية 5 leads مؤهلة من قطاعك؟" بدلاً من الـ CTA الحالي.</div>
</div>
<div class="action-card">
<div class="num">3</div>
<div class="h">ابدأ التواصل مع شركة العقار الذهبي</div>
<div class="d">Why-Now score 94. السبب: SDR hire + new branch. ✍️ Personalization Agent جهز draft — راجع وأرسل.</div>
</div>
</div>
</div>
<div class="disclaimer">
<strong>📌 ملاحظة:</strong> هذا preview للوحة Dealix — البيانات في هذه النسخة العامة افتراضية لأغراض العرض. عند الاشتراك،
اللوحة تُربط مباشرة بـ Saudi Revenue Graph الخاص بشركتك وتُحدّث في الوقت الحقيقي عبر <code>/api/v1/command-center/snapshot</code>.
كروت الأدوار تُحمّل من <code>/api/v1/cards/feed</code> (موافقة أولاً — لا إرسال تلقائي).
كل التوصيات مبنية على Pulse القطاعي + بيانات شركتك التراكمية + 11 AI Agents يعملون 24/7.
</div>
</div>
<script>
(function(){
var mount = document.getElementById('roleCardsMount');
var statusEl = document.getElementById('roleCardsStatus');
if(!mount || !statusEl) return;
var base = (window.location && window.location.origin) ? window.location.origin : '';
function esc(s){
return String(s||'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/"/g,'&quot;');
}
function render(data){
mount.innerHTML = '';
(data.cards||[]).forEach(function(c){
var col = document.createElement('div');
col.className = 'card col-6';
var risk = c.risk_level || 'low';
var tag = risk === 'high' ? 'tag-hot' : (risk === 'medium' ? 'tag-new' : 'tag-live');
var btns = (c.buttons||[]).slice(0,3).map(function(b){
return '<button type="button" style="margin:4px 0 4px 6px;padding:8px 12px;border-radius:8px;border:1px solid var(--border);background:#fff;cursor:pointer;font-size:12px">'+esc(b.label_ar)+'</button>';
}).join('');
col.innerHTML =
'<div class="card-header"><div class="card-title"><div class="card-icon">'+(c.type==='partner'?'🤝':'📌')+'</div><h3>'+esc(c.title_ar)+'</h3></div>'+
'<span class="card-tag '+tag+'">'+esc(risk)+'</span></div>'+
'<p style="font-size:13px;color:var(--muted);margin:0 0 8px"><strong>لماذا الآن:</strong> '+esc(c.why_now_ar)+'</p>'+
'<p style="font-size:13px;margin:0 0 10px"><strong>الإجراء:</strong> '+esc(c.recommended_action_ar)+'</p>'+
'<div style="display:flex;flex-wrap:wrap;align-items:center">'+btns+'</div>'+
'<p style="font-size:11px;color:var(--muted);margin-top:8px">وضع: '+esc(c.action_mode||'')+' · أثر Proof: '+(c.proof_impact||[]).join(', ')+'</p>';
mount.appendChild(col);
});
}
function load(role){
statusEl.textContent = 'جاري التحميل…';
fetch(base + '/api/v1/cards/feed?role=' + encodeURIComponent(role))
.then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })
.then(function(data){ statusEl.textContent = 'الدور: ' + role + ' · ' + (data.card_count||0) + ' كروت'; render(data); })
.catch(function(){ statusEl.textContent = 'تعذر الاتصال بالـ API (شغّل الخادم أو افتح من نفس النطاق)'; mount.innerHTML = '<div class="card col-12"><p style="font-size:14px;color:var(--muted)">جرّب من بيئة Staging أو محلياً مع <code>uvicorn</code> لعرض الكروت الحية.</p></div>'; });
}
document.querySelectorAll('[data-role]').forEach(function(btn){
btn.addEventListener('click', function(){ load(btn.getAttribute('data-role')); });
});
load('ceo');
})();
</script>
</body>
</html>