([0-9]{3})(?: )?([0-9]{3})(?: )?([0-9]{3})<\/siren>(.*?)/i'; $replace = '$1$2 $3 $4$5'; $output = preg_replace($pattern, $replace, $content); return $output; } function commentaires_liste($content){ $output = $content; $pattern = '/(.*?)(.*)/i'; $pattern_all = '/(.*)(?:)/isU'; preg_match_all($pattern_all, $content, $listes); if ( isset($listes[0]) && count($listes[0])>0 ){ FB::log($listes, 'listes'); foreach ( $listes[0] as $index => $elementR ){ $output = commentaires_liste_replace($elementR, $listes[2][$index], $listes[1][$index], $output); FB::log($output, 'output'); } } elseif ( preg_match($pattern, $content, $matches) ){ FB::log($content, 'liste'); switch($matches[2]){ case '+': $replace = '$1$3'; break; case '-': $replace = '$1$3'; break; case '=': $replace = '$1$3'; break; case ':': $replace = '$1$3'; break; default: $replace = '$1$3'; break; } $output = preg_replace($pattern, $replace, $content); } return $output; } function commentaires_liste_replace($elementR, $element, $type, $content){ switch ( $type ){ case '+': $replace = ''.$element.'
'; break; case '-': $replace = ''.$element.'
'; break; case '=': $replace = ''.$matches[2].'
'; break; case ':': $replace = ''.$element.'
'; break; default: $replace = ''.$element.'
'; break; } $output = str_replace($elementR, $replace, $content); return $output; } function commentaires_image($content){ $pattern = '/IMAGE\((.*?)\)/i'; preg_match($pattern, $content, $matches); $replace = ''; $output = str_replace($matches[0], $replace, $content); return $output; } function commentaires_lien($content){ $path = array( 'pdf' => '/datafile.php?q=commentaires', 'html' => '', ); $pattern = "/(.*?)<\/lien>/i"; preg_match($pattern, $content, $matches); if(count($matches)>0){ switch($matches[2]){ case 'pdf': $content = str_replace( $matches[0], "". $matches[3]."", $content); break; case 'htm': case 'html': $content = str_replace( $matches[0], "". $matches[3]."", $content); break; } } return $content; } function commentaires_graphique_couleur($content){ $graphCouleurs = array(); //Association des couleurs Nom => code Hexa $assocNomCouleurs = array( 'BLA' => 0xFFFFFF, 'BLA1' => 0xFFFAFA, 'BLA2' => 0xF0FFFF, 'BLA3' => 0xFFFFF0, 'BLE' => 0x0000FF, 'BLE1' => 0x00BFFF, 'BLE2' => 0x00008B, 'BLE3' => 0x87F0FA, 'JAU' => 0xFFFF00, 'JAU1' => 0xFFEFD5, 'JAU2' => 0xFFA500, 'JAU3' => 0xFFFFE0, 'LUM' => 0xADFF2F, 'LUM1' => 0x00FFFF, 'LUM2' => 0xFF00FF, 'LUM3' => 0xF0FFF0, 'MAR' => 0xD2691E, 'MAR1' => 0xF4A460, 'MAR2' => 0x8B4513, 'MAR3' => 0xF5DEB3, 'MET' => 0xFFD700, 'MET1' => 0xFFF8DC, 'MET2' => 0xC0C0C0, 'MET3' => 0xFDF5E6, 'NOI' => 0x000000, 'NOI1' => 0x808080, 'NOI2' => 0x2F4F4F, 'NOI3' => 0xDCDCDC, 'ROU' => 0xFF0000, 'ROU1' => 0xFF7F50, 'ROU2' => 0xB22222, 'ROU3' => 0xFFDAB9, 'VER' => 0x228B22, 'VER1' => 0x66CDAA, 'VER2' => 0x066400, 'VER3' => 0x98FB98, 'VIO' => 0xC71585, 'VIO1' => 0xEE82EE, 'VIO2' => 0x8B008B, 'VIO3' => 0xFFF0F5, ); $pattern = '/COULEUR\((.*)\)/i'; ///Detection couleur if ( preg_match($pattern, $content, $matches) ) { $listeCouleurs = $matches[1]; //Récupération des couleurs $pattern = '/([a-z0-9]{3,4})/i'; if ( preg_match_all($pattern, $listeCouleurs, $matches) ) { //FB::log($matches, 'matches'); $nbCouleurs = count($matches[1]); for($i=1;$i<$nbCouleurs;$i++){ $graphCouleurs[] = $assocNomCouleurs[$matches[1][$i]]; } } } //FB::log($graphCouleurs,' DETECTION : graphCouleurs'); return $graphCouleurs; } function commentaires_graphique($content){ global $siret, $siren, $idEntreprise; $pattern = '/\[GRAPHIQUE id=(.*?) titre=\'(.*?)\',(.*)]/'; if( preg_match($pattern, $content, $matches) ){ //FB::log($matches,'graphique'); $image_id = $matches[1]; $titre = $matches[2]; //Génération id/nom fichier graphique if (($siret*1)==0 || ($siren*1)<100){ $id = 'gcomment-'.$idEntreprise.'-'.$image_id; }else{ $id = 'gcomment-'.$siret.'-'.$image_id; } //Determine le type du graphique $type = ''; $typePattern = array( 'projection' => '/(R\[.*]#H,.*_Y#L)/', 'stacked' => '/((R\[.*]#HS,?){1,};?){1,}/', 'histo' => '/(Rs?\[.*]#[H|L],?){1,}/', 'radar' => '/(R\[.*]#R,?){1,}/', ); foreach($typePattern as $type => $pattern){ if (preg_match($pattern,$matches[3], $match_type)>0){ //FB::log($match_type, $type); break; } } switch($type){ case 'histo': $image_file = commentaires_graph_histo($id, $titre, $matches[3]); break; case 'radar': $image_file = commentaires_graph_radar($id, $titre, $matches[3]); break; case 'stacked': $image_file = commentaires_graph_stacked($id, $titre, $matches[3]); break; case 'projection': $image_file = commentaires_graph_histo($id, $titre, $matches[3]); break; default: $image_file = 'Erreur'; break; } //Le fichier image existe if( file_exists(PATH_SITE.'/cache/imgcache/'.$image_file) ){ $content = str_replace( $matches[0], '', $content); }else{ $content = str_replace( $matches[0], 'Erreur génération graphique', $content); } } return $content; } function commentaires_graph_stacked($id, $titre, $strRatios) { global $bilansInfos, $ratiosEntrep, $ratiosSecteur, $ratiosInfos, $graphCouleurs; if(count($graphCouleurs)>0){ $couleurs = $graphCouleurs; } else { $couleurs = array( 0xaaaaff, 0x6666ff, 0x3cb371, /*medium sea green*/ 0xff8080, 0x000000, /*noir*/ /*0x80ff80,*/ 0xffe4c4, /*abricot*/ 0xbc8f8f, /*rosy brown*/ 0xc0c0c0, /*silver*/ 0xfffff0, /*ivoire*/ /*0xf0ffff, /*azure*/ 0xff7f50, /*coral*/ 0xa0522d, /*marron*/ 0xffd700, /*gold*/ 0x8866ff, 0x0000cd, /*blue*/ 0xee82e2, /*violet*/ ); } //Tri des bilans foreach ($bilansInfos as $key => $row) { $bilansInfos[$key]['cle'] = $key; $date[$key] = $row['dateCloture']; $duree[$key] = $row['duree']; $devise[$key] = $row['devise']; $unite[$key] = $row['unite']; $cle[$key] = $row['cle']; } array_multisort( $date, SORT_DESC, $duree, SORT_DESC, $devise, SORT_DESC, $unite, SORT_DESC, $cle, SORT_DESC, $bilansInfos); $index = $bilansInfos[0]['cle']; $dateCloture = substr($bilansInfos[0]['dateCloture'],0,4); //Génération du graphique require_once 'phpchartdir/phpchartdir.php'; $path = PATH_SITE.'/cache/imgcache/'; $file = $id.'.png'; $c = new XYChart(548, 300); $c->addTitle($titre, 'times.ttf', 10); $c->setPlotArea(70, 30, 200, 200); $legendObj = $c->addLegend2(300, 50, -2, "times.ttf", 9); $legendObj->setBackground(Transparent, Transparent); $labels = array($dateCloture); $c->xAxis->setLabels($labels); $layer = $c->addBarLayer2(Stack); $layer->setBorderColor(Transparent, softLighting(Left)); $cpt_couleur = 0; $pattern = '/(Rs?)\[(.*)]#.{1}/'; $ratios = explode(';', $strRatios); $div = 1; foreach ( $ratios as $indexGroup => $groupRatios ){ $stackRatios = explode(',', $groupRatios); $layer->addDataGroup('Group'.$indexGroup); //Analyse pour unité correcte foreach ( $stackRatios as $ratio ){ preg_match($pattern, $ratio, $matches); $value = $ratiosEntrep[$index]['r'.$matches[2]]; if ( !isset($unite) ) { $unite = $ratiosInfos['r'.$matches[2]]['unite']; } if ( $unite == 'EUR' ){ if ( $div<1000000 && abs($value)/1000000>0 ){ $unite = 'M EUR'; $div = 1000000; } elseif ( $div<1000 && abs($value)/1000>0 ){ $unite = 'K EUR'; $div = 1000; } } } //Assignation valeur foreach ( $stackRatios as $ratio ){ preg_match($pattern, $ratio, $matches); $value = $ratiosEntrep[$index]['r'.$matches[2]]/$div; $titre = htmlspecialchars_decode( $ratiosInfos['r'.$matches[2]]['libelle'],ENT_QUOTES); $layer->addDataSet(array($value), $couleurs[$cpt_couleur], $titre); $cpt_couleur++; if($cpt_couleur>=count($couleurs)) { $cpt_couleur=0; } } } if ( !isset($unite) ) { $unite = 'EUR'; } $layer->setBarGap(0.2, 0); $c->yAxis->setAutoScale(0.2); $c->yAxis->setTitle($unite); $c->yAxis->setWidth(2); $c->xAxis->setTitle('Années'); $c->xAxis->setWidth(2); $c->xAxis->setLabels($labelsX); if ( $c->makeChart($path.$file) === true ){ $output = $file; } else { $output = false; } return $output; } function commentaires_graph_histo($id, $titre, $strRatios){ global $graphCouleurs, $bilansInfos, $ratiosEntrep, $ratiosSecteur, $tabProjection, $ratiosInfos; //FB::log($graphCouleurs, 'HISTO : graphCouleurs'); //Gestion des couleurs if(count($graphCouleurs)>0){ $couleurs = $graphCouleurs; } else { $couleurs = array(0xff8080, 0x80ff80, 0x8080ff); } $ratios = explode(',', $strRatios); $data = array(); $dataInfos = array(); $nbRatio = 0; //Détection des ratios $patternR = '/(Rs?)\[(.*)]#(.{1})/'; $patternP = '/(.*)_Y#(.{1})/'; foreach ( $ratios as $ratio ) { //Ratios secteur et entreprise if( preg_match($patternR, $ratio, $matches) ){ $typeRatio = $matches[1]; $numRatio = $matches[2]; $titreRatio = commentaires_graph_lib($numRatio); $unite = $ratiosInfos['r'.$numRatio]['unite']; $div = 1; switch ( $typeRatio ){ case 'R' : $titreRatio.= ' - Entreprise'; $tabRatio = $ratiosEntrep; break; case 'Rs' : $titreRatio.= ' - Secteur'; $tabRatio = $ratiosSecteur; break; } //Informations données $dataInfos[$nbRatio] = array( 'titre' => $titreRatio, 'style' => $matches[3], ); //Assignation données $xPrec = 0; foreach ( $tabRatio as $key => $valRatio ){ $index = (int)substr($bilansInfos[$key]['dateCloture'],0,4); ($xPrec != 0) ? $diff = $xPrec-$index : $diff = 1; if ($diff == 1){ $data[$index][$nbRatio] = $valRatio['r'.$numRatio]; if ( $unite == 'EUR' ){ if ( $div<1000000 && abs($valRatio['r'.$numRatio])/1000000>0 ){ $unite = 'M EUR'; $div = 1000000; } elseif ( $div<1000 && abs($valRatio['r'.$numRatio])/1000>0 ){ $unite = 'K EUR'; $div = 1000; } } } $xPrec = $index; } $nbRatio++; //Ratios de projection } elseif ( preg_match($patternP, $ratio, $matches) ){ $titreRatio = $matches[1]; $dataInfos[$nbRatio] = array( 'titre' => $titreRatio.' - Projection', 'style' => $matches[2], ); $tabRatio = $tabProjection[$titreRatio.'_Y']; krsort($tabRatio); foreach ( $tabRatio as $key => $valRatio ){ $index = (int)substr($key,0,4); $data[$index][$nbRatio] = $valRatio; } $nbRatio++; } } if ( !isset($unite) ) { $unite = 'EUR'; } //FB::log($data, 'data'); //Graphique require_once 'phpchartdir/phpchartdir.php'; $path = PATH_SITE.'/cache/imgcache/'; $file = $id.'.png'; if ( count($data)<=1 ){ $output = false; } else { ksort($data); $labelsX = array_keys($data); $valuesY = array(); for ( $i = 0; $i < $nbRatio ; $i++ ){ foreach ( $data as $values ){ $valuesY[$i][] = isset($values[$i]) ? (int)$values[$i]/$div : 0; } } //Génération du graphique $c = new XYChart(548, 350); $c->addTitle($titre, 'times.ttf', 10); $c->yAxis->setTitle($unite); $c->yAxis->setWidth(2); $c->xAxis->setTitle('Années'); $c->xAxis->setWidth(2); $c->xAxis->setLabels($labelsX); $legendObj = $c->addLegend2(25, 25, -2, "times.ttf", 9); $legendObj->setBackground(Transparent, Transparent); $c->setPlotArea(110, 90, 300, 200); //Application layer pour line $lineLayer = $c->addLineLayer2(Side); $lineLayer->setBorderColor(Transparent, softLighting(Left)); $lineLayer->setLineWidth(2); //Application layer pour bar $barLayer = $c->addBarLayer2(Side); $barLayer->setBorderColor(Transparent, softLighting(Left)); for ( $i = 0; $i < $nbRatio ; $i++ ){ //FB::log($couleurs[$i], 'Couleur'); if ( $dataInfos[$i]['style'] == 'H' ){ $barLayer->addDataSet($valuesY[$i], $couleurs[$i], $dataInfos[$i]['titre']); } else if ( $dataInfos[$i]['style'] == 'L' ){ $dataSetObj = $lineLayer->addDataSet($valuesY[$i], $couleurs[$i], $dataInfos[$i]['titre']); $dataSetObj->setDataSymbol(SquareSymbol, 7); } } if( $c->makeChart($path.$file) === true ){ $output = $file; } else { $output = false; } } return $output; } function commentaires_graph_radar($id, $titre, $strRatios) { global $graphCouleurs; if(count($graphCouleurs)>0){ $couleurs = $graphCouleurs; } else { $couleurs = array(0x9999ff); } //FB::log($couleurs, 'RADAR-couleur'); $ratios = explode(',', $strRatios); $data = array(); $pattern = '/(Rs?)\[(.*)]#(.{1})/'; foreach($ratios as $ratio){ if( preg_match($pattern, $ratio, $matches) ){ $typeRatio = $matches[1]; $numRatio = $matches[2]; $titreRatio = commentaires_graph_lib($numRatio); $supPattern = '/\(.*?\)/'; $titreRatio = preg_replace($supPattern, '', $titreRatio); $supPattern = '/[ ]/'; $titreRatio = preg_replace($supPattern, '<*br*>', $titreRatio); $data['y'][] = array( 'titre' => $titreRatio, 'data' => commentaires_graph_y($typeRatio, $numRatio), ); } } $data['x'] = commentaires_graph_x(); //Graphique require_once 'phpchartdir/phpchartdir.php'; $path = PATH_SITE.'/cache/imgcache/'; $file = $id.'.png'; if(count($data)<=1){ $output = 0; }else{ //Tri des données foreach($data['y'] as $yKey => $y){ $i = 0; foreach($y['data'] as $val){ $dataTri[$data['x'][$i]] = $val; $i++; } ksort($dataTri); $data['y'][$yKey]['data'] = array_values($dataTri); } sort($data['x']); foreach($data['y'] as $val){ $num = count($val['data'])-1; $gdata[] = $val['data'][$num]; $labels[] = $val['titre']; } } $c = new PolarChart(548, 480); $c->setPlotArea(270, 240, 150); $c->addAreaLayer($gdata, $couleurs[0]); $c->angularAxis->setLabels($labels); if( $c->makeChart($path.$file) === true ){ $output = $file; } else { $output = false; } return $output; } function commentaires_graph_lib($numRatio){ global $ratiosInfos; return htmlspecialchars_decode( $ratiosInfos['r'.$numRatio]['libelle'], ENT_QUOTES); } function commentaires_graphp_x($ratio){ global $tabProjection; $output = array(); $tabRatio = $tabProjection[$ratio.'_Y']; krsort($tabRatio); foreach($tabRatio as $key => $val){ $output[] = (int)substr($key,0,4); } return $output; } function dateBilanAAAA($value){ return (int)substr($value, 0, 4); } function commentaires_graph_x(){ global $bilansInfos; $output = array(); foreach($bilansInfos as $bilan){ $output[] = $bilan['dateCloture']; } return $output; } function commentaires_graph_y($typeRatio, $numRatio){ global $ratiosEntrep, $ratiosSecteur, $tabProjection; switch ($typeRatio) { case 'R' : $tabRatio = $ratiosEntrep; break; case 'Rs' : $tabRatio = $ratiosSecteur; break; case 'projection' : $tabRatio = $tabProjection; break; } $output = array(); if ($typeRatio != 'projection') { foreach($tabRatio as $key => $val){ $output[$key] = $val['r'.$numRatio]; } } else { $tabRatio = $tabRatio[$numRatio.'_Y']; krsort($tabRatio); foreach($tabRatio as $val){ $output[] = $val; } } return $output; }