<?php
require_once realpath(dirname(__FILE__)).'/WsScore.php';
require_once realpath(dirname(__FILE__)).'/functions.php';
require_once realpath(dirname(__FILE__)).'/Types/EntrepriseTypes.php';

class WsEntreprise extends WsScore
{
	protected $wsdl = null;
	protected $wsdlOptions = array();

	public function __construct()
	{
		parent::__construct();
		$webservicesConfig = Zend_Registry::get('webservicesConfig')->webservice->scores;
		$wsdl = !empty($webservicesConfig->wsdl) ? $webservicesConfig->wsdl : null ;
		$options = array();
		foreach ($webservicesConfig->options as $optionName => $optionValue){
			$options[$optionName] = $optionValue;
		}
		$options['login'] = $_SERVER['PHP_AUTH_USER'];
		$options['password'] = $_SERVER['PHP_AUTH_PW'];
		$this->wsdl = $wsdl;
		$this->wsdlOptions = $options;
	}

	/**
	 * Retourne les informations identitaires de l'entreprise ou de l'établissement demandé
	 * @param string 	$siret 		Siren de l'entreprise ou siret de l'établissement
	 * @param int 		$id 		Identifiant interne
	 * @param boolean 	$forceVerif
	 * @return IdentiteReturn
	 */
	public function getIdentite($siret, $id = 0, $forceVerif = false)
	{
		$this->authenticate();

		//Initialisation
		if (empty($id))	 		{ $id = 0; }
		if (empty($forceVerif)) { $forceVerif = false; }

		$outputParams = new IdentiteReturn();
		$error = new ErrorType();
		$result = new IdentiteResult();

		$tdeb = microtime(1);
		$ligne = date('YmdHis').";$siret;Ws->getIdentite Avant ...";
		$fp = fopen(LOG_PATH.'/accesDistant.log', 'a');
		fwrite($fp,$ligne.EOL);
		fclose($fp);

		debugLog('I',"Identités demandée pour siret $siret (id=$id)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabRet = array();
		$siret = trim($siret);
		$len = strlen($siret);
		$siren = substr($siret,0,9);
		if ($len == 14)
		{
			$nic = substr($siret,9,5)*1;
		}
		elseif ($len == 9)
		{
			$nic = 0;
		}

		if ($siren*1==0 && $id==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($len!=14 && $len!=9)
		{
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren/Siret incorrect';
		}
		else
		{
			debugLog('I', "Avant getIdentiteEntreprise($siren, $nic, $id)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$iInsee = new MInsee();
			$entrep = $iInsee->getIdentiteEntreprise($siren, $nic, $id, $forceVerif);
			debugLog('I', "Après getIdentiteEntreprise($siren, $nic, $id)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$duree = round(microtime(1)-$tdeb,3);
			$ligne = date('YmdHis').";$siret;Ws->getIdentite juste apres iInsee->... ($duree s)";
			$fp = fopen(LOG_PATH.'/accesDistant.log', 'a');
			fwrite($fp,$ligne.EOL);
			fclose($fp);
			if (empty($entrep)) {
				debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Siren inexistant';
			}
			else
			{
				$iBourse = new MBourse($siren);
				$bourse = $iBourse->getInfosBourse($siren);

				$tabRet = array(
					'id'				=>$entrep['id'],
					'Siret'				=>$entrep['Siret'],
					'SiretSiege'		=>$entrep['SiretSiege'],
					'Siege'				=>$entrep['Siege'],
					'TribunalCode'		=>$entrep['Tribunal'],
				  	'TribunalLib'		=>$entrep['TribunalLib'],
				  	//'NumGreffe'			=>$entrep['numGreffe'],	 // Ajouté le 4 08 2009
				  	'NumRC'				=>$entrep['numRC'],			// Ajouté le 4 08 2009
				  	'Actif'				=>$entrep['Actif'],
				  	'EntActiveRCS'		=>$entrep['EntActiveRCS'],
				  	'AutreId'			=>$entrep['AutreId'],
				  	'Source'			=>$entrep['Source'],
					'SourceId'			=>$entrep['SourceId'],
					'Isin'				=>$entrep['Isin'],
				  	'Nom'				=>strtr($entrep['Nom'],'/*','  '),
				  	'Nom2'				=>$entrep['Nom2'],
				  	'NomLong'			=>$entrep['nomLong'],	// Ajouté le 4 08 2009
				  	'NomCommercial'		=>$entrep['NomCommercial'],	// Ajouté le 16 11 2010
				  	'Siret'				=>$entrep['Siret'],
					'Sigle'				=>$entrep['Sigle'],
				  	'SigleLong'			=>$entrep['sigleLong'],	// Ajouté le 4 08 2009
					'Enseigne'			=>$entrep['Enseigne'],
					'EnseigneLong'		=>$entrep['enseigneLong'],	// Ajouté le 16 11 2010
					'Adresse'			=>$entrep['Adresse'],
					'Adresse2'			=>$entrep['Adresse2'],
					'AdresseNum'		=>$entrep['AdresseNum'],
					'AdresseBtq'		=>$entrep['AdresseBtq'],
					'AdresseVoie'		=>$entrep['AdresseVoie'],
					'AdresseRue'		=>$entrep['AdresseRue'],
					'CP'				=>$entrep['CP'],
					'Ville'				=>$entrep['Ville'],
					'Pays'				=>$entrep['Pays'],		// Ajouté le 18 02 2008
				  	'PaysIso2'			=>$entrep['PaysIso2'],

					'AdresseDom'		=>$entrep['AdresseDom'],
					'AdresseDomEnt'		=>$entrep['AdresseDomEnt'],
					'AdresseDomNb'		=>$entrep['AdresseDomNb'],

					'Civilite'			=>$entrep['Civilite'],
					'NbEtab'			=>$entrep['NbEtab'],
					'Tel'				=>$entrep['Tel'],
					'Fax'				=>$entrep['Fax'],
					'Web'				=>$entrep['Web'],
					'Mail'				=>$entrep['Mail'],
					'GeoLat'			=>$entrep['GeoLat'],
					'GeoLon'			=>$entrep['GeoLon'],
					'GeoPrecis'			=>$entrep['GeoPrecis'],
					'GeoInfos'			=>$entrep['GeoInfos'],
					'TvaNumero'			=>$entrep['TvaNumero'],
					'TvaAttribue'		=>$entrep['TvaAttribue'],
					'FJ'				=>$entrep['FJ'],
					'FJ_lib'			=>$entrep['FJ_lib'],
					'FJ2'				=>$entrep['FJ2'],	// Ajouté le 4 08 2009
					'FJ2_Lib'			=>$entrep['FJ2_Lib'],	// Ajouté le 4 08 2009
					'Siren'				=>$entrep['Siren'],
					'Nic'				=>$entrep['Nic'],
					'NafEnt'			=>$entrep['NafEnt'],
					'NafEntLib'			=>$entrep['NafEntLib'],
					'NafEtab'			=>$entrep['NafEtab'],
					'NafEtabLib'		=>$entrep['NafEtabLib'],
					'NaceEtab'			=>$entrep['NaceEtab'],
					'NaceEnt'			=>$entrep['NaceEnt'],
					'Nafa'				=>$entrep['APRM'],
					'NafaLib'			=>$entrep['APRM_Lib'],
					'NumRM'				=>$entrep['NumRM'],
					'Activite'			=>$entrep['Activite'],
					'Capital'			=>$entrep['Capital'],
					'CapitalDev'		=>$entrep['CapitalDev'],
					'CapitalLib'		=>$entrep['CapitalLib'],	// Ajouté le 18 02 2008
					'CapitalType'		=>$entrep['CapitalType'],	// Ajouté le 4 08 2009
					'DateCreaEt'		=>$entrep['DateCreaEt'],
					'DateCreaEn'		=>$entrep['DateCreaEn'],
					'DateClotEt'		=>$entrep['DateClotEt'],
					'DateImmat'			=>$entrep['dateImmat'],		// Ajouté le 4 08 2009
					'DateRadiation'		=>$entrep['dateRad'],		// Ajouté le 4 08 2009
					//	'DateMajRCS'		=>$entrep['DateMajRCS'],	// Ajouté le 4 08 2009
		    		'EffEnTr'			=>$entrep['EffEnTr'],
		    		'EffEnTrLib'		=>$entrep['EffEnTrLib'],
		    		'Effectif'			=>$entrep['Effectif'],

					'EffEtTr'			=>$entrep['EffEtTr'],	 // Ajout le 11 08 2010
					'EffEtTrLib'		=>$entrep['EffEtTrLib'],	// Ajout le 11 08 2010
					'EffectifEtab'		=>$entrep['EffectifEtab'],	// Ajout le 11 08 2010

					'Dept'				=>$entrep['Dept'],
					'codeCommune'		=>$entrep['codeCommune'],

					'AnneeEffEn'		=>$entrep['AnneeEffEn'],
					'AnneeEffEt'		=>$entrep['AnneeEffEt'],
					'AnneeTCA'			=>$entrep['AnneeTCA'],

					'TrancheCA'			=>$entrep['TrancheCA'],
					'TrancheCALib'		=>$entrep['TrancheCALib'],
					'dir1Code'			=>$entrep['dir1Code'],
					'dir1Titre'			=>$entrep['dir1Titre'],//utf8
					'dir1NomPrenom'		=>$entrep['dir1NomPrenom'],
					'dir1DateFct'		=>$entrep['dir1DateFct'],
					'dir1DateNaiss'		=>$entrep['dir1DateNaiss'],// Ajouté le 4 08 2009
					'dir1LieuNaiss'		=>$entrep['dir1LieuNaiss'],// Ajouté le 4 08 2009
					'dir2Code'			=>$entrep['dir2Code'],
					'dir2Titre'			=>$entrep['dir2Titre'],//utf8
					'dir2NomPrenom'		=>$entrep['dir2NomPrenom'],
					'dir2DateFct'		=>$entrep['dir2DateFct'],
					'dir2DateNaiss'		=>$entrep['dir2DateNaiss'],// Ajouté le 4 08 2009
					'dir2LieuNaiss'		=>$entrep['dir2LieuNaiss'],// Ajouté le 4 08 2009
					'Rivoli'			=>$entrep['Rivoli'],
					'NatureActivite'	=>$entrep['NatureActivite'],	// Nature de l'activité
					'OrigineCreation'	=>$entrep['OrigineCreation'],	// Origine de la création
					'TypeExploitation'	=>$entrep['TypeExploitation'],
					'Auxiliaire'		=>$entrep['Auxiliaire'],		// 1=Auxiliaire / 0=Non auxiliaire
					'Saisonnalite'		=>$entrep['Saisonnalite'],		// P=Activité permanente / S=Activité saisonnière
				  	'SituationJuridique'=>$entrep['SituationJuridique'],
				  	'Bilan'				=>array(
				  		'Cloture'	=> $entrep['bilanDate'],
						'Duree'		=> $entrep['bilanMois'],
						'Devise'	=> $entrep['bilanDevise'],
						'Capital'	=> $entrep['bilanDA'],
						'CA'		=> $entrep['bilanFL'],
						'Resultat'	=> $entrep['bilanHN'],
						'Effectif'	=> $entrep['bilanYP'],
					),
					'Bourse'			=>array(
						'placeCotation'=>$bourse['placeCotation'],
						'nombreTitres'=>$bourse['nombreTitres'],
						'capitalisation'=>$bourse['close']*$bourse['nombreTitres'],
						'derCoursDate'=>$bourse['date'],
						'derCoursCloture'=>$bourse['close']
					),
					'AutreSiren'		=>$entrep['AutreSiren'],
					'DateMajINSEE'		=>$entrep['DateMajINSEE'],
					'DateMajRCS'		=>$entrep['DateMajRCS'],
					'DateMajBILAN'		=>$entrep['bilanDateMaj'],
					'DateMajANN'		=>$entrep['dateMajANN'],
					'DateMajID'			=>$entrep['dateMajIdentite'],
				  	//'importExport'		=>$entrep['importExport'],
				);

				if (preg_match('/NAF4/i', $this->tabInfoUser['pref']))
				{
					$entrep2=$iInsee->getNaf4($siren, $nic, $id);
					$tabRet['Naf4Ent']		= $entrep2['apen4'];
					$tabRet['Naf4Etab']		= $entrep2['apet4'];
					$tabRet['Naf4EntLib']	= $entrep2['apen4_lib'];
					$tabRet['Naf4EtabLib']	= $entrep2['apet4_lib'];
				}

				debugLog('I', 'Etablissement retourné = '. $entrep['Nom'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				wsLog('identite',$siret,$id);
				$duree=round(microtime(1)-$tdeb,3);
				$ligne=date('YmdHis').";$siret;Ws->getIdentite APRES ($duree s) !!!";
				$fp=fopen(LOG_PATH.'/accesDistant.log', 'a');
				fwrite($fp,$ligne.EOL);
				fclose($fp);

				$result = arrayToClass($tabRet, 'IdentiteResult');
				$error->errnum = 0;
				$error->errmsg = '';
			}
		}
		$outputParams->error = $error;
		$outputParams->result = $result;
		return $outputParams;
	}

	/**
	 * Retourne les liens financiers pour une entreprise.
	 *
	 * @param  integer $siren               Siren de l'entreprise
	 * @param  boolean $actifsUniquement    Uniquement les liens Actifs
	 * @return LiensReturn
	 */
	public function getLiens($siren, $actifsUniquement = true)
	{
		$this->authenticate();
		//Initialisation
		if (empty($actifsUniquement)) { $actifsUniquement = true; }
		$error = new ErrorType();
		$tabAct = $tabPar = array();

		debugLog('I',"Liens entreprises demandés pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		if (strlen($siren)<>9){
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		} else {
			$mLiens = new MLiens($siren);
			$tabA = $mLiens->getActionnaires($siren, $actifsUniquement);
			$nbA = count($tabA);
			$tabAct = array();
			if ($nbA > 0) {
				foreach ($tabA as $i => $lien) {
					$actionnaire = new Actionnaire();
					$actionnaire->Pmin = $lien['Pmin'];
					$actionnaire->MajMin = $lien['MajMin'];
					$actionnaire->RaisonSociale = $lien['RaisonSociale'];
					$actionnaire->Pays = $lien['Pays'];
					$actionnaire->Siren = $lien['Siren'];
					$actionnaire->Actif = $lien['Actif'];
					$actionnaire->Source = $lien['Source'];
					$actionnaire->DateLien = $lien['DateLien'];
					$actionnaire->DateMaj = $lien['DateMaj'];
					$tabAct[] = $actionnaire;
				}
			}
			debugLog('W', "$nbA actionnaires pour le siren $siren", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$tabP = $mLiens->getParticipations($siren, $actifsUniquement);
			$nbP = count($tabP);
			$tabPar[] = array();
			if ($nbP > 0) {
				foreach ($tabP as $i => $lien) {
					$participation = new Participation();
					$participation->Pmin = $lien['Pmin'];
					$participation->MajMin = $lien['MajMin'];
					$participation->RaisonSociale = $lien['RaisonSociale'];
					$participation->Pays = $lien['Pays'];
					$participation->Siren = $lien['Siren'];
					$participation->Actif = $lien['Actif'];
					$participation->Source = $lien['Source'];
					$participation->DateLien = $lien['DateLien'];
					$participation->DateMaj = $lien['DateMaj'];
					$tabPar[] = $participation;
				}
			}
			debugLog('W', "$nbP participations pour le siren $siren", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			wsLog('liens',$siren);
		}
		$result = new LiensResult();
		$result->actionnaires = $tabAct;
		$result->participations = $tabPar;
		$output = new LiensReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}


	/**
	 * Liste des établissements d'une entreprise
	 * @param 	string 	$siren			Siren de l'entreprise
	 * @param 	integer	$departement	Limiter aux établissements du departement
	 * @param 	integer	$actif			Otpionnel 1=Uniquements les actifs, 0=inactifs, Néant=Tous
	 * @param 	integer	$position
	 * @param 	integer	$nbRep
	 *
	 * @return ListeEtablissementsReturn
	 */
	public function getListeEtablissements( $siren, $dep = 0, $actif = -1, $position = 0, $nbRep = 20)
	{
		$this->authenticate();

		//Initialisation
		if (empty($dep)) 		{ $dep = 0; }
		if (empty($actif)) 		{ $actif = -1; }
		if (empty($position)) 	{ $position = 0; }
		if (empty($nbRep)) 		{ $nbRep = 20; }

		//Valeur max
		if($nbRep > 200) { $nbRep = 200; }

		$departement = $dep;
		$error = new ErrorType();
		debugLog('I',"Liste des établissements demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$iInsee = new MInsee();
			$rep = $iInsee->getEtablissements($siren, '', $position, $nbRep, 200, $departement, $actif);
			$etabs = $rep['reponses'];
			$nbReponses = $rep['nbReponsesTotal'];
			$result = array();
			if (count($etabs)>0)
			{
				foreach ($etabs as $nb => $etab)
				{
					$etablissement = new Etablissement();
					$etablissement->id = $etab['id'];
					$etablissement->Siege = $etab['Siege'];
					$etablissement->Enseigne = $etab['Enseigne'];
					$etablissement->Adresse = $etab['Adresse'];
					$etablissement->Adresse2 = $etab['Adresse2'];
					$etablissement->CP = $etab['CP'];
					$etablissement->Ville = $etab['Ville'];
					$etablissement->Tel = $etab['Tel'];
					$etablissement->Fax = $etab['Fax'];
					$etablissement->Nic = $etab['Nic'];
					$etablissement->Actif = $etab['Actif'];
					$etablissement->NafEtab = $etab['NafEtab'];
					$etablissement->NafEtabLib = $etab['NafEtabLib'];
					$etablissement->EffEtTr = $etab['EffEtTr'];
					$etablissement->EffEtTrLib = $etab['EffEtTrLib'];

					$result[] = $etablissement;
				}
			}
			debugLog('I', "Nb Etablissements retournés ($departement, $actif) = ". count($result), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			wsLog('etablissements',$siren);
		}
		$reponse = new ListeEtablissementsResult();
		$reponse->nbReponses = $nbReponses;
		$reponse->liste = $result;
		$output = new ListeEtablissementsReturn();
		$output->error = $error;
		$output->result = $reponse;
		return $output;
	}

	/**
	 * Retourne l'ensemble des informations identitaires des dirigeants de l'entreprise
	 *
	 * @param  integer  $siren		Siren de l'entreprise
	 * @param  bool     $histo		Afficher l'historique des dirigeants
	 * @return DirigeantsReturn 	Liste des dirigeants actifs de l'entreprise
	 */
	public function getDirigeants( $siren , $histo = false)
	{
		$this->authenticate();

		//Initialisation
		if (empty($histo))	{ $histo = false; }

		debugLog('I',"Dirigeants demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabRet = array();
		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren Siret inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			if ($histo) $option='histo';
			else 		$option='';
			$iInsee = new MInsee();
			$dirs = $iInsee->getDirigeants($siren, $histo);
			//debugLog('W', print_r($entrep, true), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$liste = array();
			foreach ($dirs as $nb => $dir)
			{
				//debugLog('I', "Siren/Siret $siren trouvé : ".$etab['Siren'].' '.$etab['Nic'].', '.$etab['Nom'] .', '.$etab['CP'].', '.$etab['Ville'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$dirigeant = new Dirigeant();
				$dirigeant->Code = $dir['Fonction'];
				$dirigeant->Titre = $dir['Titre'];
				$dirigeant->Societe = $dir['Societe'];
				$dirigeant->Civilite = $dir['Civilite'];
				$dirigeant->Nom = $dir['Nom'];
				$dirigeant->Prenom = $dir['Prenom'];
				$dirigeant->NaissDate = $dir['NaissDate'];
				$dirigeant->NaissVille = $dir['NaissVille'];
				$dirigeant->NaissDepPays = $dir['NaissDepPays'];
				$dirigeant->Ancien = $dir['Ancien'];
				$dirigeant->DateFct = $dir['DateFct'];

				$liste[] = $dirigeant;
			}

			wsLog('dirigeants',$siren,$option);
			debugLog('I', 'Nb Dirigeants retournés = '. count($dirs), __LINE__, __FILE__, __FUNCTION__, __CLASS__);

		}
		$output = new DirigeantsReturn();
		$output->error = $error;
		$output->result = $liste;
		return $output;
	}

	/**
	 * Retourne la liste des annonces légales relative à une entreprise
	 *
	 * @todo Revoir cette fonction pour la faire marcher avec les associations
	 *
	 * @param string	$siren       Siren de l'entreprise
	 * @param integer	$filtre      0=Pas de Filtre, 1=BODACC, 2=B.A.L.O, 3=JO Association, 4=Boamp
	 * @param integer	$idAnn       Identifiant de l'annonce
	 * @param integer	$position
	 * @param integer	$nbRep
	 * @return AnnoncesReturn
	 */
	public function getAnnonces( $siren, $filtre = 0, $idAnn = 0, $position = 0, $nbRep = 20)
	{
		$this->authenticate();

		//Initialisation
		if (empty($filtre)) 	{ $filtre = 0; }
		if (empty($idAnn)) 		{ $idAnn = 0; }
		if (empty($position)) 	{ $position = 0; }
		if (empty($nbRep)) 		{ $nbRep = 20; }

		//Valeur max
		if($nbRep > 200) { $nbRep = 200; }

		debugLog('I',"Annonces demandées pour $siren ($filtre, $idAnn)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$liste = array();

		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren Siret inexistant';
		}
		elseif ($siren*1==0 && $idAnn==0)
		{
			debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant A';
		}
		else
		{
			$iInsee = new MInsee();
			/*
			if ($siren>100 && $filtre==3)	$asso=true;
			else {
				$asso=false;
				$tabIdentite=$this->iInsee->getIdentiteLight($siren);
				if ($tabIdentite['FJ']>90   && $tabIdentite['FJ']<94 ||
					$tabIdentite['FJ']>9000 && $tabIdentite['FJ']<9400)	$asso=true;
			}*/
			if ($idAnn==0) {
				$anns=$iInsee->getAnnoncesLegales($siren);
				$annsB=$iInsee->getAnnoncesBalo($siren);
				$annsA=$iInsee->getAnnoncesAsso($siren);
				$annsM=$iInsee->getAnnoncesBoamp($siren, $idAnn);
			} elseif ($filtre==1)
				$anns=$iInsee->getAnnoncesLegales($siren, $idAnn);
			elseif ($filtre==2)
				$annsB=$iInsee->getAnnoncesBalo($siren, $idAnn);
			elseif ($filtre==3)
				$annsA=$iInsee->getAnnoncesAsso($siren, $idAnn);
			elseif ($filtre==4)
				$annsM=$iInsee->getAnnoncesBoamp($siren, $idAnn);

			//debugLog('W', print_r($entrep, true), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			if (empty($anns) && empty($annsB) && empty($annsA) && empty($annsM))
			{
				debugLog('W', "Aucune annonce pour le siren $siren (source=$filtre, id=$idAnn)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Siren inexistant B '.$siren.' '.$idAnn;
			}
			else
			{
				foreach ($anns as $nb=>$ann)
				{
					//debugLog('I', "Siren/Siret $siren trouvé : ".$etab['Siren'].' '.$etab['Nic'].', '.$etab['Nom'] .', '.$etab['CP'].', '.$etab['Ville'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
					$evens = array();
					foreach ($ann['evenements'] as $tabEven)
					{
						$even = new AnnonceEvenement();
						$even->CodeEven = $tabEven['CodeEven'];
						$even->LibEven = $tabEven['LibEven'];
						$evens[] = $even;
					}
					$annonce = new Annonce();
					$annonce->id = $ann['id'];
					$annonce->BodaccCode = $ann['BodaccCode'];
					$annonce->BodaccNum = $ann['BodaccNum'];
					$annonce->NumAnnonce = $ann['NumAnnonce'];
					$annonce->DateParution = $ann['DateParution'];
					$annonce->Departement = $ann['Departement'];
					$annonce->Tribunal = $ann['Tribunal'];
					$annonce->TribunalCode = $ann['TribunalCode'];
					$annonce->TribunalSiret = $ann['TribunalSiret'];
					$annonce->Rubrique = $ann['Rubrique'];
					$annonce->typeAnnonce = $ann['typeAnnonce'];
					$annonce->texteRectificatif = $ann['texteRectificatif'];
					$annonce->texteAnnonce = $ann['texteAnnonce'];
					$annonce->libFJ = $ann['libFJ'];
					$annonce->codFJ = $ann['codFJ'];
					$annonce->capital = $ann['capital'];
					$annonce->capitalDev = $ann['capitalDev'];

					$annonce->raisonSociale = $ann['raisonSociale'];
					$annonce->nomCommercial = $ann['nomCommercial'];
					$annonce->sigle = $ann['sigle'];
					$annonce->adresse = $ann['adresse'];

					$annonce->dateEffet = $ann['dateEffet'];
					$annonce->dateJugement = $ann['dateJugement'];
					$annonce->dateInsertionSD = $ann['dateInsertionSD'];
					$annonce->evenements = $evens;
					$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];

					$liste[] = $annonce;
				}

				if (is_array($annsB))
				{
					foreach ($annsB as $nb=>$ann)
					{
						//debugLog('I', "Siren/Siret $siren trouvé : ".$etab['Siren'].' '.$etab['Nic'].', '.$etab['Nom'] .', '.$etab['CP'].', '.$etab['Ville'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
						$evens = array();
						foreach ($ann['evenements'] as $tabEven)
						{
							$even = new AnnonceEvenement();
							$even->CodeEven = $tabEven['CodeEven'];
							$even->LibEven = $tabEven['LibEven'];
							$evens[] = $even;
						}
						$annonce = new Annonce();
						$annonce->id = $ann['id'];
						$annonce->BodaccCode = $ann['BodaccCode'];
						$annonce->BodaccNum = $ann['BodaccNum'];
						$annonce->NumAnnonce = $ann['NumAnnonce'];
						$annonce->DateParution = $ann['DateParution'];
						$annonce->Departement = $ann['Departement'];
						$annonce->Tribunal = $ann['Tribunal'];
						//$annonce->TribunalCode = $ann['TribunalCode'];
						$annonce->TribunalSiret = $ann['TribunalSiret'];
						$annonce->Rubrique = $ann['Rubrique'];
						$annonce->typeAnnonce = $ann['typeAnnonce'];
						$annonce->texteRectificatif = $ann['texteRectificatif'];
						$annonce->texteAnnonce = $ann['texteAnnonce'];
						//$annonce->libFJ = $ann['libFJ'];
						//$annonce->codFJ = $ann['codFJ'];
						//$annonce->capital = $ann['capital'];
						//$annonce->capitalDev = $ann['capitalDev'];
						$annonce->dateEffet = $ann['dateEffet'];
						$annonce->dateJugement = $ann['dateJugement'];
						$annonce->dateInsertionSD = $ann['dateInsertionSD'];
						$annonce->evenements = $evens;
						$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];

						$liste[] = $annonce;
					}
				}

				if (is_array($annsA))
				{
					foreach ($annsA as $nb=>$ann)
					{
						//debugLog('I', "Siren/Siret $siren trouvé : ".$etab['Siren'].' '.$etab['Nic'].', '.$etab['Nom'] .', '.$etab['CP'].', '.$etab['Ville'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
						$evens = array();
						foreach ($ann['evenements'] as $tabEven)
						{
							$even = new AnnonceEvenement();
							$even->CodeEven = $tabEven['CodeEven'];
							$even->LibEven = $tabEven['LibEven'];
							$evens[] = $even;
						}

						$annonce = new Annonce();
						$annonce->id = $ann['id'];
						$annonce->BodaccCode = $ann['BodaccCode'];
						$annonce->BodaccNum = $ann['BodaccNum'];
						$annonce->NumAnnonce = $ann['NumAnnonce'];
						$annonce->DateParution = $ann['DateParution'];
						$annonce->Departement = $ann['Departement'];
						$annonce->Tribunal = $ann['Tribunal'];
						//$annonce->TribunalCode = $ann['TribunalCode'];
						$annonce->TribunalSiret = $ann['TribunalSiret'];
						$annonce->Rubrique = $ann['Rubrique'];
						$annonce->typeAnnonce = $ann['typeAnnonce'];
						$annonce->texteRectificatif = $ann['texteRectificatif'];
						$annonce->texteAnnonce = $ann['texteAnnonce'];
						//$annonce->libFJ = $ann['libFJ'];
						//$annonce->codFJ = $ann['codFJ'];
						//$annonce->capital = $ann['capital'];
						//$annonce->capitalDev = $ann['capitalDev'];
						$annonce->dateEffet = $ann['dateEffet'];
						$annonce->dateJugement = $ann['dateJugement'];
						$annonce->dateInsertionSD = $ann['dateInsertionSD'];
						$annonce->evenements = $evens;
						$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];

						$liste[] = $annonce;
					}
				}

				if (is_array($annsM))
				{
					foreach ($annsM as $nb=>$ann)
					{
						$evens = array();
						foreach ($ann['evenements'] as $tabEven)
						{
							$even = new AnnonceEvenement();
							$even->CodeEven = $tabEven['CodeEven'];
							$even->LibEven = $tabEven['LibEven'];
							$evens[] = $even;
						}

						$annonce = new Annonce();
						$annonce->id = $ann['id'];
						$annonce->BodaccCode = $ann['BodaccCode'];
						$annonce->BodaccNum = $ann['BodaccNum'];
						$annonce->NumAnnonce = $ann['NumAnnonce'];
						$annonce->DateParution = $ann['DateParution'];
						$annonce->Departement = $ann['Departement'];
						$annonce->Tribunal = $ann['Tribunal'];
						//$annonce->TribunalCode = $ann['TribunalCode'];
						$annonce->TribunalSiret = $ann['TribunalSiret'];
						$annonce->Rubrique = $ann['Rubrique'];
						$annonce->typeAnnonce = $ann['typeAnnonce'];
						$annonce->texteRectificatif = $ann['texteRectificatif'];
						$annonce->texteAnnonce = $ann['texteAnnonce'];
						//$annonce->libFJ = $ann['libFJ'];
						//$annonce->codFJ = $ann['codFJ'];
						//$annonce->capital = $ann['capital'];
						//$annonce->capitalDev = $ann['capitalDev'];
						$annonce->dateEffet = $ann['dateEffet'];
						$annonce->dateJugement = $ann['dateJugement'];
						$annonce->dateInsertionSD = $ann['dateInsertionSD'];
						$annonce->evenements = $evens;
						$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];

						$liste[] = $annonce;
					}
				}
			}
		}

		$nbReponses = count($liste);
		if ($nbReponses>0){
			$liste = array_slice($liste, $position, $nbRep);
		}
		debugLog('I', "Nb Annonces $filtre retournées pour $siren (source=$filtre, id=$idAnn) = ". count($liste), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		wsLog('annonces',$siren,$filtre.'/'.$idAnn);
		file_put_contents(PATH_LOG.'/annonces.log', print_r($liste,1));

		$output = new AnnoncesReturn();
		$output->error = $error;
		$result = new AnnoncesResult();
		$result->nbReponses = $nbReponses;
		$result->liste = $liste;
		$output->result = $result;
		return $output;
	}

	/**
	 * Evaluation indiScore d'une entreprise
	 *
	 * @param string $siren Siren de l'entreprise
	 * @param string $nic
	 * @param bool $accesDist
	 * @param int $niveau
	 * @return IndiscoreReturn
	 */
	public function getIndiScore($siren, $nic=0, $accesDist=true, $niveau=2)
	{
		$this->authenticate();
		//Initialisation
		if (empty($nic)) 		{ $nic = 0; }
		if (empty($accesDist)) 	{ $accesDist = true; }
		if (empty($niveau)) 	{ $niveau = 2; }
		if ( !in_array($niveau, array(0,1,2,3,4,5)) ) { $niveau = 2; }
		$error = new ErrorType();
		$tabRet = array();
		debugLog('I',"IndiScore demandée pour $siren en niveau $niveau",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		if (strlen($siren)>9 || (substr($siren,0,9)*1)<100 ){
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren incorrect';
		} else {
			$tDeb = microtime(true);
			require_once 'Metier/scores/classMScores.php';
			$tabRet = calculIndiScore($siren, $nic, $accesDist, $niveau);
			$duree = round(microtime(true)-$tDeb,3);
			debugLog('W', "indiscore DUREE = $duree s", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			wsLog('indiscore',$siren);
		}
		$output = new IndiscoreReturn();
		$output->error = $error;
		$output->result = $tabRet;
	}

	/**
	 * Liste de tous les évènements enregistrés à l'INSEE pour une entreprise
	 * @param string $siren Siren de l'entreprise
	 * @param string $nic
	 * @param integer $deb
	 * @param integer $max
	 * @return InseeReturn
	 **/
	public function getListeEvenements($siren, $nic=0, $deb=0, $max=1000)
	{
		$this->authenticate();

		//Initialisation
		if (empty($nic)) 				{ $nic = 0; }
		if (empty($deb)) 				{ $deb = 0; }
		if (empty($max) || $max>1000) 	{ $max = 1000; }
		$error = new ErrorType();

		debugLog('I',"Liste des évènements pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabRet=array();
		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$iInsee = new MInsee();
			$evens = $iInsee->getEvenements($siren, $nic, $deb, $max);
			$tabRet = array();
			if (count($evens)>0)
			{
				foreach ($evens as $nb=>$even)
				{
					$iEven = new InseeEven();
					$iEven->Nic = $even['nic'];
					$iEven->Siege = $even['siege'];
					$iEven->SiretAss = $even['siretAssocie'];
					$iEven->TypeSiretAss = $even['typeSiretAss'];
					$iEven->EvenCode = $even['codeEven'];
					$iEven->EvenLib = $even['libEven'];
					$iEven->EvenLibDet = $even['libEvenDet'];
					$iEven->EvenDate =  $even['dateEven'];
					$iEven->DateInfo = $even['dateMAJ'];
					$tabRet[] = $iEven;
				}
			}
		}
		debugLog('I', 'Nb évènements retournés = '. count($tabRet), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		//wsLog('etablissements',$siren);

		$result = new InseeResult();
		$result->nbReponses = count($tabRet);
		$result->evenements = $tabRet;
		$output = new InseeReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}


	/**
	 * Recherche
	 * @param string $type Type de la recherche (recherche entreprise : 'ent', recherche dirigeant : 'dir')
	 * @param RechercheEntrepriseCriteres $criteres
	 * @param int $position Position de parcours des résultats retournées (0 par défaut)
	 * @param int $nbRep  Nombre de réponses retournées lors d'une requête (20 par défaut)
	 * @param int $maxRep Nombre de réponses maximum pouvant être retournées lors d'une requête (200 par défaut)
	 * @param bool $pertinence Recherche orthographique stricte sur le nom, l'adresse et la ville (false par défaut)
	 * @param bool $avecSiren Seulement les entités sirénées (false par défaut)
	 * @return RechercheEntrepriseReturn
	 */
	public function rechercheEntreprise($type, $criteres, $position = 0, $nbRep = 20, $maxRep = 200, $pertinence = false, $avecSiren = false)
	{
		//Enregistrement des accès à la requête getIdentite
		Zend_Registry::get('WsLogger')->info("rechercheEntreprise - ip:".
			$_SERVER['REMOTE_ADDR'].", login:".$_SERVER['PHP_AUTH_USER']);
		switch ($type)
		{
			case 'ent':
				$entCriteres = new CriteresEntreprise();
				$entCriteres = $criteres->elementEntreprise;
				$client = new SoapClient($this->wsdl, $this->wsdlOptions);
				$identifiant = $entCriteres->identifiant;
				$typeId = '';
				if ($identifiant!='') {
					$len = strlen($identifiant);
					//Numéro WALDEC
					if (strtoupper(substr($identifiant,0,1))=='W') {
						$typeId = 'W';
					//Code ISIN
					} elseif ($len==12){
						$typeId = 'I';
					//TVA Intracommunautaire
					} elseif (in_array(substr($identifiant,0,2),
						array('AT','BE','BG','CY','CZ','DE','DK','EE','EL','ES',
						'FI','GB','HU','IE','IT','LT','LU','LV','MT','NL','PL',
						'PT','RO','SE','SI','SK'))){
							//"La recherche par numéro de TVA n'est pas encore possible sur ce pays !";
					//Pour la france
					} elseif (substr($identifiant,0,2)=='FR') {
						$typeId = 'S';
						if ($len==13) $identifiant = substr($identifiant,4,9);
						else $identifiant = '';
					//Numéro RC
					} elseif (preg_match('/A|B|C|D/i', $identifiant)) {
						$typeId='R';
					//Siren normal on enleve tout ce qui n'est pas un chiffre
					} else {
						$typeId = 'S';
					}
				}

				if (in_array($typeId, array('R', 'W', 'I'))){
					try {
						$O = $client->searchAutreId(
								$typeId,
								$identifiant,
								empty($position) ? 0 : $position,
								empty($nbRep) ? 20 : $nbRep,
								empty($maxRep) ? 200 : $maxRep,
								$entCriteres->codePostal
							);
					} catch (SoapFault $fault) {
						Zend_Registry::get('WsLogger')->err("rechercheEntreprise - ".serialize($criteres));
						throw new SoapFault($fault->faultcode, $fault->faultstring);
						exit;
					}
				} elseif ($typeId == 'S'){
					try {
						$O = $client->searchSiren(
								$identifiant,
								empty($position) ? 0 : $position,
								empty($nbRep) ? 20 : $nbRep,
								empty($maxRep) ? 200 : $maxRep,
								$entCriteres->codePostal
							);
					} catch (SoapFault $fault) {
						Zend_Registry::get('WsLogger')->err("rechercheEntreprise - ".serialize($criteres));
						throw new SoapFault($fault->faultcode, $fault->faultstring);
						exit;
					}
				} else {

					try {
						$O = $client->searchNomAdr(
								$entCriteres->raisonSociale,
								$entCriteres->adresse,
								$entCriteres->codePostal,
								$entCriteres->ville,
								empty($entCriteres->siege) ? false : $entCriteres->siege,
								empty($entCriteres->actif) ? false : $entCriteres->actif,
								empty($position) ? 0 : $position,
								empty($nbRep) ? 20 : $nbRep,
								empty($maxRep) ? 200 : $maxRep,
								empty($pertinence) ? false : $pertinence,
								empty($avecSiren) ? false : $avecSiren,
								$entCriteres->naf
							);
					} catch (SoapFault $fault) {
						Zend_Registry::get('WsLogger')->err("rechercheEntreprise - ".serialize($criteres));
						throw new SoapFault($fault->faultcode, $fault->faultstring);
						exit;
					}
				}

				break;
			case 'dir':
				$dirCriteres = new CriteresDirigeant();
				$dirCriteres = $criteres->elementDirigeant;
				$client = new SoapClient($this->wsdl, $this->wsdlOptions);
				try {
					$O = $client->searchDir(
							$dirCriteres->dirNom,
							$dirCriteres->dirPrenom,
							$dirCriteres->dirDateNaiss,
						 	$dirCriteres->dirVille,
						 	empty($position) ? 0 : $position,
							empty($nbRep) ? 20 : $nbRep,
							empty($maxRep) ? 200 : $maxRep,
							empty($pertinence) ? false : $pertinence
						 );
				} catch (SoapFault $fault) {
					Zend_Registry::get('WsLogger')->err("rechercheEntreprise - ".serialize($criteres));
					throw new SoapFault($fault->faultcode, $fault->faultstring);
					exit;
				}
				break;
		}

		$error = new ErrorType();
		$error = arrayToClass($O['error'], 'ErrorType');
		$results = new RechercheEntrepriseResult();
		$results = arrayToClass($O['results'], 'RechercheEntrepriseResult');
		$outputParams = new RechercheEntrepriseReturn();
		$outputParams->error = $error;
		$outputParams->results = $results;
		return $outputParams;
	}

	/**
	 * Retourne la fiche d'identité simplifié d'une entreprise avec son numéro de TVA.
	 *
	 * @param  string $siren Identifiant Siren de l'entreprise
	 * @return TvaReturn
	 */
	 public function getTVA($siren)
	 {
	 	$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		$result = new TvaResult();

	 	$siren = trim($siren);
	 	debugLog('I',"TVA demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabRet = array();
		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			debugLog('I', "Avant getIdentiteEntreprise($siren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$iInsee = new MInsee();
			$entrep = $iInsee->getIdentiteEntreprise($siren);
			debugLog('I', "Après getIdentiteEntreprise($siren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			if (empty($entrep))
			{
				debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Siren inexistant';
			}
			else
			{
				debugLog('I', "Avant MTva($siren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$iTva = new MTva($siren);
				if ($iTva->vatDefined)	$tva=$iTva->vatNumber;
				else 					$tva='N/A';
				debugLog('I', "Après MTva($siren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);

				$result->id = $entrep['id'];
				$result->AutreId = $entrep['AutreId'];
				$result->Nom = $entrep['Nom'];
				$result->Sigle = $entrep['Sigle'];
				$result->Enseigne = $entrep['Enseigne'];
				$result->Adresse = $entrep['Adresse'];
				$result->Adresse2 = $entrep['Adresse2'];
				$result->CP = $entrep['CP'];
				$result->Ville = $entrep['Ville'];
				$result->Siren = $entrep['Siren'];
				$result->Tva = $tva;

				debugLog('I', "TVA retournée = $tva (".$entrep['Nom'].')', __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				wsLog('tva',$siren);
			}
		}
		$output = new TvaReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * Retourne la liste des tribunaux ou Compétences demandées
	 * @param array|string $tabTypes Tableau des types de Compétences demandés 'C':Commerce, 'I':Instance, 'G':TGI, 'A':Préfectures, 'B':Sous-préf, 'D':Tribunal Administratif, 'H':Prud'hommes, 'L':	Cour d'Appel, 'M': Tribunal Mixte, 'O':CCI, 'V': Cour Administrative d'Appel
	 * @return TribunauxReturn
	 **/
	public function getTribunaux($tabTypes)
	{
		$this->authenticate();

		//Initialisation
		if (empty($tabTypes)) $tabTypes = array();
		if (is_string($tabTypes)) $tabTypes = (array)$tabTypes;
		$error = new ErrorType();

		$iBodacc = new MBodacc();
		debugLog('I',"Liste des tribunaux demandées",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabTmp = $iBodacc->getListeTribunaux();
		$tabRet = array();
		if (count($tabTypes)==0)
		{
			foreach ($tabTmp as $i=>$tribunal)
			{
				$tri = new TribunalNom();
				$tri->nom = $tribunal['nom'];
				$tabRet[$i] = $tri;
			}
		}
		else
		{
			foreach ($tabTmp as $i=>$tribunal)
			{
				$type = substr($i,-1);
				if (in_array($type, $tabTypes))
				{
					$tri = new TribunalNom();
					$tri->nom = $tribunal['nom'];
					$tabRet[$i] = $tri;
				}
			}
		}
		$output = new TribunauxReturn();
		$output->error = $error;
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Retourne tout ou patie des informations règlementées sur l'entreprise
	 *
	 * @param int $siren SIREN de l'entreprise
	 * @param mixed $id Id du communiqué
	 * @return InfosRegReturn
	 */
	public function getInfosReg( $siren, $id = false )
	{
		$this->authenticate();

		//Initialisation
		if (empty($id)) $id = false;
		$tabRet = array();
		$error = new ErrorType();
		$siren = substr($siren,0,9);

		debugLog('I',"Infos règlementées demandées pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$iBourse = new MBourse($siren);
			$anns = $iBourse->getInfosReg($siren, $id);
			//debugLog('W', print_r($entrep, true), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			if ( empty($anns) )
			{
				debugLog('W', "Aucune info règlementée pour le siren $siren", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Aucune info réglementé pour le siren';
			}
			else
			{
				foreach ($anns as $nb=>$ann)
				{
					//debugLog('I', "Siren/Siret $siren trouvé : ".$etab['Siren'].' '.$etab['Nic'].', '.$etab['Nom'] .', '.$etab['CP'].', '.$etab['Ville'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
					if ($id == false)
					{
						$infos = new InfosReg();
						$infos->id = $ann['id'];
						$infos->source = $ann['source'];
						$infos->DateParution = $ann['DateParution'];
						$infos->raisonSociale = $ann['raisonSociale'];
						$infos->titre = $ann['titre'];
						$infos->pj = $ann['pj'];
						$infos->url = $ann['url'];
						$infos->dateInsertionSD = $ann['dateInsertionSD'];

						$tabRet[] = $infos;
					}
					else
					{
						$infos = new InfosReg();
						$infos->id = $ann['id'];
						$infos->source = $ann['source'];
						$infos->DateParution = $ann['DateParution'];
						$infos->raisonSociale = $ann['raisonSociale'];
						$infos->titre = $ann['titre'];
						$infos->communique = $ann['communique'];
						$infos->communiqueHtml = $ann['communiqueHtml'];
						$infos->pj = $ann['pj'];
						$infos->url = $ann['url'];
						$infos->dateInsertionSD = $ann['dateInsertionSD'];

						$tabRet[] = $infos;
		    		}

				}
			}
			debugLog('I', 'Nb infos retournés = '. count($anns), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			wsLog('infosreg',$siren,$id);
		}

		$output = new InfosRegReturn();
		$output->error = $error;
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Retourne les informations boursières de l'entreprise
	 * @param string $siren SIREN de l'entreprise
	 * @return InfosBourseReturn
	 */
	public function getInfosBourse($siren)
	{
		$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		debugLog('I',"Infos bourse demandées pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$siren = substr($siren,0,9);

		if ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$iBourse = new MBourse($siren);
			$bourse = $iBourse->getInfosBourse($siren);
			//debugLog('W', print_r($entrep, true), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			if (empty($bourse))
			{
				debugLog('W', "Aucune info bourse pour le siren $siren", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Siren inexistant';
			}
			else
			{
				$result = new InfosBourse();
				$result->Siren = $bourse['siren'];
				$result->RaisonSociale = prepareString($bourse['raisonSociale']);
				$result->Adresse = prepareString($bourse['adresse']);
				$result->Effectif = $bourse['effectif'];
				$result->CodeSicovam = $bourse['code_sicovam'];
				$result->CodeMnemo = $bourse['code_mnemo'];
				$result->CodeBloomberg = $bourse['code_bloomberg'];
				$result->CodeDatastream = $bourse['code_datastream'];
				$result->Isin = $bourse['code_isin'];
				$result->CodeRic = $bourse['code_ric'];
				$result->DateIntroduction = prepareString($bourse['dateIntroduction']);
				$result->DateDerAG = prepareString($bourse['dateDerAG']);
				$result->DateRadiation = prepareString($bourse['dateRadiation']);
				$result->AutreIsin = $bourse['autre_isin'];
				$result->EligibleSRD = $bourse['eligibleSRD'];
				$result->EligiblePEA = $bourse['eligiblePEA'];
				$result->Tel = $bourse['tel1'];
				$result->Tel2 = $bourse['tel2'];
				$result->Fax = $bourse['fax1'];
				$result->Fax2 = $bourse['fax2'];
				$result->Web = $bourse['web'];
				$result->Mail = $bourse['mail'];

				$result->Marche = prepareString($bourse['marche']);
				$result->Description = prepareString($bourse['description']);
				$result->Secteur = prepareString($bourse['secteur']);
				$result->Activite = prepareString($bourse['activite']);
				$result->ActiviteDet = prepareString($bourse['activiteDet']);

				$result->placeCotation = prepareString($bourse['placeCotation']);
				$result->nombreTitres = $bourse['nombreTitres'];
				$result->capitalisation = $bourse['close']*$bourse['nombreTitres'];
				$result->derCoursDate = $bourse['date'];
				$result->derCoursCloture = $bourse['close'];
				$result->derCoursOuverture = $bourse['open'];
				$result->derCoursPlusHaut = $bourse['high'];
				$result->derCoursPlusBas = $bourse['low'];

				$result->derCoursVolume = $bourse['volume'];
				$result->coursMin = $bourse['coursMin'];
				$result->coursMoy = $bourse['coursMoy'];
				$result->coursMax = $bourse['coursMax'];

				wsLog('bourse',$siren,$id);
			}
		}
		$output = new InfosBourseReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * Liste des privilèges pour une entreprise en suivi Privilèges
     * @param string $siren
     * @param bool   $detail
     * @param array  $tabTypes
     * @return array
     */
	protected function getPrivileges($siren, $detail=false, $tabTypes=array('03','04'))
	{
		$this->authenticate();

		//Initialisation
		if (empty($detail)) 	$detail = false;
		if (empty($tabTypes)) 	$tabTypes = array('03','04');

		$error = new ErrorType();

		debugLog('I',"Liste des privilèges $detail sur $siren ".print_r($tabTypes, true),__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$iPriv = new MPrivileges();
		if ($detail)
		{
			$ret = $iPriv->getPrivilegesDetail($siren, $tabTypes);
		}
		else
		{
			$ret = $iPriv->getPrivilegesCumul($siren, $tabTypes);
		}
		return $ret;
	}




	/**
	 * Ajout d'une surveillance
	 *
	 * @param 	string 		$siret           Siret/Siren
	 * @param 	string  	$email           Adresse email du client
	 * @param 	string  	$ref	         Référence de la surveillance
	 * @param 	string  	$source          Type de source en surveillance (insee, annonces, bilans, actes, privileges, score, dirigeants)
	 * @param 	boolean 	$delete          Suppression de la ligne
	 * @param 	integer 	$encoursClient   Encours demandé par le client
	 * @return 	SetSurveillanceReturn
	 */
	public function setSurveillance($siret, $email, $ref='', $source='annonces', $delete=false, $encoursClient=0)
	{
		$this->authenticate();

		//Initialisation
		if (empty($ref)) 			$ref = '';
		if (empty($delete)) 		$delete = false;
		if (empty($encoursClient)) 	$encoursClient = false;
		$error = new ErrorType();
		$tabRet = array();
		$siren = substr($siret,0,9);
		$nic = substr($siret,9,5);

		debugLog('I',"setSurveillances(siret=$siret, email=$email, ref=$ref, source=$source, delete=$delete)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$iInsee = new MInsee();
		$tabIdentite = $iInsee->getIdentiteLight($siren, $nic);
		$iDb = new WDB();
		$login = $this->tabInfoUser['login'];
		$source = strtolower($source);
		switch ($source)
		{
			case 'insee':
			case 'annonces':
			case 'bilans':
			case 'actes':
			case 'privileges':
			case 'dir1igeants': $encoursClient=0; break;
			case 'score': 		$encoursClient=$encoursClient*1; break;
			default: 			$source='annonces'; break;
		}
		$tabUpdate = array(
			'source' => $source,
			'login' => $login,
			'email' => $email,
			'siren' => $siren,
			'nic' => $nic,
			'ref' => $ref,
			'encoursClient' => $encoursClient,
			'rs' => $tabIdentite['Nom'],
			'cp' => $tabIdentite['CP'],
			'ville' => $tabIdentite['Ville'],
		);
		if ($delete)
		{
			$tabUpdate = array_merge(
				$tabUpdate,
				array('dateSuppr'=>date('Y-m-d'))
			);
		}
		else
		{
			$tabUpdate = array_merge(
				$tabUpdate,
				array('dateAjout'=>date('Y-m-d'), 'dateSuppr'=>0)
			);
		}
		if ( $delete || !$iDb->insert('surveillances_site', $tabUpdate))
		{
			/*@sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "debugSurv pour $login",
			"source='$source' AND login='$login' AND email='$email' AND siren=$siren AND nic=$nic AND ref='$ref'".EOL.
			print_r($tabUpdate,true).EOL
			);*/
			if (!$iDb->update('surveillances_site', $tabUpdate, "source='$source' AND login='$login' AND email='$email' AND siren=$siren AND nic=$nic AND ref='$ref'"))
			{
				$error->errnum = 76841;
				$error->errmsg = 'Mise a jour impossible';
				$result = 0;
			}
			else
			{
				$result = 1;

			}
		}
		else
		{
			$result = 1;
		}
		$output = new SetSurveillanceReturn();
		$output->error = $error;
		$output->result = $result;
	}

	/**
	 * Enter description here ...
	 * @param 	string 	$siret
	 * @param 	string 	$source
	 * @param 	boolean $detail
	 * @param 	integer $deb
	 * @param 	integer $nbRet
	 * @param 	string 	$tri
	 * @return 	SurveillancesReturn
	 */
	public function getSurveillances($siret = '', $source='annonces', $detail=false, $deb=0, $nbRet=100, $tri='siren')
	{
		$this->authenticate();

		//Initialisation
		if (empty($siret))		$siret = '';
		if (empty($source))		$source = 'annonces';
		if (empty($detail))		$detail = false;
		if (empty($deb))		$deb = 0;
		if (empty($nbRet))		$nbRet = 100;
		if (empty($tri))		$tri = 'siren';

		$error = new ErrorType();
		$tabRet = array();
		$siren = substr($siret,0,9)*1;
		$nic = substr($siret,9,5)*1;

		$tri = strtolower(trim($tri));
		switch ($tri)
		{
			case 'ref':			$orderBy='ORDER BY ref';			break;
			case 'dateAjout':	$orderBy='ORDER BY dateAjout';		break;
			case 'dateDerEnvoi':$orderBy='ORDER BY dateDerEnvoi';	break;
			case 'rs':			$orderBy='ORDER BY rs';				break;
			case 'cp':			$orderBy='ORDER BY cp';				break;
			case 'ville':		$orderBy='ORDER BY ville';			break;
			default:			$orderBy='ORDER BY siren';			break;	// siren ou vide ou autre
		}


		$iDb = new WDB();
		$login = $this->tabInfoUser['login'];

		if ($detail)	$strSelect='source, email, siren, nic, ref, dateAjout, encoursClient, rs, cp, ville, dateDerEnvoi';
		else 			$strSelect='source, email, siren, nic, ref, dateAjout, dateDerEnvoi';

		if ($source<>'')$strSource=" AND source='$source' ";
		else 		 	$strSource='';

		if ($siren>0)	$strSiren =" AND siren=$siren ";
		else 			$strSiren ='';

		// Il faut compter le nombre de siren au total
		$tabTmp = $iDb->select('surveillances_site', 'count(*) as nb', "login='$login' AND dateSuppr=0 $strSiren $strSource", false, MYSQL_ASSOC);
		$nbRepTot = $tabTmp[0]['nb'];

		$tabTmp = $iDb->select('surveillances_site', $strSelect, "login='$login' AND dateSuppr=0 $strSiren $strSource $orderBy LIMIT $deb,$nbRet", false, MYSQL_ASSOC);
		foreach ($tabTmp as $i=>$tabSurv)
		{
			if (!$detail)
			{
				$tabRet[]=array('source'		=> $tabSurv['source'],
								'email'			=> $tabSurv['email'],
								'siren'			=> $tabSurv['siren'],
								'nic'			=> $tabSurv['nic'],
								'ref'			=> prepareString($tabSurv['ref']),
								'dateAjout'		=> $tabSurv['dateAjout'],
								'dateDerEnvoi'	=> $tabSurv['dateDerEnvoi'],
							   );
			}
			else
			{
				if (trim($tabSurv['rs'])<>'') {
					$rs = $tabSurv['rs'];
					$cp = $tabSurv['cp'];
					$ville = $tabSurv['ville'];
				} else {
					$iInsee = new MInsee();
					$tabIdentite = $iInsee->getIdentiteLight($tabSurv['siren'], $tabSurv['nic']);
					$rs = $tabIdentite['Nom'];
					$cp = $tabIdentite['CP'];
					$ville = $tabIdentite['Ville'];
					$iDb->update('surveillances_site', array(
						'rs'	=> $rs,
						'cp'	=> $cp,
						'ville'	=> $ville),
						"login='$login' AND dateSuppr=0 AND siren=".$tabSurv['siren']." AND nic=".$tabSurv['nic']." $strSource",
						false
					);
				}

				$liste = new Surveillance();
				$liste->source			= $tabSurv['source'];
				$liste->email			= $tabSurv['email'];
				$liste->siren			= $tabSurv['siren'];
				$liste->nic				= $tabSurv['nic'];
				$liste->ref				= $tabSurv['ref'];
				$liste->dateAjout		= $tabSurv['dateAjout'];
				$liste->encoursClient	= $tabSurv['encoursClient'];
				$liste->rs				= $rs;
				$liste->cp				= $cp;
				$liste->ville			= $ville;
				$liste->dateDerEnvoi	= $tabSurv['dateDerEnvoi'];

				$tabRet[] = $liste;
			}
		}
		$criteres = new SurveillanceCriteres();
		$criteres->siren = $siren;
		$criteres->nic = $nic;
		$criteres->source = $source;
		$result = new SurveillanceResult();
		$result->criteres = $criteres;
		$result->nbReponses = count($tabRet);
		$result->nbREponsesTotal = $nbRepTot;
		$result->liste = $tabRet;
		$output = new SurveillanceReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 *  Liste les mandataires correspondant à un nom donné
	 *
	 * @param 	mixed $codeTribunal Identifiants BODACC du tribunal ou tableau d'Identifiants numériques des cours d'appel
	 * @param	array $type         Type de mandataire (A)dministrateur, (M)andataire, (O)ppositions, (N)otaires, a(V)ocat
	 * @param 	int   $cpDep        Code postal ou département du mandataire
	 * @return MandatairesReturn
	 */
	public function searchMandataires($nom, $type=array('A','M'), $cpDep=0)
	{
		$this->authenticate();

		//Initialisation
		if (empty($type)) 	$type = array('A','M');
		if (empty($cpDep)) 	$cpDep = 0;
		$error = new ErrorType();
		$tabRet = array();

		debugLog('I',"Recherche de Mandataires '$nom' (Dep=$cpDep)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$iInsee = new MInsee();
		$tabTmp = $iInsee->searchMandataires($nom, true, $type, $cpDep);

		foreach ($tabTmp as $i=>$mand)
		{
			$mandataire = new Mandataire();
			$mandataire->id = 'm'.$i;
			$mandataire->mand = $mand;
			$tabRet[] = $mandataire;

		}
		$output = new MandatairesReturn();
		$output->error = $error;
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Retourne le bilan correspondant au siren, à l'exercice et au formalisme demandé
	 *
	 * @param 	string $siren 		Siren de l'entreprise
	 * @param 	string $millesime	Date du bilan au format JJ/MM/AAAA
	 * @param 	string $typeBilan 	N:Réel Normal, S:Réel Simplifié, C:Consolidé
	 * @param 	string $ref 		Référence S&D obligatoire
	 * @return 	BilanReturn
	 */
	public function getBilan($siren, $millesime, $typeBilan='N', $ref='')
	{
		$this->authenticate();

		//Initialisation
		if (empty($typeBilan))	{ $typeBilan = 'N'; }
		if (empty($ref))		{ $ref = ''; }
		$error = new ErrorType();

		debugLog('I',"Bilan $millesime $typeBilan demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$tabRet = array();
		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$mBil = new MBilans($siren);
			$tabBilan = $mBil->getBilan($millesime, $typeBilan, $ref, true);
		}

		$resultBilan = new Bilan();
		$tabPoste = array();
		foreach($tabBilan as $key => $value){
			if($key == 'POSTES'){
				foreach ($value as $posteK => $posteV){
					$resultPoste = new BilanPoste();
					$resultPoste->id = $posteK;
					$resultPoste->val = $posteV;
				}
				$tabPoste[] = $resultPoste;
			} else {
				$resultBilan->{$key} = $value;
			}
		}
		$resultBilan->POSTES = $tabPoste;

		Zend_Registry::get('WsLogger')->info("Bilan ".print_r($resultBilan, 1));

		$output = new BilanReturn();
		$output->error = $error;
		$output->result = $resultBilan;
		return $output;
	}

	/**
	 * Retourne la liste des bilans disponible pour une entreprise
	 *
	 * @param  string	$siren       Siren de l'entreprise
	 * @return ListeBilansReturn
	 */
	public function getListeBilans($siren)
	{
		$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		$tabRet = array();

		debugLog('I',"Liste des Bilans demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum = 102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			$mBil = new MBilans($siren);
			$tabBilans = $mBil->listeBilans(false);
			foreach($tabBilans as $bilan)
			{
				$element = new ListeBilans();
				$element->dateProvPartenaire 	= $bilan['dateProvPartenaire'];
				$element->dateInsert 		 	= $bilan['dateInsert'];
				$element->typeBilan 			= $bilan['typeBilan'];
				$element->dureeExercice			= $bilan['dureeExercice'];
				$element->dateExercice			= $bilan['dateExercice'];
				$element->millesime				= $bilan['millesime'];
				$element->dateExercicePre		= $bilan['dateExercicePre'];
				$element->dureeExercicePre		= $bilan['dureeExercicePre'];
				$element->monnaie				= $bilan['monnaie'];
				$element->source				= $bilan['source'];
				$tabRet[] = $element;
			}
		}
		debugLog('I', 'Nb Bilans retournés = '. count($tabBilans), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		$result = new ListeBilansResult();
		$result->nbReponses = count($tabRet);
		$result->liste = $tabRet;
		$output = new ListeBilansReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * Vérifie si un siren existe en base Scores & Décisions
	 * @param 	string $siren Siren de l'entité
	 * @return 	SirenExistantReturn
	 */
	public function isSirenExistant($siren)
	{
		$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		$tabRet = array();
		$siren = trim(substr($siren,0,9));
		$result = false;
		debugLog('I',"Siren existant demandée pour siren $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			return array('error'=>array('errnum'=>102, 'errmsg'=>'Siren inexistant'), 'result'=>$tabRet);
		}
		else
		{
			$iInsee = new MInsee();
			$entrep = $iInsee->sirenExiste($siren);
			if (empty($entrep))
			{
				debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$error->errnum = 102;
				$error->errmsg = 'Siren inexistant';
			}
			else
			{
				debugLog('I', "Siren $siren présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
				$result = true;
			}
		}
		wsLog('sirenExiste',$siren);
		$output = new SirenExistantReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * Retourne une annonce en fonction de sa référence
	 *
	 * @param string 	$siren       Siren de l'entreprise
	 * @param string 	$dateAnnee
	 * @param integer 	$numParution
	 * @param integer 	$numAnnonce
	 * @return RechercheAnnonceReturn
	 */
	public function rechercheAnnonce($source, $dateAnnee, $numParution, $numAnnonce)
	{
		$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		$tabRet = array();

		debugLog('I',"Annonce précise demandée pour $source, $dateAnnee, $numParution, $numAnnonce",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (strlen($dateAnnee)==4)	$annee=$dateAnnee;
		else						$annee=substr($dateAnnee,0,4);

		$iDb = new WDB('jo');

		switch (strtoupper($source))
		{
			case 'BODA':
			case 'BODB':
			case 'BODC':
				$lettre = substr(strtoupper($source),3,1);
				if ($annee<2005)
				{
					if ($lettre=='A'){ $numJAL=1; }
					elseif ($lettre=='B'){ $numJAL=200; }
					else{ break; }
					$anneeDeb = $annee.'0101';
					$anneeFin = $annee.'1231';
					$res = $iDb->select('historiques.entrep e, texte t',
						"$annee AS Annee_Parution, e.NOBOD AS Num_Parution, e.NOANN AS Num_Annonce, e.NOPAGE AS Num_Page, e.`DATE` AS Date_Parution, e.DEPT AS Departement, e.CODTRI AS Tribunal_Code, 'I' AS typeAnnonce, CONCAT(e.NOANN,' - ',t.annonceTxt) AS annonce",
						"e.JAL=$numJAL AND e.NOBOD=$numParution AND e.`DATE` BETWEEN $anneeDeb AND $anneeFin AND e.NOANN=$numAnnonce AND e.ANBASE=t.annonceNum");
				} else {
					$res = $iDb->select('bodacc',
						'Bodacc_Annee_Parution AS Annee_Parution, Bodacc_Num AS Num_Parution, Num_Annonce, Bodacc_Page AS Num_Page, Bodacc_Date_Parution AS Date_Parution, Tribunal_Dept AS Departement, Tribunal_Code, typeAnnonce, annonce',
						"Bodacc_Code='$lettre' AND Bodacc_Annee_Parution=$annee AND Bodacc_Num=$numParution AND Num_Annonce=$numAnnonce");
				}
				break;
			case 'ASSO':
				$res=$iDb->select('asso', 'YEAR(Date_Parution) AS Annee_Parution, Num_Parution, Num_Annonce, pageDeb AS Num_Page, Date_Parution, Departement, codTribunal AS Tribunal_Code, typeAnnonce, Annonce_Html AS annonce', "Date_Parution BETWEEN '$annee-01-01' AND '$annee-12-31' AND Num_Parution=$annee".sprintf('%04d', $numParution)." AND Num_Annonce=$numAnnonce");
				break;
			case 'BALO':
				$res=$iDb->select('balo', "YEAR(Date_Parution) AS Annee_Parution, Num_Parution, Num_Affaire AS Num_Annonce, '' AS Num_Page, Date_Parution, '' AS Departement, '' AS Tribunal_Code, 'Insertion' AS typeAnnonce, Annonce_Html AS annonce", "Date_Parution BETWEEN '$annee-01-01' AND '$annee-12-31' AND Num_Parution=$numParution AND Num_Affaire=$numAnnonce");
				break;
		}

		if (count($res)>0)
		{
			$iBodacc = new MBodacc();
			foreach ($res as $i=>$etab)
			{
				$annonces = RechercheAnnonce();
				$annonces->Annee_Parution	= $etab['Annee_Parution'];
				$annonces->Num_Parution		= $etab['Num_Parution'];
				$annonces->Num_Annonce		= $etab['Num_Annonce'];
				$annonces->Num_Page			= $etab['Num_Page'];
				$annonces->Date_Parution	= $etab['Date_Parution'];
				$annonces->Departement		= $etab['Departement'];
				$annonces->Tribunal_Code	= $etab['Tribunal_Code'];
				$annonces->Tribunal			= $iBodacc->getTribunalNom($etab['Tribunal_Code']);
				$annonces->Type_Annonce		= $etab['typeAnnonce'];
				$annonces->Annonce 			= strip_tags(strtr(
					html_entity_decode($etab['annonce']),
						array('&gt;'=>'>','&amp;'=>'&','&lt;'=>'<','&#146;'=>"'")
					));

				$tabRet[] = $annonces;
			}
		}

		$nbTot = count($tabRet);
		$result = new RechercheAnnonceResult();
		$result->criteres = $criteres;
		$result->nbReponses = $nbTot;
		$result->nbReponsesTotal = $nbTot;
		$result->liste = $tabRet;
		$output = new RechercheAnnonceReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * getRatios
	 * @param string $siren
	 * @param string $page
	 * @return RatiosReturn
	 */
	public function getRatios($siren, $page='ratios')
	{
		$this->authenticate();

		//Initialisation
		$error = new ErrorType();
		if (empty($page)) $page = 'ratios';
		$tabRatiosInfos = $tabRatiosSecteurs = $tabBilansR = array();
		$tabRatios2 = $tabRatiosEvol = array();
		$tabRet = array();

		debugLog('I',"Liste des Ratios demandée pour $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (strlen($siren)<>9)
		{
			debugLog('W', "Siren $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum =102;
			$error->errmsg = 'Siren inexistant';
		}
		elseif ($siren*1==0)
		{
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$error->errnum =102;
			$error->errmsg = 'Siren inexistant';
		}
		else
		{
			debugLog('I',"Liste des Ratios demandée pour $siren avant getIdentiteEntreprise",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
			$iInsee = new MInsee();
			$tabIdentite = $iInsee->getIdentiteEntreprise($siren,0,0,false,false);
			debugLog('I',"Liste des Ratios demandée pour $siren après getIdentiteEntreprise",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
			$naf=$tabIdentite['NafEnt'];
			$nafLib=$tabIdentite['NafEntLib'];
			$efftr=$tabIdentite['Effectif']*1;
			$fj=$tabIdentite['FJ'];

			$mBil=new MBilans($siren);
			$tabBilans=$mBil->listeBilans(true);
			//@sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "getRatios sur $siren", print_r($tabBilans, true));

			$nbBilans=count($tabBilans);
			$tabBilan=$tabBil=array();
			if ($nbBilans>0){
				$tabRatios=@calculRatios($tabBilans, $tabIdentite, true);
			}
			$nbRatios=count($tabRatios);
			debugLog('I',"Liste des Ratios demandée pour $siren après calculRatios ($nbRatios)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

			/** Tableau d'infos sur les formules **/
			$tabBorneMin = $tabBorneMax = array();
			foreach ($tabFormules as $formule) {
				$id = $formule['id']*1;
				$libelle = $formule['libelle'];
				$unite = $formule['unite'];
				$commentaires = $formule['commentaires'];
				$ratiosInfos = new RatiosInfos();
				$ratiosInfos->id = 'r'.$id;
				$ratiosInfos->libelle = $formule['libelle'];
				$ratiosInfos->unite = $formule['unite'];
				$ratiosInfos->commentaires = $formule['commentaires'];

				$tabRatiosInfos[] = $ratiosInfos;

				$tabBorneMin[$id]=$formule['borneMin'];
				$tabBorneMax[$id]=$formule['borneMax'];
			}

			/** Tableau des années de bilans **/
			$tabAnnees=array();
			// Tableau d'infos sur les bilans
			foreach ($tabRatios as $i=>$R) {
				$bilansInfos = new RatiosBilansInfos();
				$bilansInfos->dateCloture = $tabBilan[$i]['DATE_CLOTURE'];
				$bilansInfos->duree = $tabBilan[$i]['DUREE_MOIS'];
				$bilansInfos->devise = $tabBilan[$i]['MONNAIE'];
				$bilansInfos->typeBilan = $tabBilan[$i]['CONSOLIDE'];
				$bilansInfos->unite = 'U';

				$tabBilansR[] = $bilansInfos;

				if (substr($tabBilan[$i]['DATE_CLOTURE'],0,4)>1900){
					$tabAnnees[$i]=substr($tabBilan[$i]['DATE_CLOTURE'],0,4);
				}
			}

			foreach ($tabRatios as $i=>$R) {
				// Utilisation d'un index texte à cause du webservice
				foreach ($R as $Ridx=>$Rmont) {
					if ($Rmont<>'NS') {
						if ($tabBorneMin[$Ridx]<>'' && $Rmont<$tabBorneMin[$Ridx])
							$Rmont='<'.$tabBorneMin[$Ridx];
						elseif ($tabBorneMax[$Ridx]<>'' && $Rmont>$tabBorneMax[$Ridx])
							$Rmont='>'.$tabBorneMax[$Ridx];
					}

					$ratiosEntrep = new RatiosEntrep();
					if (substr($Rmont,0,1)=='N' || substr($Rmont,0,1)=='<' || substr($Rmont,0,1)=='>'){
						$ratiosEntrep->id = 'r'.$Ridx;
						$ratiosEntrep->val = $Rmont;
					} else {
						$ratiosEntrep->id = 'r'.$Ridx;
						$ratiosEntrep->val = round($Rmont,2);
					}
					$tabRatios2[] = $ratiosEntrep;

					if (($tabBilan[$i]['CONSOLIDE']=='S'&&isset($tabRatios[$i+1])&&($tabBilan[$i+1]['CONSOLIDE']=='S'||($tabBilan[$i+1]['CONSOLIDE']=='N'&&$tabBilan[$i+1]['DATE_CLOTURE']<>$tabBilan[$i]['DATE_CLOTURE']))) ||
						($tabBilan[$i]['CONSOLIDE']=='N'&&isset($tabRatios[$i+1])&&($tabBilan[$i+1]['CONSOLIDE']=='N'||($tabBilan[$i+1]['CONSOLIDE']=='S'&&$tabBilan[$i+1]['DATE_CLOTURE']<>$tabBilan[$i]['DATE_CLOTURE'])))
					   )
						$Rmont=(($R[$Ridx]-$tabRatios[$i+1][$Ridx])*100)/abs($tabRatios[$i+1][$Ridx]);
					elseif ( ($tabBilan[$i]['CONSOLIDE']=='S'&&isset($tabRatios[$i+1])&&($tabBilan[$i+2]['CONSOLIDE']=='S'||($tabBilan[$i+2]['CONSOLIDE']=='N'&&$tabBilan[$i+2]['DATE_CLOTURE']<>$tabBilan[$i]['DATE_CLOTURE'])))
					  || ($tabBilan[$i]['CONSOLIDE']=='N'&&isset($tabRatios[$i+1])&&($tabBilan[$i+2]['CONSOLIDE']=='N'||($tabBilan[$i+2]['CONSOLIDE']=='S'&&$tabBilan[$i+2]['DATE_CLOTURE']<>$tabBilan[$i]['DATE_CLOTURE'])))
					   )
						$Rmont=(($R[$Ridx]-$tabRatios[$i+2][$Ridx])*100)/abs($tabRatios[$i+2][$Ridx]);
					else
						$Rmont='NS';

					$ratiosEntrepEvol = new RatiosEntrepEvol();
					if ($Rmont=='NS' || $Rmont<-800 || $Rmont>800){
						$ratiosEntrepEvol->id = 'r'.$Ridx;
						$ratiosEntrepEvol->val = 'NS';
					} else {
						$ratiosEntrepEvol->id = 'r'.$Ridx;
						$ratiosEntrepEvol->val = number_format($Rmont,2,',',' ');
					}
					$tabRatiosEvol[] = $ratiosEntrepEvol;
				}
			}
			debugLog('I',"Liste des Ratios demandée pour $siren après EVOLUTION",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

			/** Tableau des ratios secteurs */
			$tabRatiosSecteurs = array();
			if (strlen($naf)>4)	$strNaf=" AND naf5='$naf' ";
			else				$strNaf=" AND naf4='$naf' ";
			$strAnnees=implode(',', $tabAnnees);
			if (count($tabAnnees)>0) {
				$iDb=new WDB('jo');
				$tabTmp=$iDb->select('ratios_secteurs', 'annee, naf5, naf4, id, (montant/nombre) AS ratio, nombre', "1 $strNaf AND annee IN ($strAnnees) ORDER BY annee DESC, id ASC", true, MYSQL_ASSOC);
				$nbRatiosSec=0;
				$anneePre=$tabTmp[0]['annee'];
				$iAn=0;
				foreach ($tabTmp as $tabTmp2) {
					if ($anneePre<>$tabTmp2['annee'])	$iAn++;
					$Ridx=$tabTmp2['id'];
					if ($tabTmp2['nombre']>$nbRatiosSec)	$nbRatiosSec=$tabTmp2['nombre'];
					if ($tabRatiosInfos['r'.$Ridx]['unite']=='EUR')	$montant=round($tabTmp2['ratio']*1000);
					else 											$montant=round($tabTmp2['ratio']);

					if ($tabBorneMin[$Ridx]<>'' && $montant<$tabBorneMin[$Ridx])
						$montant='<'.$tabBorneMin[$Ridx];
					elseif ($tabBorneMax[$Ridx]<>'' && $montant>$tabBorneMax[$Ridx])
						$montant='>'.$tabBorneMax[$Ridx];

					$ratiosSecteur = new RatiosSecteur();
					if (substr($montant,0,1)=='N' || substr($montant,0,1)=='<' || substr($montant,0,1)=='>'){
						$ratiosSecteur->id = 'r'.$Ridx;
						$ratiosSecteur->val = $montant;
					} else {
						$ratiosSecteur->id = 'r'.$Ridx;
						$ratiosSecteur->val = round($montant,2);
					}
					$tabRatiosSecteurs[$iAn] = $ratiosSecteur;
					$anneePre=$tabTmp2['annee'];
				}
			}
			//$tabRatiosSecteurs=array(count($tabTmp), "1 $strNaf AND annee IN ($strAnnees) ORDER BY annee DESC, id ASC");

			$result = new RatiosResult();
			$result->Nom				= $tabIdentite['Nom'];
			$result->NafEnt				= $tabIdentite['NafEnt'];
			$result->NafEntLib			= $tabIdentite['NafEntLib'];
			$result->FJ					= $fj;
			$result->FJ_lib				= $tabIdentite['FJ_lib'];
			$result->Siren				= $siren;
			$result->NbEntNaf			= $nbRatiosSec;
			$result->BilansInfos		= $tabBilansR;
			$result->RatiosInfos		= $tabRatiosInfos;
			$result->RatiosEntrep		= $tabRatios2;
			$result->RatiosEntrepEvol	= $tabRatiosEvol;
			$result->RatiosSecteur		= $tabRatiosSecteurs;

			debugLog('I',"Liste des Ratios demandée pour $siren RETURN",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
			wsLog($page, $siren);
			$output = new RatiosReturn();
			$output->error = $error;
			$output->result = $result;
			return $output;
		}
	}

	/**
	 * getRapport
	 * @param string 	$siren
	 * @param integer 	$niveau
	 * @param integer 	$id
	 * @param boolean 	$forceVerif
	 * @return RapportReturn
	 */
	public function getRapport($siren, $niveau=3, $id=0, $forceVerif=false)
	{
		$this->authenticate();
		if (empty($niveau)) $niveau = 3;
		if (empty($id))	$id = 0;
		if (empty($forceVerif)) $forceVerif = false;
		$error = new ErrorType();
		$result = new Rapport();
		$filtre=0;
		$idAnn=0;
		$accesDist=true;
		if ($niveau==1){
			$result->Indiscore = $this->getIndiScore($siren, 0, $accesDist);
		} elseif ($niveau==2) {
			$result->Identite = $this->getIdentite($siren, $id=0, $forceVerif);
			$result->Indiscore = $this->getIndiScore($siren, 0, $accesDist);
			$result->Dirigeants = $this->getDirigeants($siren, false);
			$result->Liens =  $this->getLiens($siren, true);
			$result->Ratios = $this->getRatios($siren, $page="rapport$niveau");
		} elseif ($niveau==3) {
			$result->Identite = $this->getIdentite($siren, $id=0, $forceVerif);
			$result->Indiscore = $this->getIndiScore($siren, 0, $accesDist);
			$result->Dirigeants = $this->getDirigeants($siren, false);
			$result->Liens =  $this->getLiens($siren, true);
			$result->Ratios = $this->getRatios($siren, $page="rapport$niveau");
			$result->Annonces = $this->getAnnonces($siren, $filtre, $idAnn);
		}
		$output = new RapportReturn();
		$output->error = $error;
		$output->result = $result;
		return $output;
	}

	/**
	 * Retourne le statut du webservice
	 * @return StatusReturn
	 */
	public function status()
	{
		/* @todo tester les différents éléments qui peuvent conduire
		 * à un problème dans les services tel que la connexion à la
		 * base de données, l'accès FTP, l'accès HTTP, l'accès système de fichier
		 */

		//Enregistrement des accès à la requête getIdentite
		Zend_Registry::get('WsLogger')->info("status - ip:".
			$_SERVER['REMOTE_ADDR'].", login:".$_SERVER['PHP_AUTH_USER'].
			", hash:".$_SERVER['PHP_AUTH_PW']);

		$error = new StatusReturn();
		//Test connexion à la base de données
		$db = new WDB('jo');
		if ($db === false)
		{
			$error->statusCode = 1;
			$error->statusMsg = 'Erreur critique';
		}
		else
		{
			$error->statusCode = 0;
			$error->statusMsg = 'Services disponible (beta)';
		}
		return $error;
	}

}

?>