array_column($list, 'string_label'), 'values' => array_map('floatval', array_column($list, 'string_value')), ]; } /** * Extracts labels and values for the "Répartition du chiffre d’affaires" pie chart. * * @param array $item Raw data for the chart. * @return array{labels: array, values: array} Normalized chart data. */ public static function getRepartitionAffair(array $item): array { $list = $item['list_last_repartition_affair_values'] ?? []; return [ 'labels' => array_column($list, 'string_label'), 'values' => array_map('floatval', array_column($list, 'string_value')), ]; } /** * Extracts active and passive values for the stacked bar chart (Bilan Simplifié). * * @param array $item Raw data for the chart. * @return array{labels: array, datasets: array} Normalized stacked datasets. */ public static function getBilanSimplify(array $item): array { $active = $item['list_bilan_simplify_active_values'] ?? []; $passive = $item['list_bilan_simplify_passive_values'] ?? []; $datasets = []; foreach ($active as $a) { $datasets[] = [ 'label' => $a['string_label_active_simplify'], 'data' => [floatval($a['string_value_active_simplify'])], 'stack' => 'Actif' ]; } foreach ($passive as $p) { $datasets[] = [ 'label' => $p['string_label_passive_simplify'], 'data' => [floatval($p['string_value_passive_simplify'])], 'stack' => 'Passif' ]; } return [ 'labels' => [$item['string_label']], 'datasets' => $datasets ]; } /** * Extracts labels and values for the autofinancing mixed chart. * * @param array $item Raw data for the chart. * @return array{labels: array, cpt: array, ivt: array} CAF and investment values. */ public static function getAutofinancement(array $item): array { $labels = []; $valuesCPT = []; $valuesIVT = []; foreach ($item['list_autofinancement_values'] as $row) { $labels[] = $row['string_autofinancement_label']; $inner = $row['list_autofinancement_values'][0]; $valuesCPT[] = floatval($inner['string_autofinancement_capabilities']); $valuesIVT[] = floatval($inner['string_industrial_investissment']); } return [ 'labels' => $labels, 'cpt' => $valuesCPT, 'ivt' => $valuesIVT, ]; } /** * Routes chart building based on chart type. * * @param string $type Chart identifier. * @param array $data Raw chart data. * @return array Chart.js-compatible configuration. */ public static function buildChart(string $type, array $data): array { switch ($type) { case 'list_affair': return self::buildAffairEvolution($data); case 'list_last_repartition_affair': return self::buildRepartitionAffair($data); case 'list_bilan_simplify': return self::buildBilanSimplify($data); case 'capacite_dautofinancement': return self::buildAutofinancement($data); default: return []; } } /** * Builds a line chart configuration for the revenue evolution. * * @param array $item Parsed chart data. * @return array Chart.js configuration. */ private static function buildAffairEvolution(array $item): array { $data = self::getAffairEvolution($item); return [ 'type' => 'line', 'data' => [ 'labels' => $data['labels'], 'datasets' => [[ 'label' => $item['string_label'], 'data' => $data['values'], 'borderColor' => 'rgba(54, 162, 235, 0.2)', 'backgroundColor' => 'rgba(54, 162, 235, 1)', 'borderWidth' => 1, ]] ], 'options' => [ 'responsive' => true, 'elements' => [ 'point' => [ 'radius' => 12, 'hitRadius' => 14, 'hoverRadius' => 14, 'pointStyle' => 'rect' ], 'line' => [ 'borderWidth' => 0, 'fill' => 'rect' ] ], 'legend' => ['display' => false] ] ]; } /** * Builds a pie chart configuration for CA repartition. * * @param array $item Parsed chart data. * @return array Chart.js configuration. */ private static function buildRepartitionAffair(array $item): array { $data = self::getRepartitionAffair($item); return [ 'type' => 'pie', 'data' => [ 'labels' => $data['labels'], 'datasets' => [[ 'label' => $item['string_label'], 'data' => $data['values'], 'backgroundColor' => [ 'rgba(85, 154, 213, 1)', 'rgba(64, 114, 203, 1)', 'rgba(242, 125, 32, 1)', 'rgba(165, 165, 165, 1)', 'rgba(255, 192, 0, 1)', 'rgba(75, 192, 192, 1)', ], 'borderColor' => [ 'rgba(85, 154, 213, 0.2)', 'rgba(64, 114, 203, 0.2)', 'rgba(242, 125, 32, 0.2)', 'rgba(165, 165, 165, 0.2)', 'rgba(255, 192, 0, 0.2)', 'rgba(75, 192, 192, 0.2)', ], 'borderWidth' => 1 ]] ], 'options' => [ 'scales' => [ 'y' => ['beginAtZero' => true] ], 'tooltips' => [ 'callbacks' => [ 'label' => 'function() { return null; }' ] ] ] ]; } /** * Builds a stacked bar chart for the simplified balance sheet (Actif vs Passif). * * @param array $item Parsed chart data. * @return array Chart.js configuration. */ private static function buildBilanSimplify(array $item): array { $colors = [ 'rgb(90, 155, 211)', 'rgb(255, 170, 0)', 'rgb(165, 165, 165)', 'rgb(238, 126, 52)', 'rgb(69, 116, 198)', 'rgb(113, 174, 71)', 'rgb(93, 169, 156)', 'rgb(253, 199, 0)', 'rgb(165, 165, 165)', 'rgb(238, 166, 52)', 'rgb(69, 80, 178)', ]; $i = 0; $datasetActif = array_map(function ($a) use ($colors, &$i) { return [ 'label' => $a['string_label_active_simplify'], 'data' => [floatval($a['string_value_active_simplify'])], 'stack' => 'Actif', 'backgroundColor' => $colors[$i++ % count($colors)] ]; }, $item['list_bilan_simplify_active_values'] ?? []); $datasetPassif = array_map(function ($a) use ($colors, &$i) { return [ 'label' => $a['string_label_passive_simplify'], 'data' => [floatval($a['string_value_passive_simplify'])], 'stack' => 'Passif', 'backgroundColor' => $colors[$i++ % count($colors)] ]; }, $item['list_bilan_simplify_passive_values'] ?? []); $labels = ['Actif Passif']; return [ 'type' => 'bar', 'data' => [ 'labels' => $labels, 'datasets' => array_merge($datasetActif, $datasetPassif) ], 'options' => [ 'responsive' => true, 'scales' => [ 'x' => ['stacked' => true], 'y' => ['stacked' => true] ], 'plugins' => [ 'legend' => ['position' => 'bottom'] ], 'interaction' => [ 'mode' => 'index', 'intersect' => false ], 'tooltips' => [ 'callbacks' => [ 'title' => 'function() { return null; }' ] ] ] ]; } /** * Builds a mixed chart combining bars (CAF) and line (Investissements). * * @param array $item Parsed chart data. * @return array Chart.js configuration. */ private static function buildAutofinancement(array $item): array { $data = self::getAutofinancement($item); return [ 'type' => 'bar', 'data' => [ 'labels' => $data['labels'], 'datasets' => [ [ 'type' => 'line', 'label' => "Investissements industriels", 'data' => $data['ivt'], 'borderColor' => 'rgba(231, 122, 37, 1)', 'borderWidth' => 2, 'tension' => 0.3, 'order' => 1 ], [ 'type' => 'bar', 'label' => "Capacité d'autofinancement", 'data' => $data['cpt'], 'backgroundColor' => 'rgba(64, 114, 203, 1)', 'borderColor' => 'rgba(64, 114, 203, 0.2)', 'borderWidth' => 1, 'order' => 0 ] ] ], 'options' => [ 'responsive' => true, 'point' => [ 'radius' => 6, 'hitRadius' => 8, 'hoverRadius' => 8, ], 'legend' => [ 'position' => 'bottom' ], ] ]; } }