180 lines
16 KiB
PHP
180 lines
16 KiB
PHP
<?php
|
|
// V67 — ROI SIMULATOR QUANTI + QUALI PAR AGENT
|
|
// Enrichit V66 avec: scaling_factors, qualitative_gains, payback, effort, complexity
|
|
// Consommé par page /agent-roi-simulator.html (sliders interactifs)
|
|
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
// Fetch V66 base (35 pain points + agents + baseline savings)
|
|
function fetch_internal($path, $timeout = 6) {
|
|
$ch = curl_init('http://127.0.0.1:5890' . $path);
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_TIMEOUT => $timeout,
|
|
CURLOPT_HTTPHEADER => ['Host: weval-consulting.com']
|
|
]);
|
|
$r = curl_exec($ch);
|
|
curl_close($ch);
|
|
return $r ? @json_decode($r, true) : null;
|
|
}
|
|
|
|
$v66 = fetch_internal('/api/wevia-v66-all-erps-painpoints.php');
|
|
$pain_points = ($v66 && isset($v66['pain_points'])) ? $v66['pain_points'] : [];
|
|
|
|
// ======================================================
|
|
// ENRICHMENT PER AGENT — Qualitative + Quantitative
|
|
// Each pain_point id gets: qualitative (6 axes 0-5), implementation, payback, etc.
|
|
// ======================================================
|
|
$enrichment = [
|
|
// Finance
|
|
'PP001' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>4,'compliance_uplift'=>5,'cx_impact'=>2,'brand_score'=>3,'strategic_value'=>5], 'payback_months'=>4, 'effort_md'=>40, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['ERP read access','DB connector']],
|
|
'PP002' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>5,'compliance_uplift'=>3,'cx_impact'=>1,'brand_score'=>2,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>55, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Historical data 3y','Forecasting model']],
|
|
'PP003' => ['quali'=>['time_fte_saved'=>3.0,'risk_reduction'=>3,'compliance_uplift'=>2,'cx_impact'=>3,'brand_score'=>2,'strategic_value'=>4], 'payback_months'=>2, 'effort_md'=>35, 'complexity'=>2, 'risk_of_failure'=>1, 'deps'=>['CRM API','Email/SMS gateway']],
|
|
'PP004' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>1,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>45, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Transaction logs','Graph DB']],
|
|
'PP005' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>4,'compliance_uplift'=>3,'cx_impact'=>1,'brand_score'=>2,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>30, 'complexity'=>2, 'risk_of_failure'=>1, 'deps'=>['GL/CO access']],
|
|
'PP006' => ['quali'=>['time_fte_saved'=>2.5,'risk_reduction'=>4,'compliance_uplift'=>4,'cx_impact'=>1,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>5, 'effort_md'=>60, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['Multi-entity GL','FX rates feed']],
|
|
// Supply
|
|
'PP007' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>5,'compliance_uplift'=>2,'cx_impact'=>5,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>50, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['SKU history 2y','POS data','Weather/promo signals']],
|
|
'PP008' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>4,'compliance_uplift'=>2,'cx_impact'=>2,'brand_score'=>2,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>45, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Inventory data','Multi-warehouse']],
|
|
'PP009' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>5,'compliance_uplift'=>3,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>40, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Vendor master','News/rating APIs']],
|
|
'PP010' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>1,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>4, 'effort_md'=>55, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['Procurement logs','KYB APIs']],
|
|
'PP011' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>3,'compliance_uplift'=>3,'cx_impact'=>1,'brand_score'=>2,'strategic_value'=>3], 'payback_months'=>5, 'effort_md'=>35, 'complexity'=>3, 'risk_of_failure'=>1, 'deps'=>['Purchase invoice text']],
|
|
// Manufacturing
|
|
'PP012' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>4,'compliance_uplift'=>2,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>5], 'payback_months'=>5, 'effort_md'=>80, 'complexity'=>5, 'risk_of_failure'=>3, 'deps'=>['IoT sensors','MES connector','5G/network']],
|
|
'PP013' => ['quali'=>['time_fte_saved'=>2.5,'risk_reduction'=>5,'compliance_uplift'=>3,'cx_impact'=>3,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>6, 'effort_md'=>90, 'complexity'=>5, 'risk_of_failure'=>3, 'deps'=>['Vibration/acoustic sensors','ML training data']],
|
|
'PP014' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>5,'brand_score'=>5,'strategic_value'=>5], 'payback_months'=>5, 'effort_md'=>70, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['Vision AI cameras','QM data']],
|
|
'PP015' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>3,'compliance_uplift'=>2,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>5, 'effort_md'=>65, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['Routing data','Capacity model']],
|
|
// Sales
|
|
'PP016' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>4,'compliance_uplift'=>1,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>35, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['CRM','Email/Calendar access']],
|
|
'PP017' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>2,'compliance_uplift'=>1,'cx_impact'=>4,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>3, 'effort_md'=>40, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['CRM','Enrichment APIs (Clearbit/similar)']],
|
|
'PP018' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>4,'compliance_uplift'=>1,'cx_impact'=>5,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>4, 'effort_md'=>55, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Usage logs','Support tickets','Sentiment data']],
|
|
'PP019' => ['quali'=>['time_fte_saved'=>2.5,'risk_reduction'=>2,'compliance_uplift'=>2,'cx_impact'=>5,'brand_score'=>4,'strategic_value'=>4], 'payback_months'=>3, 'effort_md'=>45, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Price list','Approval rules']],
|
|
'PP020' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>1,'compliance_uplift'=>1,'cx_impact'=>4,'brand_score'=>3,'strategic_value'=>5], 'payback_months'=>4, 'effort_md'=>50, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['CRM 360','Product catalog']],
|
|
// HR
|
|
'PP021' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>4,'compliance_uplift'=>2,'cx_impact'=>2,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>5, 'effort_md'=>55, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['HRIS','Perf/comp data','Engagement signals']],
|
|
'PP022' => ['quali'=>['time_fte_saved'=>2.5,'risk_reduction'=>3,'compliance_uplift'=>3,'cx_impact'=>3,'brand_score'=>4,'strategic_value'=>4], 'payback_months'=>3, 'effort_md'=>40, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['ATS access','JD database']],
|
|
'PP023' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>2,'compliance_uplift'=>1,'cx_impact'=>2,'brand_score'=>3,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>45, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Timesheet','Project staffing','Skills matrix']],
|
|
'PP024' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>3], 'payback_months'=>4, 'effort_md'=>35, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Payroll data','Collective agreement rules']],
|
|
// Marketing
|
|
'PP025' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>2,'compliance_uplift'=>2,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>50, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Ad platforms','Analytics','CDP']],
|
|
'PP026' => ['quali'=>['time_fte_saved'=>3.0,'risk_reduction'=>1,'compliance_uplift'=>2,'cx_impact'=>4,'brand_score'=>4,'strategic_value'=>4], 'payback_months'=>2, 'effort_md'=>30, 'complexity'=>2, 'risk_of_failure'=>1, 'deps'=>['CMS','Brand guidelines']],
|
|
'PP027' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>2,'compliance_uplift'=>3,'cx_impact'=>4,'brand_score'=>3,'strategic_value'=>3], 'payback_months'=>3, 'effort_md'=>40, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['Sending infrastructure','Seeds']],
|
|
// Security
|
|
'PP028' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>1,'brand_score'=>4,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>50, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Access logs','Role matrix']],
|
|
'PP029' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>2,'brand_score'=>5,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>55, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['Data catalog','Consent logs']],
|
|
'PP030' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>5,'compliance_uplift'=>5,'cx_impact'=>3,'brand_score'=>5,'strategic_value'=>5], 'payback_months'=>3, 'effort_md'=>70, 'complexity'=>5, 'risk_of_failure'=>3, 'deps'=>['Transaction stream','Graph DB','Model retraining']],
|
|
// Operations
|
|
'PP031' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>5,'compliance_uplift'=>3,'cx_impact'=>4,'brand_score'=>4,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>50, 'complexity'=>4, 'risk_of_failure'=>2, 'deps'=>['ITSM','Runbooks','Monitoring']],
|
|
'PP032' => ['quali'=>['time_fte_saved'=>1.5,'risk_reduction'=>4,'compliance_uplift'=>3,'cx_impact'=>2,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>5, 'effort_md'=>45, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>['iPaaS/middleware','API access']],
|
|
// Direction
|
|
'PP033' => ['quali'=>['time_fte_saved'=>1.0,'risk_reduction'=>2,'compliance_uplift'=>1,'cx_impact'=>2,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>4, 'effort_md'=>30, 'complexity'=>2, 'risk_of_failure'=>1, 'deps'=>['KPI sources','OKR tool']],
|
|
'PP034' => ['quali'=>['time_fte_saved'=>2.0,'risk_reduction'=>2,'compliance_uplift'=>2,'cx_impact'=>2,'brand_score'=>3,'strategic_value'=>4], 'payback_months'=>3, 'effort_md'=>35, 'complexity'=>3, 'risk_of_failure'=>1, 'deps'=>['BI warehouse','Templates']],
|
|
'PP035' => ['quali'=>['time_fte_saved'=>3.0,'risk_reduction'=>5,'compliance_uplift'=>3,'cx_impact'=>2,'brand_score'=>4,'strategic_value'=>5], 'payback_months'=>6, 'effort_md'=>75, 'complexity'=>4, 'risk_of_failure'=>3, 'deps'=>['Data room access','NLP pipeline']]
|
|
];
|
|
|
|
// ======================================================
|
|
// SCALING FACTORS — function of company size / maturity / vertical
|
|
// ======================================================
|
|
$scaling_factors = [
|
|
'company_size' => [
|
|
'small' => ['label'=>'PME < 10M€ CA', 'multiplier'=>0.35, 'employees'=>'<100'],
|
|
'mid' => ['label'=>'ETI 10-100M€ CA', 'multiplier'=>1.00, 'employees'=>'100-500'],
|
|
'large' => ['label'=>'Grande Ent. 100M€-1Md€','multiplier'=>2.40, 'employees'=>'500-5000'],
|
|
'enterprise' => ['label'=>'Groupe > 1Md€ CA', 'multiplier'=>5.50, 'employees'=>'>5000']
|
|
],
|
|
'maturity_ai' => [
|
|
'low' => ['label'=>'Faible (pas d\'IA)', 'multiplier'=>1.30, 'note'=>'gap plus gros = plus de gain'],
|
|
'medium' => ['label'=>'Moyenne (IA partielle)','multiplier'=>1.00, 'note'=>'baseline'],
|
|
'high' => ['label'=>'Élevée (IA déployée)', 'multiplier'=>0.60, 'note'=>'quick-wins plus rares']
|
|
],
|
|
'verticals' => [
|
|
'retail' => ['label'=>'Retail', 'multiplier'=>1.10, 'amplified_depts'=>['sales','supply','marketing']],
|
|
'pharma' => ['label'=>'Pharma', 'multiplier'=>1.25, 'amplified_depts'=>['manufacturing','security','marketing']],
|
|
'banque' => ['label'=>'Banque', 'multiplier'=>1.40, 'amplified_depts'=>['security','sales','finance']],
|
|
'industrie' => ['label'=>'Industrie', 'multiplier'=>1.20, 'amplified_depts'=>['manufacturing','supply','operations']],
|
|
'services' => ['label'=>'Services', 'multiplier'=>1.00, 'amplified_depts'=>['hr','sales','direction']],
|
|
'consulting' => ['label'=>'Conseil', 'multiplier'=>0.90, 'amplified_depts'=>['hr','direction','sales']],
|
|
'energie' => ['label'=>'Énergie', 'multiplier'=>1.30, 'amplified_depts'=>['manufacturing','supply','security']],
|
|
'tech' => ['label'=>'Tech/SaaS', 'multiplier'=>0.80, 'amplified_depts'=>['sales','operations','marketing']],
|
|
'public' => ['label'=>'Secteur public','multiplier'=>0.70, 'amplified_depts'=>['security','hr','finance']]
|
|
]
|
|
];
|
|
|
|
// ======================================================
|
|
// PROGRESSIVE ROI CURVE — adoption over 12 months
|
|
// ======================================================
|
|
function roi_curve_12m($full_savings) {
|
|
// Ramp up: month 1-3 = 0→40%, month 4-9 = 40→90%, month 10-12 = 90→100%
|
|
$curve = [];
|
|
$ramp = [0.00, 0.05, 0.15, 0.30, 0.45, 0.60, 0.72, 0.82, 0.90, 0.95, 0.98, 1.00];
|
|
foreach ($ramp as $i => $pct) {
|
|
$curve[] = ['month'=>$i+1, 'pct'=>round($pct*100,1), 'savings_cumul'=>round($full_savings*$pct)];
|
|
}
|
|
return $curve;
|
|
}
|
|
|
|
// ======================================================
|
|
// MERGE V66 + enrichment
|
|
// ======================================================
|
|
$agents_full = [];
|
|
foreach ($pain_points as $pp) {
|
|
$id = $pp['id'];
|
|
$en = $enrichment[$id] ?? [
|
|
'quali'=>['time_fte_saved'=>1,'risk_reduction'=>3,'compliance_uplift'=>3,'cx_impact'=>3,'brand_score'=>3,'strategic_value'=>3],
|
|
'payback_months'=>6, 'effort_md'=>50, 'complexity'=>3, 'risk_of_failure'=>2, 'deps'=>[]
|
|
];
|
|
// Qualitative score composite /100
|
|
$quali = $en['quali'];
|
|
$quali_composite = round(($quali['time_fte_saved']*4 + $quali['risk_reduction']*4 + $quali['compliance_uplift']*3 + $quali['cx_impact']*3 + $quali['brand_score']*2 + $quali['strategic_value']*4) * 5, 1);
|
|
|
|
// Implementation cost estimate (WEVAL TJM moy 1200€ MD)
|
|
$impl_cost_eur = $en['effort_md'] * 1200;
|
|
|
|
// Baseline NPV 3 years (simplified: savings - impl_cost - 20% maintenance/year)
|
|
$savings = $pp['savings_eur_year'];
|
|
$npv_3y = ($savings * 3) - $impl_cost_eur - ($savings * 0.2 * 3);
|
|
|
|
$agents_full[] = array_merge($pp, [
|
|
'qualitative' => $quali,
|
|
'qualitative_composite_score' => $quali_composite,
|
|
'payback_months' => $en['payback_months'],
|
|
'effort_md' => $en['effort_md'],
|
|
'implementation_cost_eur' => $impl_cost_eur,
|
|
'complexity' => $en['complexity'],
|
|
'risk_of_failure' => $en['risk_of_failure'],
|
|
'dependencies' => $en['deps'],
|
|
'npv_3y_baseline_eur' => round($npv_3y),
|
|
'roi_ratio_3y' => $impl_cost_eur > 0 ? round($npv_3y / $impl_cost_eur, 2) : 0,
|
|
'roi_curve_12m' => roi_curve_12m($savings)
|
|
]);
|
|
}
|
|
|
|
// Total baseline
|
|
$total_savings = array_sum(array_column($agents_full, 'savings_eur_year'));
|
|
$total_impl_cost = array_sum(array_column($agents_full, 'implementation_cost_eur'));
|
|
$total_effort_md = array_sum(array_column($agents_full, 'effort_md'));
|
|
$avg_payback = $agents_full ? round(array_sum(array_column($agents_full, 'payback_months'))/count($agents_full), 1) : 0;
|
|
|
|
echo json_encode([
|
|
'generated_at' => date('c'),
|
|
'version' => 'V67',
|
|
'tool' => 'WEVAL ROI Simulator Agent-by-Agent',
|
|
'summary' => [
|
|
'agents_count' => count($agents_full),
|
|
'total_savings_baseline_eur' => $total_savings,
|
|
'total_implementation_cost_eur' => $total_impl_cost,
|
|
'total_effort_md' => $total_effort_md,
|
|
'avg_payback_months' => $avg_payback,
|
|
'global_npv_3y_eur' => array_sum(array_column($agents_full, 'npv_3y_baseline_eur')),
|
|
'dogfood_weval_savings_eur' => 2400000
|
|
],
|
|
'agents' => $agents_full,
|
|
'scaling_factors' => $scaling_factors,
|
|
'instructions' => [
|
|
'client_savings_formula' => 'baseline_savings_eur * company_size.multiplier * maturity_ai.multiplier * vertical.multiplier * (dept matches vertical.amplified_depts ? 1.25 : 1.0)',
|
|
'total_pack_formula' => 'SUM(selected_agents.adjusted_savings) - SUM(selected_agents.implementation_cost_eur)',
|
|
'roi_quali_formula' => 'WEIGHTED_AVG(quali axes) * vertical_strategic_alignment'
|
|
]
|
|
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|