Label * @var array */ protected $country = null; /** * Stop the process to looks for company group head * @var boolean */ public $stopAtFirstIsin = false; /** * Stop the process to looks for physical person * @var boolean */ public $stopAtPP = true; /** * PDO Connection with Doctrine * @var \Doctrine\DBAL\Connection */ protected $conn; /** * Gestion des liens inter entreprises * @param \Doctrine\DBAL\Connection $conn */ public function __construct($conn = null) { if ($conn === null) { $this->conn = Zend_Registry::get('doctrine'); } else { $this->conn = $conn; } } /** * Identifiant * @param string $id * @param string $type ref|siren */ public function setId($id, $type = 'ref') { // Get Id if ($type == 'siren') { $this->siren = $id; try { $sql = "SELECT * FROM jo.liensRef WHERE siren = :id AND dateSuppr = 0"; $stmt = $this->conn->prepare($sql); $stmt->bindValue('id', $id); $stmt->execute(); if ($stmt->rowCount() > 0) { $result = $stmt->fetch(\PDO::FETCH_OBJ); $this->idRef = $result->id; } } catch (\Doctrine\DBAL\DBALException $e) { throw new Exception(__METHOD__ . ': ' . $e->getMessage()); } } else { $this->idRef = $id; } } /** * Retourne les actionnaires * @param int $id * @param boolean $actif * @return array Tableau d'actionnaires */ public function getActionnaires($id = null, $actif = null) { if (null === $id) { $id = $this->idRef; } $liens = array(); if (null === $id) { return $liens; } try { $qb = $this->conn->createQueryBuilder(); $qb->select(array( 'l.id', 'l.idAct', 'l.PDetention', 'l.Pvote', 'l.MajMin', 'l.idPar', 'l.dateEffetLien', 'l.dateInsert', 'l.dateUpdate', 'LPAD(r.siren, 9, 0) AS siren', 'r.PpPm', 'r.RS', 'r.sigle', 'r.civilite', 'r.nom', 'r.prenom', 'r.nom_usage', 'r.naissance_date', 'r.naissance_dept_pays', 'r.naissance_lieu', 'r.nat', 'r.adresse_num', 'r.adresse_btq', 'r.adresse_codvoie', 'r.adresse_libvoie', 'r.adresse_comp', 'r.adresse_cp', 'r.adresse_ville', 'r.adresse_pays', 'r.idLoc1Type', 'r.idLoc1Num', 'r.idLoc2Type', 'r.idLoc2Num', 'r.idLoc3Type', 'r.idLoc3Num' ) )->from('jo.liens2', 'l')->join('l', 'jo.liensRef', 'r', 'l.idAct = r.id') ->where('l.idPar = :id')->setParameter('id', $id) ->orderBy('l.PDetention', 'DESC'); // Actif / Inactif if (null !== $actif) { if (false === $actif) { $qb->andWhere('l.actif = 0'); } else { $qb->andWhere('l.actif = 1'); } } // Don't display deleted - anomaly $qb->andWhere("l.dateSuppr = '0000-00-00 00:00:00'"); $stmt = $qb->execute(); $liens = $stmt->fetchAll(\PDO::FETCH_OBJ); } catch (\Doctrine\DBAL\DBALException $e) { throw new Exception(__METHOD__ . ': ' . $e->getMessage()); } return $liens; } /** * Retourne les participations * @param int $id * @param boolean $actif * @return array Tableau des participations */ public function getParticipations($id = null, $actif = null) { if (null === $id) { $id = $this->idRef; } if (false === $actif) { $actif = 0; } else { $actif = 1; } $liens = array(); if (null === $id) { return $liens; } try { $qb = $this->conn->createQueryBuilder(); $qb->select(array( 'l.id', 'l.idAct', 'l.PDetention', 'l.Pvote', 'l.MajMin', 'l.idPar', 'l.dateEffetLien', 'l.dateInsert', 'l.dateUpdate', 'LPAD(r.siren, 9, 0) AS siren', 'r.PpPm', 'r.RS', 'r.sigle', 'r.civilite', 'r.nom', 'r.prenom', 'r.nom_usage', 'r.naissance_date', 'r.naissance_dept_pays', 'r.naissance_lieu', 'r.nat', 'r.adresse_num', 'r.adresse_btq', 'r.adresse_codvoie', 'r.adresse_libvoie', 'r.adresse_comp', 'r.adresse_cp', 'r.adresse_ville', 'r.adresse_pays', 'r.idLoc1Type', 'r.idLoc1Num', 'r.idLoc2Type', 'r.idLoc2Num', 'r.idLoc3Type', 'r.idLoc3Num' ) )->from('jo.liens2', 'l')->join('l', 'jo.liensRef', 'r', 'l.idPar=r.id') ->where('l.idAct = :id')->setParameter('id', $id) ->orderBy('l.PDetention', 'DESC'); // Actif / Inactif if (null !== $actif) { if (false === $actif) { $qb->andWhere('l.actif = 0'); } else { $qb->andWhere('l.actif = 1'); } } //Don't display deleted - anomaly $qb->andWhere("l.dateSuppr = '0000-00-00 00:00:00'"); $stmt = $qb->execute(); $liens = $stmt->fetchAll(\PDO::FETCH_OBJ); } catch (\Doctrine\DBAL\DBALException $e) { throw new Exception(__METHOD__ . ': ' . $e->getMessage()); } return $liens; } /** * Fonctions de direction * @param boolean $actif * @return array */ public function getDirections($actif = null) { if (null === $this->siren) { $sql = "SELECT LPAD(siren, 9, 0) AS siren FROM jo.liensRef WHERE id = :id"; $stmt = $this->conn->prepare($sql); $stmt->bindValue('id', $this->idRef); $result = $stmt->fetch(\PDO::FETCH_OBJ); $siren = $result->siren; } else { $siren = $this->siren; } $result = array(); if (null !== $siren && intval($siren) != 0) { try { $qb = $this->conn->createQueryBuilder(); $qb->select(array('LPAD(siren, 9, 0) AS siren', 'raisonSociale', 'dirSiren', 'dirRS', 'civilite', 'nom', 'prenom', 'naissance_date', 'naissance_lieu', 'fonction_code', 'fonction_lib') )->from('jo.rncs_dirigeants')->where("typeDir IN ('PM', 'PP')") ->andWhere('dirSiren = :siren')->setParameter('siren', $siren); // Actif / Inactif if (null !== $actif) { if (false === $actif) { $qb->andWhere('actif = 0'); } else { $qb->andWhere('actif = 1'); } } $qb->orderBy('fonction_code', 'DESC'); $qb->orderBy('raisonSociale', 'ASC'); $stmt = $qb->execute(); $result = $stmt->fetchAll(\PDO::FETCH_OBJ); } catch (\Doctrine\DBAL\DBALException $e) { throw new Exception(__METHOD__ . ': ' . $e->getMessage()); } } return $result; } /** * Retourne la maison mère * @param int $id * Id de la fiche de départ * @param int $detention * Niveau de détention (Une filiale est une entreprise détenue à plus de 50% par une autre entreprise) * @return int */ public function getHead($id = null, $detention = 0) { if (null === $id) { $id = $this->idRef; } //Add ID to the list of known $this->findId[] = $id; //Through the list $liens = $this->getActionnaires($id, true); //Find the following up entity if (count($liens)>0) { foreach ($liens as $item) { //Don't through again and again if (in_array($item->idAct, $this->findId)) { return $item->idAct; } elseif ($this->stopAtFirstIsin === true && !empty($item->isin)) { break; } //Remove physical person elseif ($item->PpPm == 'PP' && $this->stopAtPP) { continue; } //Same id elseif ($item->idAct == $id) { return $id; } //PDetention>50 elseif ($item->PDetention > 50 && $item->idAct > 1000) { return $this->getHead($item->idAct, $detention); } //MajMin=+ elseif ($item->PDetention > $detention && $item->MajMin == '+' && $item->idAct > 1000) { return $this->getHead($item->idAct, $detention); } //-- elseif ($item->PDetention > $detention && $item->idAct > 1000) { return $this->getHead($item->idAct, $detention); } } } return $id; } /** * Retourne les éléments identitaire présent dans lienRef * @param string $id * @return array */ public function getIdentity($id = null) { if (null === $id) { $id = $this->idRef; } $sql = "SELECT * FROM jo.liensRef WHERE id = :id"; $stmt = $this->conn->prepare($sql); $stmt->bindValue('id', $id); $stmt->execute(); if ($stmt->rowCount() > 0) { return $stmt->fetch(\PDO::FETCH_OBJ); } return null; } /** * Retourne l'arborescence pour les groupes * @param int $pctMin * @param int $nbNiveaux * @return array */ public function getTree($pctMin = 33, $nbNiveaux = 10) { //Get identity to stop at isin $itemWithIsin = null; if ($this->stopAtFirstIsin === true) { $id = $this->idRef; $identity = $this->getIdentity($this->idRef); if (!empty($identity->isin)) { $itemWithIsin = true; } } if ($itemWithIsin !== true) { //Récupération de la maison mère $id = $this->getHead(null, 50); //Informations de la maison mère $identity = $this->getIdentity($id); } $this->findId = array(); $this->findId[] = $identity->id; $nom = $identity->RS; if ($identity->nom != '') { $nom = $identity->civilite.' '.$identity->nom.' '.$identity->prenom; } if ($this->country === null) { $this->country = $this->getCountry(); } $pays = $identity->adresse_pays; if (array_key_exists($identity->adresse_pays, $this->country)) { $pays = $this->country[$identity->adresse_pays]; } //Retour $tabRet = array( 'id' => $identity->id, 'name' => $nom, 'siren' => str_pad($identity->siren, 9, '0', STR_PAD_LEFT), 'pmin' => $item->PDetention, 'pays' => $pays, 'children' => $this->getTreeRecursive($identity->id, $pctMin, 1, $nbNiveaux), ); return $tabRet; } /** * Retourne un sous élement de l'arborescence pour les groupes * @param int $id * @param int $pctMin * @param int $niveau * @param int $nbNiveaux * @return array */ public function getTreeRecursive($id, $pctMin=33, $niveau=0, $nbNiveaux=10) { if ($niveau > $nbNiveaux) { return array(); } $niveau++; $tabRet = array(); $participations = $this->getParticipations($id, true); if (count($participations)>0) { foreach ($participations as $item) { if ($item->PDetention > $pctMin) { $identity = $this->getIdentity($item->idPar); $nom = $identity->RS; if ($identity->nom != '') { $nom = $identity->civilite.' '.$identity->nom.' '.$identity->prenom; } if ($this->country === null) { $this->country = $this->getCountry(); } $pays = $identity->adresse_pays; if (array_key_exists($identity->adresse_pays, $this->country)) { $pays = $this->country[$identity->adresse_pays]; } $data = array( 'id' => $identity->id, 'name' => $nom, 'siren' => str_pad($identity->siren, 9, '0', STR_PAD_LEFT), 'pmin' => $item->PDetention, 'pays' => $pays, 'children' => array(), ); //Pour éviter d'avoir des boucles infinis if (!in_array($identity->id, $this->findId)) { $this->findId[] = $identity->id; $data['children'] = $this->getTreeRecursive($identity->id, $pctMin, $niveau, $nbNiveaux); } $tabRet[] = $data; } } } return $tabRet; } /** * Liste des entités du CAC40 * @return array */ public function getCAC40() { $sql = "SELECT isin, nom, MAX(date) AS dateMAJ FROM sdv1.bourse_listes WHERE lstCode='xcac40p' GROUP BY lstCode, isin HAVING MAX(date) ORDER BY dateMAJ DESC;"; $stmt = $this->conn->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(\PDO::FETCH_OBJ); $output = array(); foreach ($result as $item) { $output[] = $item->isin; } return $output; } /** * * @param number $pctMin * @return array */ public function getGroupeCAC40($pctMin = 50) { $listeIsin = $this->getCAC40(); $isin = "'".implode("','", $listeIsin)."'"; $this->findId = array(); $sql = "SELECT id FROM jo.liensRef WHERE (idLoc1Type=63 AND idLoc1Num IN (".$isin.")) OR (idLoc2Type=63 AND idLoc2Num IN (".$isin.")) OR (idLoc3Type=63 AND idLoc3Num IN (".$isin."))"; $stmt = $this->conn->executeQuery($sql); $output = array(); if ($stmt->rowCount() > 0) { $result = $stmt->fetchAll(\PDO::FETCH_OBJ); foreach ($result as $item) { $output = $output + $this->getListeGroupeCAC40($item->id, $pctMin); } } return $output; } /** * * @param int $id * @param number $pctMin * @return array */ public function getListeGroupeCAC40($id, $pctMin=50) { $participations = $this->getParticipations($id, true); $output = array(); if (count($participations)>0) { foreach ($participations as $item) { if ($item->PDetention > $pctMin) { $identity = $this->getIdentity($item->idPar); if (intval($identity->siren)!=0) { $output[] = $identity->siren; } if (!in_array($identity->id, $this->findId)) { $this->findId[] = $identity->id; $output = $output + $this->getListeGroupeCAC40($identity->id, $pctMin); } } } } return $output; } /** * * @param number $pctMin * @return boolean */ public function isInGroupeCAC40($pctMin = 50) { //Si pas d'actionnaires => false if (count($this->getActionnaires()) == 0) { return false; } $listeInGroupeCAC40 = $this->getGroupeCAC40($pctMin); if (in_array($this->siren, $listeInGroupeCAC40)) { return true; } return false; } /** * Get all countries */ protected function getCountry() { $sql = "SELECT codPays3, libPays FROM jo.tabPays WHERE codPays3 IS NOT NULL"; $stmt = $this->conn->prepare($sql); $stmt->execute(); if ($stmt->rowCount() > 0) { $data = array(); while($item = $stmt->fetch(PDO::FETCH_OBJ)) { $data[$item->codPays3] = $item->libPays; } return $data; } return false; } }