entreprise = new stdClass(); $this->dateFunction = new WDate(); $this->ws = new WsScores(); $entreprise = new SessionEntreprise($this->getRequest()->getParam('siret'), $this->getRequest()->getParam('id')); $this->entreprise->nom = $entreprise->getRaisonSociale(); $this->entreprise->siret = $this->getRequest()->getParam('siret'); $this->entreprise->siren = substr($this->entreprise->siret,0,9); $this->entreprise->naf = $entreprise->getNaf(); $this->imageCachePath = APPLICATION_PATH. '/../cache/pages/imgcache/'; $this->idSC = $this->getRequest()->getParam('id'); $this->entreprise->siren = substr($this->getRequest()->getParam('siret'), 0, 9); $this->view->assign('isChecked', 'checked="ckecket"'); $this->view->assign('isNotChecked', 'false'); $this->view->assign('dateFunction', $this->dateFunction); $this->view->headLink() ->appendStylesheet('/themes/default/styles/finance.css', 'all'); $this->view->headScript() ->appendFile('/themes/default/scripts/finance.js', 'text/javascript'); } /* --------------------------------------------------------------------------------------------------- */ /* Gestion de la synthése avec les graphiques */ /* ----------------------------------------------------------------------------------------------------*/ /** * cette fonction gére l'affichage des données pour la synthése avec les différents graphiques. * Il est possible de rajouter des champs dans le tableau bilanReference en respectant la synthaxe. */ public function syntheseAction() { $bilanN = array(); $bilanReference = array('r5' => array('evolution' => 'r6' , 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'CHIFFRE D\'AFFAIRES'), 'r7' => array('evolution' => 'r8' , 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'RESULTAT COURANT AVANT IMPOTS'), 'r10' => array('evolution' => 'r11' , 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'RESULTAT NET'), 'r18' => array('evolution' => 'r19' , 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'FONDS PROPRES'), 'r22' => array('evolution' => 'r23' , 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'TOTAL BILAN'), 'r231' => array('evolution' => 'r235', 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'FONDS DE ROULEMENT'), 'r232' => array('evolution' => 'r236', 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'BESOIN EN FONDS DE ROULEMENT'), 'r249' => array('evolution' => 'r254', 'unite' => 'EUR', 'operateur' => 1000, 'name' => 'TRESORERIE'), 'r24' => array('evolution' => 'r24' , 'unite' => 'Pers.', 'operateur' => 1, 'name' => 'EFFECTIF') ); $request = $this->getRequest(); $synthese = $this->ws->getRatios(substr($request->getParam('siret'), 0, 9), 'synthese'); foreach ($synthese->BilansInfos->item as $item) { if ($item->typeBilan == self::getTypeSynthese()) { foreach ($item->RatiosEntrep->item as $RatiosEntrep) { foreach ($bilanReference as $id => $params) { if ($RatiosEntrep->id == $id) { $bilanN[$id]['name'] = $params['name']; $bilanN[$id]['unite'] = $params['unite']; if (count($bilanN[$id]['item']) <= 2) { if (is_numeric($RatiosEntrep->val)) $valeur = number_format(($RatiosEntrep->val/$params['operateur']), 0, '', ' '); $bilanN[$id]['item'][$item->dateCloture]['ValEntrep'] = $valeur; } if (!self::checkIfImageExist(self::getTypeSynthese().'-'.$id)) self::createGraphiqueSynthes($id, $synthese, self::getTypeSynthese()); } } } foreach ($item->RatiosEntrepEvol->item as $RatiosEntrepEvol) { foreach ($bilanReference as $id => $params) { if ($RatiosEntrepEvol->id == $params['evolution']) { if (array_key_exists($item->dateCloture, $bilanN[$id]['item'])) $bilanN[$id]['item'][$item->dateCloture]['ValEntrepEvol'] = $RatiosEntrepEvol->val; } } } } } foreach ($bilanN as $id => $val) ksort($bilanN[$id]['item']); if ($this->getRequest()->isPost()) $typeBilan = $this->getRequest()->getParam('typeBilan'); else $typeBilan = 'N'; $this->view->assign('typeBilan', $typeBilan); $this->view->assign('raisonSociale', $this->entreprise->nom); $this->view->assign('siret', $this->entreprise->siret); $this->view->assign('siren', $this->entreprise->siren); $this->view->assign('synthese', $bilanN); $this->view->assign('nameForGraphique', $bilanReference); self::analyseSyntheseGraphique($synthese->BilansInfos->item); } /** * Permet de determiner le type de bilan choise * par default c'est le type N * */ protected function getTypeSynthese() { $typeBilan = $this->getRequest()->getParam('typeBilan'); switch($this->getRequest()->getParam('typeBilan')) { case 'C': return ($typeBilan); case 'N': return ($typeBilan); default: return ('N'); } return ('N'); } /** * Création des elements servant au graphique les donnée entreprise sur toutes les années. * * @param L'objet $synthese * @param id courrent $id * @param l'adresse du label $labelX * @param le type de bilan C/N $type */ protected function createAbscisseSynthese($synthese, $id, &$labelX, $type) { $dataX1 = array(); foreach ($synthese->BilansInfos->item as $item) { if ($item->typeBilan == $type) { $labelX[] = substr($item->dateCloture, 0, 4); foreach ($item->RatiosEntrep->item as $RatiosEntrep) { if ($RatiosEntrep->id == $id) { if (is_numeric($RatiosEntrep->val)) $dataX1[] = ($RatiosEntrep->val / 1000); } } } } $labelX = array_reverse($labelX); $dataX1 = array_reverse($dataX1); return ($dataX1); } /** * Création des graphiques pour chaque lignes de la synthése. * * @param id courrent $id * @param l'objet $synthese * @param le type de bilan C/N $type */ protected function createGraphiqueSynthes($id, $synthese, $type) { $labelX = array(); $labelY = array(); $file = $id.'.png'; $dataX1 = self::createAbscisseSynthese($synthese,$id, $labelX, $type); $c = new XYChart(350, 250); $c->setPlotArea(55, 10, 280, 200); $c->yAxis->setTitle('Keuros'); $c->xAxis->setTitle("Années"); $c->xAxis->setWidth(2); $c->yAxis->setWidth(2); $legendObj = $c->addLegend(50, 10, false, "times.ttf", 9); $legendObj->setBackground(Transparent); $c->addLineLayer($dataX1, 0xff0000, "Entreprise"); $c->yAxis->setLabels($labelY); $c->yAxis->setLabelStep(10); $c->xAxis->setLabels($labelX); $c->makeChart($this->imageCachePath.$type.'-'.$file); } /** * En cours de developement * * @param unknown_type $id * @param unknown_type $dataX * @param unknown_type $synthese */ protected function getVal($id, &$dataX, $synthese) { $dataX = array(); foreach ($synthese->BilansInfos->item as $element){ foreach($element->RatiosEntrepEvol->item as $RatiosEntrepEvol){ if ($RatiosEntrepEvol->id == $id) { $dataX[] = ($RatiosEntrepEvol->val == 'NS')?0:$RatiosEntrepEvol->val; } } } } private function getValFromKey($stdClass, $key) { foreach($stdClass as $element) { if ($element->id == $key) return ($element->val/1000); } } /** * En cours de developement * * @param unknown_type $synthese * @param unknown_type $bilanReference */ protected function analyseSyntheseGraphique($data) { $filename = "test.png"; //Tri des données par date et par ordre croissant foreach ($data as $key => $row) { $date[$key] = $row->dateCloture; } array_multisort($date, SORT_ASC, $data); //Définition des valeurs pour le graph $dataBFR = array(); $dataFR = array(); $dataCA = array(); $BFR = array(); $i=0; $nbAnnees = 0; //Parcourir les années foreach($data as $item) { $anneeFin = substr($item->dateCloture,0,4); $moisFin = substr($item->dateCloture,4,2); $jourFin = substr($item->dateCloture,6,2); //Calcul de la date de début $dateDebut = date("Ymd", mktime(0, 0, 0, $moisFin-$item->duree, $jourFin, $anneeFin)); $anneeDebut = substr($dateDebut,0,4); $moisDebut = substr($dateDebut,4,2); $jourDebut = substr($dateDebut,6,2); //Affectation des abscisses if(count($dataBFR['x']) < 5) { $dataBFR['x'][$i] = $dataFR['x'][$i] = $dataCA['x'][$i] = $dataEBE['x'][$i] = chartTime((int)$anneeDebut, (int)$moisDebut, (int)$jourDebut); $dataBFR['x'][$i+1] = $dataFR['x'][$i+1] = $dataCA['x'][$i+1] = $dataEBE['x'][$i+1] = chartTime((int)$anneeFin, (int)$moisFin, (int)$jourFin); } //Affectation des ordonnées if(count($dataBFR['y']) < 5) $dataBFR['y'][$i] = $dataBFR['y'][$i+1] = self::getValFromKey($item->RatiosEntrep->item, 'r236'); if(count($dataFR['y']) < 5) $dataFR['y'][$i] = $dataFR['y'][$i+1] = self::getValFromKey($item->RatiosEntrep->item, 'r235'); if(count($dataCA['y']) < 5) $dataCA['y'][$i] = $dataCA['y'][$i+1] = self::getValFromKey($item->RatiosEntrep->item, 'r6'); if(count($dataEBE['y']) < 5) $dataEBE['y'][$i] = $dataEBE['y'][$i+1] = self::getValFromKey($item->RatiosEntrep->item, 'r146'); $i+=2; } $c = new XYChart(660, 350, 0xcccccc, 0x000000, 1); $c->addTitle("Synthèse *", "timesbi.ttf", 15, 0x000000); $c->addText(60, 320, "* Elements financier rapportés à 12 mois" ); $c->setPlotArea(60, 80, 500, 200, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); $c->yAxis->setTitle("KEUROS","timesbi.ttf",10); $c->xAxis->setTitle( "<*block,valign=absmiddle*>Années<*/*>"); $c->xAxis->setWidth(2); $c->yAxis->setWidth(2); // Add a legend box at (55, 32) (top of the chart) with horizontal layout. Use 9 pts // Arial Bold font. Set the background and border color to Transparent. $legendObj = $c->addLegend(55, 30, false, "times.ttf", 9); $legendObj->setBackground(Transparent); // Add a blue (0000ff) step line layer to the chart and set the line width to 2 pixels $layer1 = $c->addStepLineLayer($dataFR['y'], 0x0000ff, "FONDS DE ROULEMENT"); $layer1->setXData($dataFR['x']); $layer1->setLineWidth(2); // Add a red (ff0000) step line layer to the chart and set the line width to 2 pixels $layer0 = $c->addStepLineLayer($dataBFR['y'], 0xff0000, "BESOIN EN FONDS DE ROULEMENT"); $layer0->setXData($dataBFR['x']); $layer0->setLineWidth(2); // Add a green (00ff00) step line layer to the chart and set the line width to 2 pixels $layer2 = $c->addStepLineLayer($dataCA['y'], 0x00ff00, "CHIFFRE D'AFFAIRES"); $layer2->setXData($dataCA['x']); $layer2->setLineWidth(2); // Add a black (000000) step line layer style dash to the chart and set the line width to 2 pixels $layer3 = $c->addStepLineLayer($dataEBE['y'], $c->dashLineColor(0x000000, DashLine), "EXCEDENT BRUT D'EXPLOITATION"); $layer3->setXData($dataEBE['x']); $layer3->setLineWidth(2); # If the FR line gets above the BFR line, color to area between the lines red (ff0000) $c->addInterLineLayer($layer0->getLine(0), $layer1->getLine(0), 0xff0000, Transparent); # If the FR line gets below the lower BFR line, color to area between the lines light green (8099ff99) $c->addInterLineLayer($layer0->getLine(0), $layer1->getLine(0), Transparent, 0x8044ff44); if($c->makeChart($this->imageCachePath.$filename) === TRUE){ $return = ''; }else{ $return = 'Impossible de générer le graphique'; } return $return; } /* --------------------------------------------------------------------------------------------------- */ /* Gestion des bilans ACTIF/PASSIF/CR */ /* ----------------------------------------------------------------------------------------------------*/ /** * Construit les elements des bilan en particulié les valeurs. * * @param objet $bilan * @param le tableau de reference $tableauDeReference * @param type de bilan $type * @param date $date * @param duree 12Mois/... $duree * @param consolidé ou Normale (formulaire) $typebilan */ protected function constructElementForBilan($bilan, $tableauDeReference, &$type, &$date, &$duree, $typebilan) { foreach($bilan->BilansInfos->item as $element) { if($element->typeBilan == $typebilan) { if($duree == EOF) $duree = $element->duree; if (@count($date) < 5) { if(!in_array($element->dateCloture, $date)) $date[] = $element->dateCloture; } foreach($element->RatiosEntrep->item as $item) { foreach($tableauDeReference as $id => $valeur) { if ($item->id == $id) { if (count($type[$id]['item']) < 5) { if ($item->val > 0) { $type[$id]['item'][$element->dateCloture] = $item->val / 1000; } else $type[$id]['item'][$element->dateCloture] = 'NS'; } } } } } } foreach ($type as $id => $valeur) { $type[$id]['item'] = array_reverse($valeur['item']); } $date = array_reverse($date); } /** * Fonction qui affiche les bilan (actif, passif, SIG). * Le principe est d'utiliser le mapping de données. * */ public function bilanAction() { $actif = array(); $passif = array(); $SIG = array(); $date = array(); $duree = EOF; $request = $this->getRequest(); $listeBilan = array('actif', 'passif', 'sig'); $referenceActif = array('r59' => 'Actif Immobilisé Net','r51' => 'Incorporelles', 'r52' => 'Corporelles', 'r53' => 'Financières', 'r69' => 'Actif Circulant Net', 'r60' => 'Stock et encours', 'r61' => 'Créances Clients', 'r62' => 'Autres Créances', 'r63' => 'Trésorerie Active', 'r22' => 'TOTAL ACTIF' ); $referencePassif = array('r79' => 'Ressources Propres', 'r70' => 'Fonds Propres', 'r71' => 'Provisions Risques', 'r72' => 'Comptes Courants', 'r90' => 'Ressources Externes', 'r83' => 'Dettes Financières', 'r84' => 'Dettes Fournisseurs', 'r85' => 'Dettes Fiscales', 'r86' => 'Autres Dettes', 'r87' => 'Trésorerie Passive', 'r22' => 'TOTAL PASSIF' ); $referenceSIG = array('r101' => 'CHIFFRE D\'AFFAIRES HORS TAXE', 'r102' => '-Achat de marchandises, de matières premières', 'r110' => 'MARGE COMMERCIALE', 'r111' => '+Production vendue', 'r112' => '+Production immobilisée et stockée', 'r120' => 'PRODUCTION DE L\'EXERCICE', 'r121' => 'Variation de stock de marchandises et matières premières', 'r122' => 'MARGE BRUTE', 'r123' => '-Autres charges externes', 'r130' => 'VALEUR AJOUTÉE', 'r132' => 'Charges de personnel', 'r133' => '-Impôts, taxes & versements assimilés', 'r131' => '+Subventions d\'exploitation', 'r140' => 'EXCÉDENT BRUT D\'EXPLOITATION (EBE)', 'r141' => '+Autres produits d\'exploitation', 'r142' => '-Autres charges d\'exploitation', 'r143' => '+Reprise sur dotations & transferts de charges', 'r144' => '+70% Loyer de crédit bail', 'r145' => '-Dotations d\'exploitation & provisions d\'exploitation', 'r150' => 'RÉSULTAT D\'EXPLOITATION', 'r151' => '+Produits financiers', 'r152' => '+30% Loyer de crédit bail', 'r153' => '+Charges financières', 'r170' => 'RÉSULTAT COURANT AVANT IMPOTS', 'r171' => '+Produits exceptionnels', 'r172' => '-Charges exceptionnelles', 'r181' => '-Impôts sur les bénéfices', 'r182' => '-Participation salariale', 'r199' => 'RÉSULTAT NET' ); $bilan = array(); $typeBilan = ($this->getRequest()->isPost())?$this->getRequest()->getParam('typeBilan'):'N'; $bilan = $this->ws->getRatios($this->entreprise->siren, 'ratios'); self::constructElementForBilan($bilan, $referenceActif, $actif, $date, $duree, $typeBilan); self::constructElementForBilan($bilan, $referencePassif, $passif, $date, $duree, $typeBilan); self::constructElementForBilan($bilan, $referenceSIG, $SIG, $date, $duree, $typeBilan); $this->view->assign('referenceactif', $referenceActif); $this->view->assign('referencepassif', $referencePassif); $this->view->assign('referencesig', $referenceSIG); $this->view->assign('typeBilan', $typeBilan); $this->view->assign('typeBilan', $typeBilan); $this->view->assign('siren', $this->entreprise->siren); $this->view->assign('raisonSociale', $this->entreprise->nom); $this->view->assign('listeBilan', $listeBilan); $this->view->assign('date', $date); $this->view->assign('duree', $duree); $this->view->assign('actif', $actif); $this->view->assign('passif', $passif); $this->view->assign('sig', $SIG); } private function formatElementForGraphiqueBilan($bilan) { $tb = array(); foreach ($bilan as $id => $item) { foreach($bilan[$id]['item'] as $element) { $tb[] = round($element*100/$bilan[$id]['item'][key($bilan['r22']['item'])],2); } } return ($tb); } /* --------------------------------------------------------------------------------------------------- */ /* Gestion des ratios avec les graphiques */ /* ----------------------------------------------------------------------------------------------------*/ /** * Permet de formater correctement les données. * * @param type d'unite $unite * @param la valeur a transcrire $valeur */ protected function parseUnite($unite, $valeur) { switch ($unite) { case 'EUR': return (number_format((round($valeur)/1000), 0, '', ' ')); case '%' : return (round($valeur)); case 'Jours': return ($valeur); default: return ($valeur); } } /** * Permet de determiner si ont crée l'image ou s'il elle existe daja dans une periode de 8 heures MAX. * * @param nom de l'image $name */ protected function checkIfImageExist($name) { $path = APPLICATION_PATH.'/../cache/pages/imgcache/'; if (file_exists($path.$name.'.png')) { $date = date('Ymdh', filemtime($path.$name.'.png')); if($date + 8 > date('Ymdh')) return (false); else return (true); } return (false); } /** * Cette fonction permet de comparer les donnée entre elles pour determiner l'evolution * positive ou négative, ( j'ai respecté les consigne apppliqué préalablement sur l'ancien Extranet. * * @param Objet $valeurEnt * @param Objet $valeurSec * @param string (le signe de comparaison) $compare */ protected function compareValeur($valeurEnt, $valeurSec, $compare) { $ecart = 1/100; if( $valeurSec=='NS' || $valeurEnt == 'NS' || $valeurSec==NULL || $valeurEnt==NULL) { return ('-'); } else if ($compare == '>') { if (($valeurEnt + $ecart) > $valeurSec) { $return = ''; } elseif( ($valeurSec - ($valeurSec * $ecart)) < $valeurEnt && ($valeurSec + ($valeurSec * $ecart)) > $valeurEnt) { $return = '-'; } else { $return = ''; } } else if ($compare == '<') { if (($valeurEnt + $ecart) > $valeurSec) { $return = ''; } elseif( ($valeurSec - ($valeurSec * $ecart)) < $valeurEnt && ($valeurSec + ($valeurSec * $ecart)) > $valeurEnt) { $return = '-'; } else { $return = ''; } } return ($return); } /** * Permet d'afficher les elements par block avec un titre. * * @param Le tableau de reference des ID a afficher $tableau * @param Le nom du block en traitement $name * @param Les elements de Ratios $element * @param L'adresse de la variable $html * @param l'object ratio $ratios * @param la date du block $date */ protected function printElementRatio($tableau, $name, $element, &$html, $ratios, $date) { foreach($tableau[$name] as $row => $val) { if ($row == $element->id) { foreach ($ratios->RatiosInfos->item as $item) { if ($item->id == $element->id) { foreach ($ratios->RatiosSecteur->item as $Secteur) { if (substr($date, 0, 4) == $Secteur->annee) { foreach ($Secteur->liste->item as $liste) { if ($item->id == $liste->id) { if (!self::checkIfImageExist($liste->id)) self::createGraphique($ratios, $liste->id, $item->unite, $liste->id); $html .= '