dbConfig = new Zend_Config_Ini(APPLICATION_PATH . '/configs/databases.ini'); try { $this->db = Zend_Db::factory($this->dbConfig->db->jo); $this->db->getConnection(); } catch (Zend_Db_Adapter_Exception $e) { throw new SoapFault('ERR', $e->getMessage()); } catch (Zend_Exception $e) { throw new SoapFault('ERR', "Application error"); } if ($type=='siren') { $refM = new Application_Model_JoLiensRef($this->db); $sql = $refM->select()->where('siren=?', $id); $result = $refM->fetchRow($sql); if ( $result===null ) { throw new SoapFault('MSG', 'Aucun siren'); } $this->idRef = $result->id; } else { $this->idRef = $id; } } /** * Retourne les actionnaires * @param int $id * @param string $actif * @return array Tableau d'actionnaires */ public function getActionnaires($id = null, $actif = true) { if ( null === $id ) { $id = $this->idRef; } if ( false === $actif ) { $actif = 0; } else { $actif = 1; } $liens = array(); try { $sql = $this->db->select() ->from(array('l'=>'liens2'), array('id', 'idAct', 'PDetention', 'Pvote', 'MajMin', 'idPar', 'dateEffetLien', 'dateInsert')) ->where('idPar=?', $id) ->where('l.actif=?',$actif) ->join(array('r'=>'liensRef'), 'l.idAct=r.id', array('LPAD(siren, 9, 000000000) AS siren','PpPm', 'RS', 'civilite', 'nom', 'prenom', 'nom_usage', 'naissance_date', 'naissance_dept_pays', 'naissance_lieu', 'nat', 'adresse_num', 'adresse_btq', 'adresse_codvoie', 'adresse_libvoie', 'adresse_comp', 'adresse_cp', 'adresse_ville', 'adresse_pays' )) ->order('PDetention DESC'); $liens = $this->db->fetchAll($sql, null, Zend_Db::FETCH_OBJ); } catch (Zend_Exception $e) { throw new SoapFault('ERR', $e->getMessage()); } file_put_contents('test.log', $sql->__toString(), FILE_APPEND); return $liens; } /** * Retourne les participations * @param int $id * @param string $actif * @return array Tableau des participations */ public function getParticipations($id = null, $actif = true) { if ( null === $id ) { $id = $this->idRef; } if ( false === $actif ) { $actif = 0; } else { $actif = 1; } $liens = array(); try { $sql = $this->db->select() ->from(array('l'=>'liens2'), array('id', 'idAct', 'PDetention', 'Pvote', 'MajMin', 'idPar', 'dateEffetLien', 'dateInsert')) ->where('idAct=?', $id) ->where('l.actif=?',$actif) ->join(array('r'=>'liensRef'), 'l.idPar=r.id', array('LPAD(siren, 9, 000000000) AS siren','PpPm', 'RS', 'civilite', 'nom', 'prenom', 'nom_usage', 'naissance_date', 'naissance_dept_pays', 'naissance_lieu', 'nat', 'adresse_num', 'adresse_btq', 'adresse_codvoie', 'adresse_libvoie', 'adresse_comp', 'adresse_cp', 'adresse_ville', 'adresse_pays' )) ->order('PDetention DESC'); $liens = $this->db->fetchAll($sql, null, Zend_Db::FETCH_OBJ); } catch (Zend_Exception $e) { throw new SoapFault('ERR', $e->getMessage()); } return $liens; } /** * Retourne la maison mère * @param int $id * @return int */ public function getHead($id = null) { if ( null === $id ) { $id = $this->idRef; } //Add ID to the list of known $this->findId[] = $id; //Through the list $liens = $this->getActionnaires($id); file_put_contents('test.log', print_r($liens,1), FILE_APPEND); //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) ) { continue; } //Same id if ( $item->idAct == $id ) { return $id; } //PDetention>50 elseif ( $item->PDetention > 50 ) { return $this->getHead($item->idAct); } //MajMin=+ elseif ( $item->MajMin == '+' ) { return $this->getHead($item->idAct); } //-- else { return $item->idAct; } } } else { return $id; } } /** * Retourne les éléments identitaire présent dans lienRef * @param string $id * @return Zend_Db_Table_Rowset_Abstract */ public function getIdentity($id = null) { if ( null === $id ) { $id = $this->idRef; } $refM = new Application_Model_JoLiensRef($this->db); $row = $refM->find($id); if (null !== row) { return $row->current(); } } /** * Retourne l'arborescence pour les groupes * @param int $pctMin * @param int $nbNiveaux * @return array */ public function getTree( $pctMin=33, $nbNiveaux=10 ) { //Récupération de la maison mère $id = $this->getHead(); //Informations de la maison mère $identity = $this->getIdentity($id); $this->findId = array(); $this->findId[] = $identity->id; //file_put_contents('test.log', print_r($identity,1)); //Retour $tabRet = array ( 'id' => $identity->id, 'name' => $identity->RS, 'siren' => str_pad($identity->siren, 9, '0', STR_PAD_LEFT), 'pays' => $identity->adresse_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); if ( count($participations)>0 ) { foreach ( $participations as $item ) { if ( $item->PDetention > $pctMin ) { $identity = $this->getIdentity($item->idPar); $data = array ( 'id' => $identity->id, 'name' => $identity->RS, 'siren' => str_pad($identity->siren, 9, '0', STR_PAD_LEFT), 'pmin' => $participations->PDetention, 'pays' => $identity->adresse_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; } }