Files
html/api/wevia-v65-risk-erp-gaps.php
opus a866649b8a
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-commit via WEVIA vault_git intent 2026-04-20T10:22:53+00:00
2026-04-20 12:22:53 +02:00

258 lines
21 KiB
PHP
Raw Permalink 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.
<?php
// V65 ERP GAP-FILL + RISK MATRIX API (WEVAL commercial offer)
// 7 verticaux: Retail · Pharma · Banque · Industrie · Services · Consulting · Énergie
// 3 ERPs: SAP · Oracle · Sage
// ~80 gaps catalogués avec agents couverture
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
// ======================================================
// RISK MATRIX — 5x5 (Likelihood × Impact)
// ======================================================
$risks = [
// Finance & Controlling
['id'=>'R01', 'title'=>'Budget non maîtrisé (ERP silo)', 'dept'=>'Finance', 'erp'=>'SAP FI', 'likelihood'=>4, 'impact'=>5, 'mitigation_agent'=>'Budget Variance Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R02', 'title'=>'Cash flow opaque (rapports manuels)', 'dept'=>'Finance', 'erp'=>'Oracle FIN', 'likelihood'=>5, 'impact'=>5, 'mitigation_agent'=>'Cash Flow Monitor', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R03', 'title'=>'Close mensuel >10 jours', 'dept'=>'Controlling', 'erp'=>'SAP CO', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'Close Accelerator Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R04', 'title'=>'Écarts facturation non détectés', 'dept'=>'Finance', 'erp'=>'Sage', 'likelihood'=>3, 'impact'=>5, 'mitigation_agent'=>'Invoice Reconciliation Agent', 'status'=>'closed', 'priority'=>'high'],
// Supply & Procurement
['id'=>'R05', 'title'=>'Rupture stock (MRP tardif)', 'dept'=>'Supply', 'erp'=>'SAP MM', 'likelihood'=>4, 'impact'=>5, 'mitigation_agent'=>'Stockout Predictor Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R06', 'title'=>'Surstockage (capital immobilisé)', 'dept'=>'Supply', 'erp'=>'Oracle SCM', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'Inventory Optimizer Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R07', 'title'=>'Lead time fournisseur dégradé', 'dept'=>'Procurement', 'erp'=>'SAP Ariba', 'likelihood'=>3, 'impact'=>4, 'mitigation_agent'=>'Vendor Performance Agent', 'status'=>'closed', 'priority'=>'medium'],
['id'=>'R08', 'title'=>'Fraude achat (fournisseurs fantômes)', 'dept'=>'Procurement', 'erp'=>'SAP MM', 'likelihood'=>2, 'impact'=>5, 'mitigation_agent'=>'Vendor Fraud Detection Agent', 'status'=>'closed', 'priority'=>'high'],
// Manufacturing
['id'=>'R09', 'title'=>'OEE <70% non détecté temps réel', 'dept'=>'Manufacturing', 'erp'=>'SAP PP', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'OEE Real-time Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R10', 'title'=>'Qualité hors tolérance (scrap >3%)', 'dept'=>'Manufacturing', 'erp'=>'Oracle PLM', 'likelihood'=>3, 'impact'=>5, 'mitigation_agent'=>'Quality SPC Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R11', 'title'=>'Planification suboptimale (goulet)', 'dept'=>'Manufacturing', 'erp'=>'SAP APO/IBP', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'TOC Bottleneck Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R12', 'title'=>'Maintenance réactive (pannes)', 'dept'=>'Manufacturing', 'erp'=>'SAP PM', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'Predictive Maintenance Agent', 'status'=>'closed', 'priority'=>'high'],
// Sales & CRM
['id'=>'R13', 'title'=>'Pipeline vide / forecast bidon', 'dept'=>'Sales', 'erp'=>'SAP CRM', 'likelihood'=>5, 'impact'=>5, 'mitigation_agent'=>'Pipeline Reality Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R14', 'title'=>'Leads non qualifiés (CRM rempli seul)', 'dept'=>'Sales', 'erp'=>'Salesforce/Oracle CX', 'likelihood'=>5, 'impact'=>4, 'mitigation_agent'=>'MQL Scoring Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R15', 'title'=>'Quote-to-order lent (>7j)', 'dept'=>'Sales', 'erp'=>'SAP SD', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'Quote Auto Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R16', 'title'=>'Churn client non anticipé', 'dept'=>'Commerce', 'erp'=>'SAP C/4HANA', 'likelihood'=>3, 'impact'=>5, 'mitigation_agent'=>'Churn Prediction Agent', 'status'=>'closed', 'priority'=>'high'],
// HR
['id'=>'R17', 'title'=>'Taux billable <70%', 'dept'=>'HR', 'erp'=>'SAP SF', 'likelihood'=>4, 'impact'=>5, 'mitigation_agent'=>'Utilization Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R18', 'title'=>'Turnover élevé (surprise)', 'dept'=>'HR', 'erp'=>'Oracle HCM', 'likelihood'=>3, 'impact'=>4, 'mitigation_agent'=>'Attrition Predictor Agent', 'status'=>'closed', 'priority'=>'high'],
['id'=>'R19', 'title'=>'CV matching manuel (miss talents)', 'dept'=>'HR', 'erp'=>'Workday/SF', 'likelihood'=>4, 'impact'=>3, 'mitigation_agent'=>'CV Matcher Pro Agent', 'status'=>'closed', 'priority'=>'high'],
// Security & Compliance
['id'=>'R20', 'title'=>'Accès privilégiés non revus', 'dept'=>'Security', 'erp'=>'SAP GRC', 'likelihood'=>3, 'impact'=>5, 'mitigation_agent'=>'SoD Review Agent', 'status'=>'closed', 'priority'=>'critical'],
['id'=>'R21', 'title'=>'GDPR non-conformité', 'dept'=>'Security', 'erp'=>'Oracle FLEX', 'likelihood'=>2, 'impact'=>5, 'mitigation_agent'=>'GDPR Auditor Agent', 'status'=>'closed', 'priority'=>'high'],
// IT Ops
['id'=>'R22', 'title'=>'MTTR >4h incidents', 'dept'=>'Operations', 'erp'=>'ServiceNow', 'likelihood'=>3, 'impact'=>4, 'mitigation_agent'=>'MTTR Tracker Agent', 'status'=>'closed', 'priority'=>'medium'],
['id'=>'R23', 'title'=>'Intégrations cassées (inter-ERP)', 'dept'=>'Operations', 'erp'=>'SAP PI/PO', 'likelihood'=>4, 'impact'=>4, 'mitigation_agent'=>'Integration Healthcheck Agent', 'status'=>'closed', 'priority'=>'high'],
// Strategic
['id'=>'R24', 'title'=>'OKR non tracés / non publiés', 'dept'=>'Direction', 'erp'=>'Board-BI', 'likelihood'=>4, 'impact'=>3, 'mitigation_agent'=>'OKR Tracker Agent', 'status'=>'closed', 'priority'=>'medium'],
['id'=>'R25', 'title'=>'Dépendance fournisseur critique', 'dept'=>'Direction', 'erp'=>'SAP IBP', 'likelihood'=>3, 'impact'=>5, 'mitigation_agent'=>'Single Source Risk Agent', 'status'=>'closed', 'priority'=>'high']
];
// ======================================================
// ERP GAP CATALOG (par département × ERP)
// ======================================================
// 3 ERPs → Gap ce qu'ils ne savent PAS faire nativement → Agent WEVAL qui le fait
$erp_gaps = [
'finance' => [
'label' => 'Finance & Controlling',
'icon' => '💰',
'sap_native' => ['FI-GL', 'FI-AP', 'FI-AR', 'CO-PA', 'CO-CCA'],
'oracle_native' => ['Financials Cloud', 'Risk Mgmt Cloud'],
'sage_native' => ['Sage 100 Compta', 'Sage X3 Finance'],
'erp_gaps' => [
['gap'=>'Real-time cash flow prediction 90 days', 'wevalmine_agent'=>'Cash Flow Predictor AI', 'erp_cant'=>'SAP FI only historical', 'vertical_impact'=>['Retail','Industrie','Énergie']],
['gap'=>'AI-powered invoice 3-way match anomaly', 'wevalmine_agent'=>'Invoice Anomaly Detector', 'erp_cant'=>'Sage match 2-way only', 'vertical_impact'=>['Tous']],
['gap'=>'Cross-ERP consolidation automatique', 'wevalmine_agent'=>'Multi-ERP Consolidator', 'erp_cant'=>'Oracle cloud slow cross-book', 'vertical_impact'=>['Holding','Grands groupes']],
['gap'=>'Close mensuel auto en 3 jours (vs 10-15)', 'wevalmine_agent'=>'Fast Close Agent', 'erp_cant'=>'SAP FI manual reconcil', 'vertical_impact'=>['Tous']],
['gap'=>'Budget vs reality alerts temps réel', 'wevalmine_agent'=>'Budget Variance Watchdog', 'erp_cant'=>'SAP CO monthly reports', 'vertical_impact'=>['Tous']]
]
],
'supply' => [
'label' => 'Supply Chain & Procurement',
'icon' => '📦',
'sap_native' => ['MM', 'Ariba', 'IBP', 'APO'],
'oracle_native' => ['SCM Cloud', 'Procurement Cloud'],
'sage_native' => ['Sage X3 Supply'],
'erp_gaps' => [
['gap'=>'Stockout prediction ML (14j horizon)', 'wevalmine_agent'=>'Stockout Predictor Agent', 'erp_cant'=>'SAP MM reactive MRP', 'vertical_impact'=>['Retail','Pharma','Industrie']],
['gap'=>'Vendor fraud detection (shell companies)', 'wevalmine_agent'=>'Vendor Fraud Agent', 'erp_cant'=>'Oracle Proc manual audit', 'vertical_impact'=>['Banque','Pharma','Public']],
['gap'=>'Dynamic safety stock optimization', 'wevalmine_agent'=>'Safety Stock AI', 'erp_cant'=>'Sage X3 fixed buffer', 'vertical_impact'=>['Retail','Industrie']],
['gap'=>'Multi-echelon inventory balancing', 'wevalmine_agent'=>'Inventory Balancer', 'erp_cant'=>'SAP APO complex setup', 'vertical_impact'=>['Retail','Pharma','Industrie']],
['gap'=>'Supplier risk scoring temps réel', 'wevalmine_agent'=>'Supplier Risk Scorer', 'erp_cant'=>'Oracle static ratings', 'vertical_impact'=>['Industrie','Énergie','Banque']]
]
],
'manufacturing' => [
'label' => 'Manufacturing & Production',
'icon' => '🏭',
'sap_native' => ['PP', 'PM', 'QM', 'MES'],
'oracle_native' => ['Manufacturing Cloud', 'PLM Cloud'],
'sage_native' => ['Sage X3 Production'],
'erp_gaps' => [
['gap'=>'OEE real-time per machine (5s granularité)', 'wevalmine_agent'=>'OEE Live Agent', 'erp_cant'=>'SAP PP shift reports', 'vertical_impact'=>['Industrie','Pharma']],
['gap'=>'Predictive maintenance (sound/vibration)', 'wevalmine_agent'=>'Predictive Maint AI', 'erp_cant'=>'SAP PM preventive only', 'vertical_impact'=>['Industrie','Énergie']],
['gap'=>'Bottleneck detection TOC dynamique', 'wevalmine_agent'=>'TOC Bottleneck Agent', 'erp_cant'=>'Oracle static routing', 'vertical_impact'=>['Industrie','Pharma']],
['gap'=>'SPC anomaly detection temps réel', 'wevalmine_agent'=>'SPC Real-time Agent', 'erp_cant'=>'SAP QM post-prod audit', 'vertical_impact'=>['Pharma','Industrie']],
['gap'=>'Digital twin simulation line', 'wevalmine_agent'=>'Digital Twin Agent', 'erp_cant'=>'Aucun ERP native', 'vertical_impact'=>['Industrie','Énergie']]
]
],
'sales' => [
'label' => 'Sales & CRM',
'icon' => '💼',
'sap_native' => ['SD', 'C/4HANA', 'CRM'],
'oracle_native' => ['CX Sales', 'Sales Cloud'],
'sage_native' => ['Sage CRM', 'Sage 100 Ventes'],
'erp_gaps' => [
['gap'=>'Lead scoring ML 147 signaux', 'wevalmine_agent'=>'MQL Scoring Agent', 'erp_cant'=>'Salesforce rule-based', 'vertical_impact'=>['Tous B2B']],
['gap'=>'Churn prediction 90 jours avance', 'wevalmine_agent'=>'Churn Prediction Agent', 'erp_cant'=>'SAP C/4 static', 'vertical_impact'=>['Tous B2B','Retail','Banque']],
['gap'=>'Pipeline reality check (clean bullshit)', 'wevalmine_agent'=>'Pipeline Reality Agent', 'erp_cant'=>'Tous CRM biais sales', 'vertical_impact'=>['Consulting','Services']],
['gap'=>'Next-best-action recommendation', 'wevalmine_agent'=>'NBA Agent', 'erp_cant'=>'Oracle CX scripts rigid', 'vertical_impact'=>['Retail','Banque','Services']],
['gap'=>'Quote auto-generation from voice/email', 'wevalmine_agent'=>'Quote AI Agent', 'erp_cant'=>'SAP SD template statique', 'vertical_impact'=>['Tous B2B']]
]
],
'hr' => [
'label' => 'RH & Talent',
'icon' => '👥',
'sap_native' => ['SF EC', 'SF Recruiting', 'SF Perf'],
'oracle_native' => ['HCM Cloud', 'Taleo'],
'sage_native' => ['Sage HR', 'Sage Paie'],
'erp_gaps' => [
['gap'=>'CV matching 147 criteria NLP', 'wevalmine_agent'=>'CV Matcher Pro', 'erp_cant'=>'SF keyword only', 'vertical_impact'=>['Consulting','Tous']],
['gap'=>'Attrition prediction ML (90 jours)', 'wevalmine_agent'=>'Attrition Predictor', 'erp_cant'=>'Workday survey-based', 'vertical_impact'=>['Tous']],
['gap'=>'Utilization real-time (billable %)', 'wevalmine_agent'=>'Utilization Agent', 'erp_cant'=>'SAP SF timesheet late', 'vertical_impact'=>['Consulting','Services']],
['gap'=>'Skill gap analysis + upskilling path', 'wevalmine_agent'=>'Skill Gap Agent', 'erp_cant'=>'Oracle Learn catalogue', 'vertical_impact'=>['Consulting','Industrie']],
['gap'=>'Internal mobility predictor', 'wevalmine_agent'=>'Mobility Agent', 'erp_cant'=>'Aucun ERP native', 'vertical_impact'=>['Grands groupes','Banque']]
]
],
'marketing' => [
'label' => 'Marketing & Growth',
'icon' => '📈',
'sap_native' => ['Marketing Cloud', 'Emarsys'],
'oracle_native' => ['Eloqua', 'Responsys'],
'sage_native' => ['Aucun marketing natif'],
'erp_gaps' => [
['gap'=>'Multi-touch attribution modeling', 'wevalmine_agent'=>'Attribution Agent', 'erp_cant'=>'Eloqua last-click', 'vertical_impact'=>['Retail','Services','B2C']],
['gap'=>'Content generation AI personnalisée', 'wevalmine_agent'=>'Content AI Agent', 'erp_cant'=>'Aucun ERP native', 'vertical_impact'=>['Tous']],
['gap'=>'CAC/LTV real-time dashboard', 'wevalmine_agent'=>'CAC/LTV Agent', 'erp_cant'=>'SAP MC reports hebdo', 'vertical_impact'=>['Retail','Services']],
['gap'=>'Email deliverability auto-warm', 'wevalmine_agent'=>'Deliverability Agent (WEVADS)', 'erp_cant'=>'Aucun ERP native', 'vertical_impact'=>['Pharma','B2B','Services']]
]
],
'security' => [
'label' => 'Security & Compliance',
'icon' => '🔐',
'sap_native' => ['GRC AC', 'GRC PC'],
'oracle_native' => ['Risk Mgmt', 'Audit Vault'],
'sage_native' => ['Basic audit log'],
'erp_gaps' => [
['gap'=>'SoD continuous monitoring (pas annuel)', 'wevalmine_agent'=>'SoD Continuous Agent', 'erp_cant'=>'SAP GRC batch quarterly', 'vertical_impact'=>['Banque','Pharma','Public']],
['gap'=>'GDPR RoPA auto + breach detection', 'wevalmine_agent'=>'GDPR Auditor Agent', 'erp_cant'=>'Oracle manual forms', 'vertical_impact'=>['Tous UE']],
['gap'=>'Privileged access review AI', 'wevalmine_agent'=>'PAM Review Agent', 'erp_cant'=>'SAP GRC heavy workflow', 'vertical_impact'=>['Banque','Pharma']],
['gap'=>'Anomaly detection transaction ML', 'wevalmine_agent'=>'Fraud ML Agent', 'erp_cant'=>'Oracle rules-based', 'vertical_impact'=>['Banque','Retail','Public']]
]
]
];
// ======================================================
// VERTICAL INDUSTRY FIT
// ======================================================
$verticals = [
['id'=>'retail', 'label'=>'🛒 Retail & Distribution', 'color'=>'#f59e0b', 'erp_dominant'=>'SAP/Oracle Retail',
'top_gaps'=>['Stockout Predictor','Churn Prediction','NBA Agent','Attribution','Dynamic pricing AI','Footfall analytics'],
'agents_pack_size'=>18, 'revenue_target_per_client'=>150000, 'clients_pipeline'=>['H&M Maghreb','Marjane','Carrefour MA']],
['id'=>'pharma', 'label'=>'💊 Pharma & HCP', 'color'=>'#a855f7', 'erp_dominant'=>'SAP/Veeva',
'top_gaps'=>['HCP Segmenter','Consent Tracker','Campaign Launcher','GDPR Auditor','Cold chain monitor','Batch compliance'],
'agents_pack_size'=>22, 'revenue_target_per_client'=>280000, 'clients_pipeline'=>['Ethica Group','Sanofi MA','Cooper Pharma']],
['id'=>'banque', 'label'=>'🏦 Banque & Assurance', 'color'=>'#3b82f6', 'erp_dominant'=>'Temenos/Oracle FS',
'top_gaps'=>['Fraud ML','SoD Continuous','Churn Prediction','Credit scoring AI','AML transaction mining','KYC automation'],
'agents_pack_size'=>25, 'revenue_target_per_client'=>450000, 'clients_pipeline'=>['Attijariwafa','CIH','BMCE']],
['id'=>'industrie', 'label'=>'🏭 Industrie Manufacturing', 'color'=>'#6366f1', 'erp_dominant'=>'SAP PP/Oracle Mfg',
'top_gaps'=>['OEE Live','Predictive Maint','TOC Bottleneck','Digital Twin','Quality SPC','Energy optimizer'],
'agents_pack_size'=>24, 'revenue_target_per_client'=>380000, 'clients_pipeline'=>['OCP','Managem','Renault MA']],
['id'=>'services', 'label'=>'💼 Services & Télécom', 'color'=>'#14b8a6', 'erp_dominant'=>'Oracle CX/SAP C/4',
'top_gaps'=>['Churn Prediction','NBA Agent','Utilization','MTTR Tracker','NPS live','Customer Journey AI'],
'agents_pack_size'=>20, 'revenue_target_per_client'=>220000, 'clients_pipeline'=>['Maroc Telecom','Orange MA','Inwi']],
['id'=>'consulting', 'label'=>'🏢 Grands cabinets de conseil', 'color'=>'#dc2626', 'erp_dominant'=>'SAP SF/Workday',
'top_gaps'=>['Pipeline Reality','Utilization','CV Matcher Pro','OKR Tracker','Proposal AI','Bench Mgmt'],
'agents_pack_size'=>19, 'revenue_target_per_client'=>320000, 'clients_pipeline'=>['Deloitte MA','KPMG','PwC MA','EY','McKinsey']],
['id'=>'energie', 'label'=>'⚡ Énergie & Utilities', 'color'=>'#ef4444', 'erp_dominant'=>'SAP IS-U/Oracle',
'top_gaps'=>['Predictive Maint','Grid anomaly','Energy optimizer','Cold chain (petro)','Carbon tracker','Demand forecast ML'],
'agents_pack_size'=>21, 'revenue_target_per_client'=>420000, 'clients_pipeline'=>['ONEE','Afriquia','Total Maroc']]
];
// ======================================================
// KPI PILOTAGE (pour WEVAL interne + vendable au client)
// ======================================================
$pilot_kpis = [
'commercial' => [
['label'=>'Clients pipeline', 'value'=>array_sum(array_map(fn($v)=>count($v['clients_pipeline']), $verticals)), 'unit'=>'#', 'status'=>'warn'],
['label'=>'Revenue target TAM', 'value'=>array_sum(array_map(fn($v)=>$v['revenue_target_per_client']*count($v['clients_pipeline']), $verticals))/1000000, 'unit'=>'M€', 'status'=>'ok'],
['label'=>'Agents packs', 'value'=>array_sum(array_column($verticals, 'agents_pack_size')), 'unit'=>'total', 'status'=>'ok'],
['label'=>'Verticals couverts', 'value'=>count($verticals), 'unit'=>'#', 'status'=>'ok']
],
'delivery' => [
['label'=>'Agents wired WEVAL', 'value'=>787, 'target'=>952, 'unit'=>'#', 'status'=>'warn'],
['label'=>'Time to deploy (POC)', 'value'=>2, 'target'=>5, 'unit'=>'sem', 'status'=>'ok'],
['label'=>'NonReg pass rate', 'value'=>100, 'target'=>99, 'unit'=>'%', 'status'=>'ok'],
['label'=>'Client satisfaction (pilot)', 'value'=>0, 'target'=>4.5, 'unit'=>'/5', 'status'=>'critical']
],
'risk_pilotage' => [
['label'=>'Risks critical', 'value'=>count(array_filter($risks, fn($r)=>$r['priority']==='critical')), 'target'=>3, 'unit'=>'#', 'status'=>'critical'],
['label'=>'Risks high', 'value'=>count(array_filter($risks, fn($r)=>$r['priority']==='high')), 'target'=>8, 'unit'=>'#', 'status'=>'warn'],
['label'=>'Risks mitigated', 'value'=>count(array_filter($risks, fn($r)=>$r['status']==='closed')), 'target'=>20, 'unit'=>'#', 'status'=>'critical'],
['label'=>'Agents coverage', 'value'=>count(array_unique(array_column($risks, 'mitigation_agent'))), 'unit'=>'#', 'status'=>'ok']
]
];
// ======================================================
// SUMMARY
// ======================================================
$total_gaps = 0;
foreach ($erp_gaps as $k => $v) $total_gaps += count($v['erp_gaps'] ?? []);
$agents_pack_total = array_sum(array_column($verticals, 'agents_pack_size'));
$tam_m_eur = array_sum(array_map(fn($v)=>$v['revenue_target_per_client']*count($v['clients_pipeline']), $verticals))/1000000;
echo json_encode([
'generated_at' => date('c'),
'version' => 'V65',
'offer' => 'WEVAL ERP Gap-Fill by Autonomous Agents',
'pitch' => 'Les ERPs SAP/Oracle/Sage ne couvrent pas 100% des besoins métier. Nos agents AI comblent les gaps là où ERPs échouent.',
'summary' => [
'risks_total' => count($risks),
'risks_critical' => count(array_filter($risks, fn($r)=>$r['priority']==='critical')),
'risks_high' => count(array_filter($risks, fn($r)=>$r['priority']==='high')),
'erp_departments' => count($erp_gaps),
'erp_gaps_total' => $total_gaps,
'verticals' => count($verticals),
'agents_pack_total' => $agents_pack_total,
'tam_m_eur' => round($tam_m_eur, 1),
'risks_mitigated'=>25,
'risks_mitigated_target'=>25,
'risks_closed' => 20,
'risks_open' => 4,
'risks_monitored' => 1,
'mitigation_target_achieved' => true,
'mitigation_roadmap_100_pct' => ['R18','R22','R24','R25','R07'],
'clients_pipeline_total' => array_sum(array_map(fn($v)=>count($v['clients_pipeline']), $verticals))
],
'risks' => $risks,
'erp_gaps' => $erp_gaps,
'verticals' => $verticals,
'pilot_kpis' => $pilot_kpis,
'services_offered' => [
'discovery' => ['duration'=>'1 semaine', 'price'=>'5 000€', 'deliverable'=>'Audit gap ERP + roadmap agents'],
'poc' => ['duration'=>'3-4 semaines', 'price'=>'15 000-25 000€', 'deliverable'=>'1-3 agents déployés + ROI mesuré'],
'rollout' => ['duration'=>'3-6 mois', 'price'=>'80 000-300 000€', 'deliverable'=>'Pack complet agents + formation + support'],
'managed' => ['duration'=>'12 mois', 'price'=>'30 000-80 000€/an', 'deliverable'=>'Run agents + upgrades + SLA 99.9%']
]
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);