<?php
require_once 'framework/fwk.php';
require_once 'framework/mail/sendMail.php';
require_once 'Metier/insee/classMInsee.php';
require_once 'Metier/insee/classMSirene.php';
require_once 'Metier/partenaires/classMBilans.php';
require_once 'Metier/partenaires/classMBourse.php';
require_once 'Metier/partenaires/classMTva.php';
require_once 'Metier/partenaires/classMMap.php';
require_once 'Metier/partenaires/classMGreffes.php';
require_once 'Metier/partenaires/classMPrivileges.php';
require_once 'Metier/scores/classMFinancier.php';
require_once 'Metier/scores/classMSolvabilite.php';


require_once __DIR__ . '/Types.php';

class Entreprise extends Scores_Ws_Server
{
	/**
	 * 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
	 * @return Identite
	 */
	public function getIdentite($siret, $id = 0)
	{
		$this->authenticate();
		$this->permission('identite');

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

		$tabRet = array();
		$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) {
			$this->sendError('1010');
		} elseif ($len!=14 && $len!=9) {
			$this->sendError('1020');
		}

		$iInsee = new MInsee();
		$entrep = $iInsee->getIdentiteEntreprise($siren, $nic, $id, $forceVerif);
		if (empty($entrep) || empty($entrep['id']) ) {
			debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1020');
		}

		$iBourse = new MBourse($siren);
		$bourse = $iBourse->getInfosBourse($siren);

		$identite = new Identite();
		$identite->id						= $entrep['id'];
		$identite->Siret					= $entrep['Siret'];
		$identite->SiretSiege				= $entrep['SiretSiege'];
		$identite->Siege					= $entrep['Siege'];
		$identite->AncienSiege				= $entrep['AncienSiege'];
		$identite->AncienSiegeDateFin		= $entrep['AncienSiegeDateFin'];
		$identite->TribunalCode				= prepareString($entrep['Tribunal']);
		$identite->TribunalLib				= prepareString($entrep['TribunalLib']);
		//'NumGreffe'						= $entrep['numGreffe'],	 	// Ajouté le 4 08 2009
		$identite->NumRC					= $entrep['numRC'];			// Ajouté le 4 08 2009
		$identite->Actif					= $entrep['Actif'];
		$identite->ActifEco					= $entrep['ActifEco'];		// Etab éco actif, ajout le 28/04/2011
		$identite->ActifEcoDate				= $entrep['ActifEcoDate'];	// Date si éco inactif et jur actif
		$identite->ActifEcoType				= $entrep['ActifEcoType']; 	// vide ou NPAI ou PFER ou ECOF
		$identite->EntActiveRCS				= $entrep['EntActiveRCS'];
		$identite->AutreId					= $entrep['AutreId'];
		$identite->Source					= $entrep['Source'];
		$identite->SourceId					= $entrep['SourceId'];
		$identite->Isin						= $entrep['Isin'];
        $identite->Nom                      = $entrep['NOMEN_LONG'];
		if (empty($identite->Nom)) {
            $identite->Nom					= prepareString(strtr($entrep['Nom'],'/*','  '));
		}
		$identite->Nom2						= prepareString($entrep['Nom2']);
		$identite->NomLong					= prepareString($entrep['nomLong']);		// Ajouté le 4 08 2009
		$identite->NomCommercial			= prepareString($entrep['NomCommercial']);	// Ajouté le 16 11 2010
		$identite->Siret					= $entrep['Siret'];
		$identite->Sigle					= prepareString($entrep['Sigle']);
		$identite->SigleLong				= prepareString($entrep['sigleLong']);		// Ajouté le 4 08 2009
		$identite->Enseigne					= prepareString($entrep['Enseigne']);
		$identite->EnseigneLong				= prepareString($entrep['enseigneLong']);	// Ajouté le 16 11 2010
		$identite->Adresse					= prepareString($entrep['Adresse']);
		$identite->Adresse2					= prepareString($entrep['Adresse2']);
		$identite->AdresseNum				= prepareString($entrep['AdresseNum']);
		$identite->AdresseBtq				= prepareString($entrep['AdresseBtq']);
		$identite->AdresseVoie				= prepareString($entrep['AdresseVoie']);
		$identite->AdresseRue				= prepareString($entrep['AdresseRue']);
		$identite->CP						= $entrep['CP'];
		$identite->Ville					= prepareString($entrep['Ville']);
		$identite->Pays						= prepareString($entrep['Pays']);			// Ajouté le 18 02 2008
		$identite->PaysIso2					= $entrep['PaysIso2'];
		$identite->AdresseDom				= $entrep['AdresseDom'];

		$tabAdresseDomEnt = array();
		if (isset($entrep['AdresseDomEnt']) && count($entrep['AdresseDomEnt'])>0){
			foreach ($entrep['AdresseDomEnt'] as $element){
				$adresseDomEnt = new AdresseDomEnt();
				$adresseDomEnt->siren = $element['siren'];
				$adresseDomEnt->nom = $element['nom'];
				$tabAdresseDomEnt[] = $adresseDomEnt;
			}
		}
		$identite->AdresseDomEnt			= $tabAdresseDomEnt;

		$identite->AdresseDomNb				= $entrep['AdresseDomNb'];
		$identite->Civilite					= $entrep['Civilite'];
		$identite->NbEtab					= $entrep['NbEtab'];
		$identite->Tel						= prepareString($entrep['Tel']);
		$identite->Fax						= prepareString($entrep['Fax']);
		$identite->Web						= prepareString($entrep['Web']);
		$identite->Mail						= prepareString($entrep['Mail']);
		$identite->GeoLat					= $entrep['GeoLat'];
		$identite->GeoLon					= $entrep['GeoLon'];
		$identite->GeoPrecis				= $entrep['GeoPrecis'];

		$geoInfos = new GeoInfos();
		$geoInfos->CUCS 					= $entrep['GeoInfos']['CUCS'];
		$geoInfos->NCUCS 					= $entrep['GeoInfos']['NCUCS'];
		$geoInfos->ZRU 						= $entrep['GeoInfos']['ZRU'];
		$geoInfos->NZRU						= $entrep['GeoInfos']['NZRU'];
		$geoInfos->ZFU						= $entrep['GeoInfos']['ZFU'];
		$geoInfos->NZFU						= $entrep['GeoInfos']['NZFU'];
		$geoInfos->ZUS						= $entrep['GeoInfos']['ZUS'];
		$geoInfos->NZUS						= $entrep['GeoInfos']['NZUS'];
		$geoInfos->AFR						= $entrep['GeoInfos']['AFR'];
		$geoInfos->NAFR						= $entrep['GeoInfos']['NAFR'];
		$geoInfos->ZRR						= $entrep['GeoInfos']['ZRR'];
		$geoInfos->NZRR						= $entrep['GeoInfos']['NZRR'];
		$identite->GeoInfos					= $geoInfos;

		$identite->TvaNumero				= $entrep['TvaNumero'];
		$identite->TvaAttribue				= $entrep['TvaAttribue'];
		$identite->FJ						= $entrep['FJ'];
		$identite->FJ_Lib					= $entrep['FJ_lib'];
		$identite->FJ2						= $entrep['FJ2'];		// Ajouté le 4 08 2009
		$identite->FJ2_Lib					= $entrep['FJ2_Lib'];	// Ajouté le 4 08 2009
		$identite->Siren					= $entrep['Siren'];
		$identite->Nic						= $entrep['Nic'];
		$identite->NafEnt					= $entrep['NafEnt'];
		$identite->NafEntLib				= $entrep['NafEntLib'];
		$identite->NafEtab					= $entrep['NafEtab'];
		$identite->NafEtabLib				= $entrep['NafEtabLib'];
		$identite->NaceEtab					= $entrep['NaceEtab'];
		$identite->NaceEnt					= $entrep['NaceEnt'];
		$identite->Nafa						= $entrep['APRM'];
		$identite->NafaLib					= prepareString($entrep['APRM_Lib']);
		$identite->NumRM					= $entrep['NumRM'];
		$identite->Activite					= $entrep['Activite'];
		$identite->Capital					= $entrep['Capital'];
		$identite->CapitalDev				= $entrep['CapitalDev'];
		$identite->CapitalLib				= $entrep['CapitalLib'];	// Ajouté le 18 02 2008
		$identite->CapitalType				= prepareString($entrep['CapitalType']);	// Ajouté le 4 08 2009

		$classWdate = new WDate();
		$identite->DateCreaEt				= $classWdate->dateT('Ymd','Y-m-d',$entrep['DateCreaEt']);
		$identite->DateCreaEn				= $classWdate->dateT('Ymd','Y-m-d',$entrep['DateCreaEn']);
		$identite->DateClotEt				= $entrep['DateClotEt'];	//@todo : date
		$identite->DateImmat				= $entrep['dateImmat'];		// Ajouté le 4 08 2009
		$identite->DateRadiation			= $entrep['dateRad'];		// Ajouté le 4 08 2009
		//'DateMajRCS'						= $entrep['DateMajRCS'],	// Ajouté le 4 08 2009
		$identite->EffEnTr					= $entrep['EffEnTr'];
    	$identite->EffEnTrLib				= $entrep['EffEnTrLib'];
    	$identite->Effectif					= $entrep['Effectif'];
		$identite->EffEtTr					= $entrep['EffEtTr']; 		// Ajout le 11 08 2010
		$identite->EffEtTrLib				= $entrep['EffEtTrLib'];	// Ajout le 11 08 2010
		$identite->EffectifEtab				= $entrep['EffectifEtab'];	// Ajout le 11 08 2010
		$identite->Dept						= $entrep['Dept'];
		$identite->codeCommune				= prepareString($entrep['codeCommune']);
		$identite->AnneeEffEn				= $entrep['AnneeEffEn'];
		$identite->AnneeEffEt				= $entrep['AnneeEffEt'];
		$identite->AnneeTCA					= $entrep['AnneeTCA'];
		$identite->TrancheCA				= $entrep['TrancheCA'];
		$identite->TrancheCALib				= $entrep['TrancheCALib'];
		$identite->TrancheCAType			= $entrep['TrancheCAType'];
		$identite->dir1Code					= $entrep['dir1Code'];
		$identite->dir1Titre				= prepareString($entrep['dir1Titre']);
		$identite->dir1NomPrenom			= prepareString($entrep['dir1NomPrenom']);
		$identite->dir1DateFct				= prepareString($entrep['dir1DateFct']);	//@todo : date
		$identite->dir1DateNaiss			= $entrep['dir1DateNaiss'];	//@todo : date // Ajouté le 4 08 2009
		$identite->dir1LieuNaiss			= prepareString($entrep['dir1LieuNaiss']);	// Ajouté le 4 08 2009
		$identite->dir2Code					= $entrep['dir2Code'];
		$identite->dir2Titre				= prepareString($entrep['dir2Titre']);
		$identite->dir2NomPrenom			= prepareString($entrep['dir2NomPrenom']);
		$identite->dir2DateFct				= $entrep['dir2DateFct'];	//@todo : date
		$identite->dir2DateNaiss			= prepareString($entrep['dir2DateNaiss']);	//@todo : date // Ajouté le 4 08 2009
		$identite->dir2LieuNaiss			= prepareString($entrep['dir2LieuNaiss']);	// Ajouté le 4 08 2009
		$identite->Rivoli					= $entrep['Rivoli'];

		$identite->InfosIris = new stdClass();
		$identite->InfosIris->codIris		= $entrep['InfosIris']['codIris'];
		$identite->InfosIris->codComIris	= $entrep['InfosIris']['codComIris'];
		$identite->InfosIris->libIris		= prepareString($entrep['InfosIris']['libIris']);
		$identite->InfosIris->typIris		= prepareString($entrep['InfosIris']['typIris']);
		$identite->InfosIris->evoIris		= $entrep['InfosIris']['evoIris'];
		$identite->InfosIris->trIris		= $entrep['InfosIris']['trIris'];
		$identite->InfosIris->grdQuartier	= $entrep['InfosIris']['grdQuartier'];

		$identite->NatureActivite			= $entrep['NatureActivite'];	// Nature de l'activité
		$identite->OrigineCreation			= $entrep['OrigineCreation'];	// Origine de la création
		$identite->TypeExploitation			= $entrep['TypeExploitation'];
		$identite->Auxiliaire				= $entrep['Auxiliaire'];		// 1=Auxiliaire / 0=Non auxiliaire
		$identite->Saisonnalite				= $entrep['Saisonnalite'];		// P=Activité permanente / S=Activité saisonnière
		$identite->SurfaceMagasin			= $entrep['ACTISURF']*1;		// 0=N/D, 1=inf. à 300m2,2=300 à 400m2, 3=400 à 2500m2, 4=sup. à 2500m2
		$identite->SituationJuridique		= $entrep['SituationJuridique'];

		$identite->Bilan = new stdClass();
		$identite->Bilan->Millesime			= $entrep['bilanAnnee'];
		$identite->Bilan->Cloture			= $entrep['bilanDate'];			//@todo : date
		$identite->Bilan->Duree				= $entrep['bilanMois'];
		$identite->Bilan->Devise			= $entrep['bilanDevise'];
		$identite->Bilan->Capital			= $entrep['bilanDA'];
		$identite->Bilan->CA				= $entrep['bilanFL'];
		$identite->Bilan->CAestime			= $entrep['bilanFLestime'];
		$identite->Bilan->Resultat			= prepareString($entrep['bilanHN']);
		$identite->Bilan->Effectif			= $entrep['bilanYP'];
		if (count($bourse) > 0 ) {
		    $identite->Bourse->placeCotation	= $bourse['placeCotation'];
		    $identite->Bourse->nombreTitres		= $bourse['nombreTitres'];
		    $identite->Bourse->capitalisation	= $bourse['close']*$bourse['nombreTitres'];
		    $identite->Bourse->derCoursDate		= $bourse['date'];			//@todo : date
		    $identite->Bourse->derCoursCloture	= $bourse['close'];			//@todo : date
		}

		$tabAutreSiren = array();
		if (isset($entrep['AutreSiren'])) {
			$autreSiren = new AutreSiren();
			$autreSiren->siren = $entrep['AutreSiren']['listeSiren']['siren'];
			$autreSiren->type = $entrep['AutreSiren']['listeSiren']['type'];
			$tabAutreSiren[] = $autreSiren;
		}
		$identite->AutreSiren				= $tabAutreSiren;

		$tabAutreSiret = array();
		if (count($entrep['AutreSiret'])) {
			foreach($entrep['AutreSiret'] as $type => $item) {
				$autreSiret = new AutreSiret();
				$autreSiret->type 		= $type;
				$autreSiret->siren 		= $item['siren'];
				$autreSiret->nic		= $item['nic'];
				$autreSiret->apeEtab	= $item['apeEtab'];
				$autreSiret->codeEve	= $item['codeEve'];
				$autreSiret->dateEve	= $item['dateEve'];
				$autreSiret->adrL1		= $item['adrL1'];
				$autreSiret->adrL2		= $item['adrL2'];
				$autreSiret->adrL3		= $item['adrL3'];
				$autreSiret->adrL4		= $item['adrL4'];
				$autreSiret->adrL5		= $item['adrL5'];
				$autreSiret->adrL6		= $item['adrL6'];
				$autreSiret->adrL7		= $item['adrL7'];
				$autreSiret->depCom		= $item['depCom'];
				$autreSiret->rivoli		= $item['rivoli'];
				$autreSiret->siege		= $item['siege'];
				$autreSiret->destinat	= $item['destinat'];
				$autreSiret->typEtab	= $item['typeEtab'];
				$autreSiret->origine	= $item['origine'];
				$tabAutreSiret[] = $autreSiret;
			}
		}
		$identite->AutreSiret				= $tabAutreSiret;

		$identite->DateMajINSEE				= $entrep['DateMajINSEE'];		//@todo : date
		$identite->DateMajRCS				= $entrep['DateMajRCS'];		//@todo : date
		$identite->DateMajBILAN				= $entrep['bilanDateMaj'];		//@todo : date
		$identite->DateMajANN				= $entrep['dateMajANN'];		//@todo : date
		$identite->DateMajID				= $entrep['dateMajIdentite'];	//@todo : date

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

		$this->wsLog('identite',$siret,$id);

		return $identite;
	}

    /**
     * Avis RNCS
     * @param string $siren
     * @return AvisRncs
     */
	public function getAvisRncs($siren)
	{
	    $this->authenticate();
	    $this->permission('avisrncs');

	    $len = strlen($siren);
	    if ( $len != 9 ) {
	        $this->sendError('1020');
	    }

	    $db = Zend_Db_Table_Abstract::getDefaultAdapter();

	    $output = new AvisRncs();
	    $iDb = new WDB();
        $rncs = new MRncs($iDb);

        //jo.etablissements => insee uniquement, rncs ?

	    //Entreprise
	    $infosEtab = $rncs->getIdentiteEtab($siren);
        if ( $infosEtab === false ) {
			throw new SoapFault('MSG', "Cette entreprise n'est pas inscrite au RNCS ou radié depuis plus de 5 ans.");
        }

        $output->Nom = $infosEtab['raisonSociale']; //@todo personne physique
		$output->Sigle = $infosEtab['sigle'];
        $output->Enseigne = $infosEtab['enseigne'];
        $output->NomCommercial = $infosEtab['nomCommercial'];

        $output->Siren = $infosEtab['siren'];
        $output->NumGest = $infosEtab['numRC'];
        $output->RadiationDate = $infosEtab['dateRad'];
        $output->ImmatDate = $infosEtab['dateImma'];
        $output->NafCode = $infosEtab['nafEnt'];
        $output->NafLabel = $infosEtab['nafEntLib'];

        if (empty($infosEtab['dateRad']) || $infosEtab['dateRad'] = '0000-00-00') {
        	$output->TribunalCode = $infosEtab['triCode']; //@todo
        	$output->TribunalLabel = $infosEtab['libGreffe']; // @todo
        	$output->FjCode = $infosEtab['cj'];
        	$output->FjLabel = $infosEtab['cjLib'];
        	$output->Capital = $infosEtab['capital'];
        	$output->CapitalDev = 'EUR';
        	if ( !empty($infosEtab['capitalDevIso'])) {
        		$output->CapitalDev = $infosEtab['capitalDevIso'];
        	}
        	$output->CapitalType = $infosEtab['capitalType'];

        	$output->SiegeAdresseNum = intval($infosEtab['adrNumVoie']);
        	$output->SiegeAdresseBtq = $infosEtab['adrIndRep'];
        	$output->SiegeAdresseVoieType = $infosEtab['adrTypeVoie'] ;
        	$output->SiegeAdresseVoieLabel = $infosEtab['adrVoie'];
        	$output->SiegeAdresseComp = $infosEtab['adrComp'];
        	$output->SiegeAdresseCP = $infosEtab['cp'];
        	$output->SiegeAdresseVille = $infosEtab['commune'];

        	$output->DateMajRCS = $infosEtab['DateMajRCS'];

        	//Durée de la société - impossible
        	$output->DureeDate = '';

        	//Date du dernier bilan - MOIS/JOUR au pire chercher dans l'annonce
        	try {
        		$bilanM = new Application_Model_JoBilans();
        		$sql = $bilanM->select(true)
        		->columns(array('dateExercice'))
        		->where('siren=?', $siren)
        		->order('dateExercice DESC')->limit(1);
        		$result = $bilanM->fetchRow($sql);
        		if ($result !== null) {
        			$output->CompteArretMois = substr($result->dateExercice,4,2);
        			$output->CompteArretJour = substr($result->dateExercice,6,2);
        		}
        	} catch(Zend_Db_Exception $e) {}

        	//=> Avec l'adresse du premier siège
        	$output->ConstitutionTribunalCode = '';
        	$output->ConstitutionTribunalLabel = '';

        	$iInsee = new MInsee($iDb);
        	$dirs = $iInsee->getDirigeants($siren, false);
        	$liste = array();
        	foreach ($dirs as $nb => $dir)
        	{
        		$dirigeant = new AvisRncsAdmin();

        		$dirigeant->Code = $dir['Fonction'];
        		$dirigeant->Label = $dir['Titre'];
        		$dirigeant->CompanyName = $dir['Societe'];
        		$dirigeant->CompanyId = (array_key_exists('Siren', $dir) && intval($dir['Siren'])!=0) ? $dir['Siren'] : '' ;
        		$dirigeant->Civilite = $dir['Civilite'];
        		$dirigeant->Nom = $dir['Nom'];
        		$dirigeant->Prenom = $dir['Prenom'];
        		$dirigeant->NomUsage = $dir['NomUsage'];
        		$dirigeant->NaissanceDate = $dir['NaissDate'];
        		$dirigeant->NaissanceVille = $dir['NaissVille'];
        		$dirigeant->NaissanceCp = $dir['NaissDepPays'];
        		$liste[] = $dirigeant;
        	}
        	$output->Administration = $liste;

        	$insee = $iInsee->getIdentiteEntreprise($siren);

        	//Origine, code à transformer - getIdentiteEntreprise - insee
        	$output->Origine = $insee['OrigineCreation'];

        	//Activité réelle - getIdentiteEntreprise - insee
        	$output->Activite = $insee['Activite'];
        	$output->BodaccActivite = $insee['Activite'];

        	//Date de création à l'insee - getIdentiteEntreprise - insee
        	//@todo : Aller cherche dans les annonces bodacc création + acquisition
        	$output->ActiviteDate = substr($insee['DateCreaEn'],0,4).'-'.substr($insee['DateCreaEn'],4,2).'-'.substr($insee['DateCreaEn'],6,2);

        	//Type d'exploitation - getIdentiteEntreprise - insee
        	$output->Exploitation = $insee['TypeExploitation'];

        	//Liste des jugements
        	$output->Evenements = array();
        	$evens = $rncs->getListeJugements($siren);
        	if ( count($evens)>0 ) {
        		foreach ( $evens as $even ) {
        			$output->Evenements[] = $even['dateEffet'] . ' - '  . $even['libEven'];
        		}
        	}

        	//Liste  des dépots
        	$output->Depots = array();
        	$infogreffe = new SdMetier_Infogreffe_DocAC($siren);
        	$depots = $infogreffe->getList();
        	if ( count($depots)>0 ) {
        		$i = 0;
        		$listNumDepot = array();
        		foreach ( $depots as $depot ) {
        			$acte = new AvisRncsDepot();
        			$acte->DepotNum = $depot->DepotNum;
        			$acte->DepotDate = $depot->DepotDate;
        			$acte->ActeNum = $depot->ActeNum;
        			$acte->ActeDate = $depot->ActeDate;
        			$acte->ActeType = $depot->ActeType;
        			$acte->ActeTypeLabel = $depot->ActeTypeLabel;
        			$acte->infos = $depot->infos;
        			$result = $rncs->getListeDepots($siren, $depot->DepotDate);
        			if (count($result)>0) {
        				foreach ($result as $infos) {
							$acte->infos[] = $infos['libDepot'];
        				}
        			}

        			//Acte constitutif - Statut
        			//@todo : STATUTS CONSTITUTIFS
        			$date = substr($depot->ActeDate,0,4);
        			if ( in_array($depot->ActeType, array('04')) && intval($date)>1995 ) {
        				$output->ConstitutionActeDate = $depot->ActeDate;
        				$output->ConstitutionDepotDate = $depot->DepotDate;
        			}

        			$i++;
        			if ($i < 4 || $i > count($depots)-4) {
        				$output->Depots[] = $acte;
        			}
        		}
        	}


        	//Liste des établissements actifs au RNCS
        	$output->Etablissements = array();
        	$result = $iInsee->getEtablissements($siren, '', 0, 200, 200, 0, 1);
        	if ( count($result['reponses'])>0 ) {
        		foreach ( $result['reponses'] as $item ) {
        			$output->Etablissements[] = $item['Adresse'] . ' ' . $item['Adresse2'] . ' - ' .
        					$item['CP'] . ' ' . strtoupper($item['Ville']);
        		}
        	}
        }

	    $this->wsLog('avisrncs', $siren);

        return $output;
	}

	/**
	 * 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  integer  	$id     Identifiant S&D de l'établissement
	 * @return IdentiteProcol		Fiche d'identité de l'établissement
	 */
	public function getIdentiteProcol($siret, $id=0, $forceVerif=false)
	{
		$this->authenticate();
		$this->permission('idprocol');

		debugLog('I',"Identité AGS 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 (intval($siren)==0 && $id==0) {
			$this->sendError('1010');
		} elseif ($len!=14 && $len!=9) {
			$this->sendError('1020');
		}

		$iInsee = new MInsee();
		$entrep = $iInsee->getIdentiteEntreprise($siren, $nic, $id, $forceVerif);
		if (empty($entrep)) {
			debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1020');
		}

		$iBourse = new MBourse($siren);
		$bourse = $iBourse->getInfosBourse($siren);

		$identiteProcol = new IdentiteProcol();

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

		$tabAdresseDomEnt = array();
		if (isset($entrep['AdresseDomEnt']) && count($entrep['AdresseDomEnt'])>0){
			foreach ($entrep['AdresseDomEnt'] as $element){
				$adresseDomEnt = new AdresseDomEnt();
				$adresseDomEnt->siren = $element['siren'];
				$adresseDomEnt->nom = $element['nom'];
				$tabAdresseDomEnt[] = $adresseDomEnt;
			}
		}
		$identite->AdresseDomEnt			= $tabAdresseDomEnt;

		$identite->AdresseDomNb				= $entrep['AdresseDomNb'];
		$identite->Civilite					= $entrep['Civilite'];
		$identite->NbEtab					= $entrep['NbEtab'];
		$identite->Tel						= $entrep['Tel'];
		$identite->Fax						= $entrep['Fax'];
		$identite->Web						= $entrep['Web'];
		$identite->Mail						= $entrep['Mail'];
		$identite->GeoLat					= $entrep['GeoLat'];
		$identite->GeoLon					= $entrep['GeoLon'];
		$identite->GeoPrecis				= $entrep['GeoPrecis'];
		$identite->GeoInfos					= $entrep['GeoInfos'];
		$identite->TvaNumero				= $entrep['TvaNumero'];
		$identite->TvaAttribue				= $entrep['TvaAttribue'];
		$identite->FJ						= $entrep['FJ'];
		$identite->FJ_Lib					= $entrep['FJ_lib'];
		$identite->FJ2						= $entrep['FJ2'];			// Ajouté le 4 08 2009
		$identite->FJ2_Lib					= $entrep['FJ2_Lib'];		// Ajouté le 4 08 2009
		$identite->Siren					= $entrep['Siren'];
		$identite->Nic						= $entrep['Nic'];
		$identite->NafEnt					= $entrep['NafEnt'];
		$identite->NafEntLib				= $entrep['NafEntLib'];
		$identite->NafEtab					= $entrep['NafEtab'];
		$identite->NafEtabLib				= $entrep['NafEtabLib'];
		$identite->NaceEtab					= $entrep['NaceEtab'];
		$identite->NaceEnt					= $entrep['NaceEnt'];
		$identite->Nafa						= $entrep['APRM'];
		$identite->NafaLib					= $entrep['APRM_Lib'];
		$identite->NumRM					= $entrep['NumRM'];
		$identite->Activite					= $entrep['Activite'];
		$identite->Capital					= $entrep['Capital'];
		$identite->CapitalDev				= $entrep['CapitalDev'];
		$identite->CapitalLib				= $entrep['CapitalLib'];	// Ajouté le 18 02 2008
		$identite->CapitalType				= $entrep['CapitalType'];	// Ajouté le 4 08 2009
		$identite->DateCreaEt				= WDate::dateT('Ymd','Y-m-d',$entrep['DateCreaEt']);
		$identite->DateCreaEn				= WDate::dateT('Ymd','Y-m-d',$entrep['DateCreaEn']);
		$identite->DateClotEt				= $entrep['DateClotEt'];	//@todo : date
		$identite->DateImmat				= $entrep['dateImmat'];		// Ajouté le 4 08 2009
		$identite->DateRadiation			= $entrep['dateRad'];		// Ajouté le 4 08 2009
		$identite->EffEnTr					= $entrep['EffEnTr'];
    	$identite->EffEnTrLib				= $entrep['EffEnTrLib'];
    	$identite->Effectif					= $entrep['Effectif'];
		$identite->EffEtTr					= $entrep['EffEtTr']; 		// Ajout le 11 08 2010
		$identite->EffEtTrLib				= $entrep['EffEtTrLib'];	// Ajout le 11 08 2010
		$identite->EffectifEtab				= $entrep['EffectifEtab'];	// Ajout le 11 08 2010
		$identite->Dept						= $entrep['Dept'];
		$identite->codeCommune				= $entrep['codeCommune'];
		$identite->AnneeEffEn				= $entrep['AnneeEffEn'];
		$identite->AnneeEffEt				= $entrep['AnneeEffEt'];
		$identite->AnneeTCA					= $entrep['AnneeTCA'];
		$identite->TrancheCA				= $entrep['TrancheCA'];
		$identite->TrancheCALib				= $entrep['TrancheCALib'];
		$identite->dir1Code					= $entrep['dir1Code'];
		$identite->dir1Titre				= $entrep['dir1Titre'];
		$identite->dir1NomPrenom			= $entrep['dir1NomPrenom'];
		$identite->dir1DateFct				= $entrep['dir1DateFct'];	//@todo : date
		$identite->dir1DateNaiss			= $entrep['dir1DateNaiss'];	//@todo : date // Ajouté le 4 08 2009
		$identite->dir1LieuNaiss			= $entrep['dir1LieuNaiss'];	// Ajouté le 4 08 2009
		$identite->dir2Code					= $entrep['dir2Code'];
		$identite->dir2Titre				= $entrep['dir2Titre'];
		$identite->dir2NomPrenom			= $entrep['dir2NomPrenom'];
		$identite->dir2DateFct				= $entrep['dir2DateFct'];	//@todo : date
		$identite->dir2DateNaiss			= $entrep['dir2DateNaiss'];	//@todo : date // Ajouté le 4 08 2009
		$identite->dir2LieuNaiss			= $entrep['dir2LieuNaiss'];	// Ajouté le 4 08 2009
		$identite->Rivoli					= $entrep['Rivoli'];
		$identite->InfosIris->codIris		= $entrep['InfosIris']['codIris'];
		$identite->InfosIris->codComIris	= $entrep['InfosIris']['codComIris'];
		$identite->InfosIris->libIris		= $entrep['InfosIris']['libIris'];
		$identite->InfosIris->typIris		= $entrep['InfosIris']['typIris'];
		$identite->InfosIris->evoIris		= $entrep['InfosIris']['evoIris'];
		$identite->InfosIris->trIris		= $entrep['InfosIris']['trIris'];
		$identite->InfosIris->grdQuartier	= $entrep['InfosIris']['grdQuartier'];
		$identite->NatureActivite			= $entrep['NatureActivite'];	// Nature de l'activité
		$identite->OrigineCreation			= $entrep['OrigineCreation'];	// Origine de la création
		$identite->TypeExploitation			= $entrep['TypeExploitation'];
		$identite->Auxiliaire				= $entrep['Auxiliaire'];		// 1=Auxiliaire / 0=Non auxiliaire
		$identite->Saisonnalite				= $entrep['Saisonnalite'];		// P=Activité permanente / S=Activité saisonnière
		$identite->SituationJuridique		= $entrep['SituationJuridique'];
		$identite->Bilan->Cloture			= $entrep['bilanDate'];			//@todo : date
		$identite->Bilan->Duree				= $entrep['bilanMois'];
		$identite->Bilan->Devise			= $entrep['bilanDevise'];
		$identite->Bilan->Capital			= $entrep['bilanDA'];
		$identite->Bilan->CA				= $entrep['bilanFL'];
		$identite->Bilan->Resultat			= $entrep['bilanHN'];
		$identite->Bilan->Effectif			= $entrep['bilanYP'];
		$identite->Bourse->placeCotation	= $bourse['placeCotation'];
		$identite->Bourse->nombreTitres		= $bourse['nombreTitres'];
		$identite->Bourse->capitalisation	= $bourse['close']*$bourse['nombreTitres'];
		$identite->Bourse->derCoursDate		= $bourse['date'];			//@todo : date
		$identite->Bourse->derCoursCloture	= $bourse['close'];			//@todo : date

		$tabAutreSiren = array();
		if (isset($entrep['AutreSiren'])) {
			$autreSiren = new AutreSiren();
			$autreSiren->siren = $entrep['AutreSiren']['listeSiren']['siren'];
			$autreSiren->type = $entrep['AutreSiren']['listeSiren']['type'];
			$tabAutreSiren[] = $autreSiren;
		}
		$identite->AutreSiren				= $tabAutreSiren;

		$identite->DateMajINSEE				= $entrep['DateMajINSEE'];		//@todo : date
		$identite->DateMajRCS				= $entrep['DateMajRCS'];		//@todo : date
		$identite->DateMajBILAN				= $entrep['bilanDateMaj'];		//@todo : date
		$identite->DateMajANN				= $entrep['dateMajANN'];		//@todo : date
		$identite->DateMajID				= $entrep['dateMajIdentite'];	//@todo : date

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

		$identiteProcol->Identite = $identite;

		//Eléments annonces légales
    	$tabRetAnn = $tabLastEven = array();
       	if (intval($siren)!=0) {
			$anns = $this->getAnnonces($siren, 1);
    		$anns = $anns->result;
    		$tribunalProcol = false;
			foreach ($anns as $nb=>$ann)
			{
				$tabRetEven = array();
				foreach ($ann->evenements as $tabEven) {
					// On ignore les éléments suivants
					if ($tabEven->CodeEven>=7000)								continue;
					if ($tabEven->CodeEven>=4000 && $tabEven->CodeEven<=4999)	continue;

					// Par défaut, on force le tribunal à celui présent dans la dernière annonce de Procol
	    			if ($tribunalProcol==false && $tabEven->CodeEven>=1000 && $tabEven->CodeEven<2000 && $ann->BodaccCode=='BODA') {
	    				$identiteProcol->TribunalCode = $ann->TribunalCode;
	    				$identiteProcol->TribunalLib = prepareString($ann->Tribunal);
	    				$tribunalProcol=true;
	    			}

	    			// On ne prend que le dernier élément de chaque type
					if (in_array($tabEven->CodeEven, $tabLastEven)) continue;

					$tabLastEven[] = $tabEven->CodeEven;
					$tabRetEven[] = $tabEven;
				}

				if (count($tabRetEven)>0) {
					$annonce = new Annonce();
					$annonce->id 				= $ann->id;
					$annonce->BodaccCode 		= $ann->BodaccCode;
					$annonce->BodaccNum 		= $ann->BodaccNum;
					$annonce->NumAnnonce 		= $ann->NumAnnonce;
					$annonce->DateParution 		= $ann->DateParution;				//@todo : date
					$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 		= utf8_encode($ann->texteAnnonce);
					$annonce->dateEffet 		= $ann->dateEffet;					//@todo : date
					$annonce->dateJugement 		= $ann->dateJugement;				//@todo : date
					$annonce->dateInsertionSD 	= $ann->dateInsertionSD;			//@todo : date
					$annonce->evenements 		= $tabRetEven;
					$annonce->Lien_Annonce_Pdf 	= $ann->Lien_Annonce_Pdf;
					$tabRetAnn[] = $annonce;
				}
			}
			$identiteProcol->Annonces = $tabRetAnn;

			$iRncs = new MRncs();
			if ($entrep['Siege']==1 || $entrep['Siege']==11) {
				$identiteProcol->LibTypeEtab = 'Etablissement Siege';
			} else {
				$tabEtabRncs = $iRncs->getIdentiteEtab($siren, $entrep['Nic']);
				if 		($tabEtabRncs['Siege']==2)	$identiteProcol->LibTypeEtab = 'Etablissement Principal';
				elseif 	($tabEtabRncs['Siege']==1)	$identiteProcol->LibTypeEtab = 'Etablissement Complementaire';
				elseif 	($tabEtabRncs['Siege']==0)	$identiteProcol->LibTypeEtab = 'Etablissement Secondaire';
			}

			//@todo
			$tabJuge = $iRncs->getIntervenants($siren);
			$tabDepots=array();
			foreach ($tabJuge as $iDepot=>$depot) {
				$organe = new Organe();
				$organe->codEven 		= $depot['codEven'];
				$organe->libEven		= prepareString($depot['libEven']);
				$organe->dateEffet 		= $depot['dateEffet'];
				$organe->admcode 		= $depot['admcode'];
				$organe->admfonction 	= prepareString($depot['admfonction']);
				$organe->admnom 		= prepareString($depot['admnom']);
				$organe->admadrNum 		= $depot['admadrNum'];
				$organe->admadrInd 		= $depot['admadrInd'];
				$organe->admadrVoie 	= $depot['admadrVoie'];	// @todo : adm1adr1, adm1adr2, adm1adr3,
				$organe->admadrCP 		= $depot['admadrCP'];
				$organe->admadrVille 	= $depot['admadrVille'];
				$tabDepots[] = $organe;
			}
			$identiteProcol->Organes = $tabDepots;

			require_once 'Metier/partenaires/classMLiens.php';
			$mLiens = new MLiens($siren);
			$tabA = $mLiens->getActionnaires($siren, 1);
			$nbA = count($tabA);
			$tabAct = array();
			foreach ($tabA as $i=>$lien) {
				$liens = new Actionnaire();
				$liens->Pmin			= $lien['Pmin'];
				$liens->MajMin			= $lien['MajMin'];
				$liens->RaisonSociale	= $lien['RaisonSociale'];
				$liens->Pays			= $lien['Pays'];
				$liens->Siren			= $lien['Siren'];
				$liens->Actif			= $lien['Actif'];
				$tabAct[] = $liens;
			}
			$identiteProcol->Actionnaires = $tabAct;

			$iGreffes = new MGreffes();
			$tabActes = $iGreffes->getListeActes($siren);

			$identiteProcol->StatutsModifDepot = $identiteProcol->StatutsModif = '0000-00-00';
			foreach ($tabActes as $i=>$acte) {
				if ('_'.$acte['acte_type']=='_04') {	// STATUTS CONSTITUTIFS
					$identiteProcol->StatutsConstDepot 	= $acte['depot_date'];  // => 1997-12-18
					$identiteProcol->StatutsConst		= $acte['acte_date'];	// => 1997-11-13
					break;
				} elseif (in_array('_'.$acte['acte_type'], array(
						//'_04',	// STATUTS CONSTITUTIFS
						'_06',	// STATUTS A JOUR 	9 	0000-00-00 	2009-09-02 17:05:55
						'_07',	// STATUTS A JOUR 	9 	0000-00-00 	2009-09-02 17:05:55
						'_08',	// STATUTS A JOUR ET DECLARATION DE CONFORMITE 	9 	0000-00-00 	2009-09-02 17:05:55
						'_09',	// STATUTS APRES TRANSFERT DE SIEGE 	9 	0000-00-00 	2009-09-02 17:05:55
						'_A1',	// STATUTS 	9 	0000-00-00 	2009-09-02 17:05:55
						'_AH',	// AVENANT AUX STATUTS
						))) {
							// On ne prend que la dernière modif
							if ($identiteProcol->StatutsModifDepot=='0000-00-00' && $identiteProcol->StatutsModif=='0000-00-00') {
								$identiteProcol->StatutsModifDepot 	= $acte['depot_date'];// => 1997-12-18
								$identiteProcol->StatutsModif		= $acte['acte_date'];	// => 1997-11-13
							}
				}
			}

			/** Y a t il eu des informations relatives à une cession ? **/
			$tabCes = $iGreffes->getInfosCessions($siren);
			if ($tabCes) {
				$identiteProcol->CessionJugeLib		= $tabCes['cessJuge'];
				$identiteProcol->CessionJugeDate	= $tabCes['cessDateJuge'];
				$identiteProcol->CessionAvisBodac	= $tabCes['cessDateBod'];
				$identiteProcol->CessionInvenDate	= $tabCes['cessDateInv'];
				$identiteProcol->CessionCAdeclare	= $tabCes['cessCAdec'];
				$identiteProcol->CessionEffectif	= $tabCes['cessEffectif'];
			 	$identiteProcol->CessionDesc		= $tabCes['cessDesc'];
				$identiteProcol->CessionDescDate	= $tabCes['cessDateDesc'];
				$identiteProcol->CessionOffreDate	= $tabCes['cessDateLim'];
				$identiteProcol->CessionMandataire	= $tabCes['cessMand'];
			}
       	}
		//sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "Debug $siren", print_r($tabRet,true)) ;
		debugLog('I', 'Etablissement retourné = '. $entrep['Nom'], __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		$this->wsLog('identite', $siret, $id);

		return $identiteProcol;
	}

	/**
	 * Retourne les liens financiers pour une entreprise.
	 * @param string    $siren    Siren de l'entreprise
	 * @param string    $type     Type de lien (actionnaire|participation)
	 * @return LiensReturn
	 */
	public function getLiens($siren, $type = null)
	{
		$this->authenticate();
		$this->permission('liens');

		//Load country table
		try {
		    $countryM = new Application_Model_JoTabPays();
		    $sql = $countryM->select()->from($countryM, array('codPays3', 'libPays'));
		    $result = $countryM->fetchAll($sql);
	    } catch (Zend_Db_Adapter_Exception $e) {
	        if ($this->User->idClient==1) {
		        throw new SoapFault('ERR', $e->getMessage());
		    } else {
		        throw new SoapFault('ERR', "Application error");
		    }
	    } catch (Zend_Exception $e) {
	        throw new SoapFault('ERR', "Application error");
	    }

		$tabPays = array();
		if ( $result->count()>0 ) {
		    foreach ( $result as $item ) {
		        $tabPays[$item->codPays3] = $item->libPays;
		    }
		}

		$tabAct = $tabPar = $tabDir = array();

		try
		{
		    $liensM = new SdMetier_Liens_Base($siren, 'siren');

    		//Actionnaires
    		$liens = $liensM->getActionnaires(null, true);
    		if (count($liens)>0) {
    		    foreach ( $liens as $item ) {
    		        $detail = new Lien();
    		        $detail->id = $item->id;
    		        $detail->idFiche = $item->idAct;
    		        $detail->nom = $item->RS;
    		        $detail->sigle = $item->sigle;

    		        $libPays = '';
    		        if ($item->adresse_pays!='') {
    		            $libPays = array_key_exists($item->adresse_pays, $tabPays) ?
    		                $tabPays[$item->adresse_pays] : $item->adresse_pays;
    		        } else {
    		            $libPays = $tabPays['FRA'];
    		        }
    		        $detail->pays = $libPays;

    		        if ($item->PpPm=='PP' && intval($siren)==0) {
    		            $detail->nom = $item->civilite.' '.$item->nom.' '.$item->prenom;
    		        }
    		        $detail->siren = str_pad($item->siren, 9, "0", STR_PAD_LEFT);
    		        $detail->PDetention = $item->PDetention;
    		        $detail->Pvote = $item->Pvote;
    		        $detail->MajMin = $item->MajMin;

    		        if ($item->dateUpdate=='0000-00-00 00:00:00'){
    		            $detail->date = substr($item->dateInsert,0,10);
    		        } else {
    		            $detail->date = substr($item->dateUpdate,0,10);
    		        }

    		        $nbIdNum = 3;
	                $refs = array();
	                $idM = new Application_Model_Sdv1TabIdLocal();
	                for ($i=0;$i<$nbIdNum;$i++) {
	                    if( !empty($item->{'idLoc'.$i.'Num'}) ) {
	                        $ref = new LienRefId();
	                        $ref->num = $item->{'idLoc'.$i.'Num'};

	                        if ( !empty($item->{'idLoc'.$i.'Type'}) ) {
    	                        $sql = $idM->select()->from($idM, array('idLocal', 'idPrincipal'))
    	                            ->where('id=?', $item->{'idLoc'.$i.'Type'});
    	                        $result = $idM->fetchRow($sql);
    	                        if (null!==$result) {
    	                            $ref->label = $result->idLocal;
    	                            $ref->type = $result->idPrincipal;
    	                        } else {
    	                            $ref->label = '';
    	                            $ref->type = 0;
    	                        }
	                        } else {
	                            $ref->label = 'Identifiant local';
	                            $ref->type = 1;
	                        }

	                        $refs[] = $ref;
	                    }
	                }
	                $detail->identification = $refs;

    		        $tabAct[] = $detail;
    		    }
    		}

    		//Participations
    		$liens = $liensM->getParticipations(null, true);
    		if (count($liens)>0) {
    		    foreach ( $liens as $item ) {
    		        $detail = new Lien();
    		        $detail->id = $item->id;
    		        $detail->idFiche = $item->idPar;
    		        $detail->nom = $item->RS;
    		        $detail->sigle = $item->sigle;

    		        $libPays = '';
    		        if ($item->adresse_pays!='') {
    		            $libPays = array_key_exists($item->adresse_pays, $tabPays) ?
    		                $tabPays[$item->adresse_pays] : $item->adresse_pays;
    		        } else {
    		            $libPays = $tabPays['FRA'];
    		        }
    		        $detail->pays = $libPays;

    		        if ($item->PpPm=='PP' && intval($siren)==0) {
    		            $detail->nom = $item->civilite.' '.$item->nom.' '.$item->prenom;
    		        }
    		        $detail->siren = str_pad($item->siren, 9, "0", STR_PAD_LEFT);
    		        $detail->PDetention = $item->PDetention;
    		        $detail->Pvote = $item->Pvote;
    		        $detail->MajMin = $item->MajMin;

    		        if ($item->dateUpdate=='0000-00-00 00:00:00'){
    		            $detail->date = substr($item->dateInsert,0,10);
    		        } else {
    		            $detail->date = substr($item->dateUpdate,0,10);
    		        }

    		        $nbIdNum = 3;
	                $refs = array();
	                $idM = new Application_Model_Sdv1TabIdLocal();
	                for ($i=0;$i<$nbIdNum;$i++) {
	                    if( !empty($item->{'idLoc'.$i.'Num'}) ) {
	                        $ref = new LienRefId();
	                        $ref->num = $item->{'idLoc'.$i.'Num'};

	                        if ( !empty($item->{'idLoc'.$i.'Type'}) ) {
    	                        $sql = $idM->select()->from($idM, array('idLocal', 'idPrincipal'))
    	                            ->where('id=?', $item->{'idLoc'.$i.'Type'});
    	                        $result = $idM->fetchRow($sql);
    	                        if (null!==$result) {
    	                            $ref->label = $result->idLocal;
    	                            $ref->type = $result->idPrincipal;
    	                        } else {
    	                            $ref->label = '';
    	                            $ref->type = 0;
    	                        }
	                        } else {
	                            $ref->label = 'Identifiant local';
	                            $ref->type = 1;
	                        }

	                        $refs[] = $ref;
	                    }
	                }
	                $detail->identification = $refs;

    		        $tabPar[] = $detail;
    		    }
    		}

    		//Directions
    		$liens = $liensM->getDirections(true);
    		if (count($liens)>0) {
    		    foreach ( $liens as $item ) {
    		        $detail = new LienDirection();
    		        $detail->siren = $item->siren;
    		        $detail->nom = $item->raisonSociale;
    		        $detail->fonction = $item->fonction_lib;
    		        $detail->dirRS = $item->dirRS;

    		        $nom = '';
    		        if (!empty($item->civilite)) {
    		            $nom.= $item->civilite.'. ';
    		        }
    		        if (!empty($item->nom)) {
    		            $nom.= $item->nom.' ';
    		        }
    		        if (!empty($item->prenom)) {
    		            $nom.= $item->prenom;
    		        }
    		        $detail->dirNom = $nom;
    		        $detail->dirNaissLieu = $item->naissance_lieu;
    		        $detail->dirNaissDate = $item->naissance_date;

    		        $tabDir[] = $detail;
    		    }
    		}
		} catch(Exception $e) {
		    if ($this->User->idClient==1) {
		        throw new SoapFault('ERR', $e->getMessage());
		    } else {
		        throw new SoapFault('ERR', "Application error");
		    }
		}

		$output = new LiensReturn();
		$output->actionnaires = $tabAct;
		$output->participations = $tabPar;
		$output->directions = $tabDir;

		$this->wsLog('liens', $siren);

		return $output;
	}

	/**
	 * Retourne les liens financiers pour une entreprise.
	 * @param int       $id       Identifiant de référence de l'entreprise
	 * @param string    $type     Type de lien (actionnaire|participation)
	 * @return LiensReturn
	 */
	public function getLiensById($id, $type = null)
	{
	    $this->authenticate();
	    $this->permission('liens');

	    try {
		    $countryM = new Application_Model_JoTabPays();
		    $sql = $countryM->select()->from($countryM, array('codPays3', 'libPays'));
		    $result = $countryM->fetchAll($sql);
	    } catch (Zend_Db_Adapter_Exception $e) {
	        if ($this->User->idClient==1) {
		        throw new SoapFault('ERR', $e->getMessage());
		    } else {
		        throw new SoapFault('ERR', "Application error");
		    }
	    } catch (Zend_Exception $e) {
	        throw new SoapFault('ERR', "Application error");
	    }

		$tabPays = array();
		if ( $result->count()>0 ) {
		    foreach ( $result as $item ) {
		        $tabPays[$item->codPays3] = $item->libPays;
		    }
		}

	    $tabAct = $tabPar = $tabDir = array();

	    try
	    {
	        $liensM = new SdMetier_Liens_Base($id);

	        //Actionnaires
	        $liens = $liensM->getActionnaires(null, true);
	        if (count($liens)>0) {
	            foreach ( $liens as $item ) {
	                $detail = new Lien();
	                $detail->id = $item->id;
	                $detail->idFiche = $item->idAct;
	                $detail->nom = $item->RS;
	                $detail->sigle = $item->sigle;

	                $libPays = '';
	                if ($item->adresse_pays!='') {
	                    $libPays = array_key_exists($item->adresse_pays, $tabPays) ?
	                    $tabPays[$item->adresse_pays] : $item->adresse_pays;
	                } else {
	                    $libPays = $tabPays['FRA'];
	                }
	                $detail->pays = $libPays;

	                if ($item->PpPm=='PP') {
	                    $detail->nom = $item->civilite.' '.$item->nom.' '.$item->prenom;
	                }
	                $detail->siren = str_pad($item->siren, 9, "0", STR_PAD_LEFT);
	                $detail->PDetention = $item->PDetention;
	                $detail->Pvote = $item->Pvote;
	                $detail->MajMin = $item->MajMin;

	                if ($item->dateUpdate=='0000-00-00 00:00:00'){
	                    $detail->date = substr($item->dateInsert,0,10);
	                } else {
	                    $detail->date = substr($item->dateUpdate,0,10);
	                }

	                $nbIdNum = 3;
	                $refs = array();
	                $idM = new Application_Model_Sdv1TabIdLocal();
	                for ($i=0;$i<$nbIdNum;$i++) {
	                    if( !empty($item->{'idLoc'.$i.'Num'}) ) {
	                        $ref = new LienRefId();
	                        $ref->num = $item->{'idLoc'.$i.'Num'};

	                        if ( !empty($item->{'idLoc'.$i.'Type'}) ) {
    	                        $sql = $idM->select()->from($idM, array('idLocal', 'idPrincipal'))
    	                            ->where('id=?', $item->{'idLoc'.$i.'Type'});
    	                        $result = $idM->fetchRow($sql);
    	                        if (null!==$result) {
    	                            $ref->label = $result->idLocal;
    	                            $ref->type = $result->idPrincipal;
    	                        } else {
    	                            $ref->label = '';
    	                            $ref->type = 0;
    	                        }
	                        } else {
	                            $ref->label = 'Identifiant local';
	                            $ref->type = 1;
	                        }

	                        $refs[] = $ref;
	                    }
	                }
	                $detail->identification = $refs;

	                $tabAct[] = $detail;
	            }
	        }

	        //Participations
	        $liens = $liensM->getParticipations(null, true);
	        if (count($liens)>0) {
	            foreach ( $liens as $item ) {
	                $detail = new Lien();
	                $detail->id = $item->id;
	                $detail->idFiche = $item->idPar;
	                $detail->nom = $item->RS;
	                $detail->sigle = $item->sigle;

	                $libPays = '';
	                if ($item->adresse_pays!='') {
	                    $libPays = array_key_exists($item->adresse_pays, $tabPays) ?
	                    $tabPays[$item->adresse_pays] : $item->adresse_pays;
	                } else {
	                    $libPays = $tabPays['FRA'];
	                }
	                $detail->pays = $libPays;

	                if ($item->PpPm=='PP') {
	                    $detail->nom = $item->civilite.' '.$item->nom.' '.$item->prenom;
	                }
	                $detail->siren = str_pad($item->siren, 9, "0", STR_PAD_LEFT);
	                $detail->PDetention = $item->PDetention;
	                $detail->Pvote = $item->Pvote;
	                $detail->MajMin = $item->MajMin;

	                if ($item->dateUpdate=='0000-00-00 00:00:00'){
	                    $detail->date = substr($item->dateInsert,0,10);
	                } else {
	                    $detail->date = substr($item->dateUpdate,0,10);
	                }

	                $nbIdNum = 3;
	                $refs = array();
	                $idM = new Application_Model_Sdv1TabIdLocal();
	                for ($i=0;$i<$nbIdNum;$i++) {
	                    if( !empty($item->{'idLoc'.$i.'Num'}) ) {
	                        $ref = new LienRefId();
	                        $ref->num = $item->{'idLoc'.$i.'Num'};

	                        if ( !empty($item->{'idLoc'.$i.'Type'}) ) {
    	                        $sql = $idM->select()->from($idM, array('idLocal', 'idPrincipal'))
    	                            ->where('id=?', $item->{'idLoc'.$i.'Type'});
    	                        $result = $idM->fetchRow($sql);
    	                        if (null!==$result) {
    	                            $ref->label = $result->idLocal;
    	                            $ref->type = $result->idPrincipal;
    	                        } else {
    	                            $ref->label = '';
    	                            $ref->type = 0;
    	                        }
	                        } else {
	                            $ref->label = 'Identifiant local';
	                            $ref->type = 1;
	                        }

	                        $refs[] = $ref;
	                    }
	                }
	                $detail->identification = $refs;

	                $tabPar[] = $detail;
	            }
	        }

	        //Directions
	        $liens = $liensM->getDirections(true);
	        if (count($liens)>0) {
	            foreach ( $liens as $item ) {
	                $detail = new LienDirection();
	                $detail->siren = $item->siren;
	                $detail->nom = $item->raisonSociale;
	                $detail->fonction = $item->fonction_lib;
	                $detail->dirRS = $item->dirRS;

	                $nom = '';
	                if (!empty($item->civilite)) {
	                    $nom.= $item->civilite.'. ';
	                }
	                if (!empty($item->nom)) {
	                    $nom.= $item->nom.' ';
	                }
	                if (!empty($item->prenom)) {
	                    $nom.= $item->prenom;
	                }
	                $detail->dirNom = $nom;
	                $detail->dirNaissLieu = $item->naissance_lieu;
	                $detail->dirNaissDate = $item->naissance_date;

	                $tabDir[] = $detail;
	            }
	        }
	    } catch(Exception $e) {
	        if ($this->User->idClient==1) {
	            throw new SoapFault('ERR', $e->getMessage());
	        } else {
	            throw new SoapFault('ERR', "Application error");
	        }
	    }

	    $output = new LiensReturn();
	    $output->actionnaires = $tabAct;
	    $output->participations = $tabPar;
	    $output->directions = $tabDir;

	    $this->wsLog('liens', '', $id);

	    return $output;
	}

	/**
	 * Fiche identite Référence lien
	 * @param int $id
	 *     Identifiant interne SD
	 * @throws SoapFault
	 * @return LienRef
	 */
	public function getLienRef($id)
	{
	    $this->authenticate();
	    $this->permission('liens');

	    $refM = new Application_Model_JoLiensRef();

	    try {
	        $rows = $refM->find($id);
	    } catch (Zend_Db_Exception $e) {
	        if ($this->User->idClient!=1) {
	            throw new SoapFault('ERR', "Application error");
	        } else {
	            throw new SoapFault('ERR', $e->getMessage());
	        }
	    }

	    if ($rows->count()==0) {
	        throw new SoapFault('MSG', 'Aucun résultat');
	    }

	    $result = $rows->current()->toArray();

	    $output = new LienRef();
	    $output->siren = $result['siren'];
	    $output->actif = $result['actif'];
	    $output->PpPm = $result['PpPm'];
	    $output->raisonSociale = $result['RS'];
	    $output->civilite = $result['civilite'];
	    $output->nom = $result['nom'];
	    $output->prenom = $result['prenom'];
	    $output->nomUsage = $result['nom_usage'];
	    $output->naissanceDate = $result['naissance_date'];
	    $output->naissanceDeptPays = $result['naissance_dept_pays'];
	    $output->naissanceLieu = $result['naissance_lieu'];
	    $output->nat = $result['nat'];
	    $output->isin = $result['isin'];
	    $output->adresseNum = $result['adresse_num'];
	    $output->adresseBtq = $result['adresse_btq'];
	    $output->adresseCodeVoie = $result['adresse_codvoie'];
	    $output->adresseLibVoie = $result['adresse_libvoie'];
	    $output->adressComp = $result['adresse_comp'];
	    $output->adresseCp = $result['adresse_cp'];
	    $output->adresseVille = $result['adresse_ville'];

	    $output->capital = new stdClass();
	    $output->capital->amount = $result['capital'];
	    $output->capital->currency = $result['deviseCapital'];

	    //@todo : Utiliser le libellé du pays
	    $output->adressePays = $result['adresse_pays'];

	    if ($result['dateUpdate']=='0000-00-00 00:00:00'){
	        $output->date = substr($result['dateInsert'],0,10);
	    } else {
	        $output->date = substr($result['dateUpdate'],0,10);
	    }

	    $refs = array();

	    $nbIdNum = 3;
        $refs = array();
        $idM = new Application_Model_Sdv1TabIdLocal();
        for ($i=0;$i<$nbIdNum;$i++) {
            if( !empty($result['idLoc'.$i.'Type']) ) {
                $ref = new LienRefId();
                $ref->num = $result['idLoc'.$i.'Num'];
                $sql = $idM->select()->from($idM, array('idLocal', 'idPrincipal'))
                    ->where('id=?', $result['idLoc'.$i.'Type']);
                $result = $idM->fetchRow($sql);
                if (null!==$result) {
                    $ref->label = $result->idLocal;
                    $ref->type = $result->idPrincipal;
                } else {
                    $ref->label = '';
                    $ref->type = 0;
                }

                $refs[] = $ref;
            }
        }
	    $output->identification = $refs;

	    $this->wsLog('liens', 0, $id);

	    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();
		$this->permission('etablissements');

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

		$departement = $dep;

		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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$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__);
		$this->wsLog('etablissements',$siren);
		$output = new ListeEtablissementsReturn();
		$output->nbReponses = $nbReponses;
		$output->result = $result;
		return $output;
	}

	/**
	 * Retourne l'ensemble des informations identitaires des dirigeants de l'entreprise
	 *
	 * @param  string  	$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();
		$this->permission('dirigeants');

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

		//Zend_Registry::get('WsLogger')->info('HISTO : '.$histo);

		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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();
		$dirs = $iInsee->getDirigeants($siren, $histo);
		//debugLog('W', print_r($dirs, 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->Siren = (array_key_exists('Siren', $dir) && intval($dir['Siren'])!=0) ? $dir['Siren'] : '' ;
			$dirigeant->Civilite = $dir['Civilite'];
			$dirigeant->Nom = $dir['Nom'];
			$dirigeant->Prenom = $dir['Prenom'];
			$dirigeant->NomUsage = $dir['NomUsage'];
			$dirigeant->NaissDate = $dir['NaissDate'];			//@todo : date
			$dirigeant->NaissVille = $dir['NaissVille'];
			$dirigeant->NaissDepPays = $dir['NaissDepPays'];
			$dirigeant->Ancien = $dir['Ancien'];
			$dirigeant->DateFct = $dir['DateFct'];				//@todo : date
			$liste[] = $dirigeant;
		}
		$this->wsLog('dirigeants',$siren,$option);
		debugLog('I', 'Nb Dirigeants retournés = '. count($dirs), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		$output = new DirigeantsReturn();
		$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      1=BODACC, 2=B.A.L.O, 3=JO Association, 4=Boamp
	 * @param string	$idAnn       Identifiant de l'annonce
	 * @param integer	$position
	 * @param integer	$nbRep
	 * @return AnnoncesReturn
	 */
	protected function getAnnonces($siren, $filtre = 1, $idAnn = '', $position = 0, $nbRep = 100)
	{
	    $this->authenticate();
	    $this->permission('annonces');

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

	    //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__);
	        $this->sendError('1010');
	    } elseif (intval($siren)==0 && $idAnn=='') {
	        debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
	        $this->sendError('1010');
	    }

	    $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;
	    }*/

	    //@todo : Connaitre le nombre d'annonce

	    /*
	     getAnnoncesBoamp => Avis de marché, Avis d'attribution
	    getAnnoncesAsso => Rien de particulier
	    getAnnoncesBalo => Rien de particulier
	    getAnnoncesLegales => Plusieurs requetes SQL suivant la situation
	    */

	    if ($idAnn=='') {
	        $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'];		//@todo : date
	            $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 = prepareString($ann['texteRectificatif']);
	            $annonce->texteAnnonce = prepareString($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'];				//@todo : date
	            $annonce->dateJugement = $ann['dateJugement'];			//@todo : date
	            $annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
	            $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'];			//@todo : date
	                $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 = prepareString($ann['texteRectificatif']);
	                $annonce->texteAnnonce = utf8_encode($ann['texteAnnonce']);
	                //$annonce->libFJ = $ann['libFJ'];
	                //$annonce->codFJ = $ann['codFJ'];
	                //$annonce->capital = $ann['capital'];
	                //$annonce->capitalDev = $ann['capitalDev'];
	                $annonce->dateEffet = $ann['dateEffet'];				//@todo : date
	                $annonce->dateJugement = $ann['dateJugement'];			//@todo : date
	                $annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
	                $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'];			//@todo : date
	                $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 = prepareString($ann['texteRectificatif']);
	                $annonce->texteAnnonce = utf8_encode($ann['texteAnnonce']);
	                //$annonce->libFJ = $ann['libFJ'];
	                //$annonce->codFJ = $ann['codFJ'];
	                //$annonce->capital = $ann['capital'];
	                //$annonce->capitalDev = $ann['capitalDev'];
	                //@todo : date
	                $annonce->dateEffet = $ann['dateEffet'];				//@todo : date
	                $annonce->dateJugement = $ann['dateJugement'];			//@todo : date
	                $annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
	                $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'];			//@todo : date
	                $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 = prepareString($ann['texteRectificatif']);
	                $annonce->texteAnnonce = utf8_encode($ann['texteAnnonce']);
	                //$annonce->libFJ = $ann['libFJ'];
	                //$annonce->codFJ = $ann['codFJ'];
	                //$annonce->capital = $ann['capital'];
	                //$annonce->capitalDev = $ann['capitalDev'];
	                $annonce->dateEffet = $ann['dateEffet'];				//@todo : date
	                $annonce->dateJugement = $ann['dateJugement'];			//@todo : date
	                $annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
	                $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__);
	    $this->wsLog('annonces',$siren,$filtre.'/'.$idAnn);

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

	/**
	 * Retourne le nombre d'élément pour chaque type
	 * @param string $siren
	 * @return AnnonceNum[]
	 */
	public function getAnnoncesNum($siren)
	{
	    $this->authenticate();

	    $output = array();

	    if ( substr($siren,0,1)=='W' ) {
	        $iInsee = new MInsee();
	        $nb = new AnnonceNum();
	        $nb->type = 'asso';
	        $nb->num = $iInsee->getAnnoncesAssoCount($siren);
	        $output[] = $nb;
	    } elseif (intval($siren)!=0) {
	        $types = array('bodacc', 'balo', 'boamp', 'asso');
	        $iInsee = new MInsee();
	        $iInsee->AnnoncesLegalesVisu = true;
	        foreach ($types as $type) {
	            switch($type) {
	                case 'bodacc':
	                    //@ todo : Get count
	                    $anns = $iInsee->getAnnoncesLegales($siren);
	                    $total = count($anns);
	                    break;
	                case 'balo':
	                    $total = $iInsee->getAnnoncesBaloCount($siren);
	                    break;
	                case 'boamp':
	                    $total = $iInsee->getAnnoncesBoampCount($siren);
	                    break;
	                case 'asso':
	                    $total = $iInsee->getAnnoncesAssoCount($siren);
	                    break;
	            }
	            $nb = new AnnonceNum();
	            $nb->type = $type;
	            $nb->num = $total;
	            $output[] = $nb;
	        }
	    }
	    return $output;
	}

	/**
	 * Retourne les annonces légales
	 * @param string $siren
	 * @param string $idAnn
	 * @param AnnonceFilter[] $filtre
	 * @param int $position
	 * @param int $nbRep
	 * @return AnnoncesReturn
	 */
	public function getAnnoncesLegales($siren, $idAnn = null, $filtre = null, $position = 0, $nbRep = 20)
	{
		$this->authenticate();
		$this->permission('annonces');

		//Initialisation
		if (empty($idAnn)) 		{ $idAnn = null; }
		if (empty($position)) 	{ $position = 0; }
		if (empty($nbRep)) 		{ $nbRep = 100; }

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

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

		if (strlen($siren)!=9) {
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		} elseif (intval($siren)==0 && $idAnn=='') {
			debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();
		$iInsee->AnnoncesLegalesVisu = true;

		$isList = false;

		if ( is_null($idAnn) ) {
			$anns = $iInsee->getAnnoncesLegales($siren, 0, '', false, false, true);
			$nbReponses = count($anns);
			$isList = true;
		} else {
			$anns = $iInsee->getAnnoncesLegales($siren, $idAnn, '', false, false, true);
			$nbReponses = count($anns);
		}

		$liste = array();
		$cpt = 0;

		if ( is_array($anns) && $nbReponses > 0 ) {
			foreach ($anns as $nb => $ann) {
				if ($isList===true && $nb<$position) { continue; }
				$cpt++;
				if ($isList===true && $cpt>$nbRep) { break; }

				/**
				 * Si l'annonce est une annonce BODACC alors
				 * recherche des entités concernées
				 */
				$entites = array();
    			if (in_array($ann['BodaccCode'], array('BODA', 'BODB', 'BODC'))) {
    				$detailM = new Application_Model_JoBodaccDetail();
    				$sql = $detailM->select()->from($detailM, array(
    				        'LPAD(siren, 9, 0) AS siren',
    				        'LPAD(nic, 5, 0) AS nic',
    				        'raisonSociale','adresse', 'codePostal', 'ville', 'typeEven')
    				       )->where('id=?', $ann['id']);
    				$result = $detailM->fetchAll($sql);
    				if (count($result)>1) {
    				    foreach ($result as $entity) {
    				        $entite = new AnnonceEntite();
    				        $entite->siret = $entity->siren . $entity->nic;
    				        $entite->raisonSociale = $entity->raisonSociale;

    				        $iBodacc = new MBodacc();
    				        $even = new AnnonceEvenement();
    				        $even->CodeEven = $entity->typeEven;
    				        $even->LibEven = $iBodacc->getEvenement($entity->typeEven);

    				        $entite->event = $even;
    				        $entites[] = $entite;
    				    }
    				}
				}

				//List events
				$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'];		//@todo : date
				$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->texteAnnonce = $ann['texteAnnonce'];
				$annonce->dateEffet = $ann['dateEffet'];				//@todo : date
				$annonce->dateJugement = $ann['dateJugement'];			//@todo : date
				$annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
				$annonce->evenements = $evens;
				$annonce->entites = $entites;
				$annonce->deleted = $ann['deleted'];

				$liste[] = $annonce;
			}
		}

		$this->wsLog('annonces',$siren,$idAnn);

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

	/**
	 * Retourne les annonces du journal officiel des associations
	 * @param string $siren
	 * @param string $idAnn
	 * @param AnnonceFilter[] $filtre
	 * @param int $position
	 * @param int $nbRep
	 * @return AnnoncesReturn
	 */
	public function getAnnoncesAsso($siren, $idAnn = null, $filtre = null, $position = 0, $nbRep = 20)
	{
		$this->authenticate();
		$this->permission('annonces');

		//Initialisation
		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__);

		if (strlen($siren)!=9 && substr($siren,0,1)!='W') {
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		} elseif (intval($siren)==0 && is_null($idAnn)) {
			debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();

		$nbReponses = $iInsee->getAnnoncesAssoCount($siren, $idAnn);
		$anns = $iInsee->getAnnoncesAsso($siren, $idAnn, $position, $nbRep);

		$liste = array();

		if (is_array($anns))
		{
			foreach ($anns 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'];			//@todo : date
				$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 = prepareString($ann['texteRectificatif']);
				$annonce->texteAnnonce = utf8_encode($ann['texteAnnonce']);
				//$annonce->libFJ = $ann['libFJ'];
				//$annonce->codFJ = $ann['codFJ'];
				//$annonce->capital = $ann['capital'];
				//$annonce->capitalDev = $ann['capitalDev'];
				//@todo : date
				$annonce->dateEffet = $ann['dateEffet'];				//@todo : date
				$annonce->dateJugement = $ann['dateJugement'];			//@todo : date
				$annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
				$annonce->evenements = $evens;
				$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];
				$annonce->deleted = $ann['deleted'];

				$liste[] = $annonce;
			}
		}

		$this->wsLog('annonces',$siren,$idAnn);

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

	protected function getAnnoncesBoampList($siren, $filtre = null, $position = 0, $nbRep = 20)
	{

	}

	/**
	 * Retourne les annonces de marché public
	 * @param string $siren
	 * @param string $idAnn
	 * @param AnnonceFilter[] $filtre
	 * @param int $position
	 * @param int $nbRep
	 * @return AnnoncesReturn
	 */
	public function getAnnoncesBoamp($siren, $idAnn = null, $filtre = null, $position = 0, $nbRep = 20)
	{
		$this->authenticate();
		$this->permission('annonces');

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

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

		$type = array('A', 'M');

		if (is_array($filtre->item) && count($filtre->item)>0) {
			foreach($filtre->item as $item) {
				if ( $item->key == 'type' ) {
					$type = $item->value;
				}
			}
		}

		if (strlen($siren)<>9) {
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		} elseif (intval($siren)==0 && is_null($idAnn)) {
			debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();
		if ( empty($idAnn) ) {
			$nbReponses = $iInsee->getAnnoncesBoampCount($siren, $type);
			$anns = $iInsee->getAnnoncesBoamp($siren, $idAnn, $type, $position, $nbRep);
		} else {
			$anns = $iInsee->getAnnoncesBoamp($siren, $idAnn, $type, 0, 1);
			$nbReponses = count($anns);
		}

		$liste = array();
		if (is_array($anns) && count($anns)>0) {
			foreach ($anns as $nb=>$ann) {
			    $entites = array();

			    //Add acheteur
			    $identite = $iInsee->getIdentiteLight($siren);
			    $entite = new AnnonceEntite();
			    $entite->siret = $identite['Siret'];
			    $entite->raisonSociale = $identite['Nom'];
			    $even = new AnnonceEvenement();
			    //$even->CodeEven = '';
			    $even->LibEven = 'Acheteur';
			    $entite->event = $even;
			    $entites[] = $entite;

			    //Search titulaire
			    $boamplotsM = new Application_Model_JoBoampLots();
			    $sql = $boamplotsM->select()->from($boamplotsM, array(
			        'LPAD(siren, 9, 000000000) AS siren',
			        'LPAD(nic, 5, 00000) AS nic', 'nom','adresse','cp', 'ville', 'pays')
			            )->where('idAnn=?', substr($ann['id'],2));

			    $result = $boamplotsM->fetchAll($sql);

			    if (count($result)>0) {
				    foreach ($result as $entity) {
				        $entite = new AnnonceEntite();
				        $entite->siret = $entity->siren.$entity->nic;
				        $entite->raisonSociale = $entity->nom;

				        $even = new AnnonceEvenement();
				        //$even->CodeEven = '';
				        $even->LibEven = 'Attributaire';
				        $entite->event = $even;
				        $entites[] = $entite;
				    }
				}

			    //Events
			    $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'];			//@todo : date
				$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 = prepareString($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'];				//@todo : date
				$annonce->dateJugement = $ann['dateJugement'];			//@todo : date
				$annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
				$annonce->evenements = $evens;
				$annonce->entites = $entites;
				$annonce->deleted = $ann['deleted'];

				$liste[] = $annonce;
			}
		}

		$this->wsLog('annonces',$siren,$idAnn);

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

	}

	/**
	 * Retourne les annonces du bulletins des annonces légales obligatoires
	 * @param string $siren
	 * @param string $idAnn
 	 * @param AnnonceFilter[] $filtre
	 * @param int $position
	 * @param int $nbRep
	 * @return AnnoncesReturn
	 */
	public function getAnnoncesBalo($siren, $idAnn = null, $filtre = null, $position = 0, $nbRep = 20)
	{
		$this->authenticate();
		$this->permission('annonces');

		//Initialisation
		if (empty($idAnn)) 		{ $idAnn = null; }
		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__);

		if (strlen($siren)<>9) {
			debugLog('W', "Siren/Siret $siren incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		} elseif (intval($siren)==0 && is_null($idAnn)) {
			debugLog('W', "Siren $siren ou annonce $idAnn inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();

		if ( is_null($idAnn) ) {
			$nbReponses = $iInsee->getAnnoncesBaloCount($siren);
			$anns = $iInsee->getAnnoncesBalo($siren, $idAnn, $position, $nbRep);
		} else {
			$anns = $iInsee->getAnnoncesBalo($siren, $idAnn, 0, 1);
			$nbReponses = count($anns);
		}

		$liste = array();
		if (is_array($anns) && count($anns)>0)
		{
			foreach ($anns 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'];			//@todo : date
				$annonce->Departement = $ann['Departement'];
				$annonce->Tribunal = $ann['Tribunal'];
				$annonce->TribunalSiret = $ann['TribunalSiret'];
				$annonce->Rubrique = $ann['Rubrique'];
				$annonce->typeAnnonce = $ann['typeAnnonce'];
				$annonce->texteRectificatif = prepareString($ann['texteRectificatif']);
				$annonce->texteAnnonce = utf8_encode($ann['texteAnnonce']);
				$annonce->dateEffet = $ann['dateEffet'];				//@todo : date
				$annonce->dateJugement = $ann['dateJugement'];			//@todo : date
				$annonce->dateInsertionSD = $ann['dateInsertionSD'];	//@todo : date
				$annonce->evenements = $evens;
				$annonce->Lien_Annonce_Pdf = $ann['Lien_Annonce_Pdf'];
				$annonce->deleted = $ann['deleted'];

				$liste[] = $annonce;
			}
		}

		$this->wsLog('annonces',$siren,$idAnn);

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

	/**
	 * Evaluation indiScore d'une entreprise
	 * @param string 	$siren		Siren de l'entreprise
	 * @param string	$nic		Nic de l'établissement
	 * @param integer 	$niveau     Niveau des commentaires (Suivant droits d'accès 1=INDISCORE, 2=INDISCORE2, 3=INDISCORE3)
	 * @param bool    	$plus		Si true, mise en surveillance privilèges
	 * @param string  	$ref		Si $plus=true, référence de la mise en Surveillance
	 * @param integer 	$encours	Si $plus=true, encours client demandé lors de la mise en Surveillance
	 * @param string	$email		Si $plus=true, email client pour la mise en surveillance
	 * @return Indiscore
	 */
	public function getIndiScore($siren, $nic=0, $niveau=2, $plus=false, $ref='', $encours=0, $email='')
	{
		$this->authenticate();

		//Initialisation
		$accesDist = true;
		if (empty($nic)) 	{ $nic = 0; }
		if (empty($niveau)) { $niveau = 2; }
		if (empty($plus)) 	{ $plus = false; }
		if ( !in_array($niveau, array(0,1,2,3,4,5)) ) 	{ $niveau = 2; }
		$perm = false;
		//@todo : Gestion des droits
		switch($niveau){
		    case 3: $perms = array('indiscore3', 'indiscore3p'); 	break;
		    case 2: $perms = array('indiscore2', 'indiscore2p', 'indiscore3', 'indiscore3p'); 	break;
		    case 1: $perms = array('indiscore', 'indiscorep'); 		break;
		}
		foreach($perms as $item){
			if ( $this->checkPerm($item) ){
			    $perm = true;
				break;
			}
		}
		if ($perm === false) {
			$this->sendError('0902');
		}

		$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__);
			$this->sendError('1010');
		}

		$tDeb = microtime(true);
		require_once 'Metier/scores/classMScores.php';
		$tabRet = calculIndiScore($siren, $nic, $accesDist, $niveau, false, 'scores');
		$duree = round(microtime(true)-$tDeb,3);
		debugLog('W', "indiscore DUREE = $duree s", __LINE__, __FILE__, __FUNCTION__, __CLASS__);

		$output = new Indiscore();
		foreach($tabRet as $key => $value){
			if ($key=='paiements'){
				$parMont = $value['parMont'];
				$parTrim = $value['parTrim'];
				$tabMont = array();
				foreach($parMont as $parMontK => $parMontV){
					$paiementMont = new IndiscorePaiementDetail();
					$paiementMont->id = $parMontK;
					$paiementMont->nb = $parMontV['nb'];
					if (array_key_exists('d=180', $parMontV)){
						$paiementMont->d180 = $parMontV['d=180'];
					}
					if (array_key_exists('d=150', $parMontV)){
						$paiementMont->d150 = $parMontV['d=150'];
					}
					if (array_key_exists('d=120', $parMontV)){
						$paiementMont->d120 = $parMontV['d=120'];
					}
					if (array_key_exists('d=90', $parMontV)){
						$paiementMont->d90 = $parMontV['d=90'];
					}
					if (array_key_exists('d=60', $parMontV)){
						$paiementMont->d60 = $parMontV['d=60'];
					}
					if (array_key_exists('d=30', $parMontV)){
						$paiementMont->d30 = $parMontV['d=30'];
					}
					$tabMont[] = $paiementMont;
				}
				$tabTrim = array();
				foreach($parTrim as $parTrimK => $parTrimV){
					$paiementTrim = new IndiscorePaiementDetail();
					$paiementTrim->id = $parTrimK;
					$paiementTrim->nb = $parTrimV['nb'];
					if (array_key_exists('d=180', $parTrimV)){
						$paiementTrim->d180 = $parTrimV['d=180'];
					}
					if (array_key_exists('d=150', $parTrimV)){
						$paiementTrim->d150 = $parTrimV['d=150'];
					}
					if (array_key_exists('d=120', $parTrimV)){
						$paiementTrim->d120 = $parTrimV['d=120'];
					}
					if (array_key_exists('d=90', $parTrimV)){
						$paiementTrim->d90 = $parTrimV['d=90'];
					}
					if (array_key_exists('d=60', $parTrimV)){
						$paiementTrim->d60 = $parTrimV['d=60'];
					}
					if (array_key_exists('d=30', $parTrimV)){
						$paiementTrim->d30 = $parTrimV['d=30'];
					}
					$tabTrim[] = $paiementTrim;
				}
				$paiement = new IndiscorePaiement();
				$paiement->parMont = $tabMont;
				$paiement->parTrim = $tabTrim;
				$output->paiements = $paiement;

			} elseif ($key=='Notes_Structure') {

				$notesStructure = new IndiscoreNotesStructure();
				$notesStructure->activite = $value['activite'];
				$notesStructure->naf4 = $value['naf4'];
				$notesStructure->age = $value['age'];
				$notesStructure->capital = $value['capital'];
				$notesStructure->effectif = $value['effectif'];
				$notesStructure->fj = $value['fj'];
				$notesStructure->localite = $value['localite'];
				$notesStructure->singulier = $value['singulier'];
				$output->Notes_Structure = $notesStructure;

			} elseif ($key=='tabBilans') {

				$tabRet = array();
				foreach($value as $bilan)
				{
					$element = new ListeBilans();
					$element->dateProvPartenaire 	= $bilan['dateProvPartenaire']; //@todo : date
					$element->dateInsert 		 	= $bilan['dateInsert'];			//@todo : date
					$element->typeBilan 			= $bilan['typeBilan'];
					$element->dureeExercice			= $bilan['dureeExercice'];
					$element->dateExercice			= $bilan['dateExercice'];		//@todo : date
					$element->millesime				= $bilan['millesime'];
					$element->dateExercicePre		= $bilan['dateExercicePre'];	//@todo : date
					$element->dureeExercicePre		= $bilan['dureeExercicePre'];
					$element->monnaie				= $bilan['monnaie'];
					$element->source				= $bilan['source'];
					$tabRet[] = $element;
				}
				$output->tabBilans = $tabRet;

			} elseif ($key=='tabBilan') {

				$tabRet = array();
				foreach($value as $bilan){
					$resultBilan = new Bilan();
					$tabPoste = array();
					foreach($bilan as $bilan_key => $bilan_value){
						if(!in_array($bilan_key, array('SIREN', 'DATE_FRAICHE_BILAN',
							'DATE_CLOTURE', 'DATE_CLOTURE_PRE', 'DUREE_MOIS',
							'DUREE_MOIS_PRE', 'MONNAIE', 'CONSOLIDE', 'MONNAIE_ORI',
							'MONNAIE_LIV_UNITE', 'SOURCE', 'devise'))){
								$resultPoste = new BilanPoste();
								$resultPoste->id = $bilan_key;
								$resultPoste->val = $bilan_value;
								$tabPoste[] = $resultPoste;
						} else {
							$resultBilan->$bilan_key = $bilan_value;
						}
					}
					$resultBilan->POSTES = $tabPoste;
					$tabRet[] = $resultBilan;
				}
				$output->tabBilan = $tabRet;

			} elseif ($key=='tabInfosNotations') {

				$infosNotation = new IndiscoreInfosNotations();
				$infosNotation->SituationFinanciere = $value['SituationFinanciere'];
				$infosNotation->Notation = $value['Notation'];
				$infosNotation->ProbabiliteDefaut = $value['ProbabiliteDefaut'];
				$output->tabInfosNotations = $infosNotation;

			} elseif ($key=='tabImportExport') {

				$tabRet = array();
				foreach($value as $element){
					$importExport = new IndiscoreImportExport();
					$importExport->importExport = $element['importExport'];
					$importExport->annee = $element['annee'];
					$importExport->rangNational = $element['rangNational'];
					$importExport->deptSiege = $element['deptSiege'];
					$tabRet[] = $importExport;
				}
				$output->tabImportExport = $tabRet;

			} elseif ($key=='tabCommentaires') {

				$tab = array();
				if (count($value)>0) {
					foreach($value as $comment) {
						$tab[] = Scores_Locale_String::fixEncoding($comment);
					}
				}
				$output->tabCommentaires = $tab;

			} elseif ($key=='tabVariables') {

				$tab = $value['CA_Y'];
				$tabVar = array();
				if (count($tab)>0) {
					foreach($tab as $varName => $varVal){
						$var = new CA_Y();
						$var->id = $varName;
						$var->val = $varVal;
						$tabVar[] = $var;
	 				}
				}
				$variables = new IndiscoreVariables();
				$variables->CA_Y = $tabVar;
				$output->tabVariables = $variables;

			} elseif ($key=='Bilans') {

				$tab = array();
				foreach($value as $item)
				{
					$objet = new IndiscoreBilans();
					$objet->Millesime = $item['Millesime'];
					$objet->FraisPerso = $item['FraisPerso'];
					$objet->CA = $item['CA'];
					$objet->EBE = $item['EBE'];
					$objet->TxInvest = $item['TxInvest'];
					$objet->TxEndett = $item['TxEndett'];
					$objet->DettesCT = $item['DettesCT'];
					$objet->FraisFi = $item['FraisFi'];
					$objet->BFR = $item['BFR'];
					$objet->FR = $item['FR'];
					$objet->FondsPr = $item['FondsPr'];
					$objet->DelaiCli = $item['DelaiCli'];
					$objet->DelaiFour = $item['DelaiFour'];
					$tab[] = $objet;
				}
				$output->$key = $tab;
			} else {
				$output->$key = $value;
			}
		}

		if ($plus) {
			if (empty($ref))	$ref='Indiscore+';
			if (empty($email))	$email=$this->User->email;
			$this->setSurveillance($siren, $email, $ref, 'privileges');
			$this->setSurveillance($siren, $email, $ref, 'score', false, $encours);
			if ($this->User->idClient==89)
				$this->setSurveillance($siren, $email, $ref, 'annonces');
			$this->wsLog('indiscore+',$siren);
		} else {
			$this->wsLog('indiscore',$siren);
		}

		return $output;
	}

	/**
	 * Evaluation valorsation d'une entreprise
	 * @param string 	$siren		Siren de l'entreprise
	 * @param string	$nic		Nic de l'établissement
	 * @param integer 	$niveau     Niveau des commentaires
	 * @return Valo
	 */
	public function getValo($siren, $nic=0, $niveau=2)
	{
	    $this->authenticate();
	    $this->permission('VALORISATION');

	    //Initialisation
	    $accesPartenaire = true;
	    if (APPLICATION_ENV == 'development') {
	        $accesPartenaire = false;
	    }
	    if (empty($nic)) 	{
	        $nic = 0;
	    }
		$niveau = 2;

	    $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__);
	        $this->sendError('1010');
	    }

	    $tDeb = microtime(true);
	    require_once 'Metier/scores/classMScores.php';
	    $tabRet = calculIndiScore($siren, $nic, $accesPartenaire, $niveau, false, 'valo');
	    $duree = round(microtime(true)-$tDeb,3);
	    debugLog('W', "indiscore DUREE = $duree s", __LINE__, __FILE__, __FUNCTION__, __CLASS__);

	    $ouput = new Valo();

	    $Indiscore = new Indiscore();

	    foreach($tabRet as $key => $value){
	        if ($key=='paiements'){
	            $parMont = $value['parMont'];
	            $parTrim = $value['parTrim'];
	            $tabMont = array();
	            foreach($parMont as $parMontK => $parMontV){
	                $paiementMont = new IndiscorePaiementDetail();
	                $paiementMont->id = $parMontK;
	                $paiementMont->nb = $parMontV['nb'];
	                if (array_key_exists('d=180', $parMontV)){
	                    $paiementMont->d180 = $parMontV['d=180'];
	                }
	                if (array_key_exists('d=150', $parMontV)){
	                    $paiementMont->d150 = $parMontV['d=150'];
	                }
	                if (array_key_exists('d=120', $parMontV)){
	                    $paiementMont->d120 = $parMontV['d=120'];
	                }
	                if (array_key_exists('d=90', $parMontV)){
	                    $paiementMont->d90 = $parMontV['d=90'];
	                }
	                if (array_key_exists('d=60', $parMontV)){
	                    $paiementMont->d60 = $parMontV['d=60'];
	                }
	                if (array_key_exists('d=30', $parMontV)){
	                    $paiementMont->d30 = $parMontV['d=30'];
	                }
	                $tabMont[] = $paiementMont;
	            }
	            $tabTrim = array();
	            foreach($parTrim as $parTrimK => $parTrimV){
	                $paiementTrim = new IndiscorePaiementDetail();
	                $paiementTrim->id = $parTrimK;
	                $paiementTrim->nb = $parTrimV['nb'];
	                if (array_key_exists('d=180', $parTrimV)){
	                    $paiementTrim->d180 = $parTrimV['d=180'];
	                }
	                if (array_key_exists('d=150', $parTrimV)){
	                    $paiementTrim->d150 = $parTrimV['d=150'];
	                }
	                if (array_key_exists('d=120', $parTrimV)){
	                    $paiementTrim->d120 = $parTrimV['d=120'];
	                }
	                if (array_key_exists('d=90', $parTrimV)){
	                    $paiementTrim->d90 = $parTrimV['d=90'];
	                }
	                if (array_key_exists('d=60', $parTrimV)){
	                    $paiementTrim->d60 = $parTrimV['d=60'];
	                }
	                if (array_key_exists('d=30', $parTrimV)){
	                    $paiementTrim->d30 = $parTrimV['d=30'];
	                }
	                $tabTrim[] = $paiementTrim;
	            }
	            $paiement = new IndiscorePaiement();
	            $paiement->parMont = $tabMont;
	            $paiement->parTrim = $tabTrim;
	            $Indiscore->paiements = $paiement;

	        } elseif ($key=='Notes_Structure') {

	            $notesStructure = new IndiscoreNotesStructure();
	            $notesStructure->activite = $value['activite'];
	            $notesStructure->naf4 = $value['naf4'];
	            $notesStructure->age = $value['age'];
	            $notesStructure->capital = $value['capital'];
	            $notesStructure->effectif = $value['effectif'];
	            $notesStructure->fj = $value['fj'];
	            $notesStructure->localite = $value['localite'];
	            $notesStructure->singulier = $value['singulier'];
	            $Indiscore->Notes_Structure = $notesStructure;

	        } elseif ($key=='tabBilans') {

	            $tabRet = array();
	            foreach($value as $bilan)
	            {
	                $element = new ListeBilans();
	                $element->dateProvPartenaire 	= $bilan['dateProvPartenaire']; //@todo : date
	                $element->dateInsert 		 	= $bilan['dateInsert'];			//@todo : date
	                $element->typeBilan 			= $bilan['typeBilan'];
	                $element->dureeExercice			= $bilan['dureeExercice'];
	                $element->dateExercice			= $bilan['dateExercice'];		//@todo : date
	                $element->millesime				= $bilan['millesime'];
	                $element->dateExercicePre		= $bilan['dateExercicePre'];	//@todo : date
	                $element->dureeExercicePre		= $bilan['dureeExercicePre'];
	                $element->monnaie				= $bilan['monnaie'];
	                $element->source				= $bilan['source'];
	                $tabRet[] = $element;
	            }
	            $Indiscore->tabBilans = $tabRet;

	        } elseif ($key=='tabBilan') {

	            $tabRet = array();
	            foreach($value as $bilan){
	                $resultBilan = new Bilan();
	                $tabPoste = array();
	                foreach($bilan as $bilan_key => $bilan_value){
	                    if(!in_array($bilan_key, array('SIREN', 'DATE_FRAICHE_BILAN',
	                        'DATE_CLOTURE', 'DATE_CLOTURE_PRE', 'DUREE_MOIS',
	                        'DUREE_MOIS_PRE', 'MONNAIE', 'CONSOLIDE', 'MONNAIE_ORI',
	                        'MONNAIE_LIV_UNITE', 'SOURCE', 'devise'))){
	                        $resultPoste = new BilanPoste();
	                        $resultPoste->id = $bilan_key;
	                        $resultPoste->val = $bilan_value;
	                        $tabPoste[] = $resultPoste;
	                    } else {
	                        $resultBilan->$bilan_key = $bilan_value;
	                    }
	                }
	                $resultBilan->POSTES = $tabPoste;
	                $tabRet[] = $resultBilan;
	            }
	            $Indiscore->tabBilan = $tabRet;

	        } elseif ($key=='tabInfosNotations') {

	            $infosNotation = new IndiscoreInfosNotations();
	            $infosNotation->SituationFinanciere = $value['SituationFinanciere'];
	            $infosNotation->Notation = $value['Notation'];
	            $infosNotation->ProbabiliteDefaut = $value['ProbabiliteDefaut'];
	            $Indiscore->tabInfosNotations = $infosNotation;

	        } elseif ($key=='tabImportExport') {

	            $tabRet = array();
	            foreach($value as $element){
	                $importExport = new IndiscoreImportExport();
	                $importExport->importExport = $element['importExport'];
	                $importExport->annee = $element['annee'];
	                $importExport->rangNational = $element['rangNational'];
	                $importExport->deptSiege = $element['deptSiege'];
	                $tabRet[] = $importExport;
	            }
	            $Indiscore->tabImportExport = $tabRet;

	        } elseif ($key=='tabCommentaires') {

	            $tab = array();
	            foreach($value as $comment) {
	                $tab[] = Scores_Locale_String::fixEncoding($comment);
	            }
	            $Indiscore->tabCommentaires = $tab;

	        } elseif ($key=='tabVariables') {

	            $tab = $value['CA_Y'];
	            $tabVar = array();
	            if (count($tab)>0) {
	                foreach($tab as $varName => $varVal){
	                    $var = new CA_Y();
	                    $var->id = $varName;
	                    $var->val = $varVal;
	                    $tabVar[] = $var;
	                }
	            }
	            $variables = new IndiscoreVariables();
	            $variables->CA_Y = $tabVar;
	            $Indiscore->tabVariables = $variables;

	        } elseif ($key=='Bilans') {

	            $tab = array();
	            foreach($value as $item)
	            {
	                $objet = new IndiscoreBilans();
	                $objet->Millesime = $item['Millesime'];
	                $objet->FraisPerso = $item['FraisPerso'];
	                $objet->CA = $item['CA'];
	                $objet->EBE = $item['EBE'];
	                $objet->TxInvest = $item['TxInvest'];
	                $objet->TxEndett = $item['TxEndett'];
	                $objet->DettesCT = $item['DettesCT'];
	                $objet->FraisFi = $item['FraisFi'];
	                $objet->BFR = $item['BFR'];
	                $objet->FR = $item['FR'];
	                $objet->FondsPr = $item['FondsPr'];
	                $objet->DelaiCli = $item['DelaiCli'];
	                $objet->DelaiFour = $item['DelaiFour'];
	                $tab[] = $objet;
	            }
	            $Indiscore->$key = $tab;
	        } else {
	            $Indiscore->$key = $value;
	        }
	    }

	    $output->Indiscore = $Indiscore;

	    //Tableau d'infos sur les formules
	    $tabFormules = include APPLICATION_PATH . '/../library/Metier/scores/Data/Formules.php';
	    $tabBorneMin = $tabBorneMax = array();
	    foreach ($tabFormules as $formule) {
	        $id = $formule['id']*1;
	        $libelle = $formule['libelle'];
	        $unite = $formule['unite'];
	        $commentaires = $formule['commentaires'];
	        $tabFormulesInfos[$id] = $formule; //Pour la gestion des unités des ratios secteur
	        $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'];
	    }

	    //Ratios
	    global $tva, $mBil, $efftr, $tabInfla;
	    require_once 'Metier/scores/classMRatios.php';
	    $mBil = new MBilans($siren);
	    $tabBilans = $mBil->listeBilans($accesPartenaire, 5);
	    $nbBilans = count($tabBilans);
	    $tabBilan = $tabBil = array();
	    if ($nbBilans>0)
	    {
	        $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'];
	        $i = 0;
	        foreach ($tabBilans as $millesime => $item) {
	        	if ($i > 4) {
	        		break;
	        	}
	        	if ( $item['typeBilan'] == 'N' ) {
	        		$tabBilan[] = $mBil->getBilan(substr($millesime,-10), substr($millesime,0,1), '');
	        		$i++;
	        	} elseif ( $item['typeBilan'] == 'S' ) {
	        		$tabN = $mBil->getBilan(substr($millesime,-10), substr($millesime,0,1), '');
	        		$tabS = $mBil->bilanSimplifie2Normal($tabN);
	        		$tabBilan[] = array_merge($tabN, $tabS);
	        		$i++;
	        	}
	        }
			$mRatios = new MRatios();
			$mRatios->setTrancheEffectif($efftr);
	        $tabRatios = $mRatios->calcul($tabBilan);
	    }

	    $nbRatios = count($tabRatios);
	    debugLog('I',"Liste des Ratios demandée pour $siren après calculRatios ($nbRatios)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

	    $tabAnnees = array();
	    if ( $nbRatios > 0 ) {
	        foreach ( $tabRatios as $i=>$R ) {
	            //Informations sur le bilan
	            $bilansInfos = new RatiosBilansInfos();
	            $bilansInfos->dateCloture = $tabBilan[$i]['DATE_CLOTURE'];		//@todo : date
	            $bilansInfos->duree = $tabBilan[$i]['DUREE_MOIS'];
	            $bilansInfos->devise = $tabBilan[$i]['MONNAIE'];
	            $bilansInfos->typeBilan = $tabBilan[$i]['CONSOLIDE'];
	            $bilansInfos->unite = 'U';
	            if ( substr($tabBilan[$i]['DATE_CLOTURE'],0,4)>1900 ){
	                $tabAnnees[$i]=substr($tabBilan[$i]['DATE_CLOTURE'],0,4);
	            }

	            $tabRatiosEntrep = array();
	            $tabRatiosEntrepEvol = array();
	            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
	                $ratiosEntrep = new Ratios();
	                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);
	                }
	                $tabRatiosEntrep[] = $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
	                $ratiosEntrepEvol = new Ratios();
	                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,',',' ');
	                }
	                $tabRatiosEntrepEvol[] = $ratiosEntrepEvol;
	            }
	            $bilansInfos->RatiosEntrep = $tabRatiosEntrep;
	            $bilansInfos->RatiosEntrepEvol = $tabRatiosEntrepEvol;
	            $tabBilansR[] = $bilansInfos;
	        }
	    }
	    debugLog('I',"Liste des Ratios demandée pour $siren après EVOLUTION",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

	    // Tableau des ratios secteurs
	    if (strlen($naf)>4)	$strNaf = " AND naf5='$naf' ";
	    else				$strNaf = " AND naf4='$naf' ";
	    $strAnnees = implode(',', $tabAnnees);

	    $tabRatiosSecteurs = array();

	    $tabAnnees = array_unique($tabAnnees);

	    if ( count($tabAnnees)>0 ) {
	        $iDb = new WDB();
	        $tabTmp = $iDb->select('jo.ratios_secteurs',
	                'annee, naf5, naf4, id, (montant/nombre) AS ratio, nombre',
	                "1 $strNaf AND annee IN ($strAnnees) ORDER BY annee DESC, id ASC",
	                false, MYSQL_ASSOC);

	        $nbRatiosSec = 0;
	        foreach($tabAnnees as $annee) {
	            $ratiosSecteur = new RatiosSecteur();
	            $ratiosSecteur->annee = $annee;
	            foreach ($tabTmp as $tmp)
	            {
	                if ($tmp['annee']== $annee)
	                {
	                    $Ridx = $tmp['id'];
	                    if ($tmp['nombre']>$nbRatiosSec){
	                        $nbRatiosSec = $tmp['nombre'];
	                    }

	                    $unite = $tabFormulesInfos[$Ridx]['unite'];
	                    if ($unite=='EUR'){
	                        $montant = round($tmp['ratio']*1000);
	                    } else {
	                        $montant = round($tmp['ratio']);
	                    }
	                    if ($tabBorneMin[$Ridx]<>'' && $montant<$tabBorneMin[$Ridx]){
	                        $montant='<'.$tabBorneMin[$Ridx];
	                    } elseif ($tabBorneMax[$Ridx]<>'' && $montant>$tabBorneMax[$Ridx]){
	                        $montant='>'.$tabBorneMax[$Ridx];
	                    }

	                    $ratiosSecteurListe = new Ratios();
	                    if (substr($montant,0,1)=='N' || substr($montant,0,1)=='<' || substr($montant,0,1)=='>'){
	                        $ratiosSecteurListe->id = 'r'.$Ridx;
	                        $ratiosSecteurListe->val = $montant;
	                    } else {
	                        $ratiosSecteurListe->id = 'r'.$Ridx;
	                        $ratiosSecteurListe->val = round($montant,2);
	                    }
	                    $ratiosSecteur->liste[] = $ratiosSecteurListe;
	                }
	            }
	            $tabRatiosSecteurs[] = $ratiosSecteur;
	        }
	    }

	    $output->RatiosBilansInfos = $tabBilansR;
	    $output->RatiosInfos = $tabRatiosInfos;
	    $output->RatiosSecteur = $tabRatiosSecteurs;

	    $this->wsLog('valorisation',$siren);
	    return $output;
	}

	/**
	 * Liste de tous les évènements enregistrés à l'INSEE pour une entreprise
	 * @param string $siren Siren de l'entreprise
	 * @param string $nic Nic de l'entreprise (Si définit filtre les événéments à l'établissements)
	 * @param integer $position
	 * @param integer $nbRep
	 * @return InseeReturn
	 **/
	public function getListeEvenements($siren, $nic=0, $position=0, $nbRep=50)
	{
		$this->authenticate();
		$this->permission('eveninsee');

		//Initialisation
		if (empty($nic))                  { $nic = 0; }
		if (empty($position))			  { $position = 0; }
		if (empty($nbRep) || $nbRep>50)   { $nbRep = 50; }

		$tabRet = array();
		if (strlen($siren)<>9) {
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			$this->sendError('1010');
		}

		$iInsee = new MInsee();
		$nbReponses = $iInsee->getEvenementsCount($siren, $nic);
		$output = new InseeReturn();
		$output->nbReponses = $nbReponses;
        if ( $nbReponses > 0 ) {
            $evens = $iInsee->getEvenements($siren, $nic, $position, $nbRep);
            $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;
                }
            }
            $output->result = $tabRet;
        }

        $this->wsLog('evenements',$siren);
		return $output;
	}


	/**
	 * Recherche
	 * @param EntrepriseCriteres $criteres
	 * @param integer $position Position de parcours des résultats retournées (0 par défaut)
	 * @param integer $nbRep  Nombre de réponses retournées lors d'une requête (20 par défaut)
	 * @param integer $maxRep Nombre de réponses maximum pouvant être retournées lors d'une requête (200 par défaut)
	 * @param boolean $pertinence Recherche orthographique stricte sur le nom, l'adresse et la ville (false par défaut)
	 * @param boolean $avecSiren Seulement les entités sirénées (false par défaut)
	 * @return SearchEntrepriseReturn
	 */
	public function searchEntreprise($criteres, $position = 0, $nbRep = 20, $maxRep = 200, $pertinence = false, $avecSiren = false)
	{
		$this->authenticate();

		if (empty($position)) 	{ $position = 0;}
		if (empty($nbRep)) 	 	{ $nbRep = 20; }
		if (empty($maxRep)) 	{ $maxRep = 200; }

		$entCriteres = new EntrepriseCriteres();
		$entCriteres = $criteres;
		$identifiant = $entCriteres->identifiant;
		$typeId = '';

		//Detection autour de l'identifiant
		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';
			}
		}

		$adresse = trim($entCriteres->adresse);

		//Détection Tel/Fax uniquement
		if ( empty($typeId)
			&& empty($entCriteres->raisonSociale)
			&& empty($adresse)
			&& empty($entCriteres->codePostal)
			&& empty($entCriteres->ville)
			&& empty($entCriteres->naf) ){
				$typeId = 'TEL';
		}

		if (in_array($typeId, array('R', 'W', 'I'))){

			$O = $this->searchAutreId(
					$typeId,
					$identifiant,
					$entCriteres->codePostal,
					$entCriteres->actif,
					empty($position) ? 0 : $position,
					empty($nbRep) ? 20 : $nbRep,
					empty($maxRep) ? 200 : $maxRep
			);
			$output = new SearchEntrepriseReturn();
			$output->nbReponses = $O->nbReponses;
			$output->nbReponsesTotal = $O->nbReponsesTotal;
			$output->result = $O->result;
			return $output;

		} elseif ($typeId == 'S'){

			$O = $this->searchSiren(
					$identifiant,
					$entCriteres->codePostal,
					$entCriteres->actif,
					empty($position) ? 0 : $position,
					empty($nbRep) ? 20 : $nbRep,
					empty($maxRep) ? 200 : $maxRep
			);

			$output = new SearchEntrepriseReturn();
			$output->nbReponses = $O->nbReponses;
			$output->nbReponsesTotal = $O->nbReponsesTotal;
			$output->result = $O->result;
			$output->info = $O->info;
			return $output;

		} elseif ($typeId == 'TEL'){

			$O = $this->searchTelFax(
					$entCriteres->telFax,
					$entCriteres->actif,
					empty($position) ? 0 : $position,
					empty($nbRep) ? 20 : $nbRep,
					empty($maxRep) ? 200 : $maxRep
			);

			$output = new SearchEntrepriseReturn();
			$output->nbReponses = $O->nbReponses;
			$output->nbReponsesTotal = $O->nbReponsesTotal;
			$output->result = $O->result;
			return $output;

		} else {

			$O = $this->searchNomAdr(
					Scores_Locale_String::cleanstring($entCriteres->raisonSociale),
					Scores_Locale_String::cleanstring($entCriteres->adresse),
					$entCriteres->codePostal,
					Scores_Locale_String::cleanstring($entCriteres->ville),
					empty($entCriteres->siege) ? false : $entCriteres->siege,
					$entCriteres->actif,
					empty($position) ? 0 : $position,
					empty($nbRep) ? 20 : $nbRep,
					empty($maxRep) ? 200 : $maxRep,
					empty($pertinence) ? false : $pertinence,
					empty($avecSiren) ? false : $avecSiren,
					$entCriteres->naf,
			        $entCriteres->fj
			);

			$output = new SearchEntrepriseReturn();
			$output->nbReponses = $O->nbReponses;
			$output->nbReponsesTotal = $O->nbReponsesTotal;
			$output->result = $O->result;
			return $output;
		}
	}

	/**
	 * Recherche d'entreprise par dirigeants
	 * @param DirigeantCriteres $criteres
	 * @param integer 	$deb		Position du curseur dans la liste des réponses (0 par défaut)
	 * @param integer 	$nbRep		Nombre de réponses retournées au maximum par cette requete (20 par défaut)
	 * @param integer 	$maxRep		Nombre de réponses recherchées au maximum (200 par défaut)
	 * @return SearchDirReturn
	 */
	public function searchDir($criteres, $deb=0, $nbRep=20, $maxRep=200)
	{
		$this->authenticate();

		$nom = $criteres->nom;
		$prenom = $criteres->prenom;
		$dateNaiss = $criteres->dateNaiss;
		$lieuNaiss = $criteres->lieuNaiss;
		$pertinence = $criteres->pertinence;

		debugLog('I',"Recherche Dirigeant de $nom, $prenom, $dateNaiss, $lieuNaiss (Max Rep=$nbRep)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (empty($prenom))		$prenom = '';
		if (empty($dateNaiss))	$dateNaiss = '';
		if (empty($lieuNaiss))	$lieuNaiss = '';
		if (empty($pertinence))	$pertinence = false;
		if (empty($deb))		$deb = 0;
		if (empty($nbRep))		$nbRep = 20;
		if (empty($maxRep))		$maxRep = 200;

		$iInsee = new MInsee();
		$etabs = $iInsee->rechercheDir($nom, $prenom, '', $dateNaiss, $lieuNaiss, $deb, $nbRep, $maxRep, $pertinence);

		$tabRet = array();
		foreach ($etabs['reponses'] as $etab) {
			$item = new EntrepriseDirItem();
			$item->id 			= $etab['id'];
			$item->Pertinence 	= $etab['Pertinence'];
			$item->Siret 		= $etab['Siret'];
			$item->Siege 		= $etab['Siege'];
			$item->Nom 			= prepareString(strtr($etab['Nom'],'/*','  '));
			$item->Nom2 		= prepareString($etab['Nom2']);
			$item->Sigle 		= prepareString($etab['Sigle']);
			$item->Enseigne		= prepareString($etab['Enseigne']);
			$item->Adresse 		= prepareString($etab['Adresse']);
			$item->Adresse2 	= prepareString($etab['Adresse2']);
			$item->CP			= $etab['CP'];
			$item->Ville 		= prepareString($etab['Ville']);
			$item->Pays     	= $etab['Pays'];
			$item->Tel			= $etab['Tel'];
			$item->Fax 			= $etab['Fax'];
			$item->FJ			= $etab['FJ'];
			$item->FJLib 		= $iInsee->getLibelleFJ($etab['FJ']);
			$item->Siren 		= $etab['Siren'];
			$item->Nic 			= $etab['Nic'];
			$item->Actif 		= $etab['Actif'];
			$item->NafEtab 		= $etab['NafEtab'];	// Etablissement
			$item->NafEtabLib 	= prepareString($iInsee->getLibelleNaf($etab['NafEtab']));	// Etablissement
			$item->NafEnt 		= $etab['NafEnt'];	// Entreprise
			$item->NafEntLib 	= prepareString($iInsee->getLibelleNaf($etab['NafEnt']));

			// Dirigeant
			$item->DirRs 		= prepareString($etab['DirRs']);
			$item->DirNom 		= prepareString($etab['DirNom']);
			$item->DirPrenom 	= prepareString($etab['DirPrenom']);
			$item->DirNomUsage 	= prepareString($etab['DirNomUsage']);
			$item->DirDateEffet = $etab['DirDateEffet'];
			$item->DirFonction 	= prepareString($etab['DirFonction']);
			$item->DirDepart 	= $etab['DirDepart'];
			$tabRet[] = $item;
		}

		if ($etabs['nbReponses']==0){
			debugLog('W', "Aucun résultat pour cette recherche !", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		}

		$search = new SearchDirReturn();
		$search->nbReponses = $etabs['nbReponses'];
		$search->nbReponsesTotal = $etabs['nbReponsesTotal'];
		$search->result = $tabRet;
		return $search;
	}

	/**
	 * Recherche d'entreprise ou d'établissement par un autre Identifiant
	 *
	 * @param  string  	$typeId         I=Code Isin, W=N°Waldec (Associations) ou R=N°RC (Registre Greffe)
	 * @param  string  	$identifiant    Identifiant recherché
	 * @param  integer  $dep			Département
	 * @param  integer 	$actif 			0 : Filtre sur les inactfis, 1: Filtre sur les actifs, 2 : Tous (defaut)
	 * @param  integer  $deb            Position du curseur dans la liste des réponses (0 par défaut)
	 * @param  integer  $nbRep          Nombre de réponses retournées au maximum par cette requete (20 par défaut)
	 * @param  integer  $maxRep         Nombre de réponses recherchées au maximum (200 par défaut)
	 * @return SearchReturn
	 */
	public function searchAutreId($typeId, $identifiant, $dep=0, $actif=2, $deb=0, $nbRep=20, $maxRep=200)
	{
		$this->authenticate();

		if (empty($deb)) 	$deb = 0;
		if (empty($nbRep)) 	$nbRep = 0;
		if (empty($maxRep)) $maxRep = 0;
		if (empty($dep)) 	$dep = 0;
		if (!in_array($actif, array(0,1,2))) $actif = 2;

		$typeId = substr(trim(strtoupper($typeId)),0,1);

		if ($typeId!='I' && $typeId!='W' && $typeId!='R') {
			debugLog('I',"Type d'identifiant $typeId inexistant",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1021');
		}
		$tabRet = array();
		debugLog('I',"Recherche par identifiant $typeId de $identifiantavec un maximum de $nbRep réponses",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		if ($typeId=='W' || $typeId=='R')
		{
			$iInsee = new MInsee();
			$rep = $iInsee->getEtablissementsParId('AUTRE', $identifiant, $deb, $nbRep, $maxRep, $dep, $actif);
			$etabs = $rep['reponses'];
			foreach ($etabs as $nb=>$etab)
			{
				$item = new EntrepriseItem();
				$item->id			= $etab['id'];
				$item->Pertinence 	= $etab['Pertinence'];
				$item->Source		= $etab['Source'];
				$item->SourceId		= $etab['SourceId'];
				$item->Siret		= $etab['Siret'];
				$item->Siege		= $etab['Siege'];
				$item->Nom			= prepareString(strtr($etab['Nom'],'/*','  '));
				$item->Nom2			= prepareString($etab['Nom2']);
				$item->Sigle		= prepareString($etab['Sigle']);
				$item->Enseigne		= prepareString($etab['Enseigne']);
				$item->Adresse		= prepareString($etab['Adresse']);
				$item->Adresse2		= prepareString($etab['Adresse2']);
				$item->CP			= $etab['CP'];
				$item->Ville		= prepareString($etab['Ville']);
				$item->Pays     	= $etab['Pays'];
				$item->Tel			= $etab['Tel'];
				$item->Fax			= $etab['Fax'];
				$item->FJ			= $etab['FJ'];
				$item->FJLib		= prepareString($etab['FJLib']);
				$item->Siren		= $etab['Siren'];
				$item->Nic			= $etab['Nic'];
				$item->Actif		= $etab['Actif'];
				$item->NafEtab		= $etab['NafEtab'];						// Etablissement
				$item->NafEtabLib	= prepareString($etab['NafEtabLib']);	// Etablissement
				$item->NafEnt		= $etab['NafEnt'];						// Entreprise
				$item->NafEntLib	= prepareString($etab['NafEntLib']);
				$tabRet[] = $item;
			}
			$output = new SearchReturn();
			$output->nbReponses = $rep['nbReponses'];
			$output->nbReponsesTotal = $rep['nbReponsesTotal'];
			$output->result = $tabRet;
			return $output;
		} else {
			$iBourse = new MBourse($siren);
			$siren = $iBourse->getCodeSiren($identifiant);
			return $this->searchSiren($siren, $dep, $actif, $deb, $nbRep, $maxRep);
		}
	}


	/**
	 * Recherche d'entreprise ou d'établissement par leur TEL FAX
	 *
	 * @param  string  	$telFax         Téléphone ou fax de l'établissement (ex: 0175438010)
	 * @param  integer 	$actif 			0 : Filtre sur les inactfis, 1: Filtre sur les actifs, 2 : Tous (defaut)
	 * @param  integer  $deb            Position du curseur dans la liste des réponses (0 par défaut)
	 * @param  integer  $nbRep          Nombre de réponses retournées au maximum par cette requete (20 par défaut)
	 * @param  integer  $maxRep         Nombre de réponses recherchées au maximum (200 par défaut)
	 * @return SearchReturn
	 */
	public function searchTelFax($telFax, $actif=2, $deb=0, $nbRep=20, $maxRep=200)
	{
		$this->authenticate();

		if (empty($deb)) 	$deb = 0;
		if (empty($nbRep)) 	$nbRep = 0;
		if (empty($maxRep)) $maxRep = 0;
		if (!in_array($actif, array(0,1,2))) $actif = 2;

		$tabRet = array();
		debugLog('I',"Recherche par Tel/Fax de $telFax avec un maximum de $nbRep réponses",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		//$assocs=$this->iInsee->rechercheEtab($raisonSociale, $adresse, $codePostal, $ville, $siege, $nbRep, $pertinence);
		/** @todo A FAIRE **/
		if (strlen($telFax)<10 || strlen($telFax)>14) {
			debugLog('W', "Tel/Fax $telFax incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1011');
		}

		$iInsee = new MInsee();
		$rep = $iInsee->getEtablissementsParId('TEL', $telFax, $deb, $nbRep, $maxRep, 0, $actif);
		$etabs = $rep['reponses'];
		foreach ($etabs as $nb=>$etab)
		{
			$pays = 'France';
			if ( $etab['adr_dep']==99 ) {
				$resultPays = $this->iDb->select("jo.tabPays", "libPays", "codePaysInsee = ".$etab['adr_com'], false, MYSQL_ASSOC);
				$pays = $resultPays[0]['libPays'];
			}

			$item = new EntrepriseItem();
			$item->id			= $etab['id'];
			$item->Pertinence	= $etab['Pertinence'];
			$item->Siret		= $etab['Siret'];
			$item->Siege		= $etab['Siege'];
			$item->Nom			= prepareString(strtr($etab['Nom'],'/*','  '));
			$item->Nom2			= prepareString($etab['Nom2']);
			$item->Sigle		= prepareString($etab['Sigle']);
			$item->Enseigne		= prepareString($etab['Enseigne']);
			$item->Adresse		= prepareString($etab['Adresse']);
			$item->Adresse2		= prepareString($etab['Adresse2']);
			$item->CP			= $etab['CP'];
			$item->Ville		= prepareString($etab['Ville']);
			$item->Pays     	= $etab['Pays'];
			$item->Tel			= $etab['Tel'];
			$item->Fax			= $etab['Fax'];
			$item->FJ			= $etab['FJ'];
			$item->FJLib		= prepareString($etab['FJLib']);
			$item->Siren		= $etab['Siren'];
			$item->Nic			= $etab['Nic'];
			$item->Actif		= $etab['Actif'];
			$item->NafEtab		= $etab['NafEtab'];	// Etablissement
			$item->NafEtabLib	= prepareString($etab['NafEtabLib']);	// Etablissement
			$item->NafEnt		= $etab['NafEnt'];	// Entreprise
			$item->NafEntLib	= prepareString($etab['NafEntLib']);
			$tabRet[] = $item;
		}

		$output = new SearchReturn();
		$output->nbReponses = $rep['nbReponses'];
		$output->nbReponsesTotal = $rep['nbReponsesTotal'];
		$output->result = $tabRet;
		return $output;
	}


	/**
	 * Recherche entreprise par nom et adresse
	 * @param string 	$raisonSociale 	Raison Sociale ou Enseigne ou Sigle
	 * @param string 	$adresse 		Adresse de l'entreprise, du type : 3 rue des Plantes
	 * @param string 	$codePostal 	Code postal (ex: 75014)
	 * @param string 	$ville 			Ville
	 * @param boolean 	$siege 			Limitation de la recherche aux sièges (si true)
	 * @param integer 	$actif 			0 : Filtre sur les inactfis, 1: Filtre sur les actifs, 2 : Tous (defaut)
	 * @param integer 	$deb 			Position du curseur dans la liste des réponses (0 par défaut)
	 * @param integer 	$nbRep 			Nombre de réponses retournées au maximum par cette requete (20 par défaut)
	 * @param integer 	$maxRep 		Nombre de réponses recherchées au maximum (200 par défaut)
	 * @param boolean 	$pertinence 	Recherche orthographique stricte sur le nom, l'adresse et la ville (si true)
	 * @param boolean 	$avecSiren 		Ne proposer que les entités sirénées
	 * @param string 	$ape_etab
	 * @param  integer  $fj             Code Forme juridique
	 * @return SearchReturn
	 */
	public function searchNomAdr($raisonSociale, $adresse='', $codePostal='', $ville='', $siege=false, $actif=2, $deb=0, $nbRep=20, $maxRep=200, $pertinence=false, $avecSiren=false, $ape_etab='', $fj=null)
	{
		$this->authenticate();

		debugLog('I',"Recherche Entreprise de $raisonSociale, $adresse, $codePostal $ville (Siège=$siege / Max Rep=$nbRep)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (empty($adresse)) 	$adresse = '';
		if (empty($codePostal)) $codePostal = '';
		if (empty($ville)) 		$ville = '';
		if (empty($siege)) 		$siege = false;
		if (!in_array($actif, array(0,1,2))) $actif = 2;
		if (empty($deb)) 		$deb = 0;
		if (empty($nbRep)) 		$nbRep = 20;
		if (empty($maxRep)) 	$maxRep = 200;
		if (empty($pertinence)) $pertinence = false;
		if (empty($avecSiren)) 	$avecSiren = false;
		if (empty($ape_etab)) 	$ape_etab = '';
		if (!preg_match('/[0-9]{4}/',$fj))    $fj = null;

		$iInsee = new MInsee();
		$etabs = $iInsee->rechercheEtab(
    		        $raisonSociale,
    		        $adresse,
    		        $codePostal,
    		        $ville,
    		        $siege,
    		        $actif,
    		        $deb,
    		        $nbRep,
    		        $maxRep,
    		        $pertinence,
    		        $avecSiren,
    		        $ape_etab,
    		        $fj
		        );

		$result = new SearchReturn();
		$tabRet = array();
		if (count($etabs['reponses'])) {
			foreach ($etabs['reponses'] as $etab) {
				$reponse = new EntrepriseItem();
				$reponse->id 			= $etab['id'];
				$reponse->Pertinence 	= $etab['Pertinence'];
				$reponse->Source 		= $etab['Source'];
				$reponse->SourceId 		= $etab['SourceId'];
				$reponse->Siret 		= $etab['Siret'];
				$reponse->Siege 		= $etab['Siege'];
				$reponse->Nom 			= strtr($etab['Nom'],'/*','  ');
				$reponse->Nom2 			= $etab['Nom2'];
				$reponse->Sigle 		= $etab['Sigle'];
				$reponse->Enseigne 		= $etab['Enseigne'];
				$reponse->Adresse 		= $etab['Adresse'];
				$reponse->Adresse2 		= $etab['Adresse2'];
				$reponse->CP 			= $etab['CP'];
				$reponse->Ville 		= $etab['Ville'];
				$reponse->Pays     		= $etab['Pays'];
				$reponse->Tel 			= $etab['Tel'];
				$reponse->Fax 			= $etab['Fax'];
				$reponse->FJ 			= $etab['FJ'];
				$reponse->FJLib 		= $iInsee->getLibelleFJ($etab['FJ']);
				$reponse->Siren 		= $etab['Siren'];
				$reponse->Nic 			= $etab['Nic'];
				$reponse->Actif 		= $etab['Actif'];
				$reponse->NafEtab 		= $etab['NafEtab'];	// Etablissement
				$reponse->NafEtabLib 	= prepareString($iInsee->getLibelleNaf($etab['NafEtab']));	// Etablissement
				$reponse->NafEnt 		= $etab['NafEnt'];	// Entreprise
				$reponse->NafEntLib 	= prepareString($iInsee->getLibelleNaf($etab['NafEnt']));

				$tabRet[] = $reponse;
			}
		}

		$siretTrouve = 0;
		if ($etabs['nbReponses']==0) {

			debugLog('I', "rechercheEtab : AUCUN RESULTAT, S=$raisonSociale, R=$adresse, L=$codePostal, V=$ville, A=$ape_etab ($siege, $actif, $deb, $nbRep, $maxRep, $pertinence, $avecSiren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);

			$result->nbReponses = count($tabRet);
			$result->nbReponsesTotal = $etabs['nbReponsesTotal'];
			$result->result = $tabRet;

			return $result;
		}

		if ($etabs['nbReponses']==1)	$siretTrouve=$etabs['reponses'][0]['Siret'];
		debugLog('I', "rechercheEtab : ".$etabs['nbReponses']." RESULTATS, S=$raisonSociale, R=$adresse, L=$codePostal, V=$ville, A=$ape_etab ($siege, $actif, $deb, $nbRep, $maxRep, $pertinence, $avecSiren)", __LINE__, __FILE__, __FUNCTION__, __CLASS__);

		$result->nbReponses = $etabs['nbReponses'];
		$result->nbReponsesTotal = $etabs['nbReponsesTotal'];
		$result->result = $tabRet;
		return $result;
	}

	/**
	 * Recherche d'entreprise ou d'établissement par leur identifiant SIREN ou SIRET
	 * @param  string 	$siret		Siren ou Siret de l'entreprise ou de l'établissement sur 9 ou 14 chiffres significatifs
	 * @param  integer  $dep		Département
	 * @param  integer 	$actif		0 : Filtre sur les inactfis, 1: Filtre sur les actifs, 2 : Tous (defaut)
	 * @param  integer  $deb		Position du curseur dans la liste des réponses (0 par défaut)
	 * @param  integer  $nbRep		Nombre de réponses retournées au maximum par cette requete (20 par défaut)
	 * @param  integer  $maxRep		Nombre de réponses recherchées au maximum (200 par défaut)
	 * @return SearchReturn
	 */
	public function searchSiren($siret, $dep=0, $actif=2, $deb=0, $nbRep=20, $maxRep=200)
	{
		$this->authenticate();

		debugLog('I',"Recherche par Siret de $siret (dep=$dep) avec un maximum de $maxRep réponses pour la tranche $deb à $nbRep",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		// --- Supprimer les éléments autres que chiffres dans le siret
        $siret = preg_replace('/[^0-9]/', '', $siret);

		// --- Controle de la taille du siret/siren
		if ( strlen($siret)!=14 && strlen($siret)!=9 ){
			debugLog('W', "Siren/Siret $siret incorrect", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		// --- Initialisation des variables
		if (empty($deb))	$deb = 0;
		if (empty($nbRep))	$nbRep = 20;
		if (empty($maxRep))	$maxRep = 200;
		if (empty($dep))	$dep = 0;
		if (empty($siege))	$siege = null;

		if (!in_array($actif, array(0,1,2))) $actif = 2;
		if ( $actif==2 ) $actif = -1;

		$nbReponsesTotal = $nbReponses = 0;

		$siren = substr($siret,0,9);
		if     (strlen($siret) == 14)	$nic = substr($siret,9,5);
		elseif (strlen($siret) ==  9)	$nic = '';

		$iDb = new WDB();
		$iInsee = new MInsee($iDb);

		$rep = $iInsee->getEtablissements($siren, $nic, $deb, $nbRep, $maxRep, $dep, $actif, $siege);
		if ( count($rep['reponses'])==0 && $dep>0 ) {
			$rep = $iInsee->getEtablissements($siren, $nic, $deb, $nbRep, $maxRep, 0, $actif, $siege);
		}
		$etabs = $rep['reponses'];
		$tabRet = array();
		if (count($etabs)>0){
			foreach ($etabs as $nb=>$etab) {
				$reponse = new EntrepriseItem();
				$reponse->id			= $etab['id'];
				$reponse->Pertinence	= $etab['Pertinence'];
				$reponse->Source		= $etab['Source'];
				$reponse->SourceId		= $etab['sourceId'];
				$reponse->Siret			= $etab['Siret'];
				$reponse->Siege			= $etab['Siege'];
				$reponse->Nom			= prepareString(strtr($etab['Nom'],'/*','  '));
				$reponse->Nom2			= prepareString($etab['Nom2']);
				$reponse->Sigle			= prepareString($etab['Sigle']);
				$reponse->Enseigne		= prepareString($etab['Enseigne']);
				$reponse->Adresse		= prepareString($etab['Adresse']);
				$reponse->Adresse2		= prepareString($etab['Adresse2']);
				$reponse->CP			= $etab['CP'];
				$reponse->Ville			= prepareString($etab['Ville']);
				$reponse->Pays			= prepareString($etab['Pays']);
				$reponse->Tel			= $etab['Tel'];
				$reponse->Fax			= $etab['Fax'];
				$reponse->FJ			= $etab['FJ'];
				$reponse->FJLib			= prepareString($etab['FJLib']);
				$reponse->Siren			= $etab['Siren'];
				$reponse->Nic			= $etab['Nic'];
				$reponse->Actif			= $etab['Actif'];
				$reponse->NafEtab		= $etab['NafEtab'];	// Etablissement
				$reponse->NafEtabLib	= $etab['NafEtabLib'];	// Etablissement
				$reponse->NafEnt		= $etab['NafEnt'];	// Entreprise
				$reponse->NafEntLib		= $etab['NafEntLib'];
				$tabRet[] = $reponse;
			}
		}
		$nbReponsesTotal = $rep['nbReponsesTotal'];
		$nbReponses = $rep['nbReponses'];

		// --- Si le siren est valide et pas de résultats
		if ( count($tabRet)==0 && $iInsee->valideSiren($siren) ) {
		    // --- Vérification dans la table des greffes
	        $iGeffes = new MGreffes();
	        $etab = $iGeffes->getIdentite($siren);
	        if ($etab) {
	            $reponse = new EntrepriseItem();
	            $reponse->id			= $etab['id'];
	            $reponse->Pertinence 	= $etab['Pertinence'];
	            $reponse->Siret 		= $etab['Siret'];
	            $reponse->Siege			= $etab['Siege'];
	            $reponse->Nom			= prepareString($etab['Nom']);
	            $reponse->Nom2 			= prepareString($etab['Nom2']);
	            $reponse->Sigle			= prepareString($etab['Sigle']);
	            $reponse->Enseigne 		= prepareString($etab['Enseigne']);
	            $reponse->Adresse		= prepareString($etab['Adresse']);
	            $reponse->Adresse2		= prepareString($etab['Adresse2']);
	            $reponse->CP 			= $etab['CP'];
	            $reponse->Ville			= prepareString($etab['Ville']);
	            $reponse->Pays			= 'France';
	            $reponse->Tel			= $etab['Tel'];
	            $reponse->Fax			= $etab['Fax'];
	            $reponse->FJ			= $etab['FJ'];
	            $reponse->FJLib			= $etab['FJLib'];
	            $reponse->Siren 		= $etab['Siren'];
	            $reponse->Nic			= $etab['Nic'];
	            $reponse->Actif			= $etab['Actif'];
	            $reponse->NafEtab		= $etab['NafEtab'];
	            $reponse->NafEtabLib	= $etab['NafEtabLib'];
	            $reponse->NafEnt		= $etab['NafEnt'];
	            $reponse->NafEntLib		= $etab['NafEntLib'];
	            $tabRet[] = $reponse;
	            $nbReponses = 1;
	            $nbReponsesTotal = 1;
	        }

	        else {
	            $iDb->insert('jo.siren_inexistants', array(
	                'siren' => $siren,
	                'nic' => $nic,
	                'dep' => $dep,
	                'login' => $this->User->login,
	                'client' => $this->User->idClient,
	                'dateInsert' => date('YmdHis'))
	            );
	            $nbReponses = 0;
	            $nbReponsesTotal = 0;
	        }
		}

		$output = new SearchReturn();
		$output->nbReponses = $nbReponses;
		$output->nbReponsesTotal = $nbReponsesTotal;
		$output->result = $tabRet;
		$output->info = $rep['info'];
		return $output;
	}




	/**
	 * 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
	 	$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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		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__);
			$this->sendError('1020');
		}

		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__);

		$output = new TvaReturn();
		$output->id = $entrep['id'];
		$output->AutreId = $entrep['AutreId'];
		$output->Nom = $entrep['Nom'];
		$output->Sigle = $entrep['Sigle'];
		$output->Enseigne = $entrep['Enseigne'];
		$output->Adresse = $entrep['Adresse'];
		$output->Adresse2 = $entrep['Adresse2'];
		$output->CP = $entrep['CP'];
		$output->Ville = $entrep['Ville'];
		$output->Siren = $entrep['Siren'];
		$output->Tva = $tva;

		debugLog('I', "TVA retournée = $tva (".$entrep['Nom'].')', __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		$this->wsLog('tva',$siren);

		return $output;
	}

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

		//Initialisation
		if (empty($id)) $id = null;
		$tabRet = array();
		$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__);
			$this->sendError('1010');
		}
		$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__);
			$this->sendError('1030');
		}

		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 === null) {
				$infos = new InfosReg();
				$infos->id = $ann['id'];
				$infos->source = $ann['source'];
				$infos->DateParution = $ann['DateParution'];			//@todo : date
				$infos->raisonSociale = $ann['raisonSociale'];
				$infos->titre = $ann['titre'];
				$infos->pj = $ann['pj'];
				$infos->url = $ann['url'];
				$infos->dateInsertionSD = $ann['dateInsertionSD'];		//@todo : date
				$tabRet[] = $infos;
			} else {
				$infos = new InfosReg();
				$infos->id = $ann['id'];
				$infos->source = $ann['source'];
				$infos->DateParution = $ann['DateParution'];			//@todo : date
				$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'];		//@todo : date
				$tabRet[] = $infos;
    		}
		}
		debugLog('I', 'Nb infos retournés = '. count($anns), __LINE__, __FILE__, __FUNCTION__, __CLASS__);
		$this->wsLog('infosreg',$siren,$id);
		$output = new InfosRegReturn();
		$output->result = $tabRet;
		return $output;
	}

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

		//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__);
			$this->sendError('1010');
		}

		$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__);
			$this->sendError('1030');
		}

		$result = new InfosBourse();
		$result->Siren = $bourse['siren'];
		$result->RaisonSociale = $bourse['raisonSociale'];
		$result->Adresse = $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 = $bourse['dateIntroduction'];	//@todo : date
		$result->DateDerAG = $bourse['dateDerAG'];					//@todo : date
		$result->DateRadiation = $bourse['dateRadiation'];			//@todo : date
		$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 = $bourse['marche'];
		$result->Description = $bourse['description'];
		$result->Secteur = $bourse['secteur'];
		$result->Activite = $bourse['activite'];
		$result->ActiviteDet = $bourse['activiteDet'];

		$result->placeCotation = $bourse['placeCotation'];
		$result->nombreTitres = $bourse['nombreTitres'];
		$result->capitalisation = $bourse['close']*$bourse['nombreTitres'];
		$result->derCoursDate = $bourse['date'];									//@todo : 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'];

		$this->wsLog('bourse',$siren,$id);
		return $result;
	}

	/**
	 * 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, paiements, liens)
	 * @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();
		$source = strtolower($source);
		switch ($source) {
			case 'insee':
				$this->permission('survinsee');
				break;
			case 'bilans':
				$this->permission('survbilan');
				break;
			case 'actes':
				$this->permission('survactes');
				break;
			case 'privileges':
				$this->permission('survpriv');
				break;
			case 'dirigeants':
				$this->permission('survdirigeants');
				break;
			case 'score':
				$this->permission('survscore');
				break;
			case 'paiements':
				$this->permission('survpaiements');
				break;
			case 'liens':
				$this->permission('survliens');
				break;
			case 'annonces':
			default:
				$this->permission('survannonce');
				break;
		}

		//Initialisation
		if (empty($ref)) 			$ref = '';
		if (empty($delete)) 		$delete = false;
		if (empty($encoursClient)) 	$encoursClient = false;
		$result = false;
		$siren = substr($siret,0,9);
		$nic = substr($siret,9,5);
		if (empty($nic)) {
		    $nic = '00000';
		}

		debugLog('I',"setSurveillances(siret=$siret, email=$email, ref=$ref, source=$source, delete=$delete)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$iDb = new WDB();
		$login = $this->User->login;
		switch ($source) {
			case 'insee':
			case 'annonces':
			case 'bilans':
			case 'actes':
			case 'privileges':
			case 'paiements':
			case 'liens':
			case 'dirigeants': 	$encoursClient=0; break;
			case 'score': 		$encoursClient=$encoursClient*1; break;
			default: 			$source='annonces'; break;
		}

		/**
		 * Suppression de la surveillance
		 * @todo : Déplacer dans la table de mouvement
		 */
		if ($delete) {

			$tabUpdate = array('dateSuppr'=>date('Y-m-d'));
			$result = $iDb->update('jo.surveillances_site',
				$tabUpdate,
				"source='$source' AND login='$login' AND email='$email' AND siren=$siren AND nic=$nic AND ref='$ref'"
			);

		} else {

			/**
			 * Calcul d'initialisation du score lors d'un ajout
			 */
			if ( $source == 'score' ) {
				$survM = new Application_Model_JoScoresSurveillance();
				$item = $survM->find($siren);
				if ( $item === null ) {
					require_once 'Metier/scores/classMScores.php';
					calculIndiScore($siren, 0, false, 0);
				}
			}

			$where = "source='$source' AND login='$login' AND email='$email' AND siren=$siren AND nic=$nic AND ref='$ref'";
			$detect = $iDb->select('jo.surveillances_site', 'siren', $where, false, MYSQL_ASSOC);

			if ( count($detect)>0 ) {

			    //Si la donnée existe déjà et que la source=score alors il faut mettre à jour l'encours client
			    if ($source == 'score' && $detect[0]['dateSuppr']=='0000-00-00 00:00:00') {

			        $data = array (
			            'encoursClient' => $encoursClient,
			        );
			        $result = $iDb->update('jo.surveillances_site', $data, $where, false, 0, true);

			    } elseif ( $detect[0]['dateSuppr']!='0000-00-00 00:00:00') {

			        $data = array (
			            'dateAjout' => date('Y-m-d'),
			            'dateSuppr' => '0000-00-00 00:00:00',
			        );
			        $result = $iDb->update('jo.surveillances_site', $data, $where, false, 0, true);

			    }

			} else {

				$iInsee = new MInsee();
				$tabIdentite = $iInsee->getIdentiteLight($siren, $nic);

				$data = array(
					'source' => $source,
					'login' => $login,
					'email' => $email,
					'siren' => $siren,
					'nic' => $nic,
					'ref' => $ref,
					'encoursClient' => $encoursClient,
					'rs' => $tabIdentite['Nom'],
					'cp' => $tabIdentite['CP'],
					'ville' => $tabIdentite['Ville'],
					'dateAjout'=>date('Y-m-d'),
					'dateSuppr'=>0,
				);
				$result = $iDb->insert('jo.surveillances_site', $data, false, true);
			}
		}
		$output = new SetSurveillanceReturn();
		$output->result = $result;
		return $output;
	}

	/**
	 * getSurveillances
	 * @param 	SurveillancesFiltre $filtre
	 * @param 	integer $deb
	 * @param 	integer $nbRep
	 * @return 	SurveillancesReturn
	 */
	public function getSurveillances($filtre, $position=0, $nbRep=100)
	{
		$this->authenticate();
		//$this->permission('survliste');

		//Initialisation
		if (empty($position))	$position = 0;
		if (empty($nbRep))		$nbRep = 100;

		$error = new ErrorType();
		$tabRet = array();
		$siren = 0;
		$login = $this->User->login;

		$strSiren = "";
		if (!empty($filtre->item) && $filtre->itemMode == 'siren'){
			$siren = substr($filtre->item,0,9);
			$nic = substr($filtre->item,9,5);
			$strSiren = " AND siren='$siren'";
		} elseif (!empty($filtre->item) && $filtre->itemMode == 'search') {
		    $identifiant = trim($filtre->item);
            if (preg_match('/([0-9]{9})|([0-9]{3}\s[0-9]{3}\s[0-9]{3})/',$identifiant, $matches)){
                $identifiant = str_replace(' ', '', $identifiant);
                $strSiren = " AND ( siren='$identifiant' )";
            } else {
                $strSiren = " AND ( ref='$filtre->item' OR rs='$filtre->item' )";
            }
		}

		//Ordre pour le tri
		$triMode = strtoupper(trim($filtre->triMode));
		if ($triMode == 'DESC') {
			$triMode = 'DESC';
		} else {
			$triMode = 'ASC';
		}

		//Option de tri
		$tri = strtolower(trim($filtre->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
		}
		$orderBy = $orderBy.' '.$triMode;

		if ($filtre->detail) {
			$strSelect = 'source, email, LPAD(siren,9,0) AS siren, LPAD(nic,5,0) AS nic, ref, dateAjout, encoursClient, rs, cp, ville, dateDerEnvoi';
		} else {
			$strSelect = 'source, email, LPAD(siren,9,0) AS siren, LPAD(nic,5,0) AS nic, ref, dateAjout, dateDerEnvoi';
		}
		if ($filtre->source!='') 	$strSource = " AND source='$filtre->source' ";
		else 		 	 			$strSource = '';

		$iDb = new WDB();

		if ($filtre->source!='') {

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

			// Récupération des résultats
			$tabTmp = $iDb->select(
				'jo.surveillances_site', $strSelect,
				"login='$login' AND dateSuppr=0 $strSiren $strSource $orderBy LIMIT $position,$nbRep",
				false, MYSQL_ASSOC
			);

		} else {

			// Il faut compter le nombre de siren au total
			$tabTmp = $iDb->select(
				'jo.surveillances_site',
				'siren', "login='$login' AND dateSuppr=0 $strSiren GROUP BY siren",
				false, MYSQL_ASSOC
			);
			$nbRepTot = count($tabTmp);

			// Récupération des résultats
			if ($nbRepTot>0){
				$tabTmp = $iDb->select(
					'jo.surveillances_site',
					'siren', "login='$login' AND dateSuppr=0 $strSiren GROUP BY siren ORDER BY siren LIMIT $position,$nbRep",
					false, MYSQL_ASSOC
				);
				$listeSiren = array();
				foreach($tabTmp as $i => $v) {
					$listeSiren[] = $v['siren'];
				}
				$tabTmp = $iDb->select(
					'jo.surveillances_site', $strSelect,
					"login='$login' AND dateSuppr=0 AND siren IN (".join(',',$listeSiren).") $strSiren ORDER BY siren",
					false, MYSQL_ASSOC
				);
			}
		}

		if (count($tabTmp)>0)
		{
			//Tri pour avoir le nombre de réponse correct suivant la structure
			$listeRetour = array();
			foreach ($tabTmp as $i => $tabSurv)
			{
				$rs = '';
				$cp = '';
				$ville = '';
				$encoursClient = 0;
				if ($filtre->detail) {
				    $encoursClient = $tabSurv['encoursClient'];
					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('jo.surveillances_site', array(
							'rs'	=> $rs,
							'cp'	=> $cp,
							'ville'	=> $ville),
							"login='$login' AND dateSuppr=0 AND siren=".$tabSurv['siren']." AND nic=".$tabSurv['nic']." $strSource",
							false
						);
					}
				}

				$listeRetour[$tabSurv['siren']][] = array(
					'rs' 			=> $rs,
					'cp' 			=> $cp,
					'ville' 		=> $ville,
					'source' 		=> $tabSurv['source'],
					'email' 		=> $tabSurv['email'],
					'nic' 			=> $tabSurv['nic'],
					'ref' 			=> $tabSurv['ref'],
				    'encoursClient' => $encoursClient,
					'dateAjout'		=> $tabSurv['dateAjout'],
					'dateDerEnvoi' 	=> $tabSurv['dateDerEnvoi'],
				);
			}

			foreach ($listeRetour as $siren => $item)
			{
				$liste = new Surveillance();
				$liste->siren			= $siren;
				foreach($item as $s) {
					$source = new stdClass();
					$source->rs				= $s['rs'];
					$source->cp				= $s['cp'];
					$source->ville			= $s['ville'];
					$source->source			= $s['source'];
					$source->email			= $s['email'];
					$source->nic			= $s['nic'];
					$source->ref			= $s['ref'];
					$source->encoursClient	= $s['encoursClient'];
					$source->dateAjout		= $s['dateAjout'];			//@todo : date
					$source->dateDerEnvoi	= $s['dateDerEnvoi'];		//@todo : date
					$liste->sources[] 		= $source;
				}
				$tabRet[] = $liste;
			}
		}
		$output = new SurveillancesReturn();
		$output->nbReponses = count($tabRet);
		$output->nbReponsesTotal = $nbRepTot;
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Recherche par référence client
	 * @param string $search
	 * @param integer $position
	 * @param integer $nbRep
	 * @return SearchRefClientReturn
	 */
	public function searchRefClient($search, $position=0, $nbRep=20)
	{
		$this->authenticate();

		//Initialisation
		if (empty($position))	$position = 0;
		if (empty($nbRep))		$nbRep = 20;

		$iDb = new WDB();
		$login = $this->User->login;
		$orderBy = " ORDER BY dateAjout ASC";

		if ($this->User->rechRefType=='CLI'){
			//On cherche les logins actifs pour le client
			$idClient = $this->User->idClient;

			$where = "u.idClient='$idClient' AND u.actif=1 AND s.dateSuppr=0 AND ( s.siren='$search' OR s.ref='$search' OR s.rs='$search' )";
			// Il faut compter le nombre au total
			$tabTmp = $iDb->select('jo.surveillances_site s, sdv1.utilisateurs u', 'count(*) as nb', $where.$orderBy, false, MYSQL_ASSOC);
			$nbRepTot = $tabTmp[0]['nb'];

			// Execution de la requete
			$tabTmp = $iDb->select('jo.surveillances_site s, sdv1.utilisateurs u',
				"siren, nic, ref, source, login, email, DATE_FORMAT(dateAjout, '%Y-%m-%d') as dateAjout, DATE_FORMAT(dateDerEnvoi, '%Y-%m-%d') as dateEnvoi",
				$where.$orderBy." LIMIT $position,$nbRep", false, MYSQL_ASSOC);
		} else {
			$where = "login='$login' AND dateSuppr=0 AND ( siren='$search' OR ref='$search' OR rs='$search' )";
			// Il faut compter le nombre au total
			$tabTmp = $iDb->select('jo.surveillances_site', 'count(*) as nb', $where.$orderBy, false, MYSQL_ASSOC);
			$nbRepTot = $tabTmp[0]['nb'];

			// Execution de la requete
			$tabTmp = $iDb->select('jo.surveillances_site',
				"siren, nic, ref, source, login, email, DATE_FORMAT(dateAjout, '%Y-%m-%d') as dateAjout, DATE_FORMAT(dateDerEnvoi, '%Y-%m-%d') as dateEnvoi",
				$where.$orderBy." LIMIT $position,$nbRep", false, MYSQL_ASSOC);
		}

		$tabRet = array();
		if (count($tabTmp)>0)
		{
			foreach ($tabTmp as $i => $item)
			{
				$info = new SearchRefClientInfo();
				$info->ref = $item['ref'];
				$info->source = $item['source'];
				$info->login = $item['login'];
				$info->email = $item['email'];
				$info->dateAjout = $item['dateAjout'];
				$info->dateEnvoi = $item['dateEnvoi'];

				$iInsee = new MInsee();
				$tabIdentite = $iInsee->getIdentiteLight($item['siren'], $item['nic']);

				$reponse = new SearchRefClient();
				$reponse->id			= $tabIdentite['id'];
				$reponse->Siret			= $tabIdentite['Siret'];
				$reponse->Siege			= $tabIdentite['Siege'];
				$reponse->Nom			= prepareString(strtr($tabIdentite['Nom'],'/*','  '));
				$reponse->Nom2			= prepareString($tabIdentite['Nom2']);
				$reponse->Sigle			= prepareString($tabIdentite['Sigle']);
				$reponse->Enseigne		= prepareString($tabIdentite['Enseigne']);
				$reponse->Adresse		= prepareString($tabIdentite['Adresse']);
				$reponse->Adresse2		= prepareString($tabIdentite['Adresse2']);
				$reponse->CP			= $tabIdentite['CP'];
				$reponse->Ville			= prepareString($tabIdentite['Ville']);
				$reponse->Tel			= $tabIdentite['Tel'];
				$reponse->Fax			= $tabIdentite['Fax'];
				$reponse->FJ			= $tabIdentite['FJ'];
				$reponse->FJLib			= prepareString($tabIdentite['FJ_lib']);
				$reponse->Siren			= $tabIdentite['Siren'];
				$reponse->Nic			= $tabIdentite['Nic'];
				$reponse->Actif			= $tabIdentite['Actif'];
				$reponse->NafEtab		= $tabIdentite['NafEtab'];
				$reponse->NafEtabLib	= $tabIdentite['NafEtabLib'];
				$reponse->NafEnt		= $tabIdentite['NafEnt'];
				$reponse->NafEntLib		= $tabIdentite['NafEntLib'];
				$reponse->Infos = $info;
				$tabRet[] = $reponse;
			}
		}
		$output = new SearchRefClientReturn();
		$output->nbReponses = count($tabRet);
		$output->nbReponsesTotal = $nbRepTot;
		$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 AAAAMMJJ
	 * @param 	string $typeBilan 	N:Réel Normal, S:Réel Simplifié, C:Consolidé
	 * @param 	string $ref 		Référence S&D obligatoire
	 * @return 	Bilan
	 */
	public function getBilan($siren, $millesime, $typeBilan='N', $ref='')
	{
		$this->authenticate();
		$this->permission('liasse');

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

		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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$millesime = WDate::dateT('Ymd','d/m/Y',$millesime);
		$mBil = new MBilans($siren);
		$tabBilan = $mBil->getBilan($millesime, $typeBilan, $ref, true);

		// --- Bilan condidentiel


		// --- Génération du format pour le webservice
		$txtKey = array(
		    'SIREN',
		    'DATE_FRAICHE_BILAN',
			'DATE_CLOTURE',
		    'DATE_CLOTURE_PRE',
		    'DUREE_MOIS',
			'DUREE_MOIS_PRE',
		    'MONNAIE',
		    'CONSOLIDE',
		    'MONNAIE_ORI',
		    'MONNAIE_LIV_UNITE',
		    'SOURCE',
            'devise',
		    'ID_BILAN_SD',
		    'DATE_BILAN_SD',
		    'TOP_CONFIDENTIEL',
		);

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

		$this->wsLog('bilan',$siren, $millesime.':'.$typeBilan.':'.$ref);
		return $resultBilan;
	}

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

		//Initialisation
		$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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		$mBil = new MBilans($siren);
		$tabBilans = $mBil->listeBilans(true);
		foreach($tabBilans as $bilan) {
			$element = new ListeBilans();
			$element->dateProvPartenaire 	= $bilan['dateProvPartenaire'];		//@todo : date
			$element->dateInsert 		 	= $bilan['dateInsert'];				//@todo : date
			$element->typeBilan 			= $bilan['typeBilan'];
			$element->dureeExercice			= $bilan['dureeExercice'];
			$element->dateExercice			= $bilan['dateExercice'];			//@todo : date
			$element->millesime				= $bilan['millesime'];
			$element->dateExercicePre		= $bilan['dateExercicePre'];		//@todo : date
			$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__);
		$this->wsLog('listebilans', $siren);
		$output = new ListeBilansReturn();
		$output->nbReponses = count($tabRet);
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Informations date de cloture du dernier bilan et état de saisie
	 *
	 * @param string $siren
	 * @return LiasseInfos|null
	 */
	public function getLiasseInfos($siren)
	{
	    $this->authenticate();
	    //$this->permission('liasse');

	    //Check SIREN

	    //Lecture de la base de données
	    try {
    	    $bilansM = new Application_Model_JoGreffesBilans();
    	    $sql = $bilansM->select()
    	       ->where('siren=?', $siren)
    	       ->where('actif=1')
    	       ->order('date_cloture DESC')
    	       ->order('num_depot DESC')
    	       ->order('dateInsert DESC')
    	       ->limit(1);
    	    $row = $bilansM->fetchRow($sql);
	    } catch (Zend_Db_Exception $e) {
	        if ($this->User->idClient==1) {
	            throw new SoapFault('ERR', $e->getMessage());
	        } else {
	            throw new SoapFault('ERR', "Application error");
	        }
	    }

	    if ( $row === null ) {
	        return null;
	    }

        $liasseInfos = new LiasseInfos();
        $liasseInfos->Id = $row->id;
        $liasseInfos->BilanDateCloture = $row->date_cloture;

        switch ( $row->type_comptes ) {
            case '':
            case 'sociaux':
                $liasseInfos->BilanType = 'N';
                break;
            case 'consolides':
                $liasseInfos->BilanType = 'C';
                break;
        }

        $liasseInfos->SaisieDate = $row->saisie_date;
        $liasseInfos->SaisieCode = $row->saisie_code;
        switch ( $row->saisie_code ) {
        	case '00': $liasseInfos->SaisieLabel = "Bilan saisi sans anomalie"; break;
        	case '01': $liasseInfos->SaisieLabel = "Bilan saisi avec des incohérences comptables à la source du document (issues du remettant)"; break;
        	case '02': $liasseInfos->SaisieLabel = "Bilan avec Actif, Passif ou Compte de Résultat nul"; break;
        	case '03': $liasseInfos->SaisieLabel = "Bilan incomplet (des pages manquent)"; break;
        	case '04': $liasseInfos->SaisieLabel = "Bilan complet non détaillé (seuls les totaux et sous totaux sont renseignés)"; break;
        	case '05': $liasseInfos->SaisieLabel = "Bilan reçu en double exemplaire"; break;
        	case '06': $liasseInfos->SaisieLabel = "Bilan intermédiaire - Situation provisoire"; break;
        	case '07': $liasseInfos->SaisieLabel = "Bilan illisible"; break;
        	case 'A7': $liasseInfos->SaisieLabel = "Bilan illisible, présentant un cadre gris très foncés (dans lesquels sont inscrits en général les totaux)"; break;
        	case 'B7': $liasseInfos->SaisieLabel = "Bilan manuscrits"; break;
        	case 'C7': $liasseInfos->SaisieLabel = "Bilan illisible, présentant des caractères trop gras"; break;
        	case 'D7': $liasseInfos->SaisieLabel = "Bilan scanné en biais ou qui présentent des pages rognées"; break;
        	case 'E7': $liasseInfos->SaisieLabel = "Bilan numérisés trop clairement (comme une imprimante dont la cartouche est presque vide)"; break;
        	case 'F7': $liasseInfos->SaisieLabel = "Bilan illisible"; break;
        	case '08': $liasseInfos->SaisieLabel = "Bilan consolidé"; break;
        	case '09': $liasseInfos->SaisieLabel = "Déclaration d'impôts"; break;
        	case '10': $liasseInfos->SaisieLabel = "Document autre que bilan"; break;
        	case '11': $liasseInfos->SaisieLabel = "Bilan de clôture de liquidation"; break;
        	case '12': $liasseInfos->SaisieLabel = "Bilan de Société financière"; break;
        	case '13': $liasseInfos->SaisieLabel = "Bilan de Société d'assurance"; break;
        	case '14': $liasseInfos->SaisieLabel = "Bilan de Société immobilière"; break;
        	case '15': $liasseInfos->SaisieLabel = "Bilan de Société étrangère"; break;
        	default:   $liasseInfos->SaisieLabel = ""; break;
        }

        if ( $row->saisie_code != '00' ) {
            //Surcharge des codes de saisie
            $date = new Zend_Date($row->date_cloture, 'yyyy-MM-dd');
            try {
                $liasseM = new Application_Model_JoBilans();
                $sql = $liasseM->select()
                    ->where('siren=?', $siren)
                    ->where('typeBilan=?', $liasseInfos->BilanType)
                    ->where('dateExercice=?', $date->toString('yyyyMMdd'));
                $row = $liasseM->fetchRow($sql);
            } catch (Zend_Db_Exception $e) {
                //file_put_contents('debug.log', $e->getMessage()."\n", FILE_APPEND);
            }
            if ( $row !== null ) {
                $liasseInfos->SaisieDate = substr($row->dateProvPartenaire,0,4) .
                    '-' . substr($row->dateProvPartenaire,4,2) .
                    '-' . substr($row->dateProvPartenaire,6,2);
                $liasseInfos->SaisieCode = '00';
            }
        }

        return $liasseInfos;
	}

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

		//Initialisation
		$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__);
			$this->sendError('1010');
		}

		$iInsee = new MInsee();
		$entrep = $iInsee->sirenExiste($siren);
		if (empty($entrep)) {
			debugLog('W', "Siren $siren non présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$result = false;
		} else {
			debugLog('I', "Siren $siren présent en base", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$result = true;
		}
		$this->wsLog('sirenExiste',$siren);
		return $result;
	}

	/**
	 * 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();
		$this->permission('histobodacc');

		//Initialisation
		$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();

		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", false, MYSQL_ASSOC);
				} else {
					$res = $iDb->select('jo.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", false, MYSQL_ASSOC);
				}
				break;
			case 'ASSO':
				$res = $iDb->select('jo.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",
					false, MYSQL_ASSOC);
				break;
			case 'BALO':
				$res = $iDb->select('jo.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",
					false, MYSQL_ASSOC);
				break;
		}

		if (count($res)>0)
		{
			$iBodacc = new MBodacc();
			foreach ($res as $i => $etab)
			{
				$annonces = new AnnonceItem();
				$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'];			//@todo : date
				$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);
		$output = new RechercheAnnonceReturn();
		$output->criteres = $criteres;
		$output->nbReponses = $nbTot;
		$output->nbReponsesTotal = $nbTot;
		$output->result = $tabRet;
		return $output;
	}

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

		//Initialisation
		if (empty($page)) $page = 'ratios';

		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__);
			$this->sendError('1010');
		} elseif ($siren*1==0) {
			debugLog('W', "Siren $siren inexistant", __LINE__, __FILE__, __FUNCTION__, __CLASS__);
			$this->sendError('1010');
		}

		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'];

		$accesPartenaire = true;
		if (APPLICATION_ENV == 'development') {
		    $accesPartenaire = false;
		}

		$tabRatiosInfos = $tabRatiosSecteurs = $tabBilansR = array();
		$tabRatios = $tabRatiosEvol = array();
		$tabRet = array();

		/**
		 * Tableau d'infos sur les formules
		 */
		$tabFormules = include APPLICATION_PATH . '/../library/Metier/scores/Data/Formules.php';
		$tabBorneMin = $tabBorneMax = array();
		foreach ($tabFormules as $formule) {
		    $id = $formule['id']*1;
		    $libelle = $formule['libelle'];
		    $unite = $formule['unite'];
		    $commentaires = $formule['commentaires'];
		    $tabFormulesInfos[$id] = $formule; //Pour la gestion des unités des ratios secteur
		    $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'];
		}

		//Ratios
		$mBil = new MBilans($siren);
		$tabBilans = $mBil->listeBilans($accesPartenaire, 5);
		$nbBilans = count($tabBilans);
		$tabBilan = $tabBil = array();
		if ($nbBilans > 0) {
			$i = 0;
			foreach ($tabBilans as $millesime => $item) {
				if ( $item['typeBilan'] == 'N' ) {
					$tabBilan[] = $mBil->getBilan(substr($millesime, -10), substr($millesime, 0, 1));
					$i++;
				} elseif ( $item['typeBilan'] == 'S' ) {
					$tabN = $mBil->getBilan(substr($millesime, -10), substr($millesime, 0, 1));
					$tabS = $mBil->bilanSimplifie2Normal($tabN);
					$tabBilan[] = array_merge($tabN, $tabS);
					$i++;
				} elseif ( $item['typeBilan'] == 'C' ) {
					$tabBilan[] = $mBil->getBilan(substr($millesime, -10), substr($millesime, 0, 1));
					$i++;
				}
			}
			require_once 'Metier/scores/classMRatios.php';
			$mRatios = new MRatios();
		    $mRatios->setTrancheEffectif($efftr);
			$tabRatios = $mRatios->calcul($tabBilan);
		   	//file_put_contents('debug.log', print_r($tabRatios,1));
		}

		$nbRatios = count($tabRatios);
		debugLog('I',"Liste des Ratios demandée pour $siren après calculRatios ($nbRatios)",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$tabAnnees = array();
		if ( $nbRatios > 0 ) {
    		foreach ( $tabRatios as $i => $R ) {
    			//Informations sur le bilan
    			$bilansInfos = new RatiosBilansInfos();
    			$bilansInfos->dateCloture = $tabBilan[$i]['DATE_CLOTURE'];		//@todo : date
    			$bilansInfos->duree = $tabBilan[$i]['DUREE_MOIS'];
    			$bilansInfos->devise = $tabBilan[$i]['MONNAIE'];
    			$bilansInfos->typeBilan = $tabBilan[$i]['CONSOLIDE'];
    			$bilansInfos->unite = 'U';
    			if ( substr($tabBilan[$i]['DATE_CLOTURE'],0,4)>1900 ){
    				$tabAnnees[$i]=substr($tabBilan[$i]['DATE_CLOTURE'],0,4);
    			}

    			$tabRatiosEntrep = array();
    			$tabRatiosEntrepEvol = array();
    			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
    				$ratiosEntrep = new Ratios();
    				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);
    				}
    				$tabRatiosEntrep[] = $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'])) )
    				) {
    					if ($tabRatios[$i+1][$Ridx] == 0) {
    				        $Rmont = 'NS';
    					} else {
    					    $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'])) )
    				) {
                        if ($tabRatios[$i+2][$Ridx] == 0) {
    				        $Rmont = 'NS';
                        } else {
                            $Rmont = (($R[$Ridx]-$tabRatios[$i+2][$Ridx])*100)/abs($tabRatios[$i+2][$Ridx]);
                        }
    				} else {
    					$Rmont = 'NS';
    				}

    				// RatiosEntrepEvol
    				$ratiosEntrepEvol = new Ratios();
    				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,',',' ');
    				}
    				$tabRatiosEntrepEvol[] = $ratiosEntrepEvol;
    			}
    			$bilansInfos->RatiosEntrep = $tabRatiosEntrep;
    			$bilansInfos->RatiosEntrepEvol = $tabRatiosEntrepEvol;
    			$tabBilansR[] = $bilansInfos;
    		}
		}
		debugLog('I',"Liste des Ratios demandée pour $siren après EVOLUTION",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		// Tableau des ratios secteurs
		if (strlen($naf)>4)	$strNaf = " AND naf5='$naf' ";
		else				$strNaf = " AND naf4='$naf' ";
		$strAnnees = implode(',', $tabAnnees);

		$tabRatiosSecteurs = array();

		$tabAnnees = array_unique($tabAnnees);

		if ( count($tabAnnees)>0 ) {
			$iDb = new WDB();
			$tabTmp = $iDb->select('jo.ratios_secteurs',
				'annee, naf5, naf4, id, (montant/nombre) AS ratio, nombre',
				"1 $strNaf AND annee IN ($strAnnees) ORDER BY annee DESC, id ASC",
				false, MYSQL_ASSOC);

			$nbRatiosSec = 0;
			foreach($tabAnnees as $annee) {
				$ratiosSecteur = new RatiosSecteur();
				$ratiosSecteur->annee = $annee;
				foreach ($tabTmp as $tmp)
				{
					if ($tmp['annee']== $annee)
					{
						$Ridx = $tmp['id'];
						if ($tmp['nombre']>$nbRatiosSec){
							$nbRatiosSec = $tmp['nombre'];
						}

						$unite = $tabFormulesInfos[$Ridx]['unite'];
						if ($unite=='EUR'){
							$montant = round($tmp['ratio']*1000);
						} else {
							$montant = round($tmp['ratio']);
						}
						if ($tabBorneMin[$Ridx]<>'' && $montant<$tabBorneMin[$Ridx]){
							$montant='<'.$tabBorneMin[$Ridx];
						} elseif ($tabBorneMax[$Ridx]<>'' && $montant>$tabBorneMax[$Ridx]){
							$montant='>'.$tabBorneMax[$Ridx];
						}

						$ratiosSecteurListe = new Ratios();
						if (substr($montant,0,1)=='N' || substr($montant,0,1)=='<' || substr($montant,0,1)=='>'){
							$ratiosSecteurListe->id = 'r'.$Ridx;
							$ratiosSecteurListe->val = $montant;
						} else {
							$ratiosSecteurListe->id = 'r'.$Ridx;
							$ratiosSecteurListe->val = round($montant,2);
						}
						$ratiosSecteur->liste[] = $ratiosSecteurListe;
					}
				}
				$tabRatiosSecteurs[] = $ratiosSecteur;
			}
		}

		$output = new RatiosReturn();
		$output->Nom				= $tabIdentite['Nom'];
		$output->NafEnt				= $tabIdentite['NafEnt'];
		$output->NafEntLib			= $tabIdentite['NafEntLib'];
		$output->FJ					= $fj;
		$output->FJ_lib				= $tabIdentite['FJ_lib'];
		$output->Siren				= $siren;
		$output->NbEntNaf			= $nbRatiosSec;
		$output->BilansInfos		= $tabBilansR;
		$output->RatiosInfos		= $tabRatiosInfos;
		$output->RatiosSecteur		= $tabRatiosSecteurs;

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

	}

	/**
	 * getRapport
	 * @param string 	$siren		Siren de l'entreprise
	 * @param integer 	$niveau		Niveau du rapport 1, 2 ou 3
	 * @param integer 	$id			Identifiant interne S&D de l'entreprise
	 * @param boolean	$plus 		Si true, mise en surveillance privilèges
	 * @param string  	$ref		Si $plus=true, référence facultative de la mise en Surveillance
	 * @param integer 	$encours	Si $plus=true, encours facultatif Demandé par le client lors de la mise en Surveillance
	 * @param string  	$email		Si $plus=true, email facultatif pour le suivi
	 * @return Rapport
	 */
	public function getRapport($siren, $niveau=3, $id=0, $plus=false, $ref='', $encours=0, $email='')
	{
		$this->authenticate();
		if (empty($niveau)) $niveau = 3;
		if (empty($id))	$id = 0;
		$result = new Rapport();
		$filtre = 0;
		$idAnn = 0;

		//@todo : Gestion des droits
		$perm = false;
		switch($niveau){
			case 1: $perms = array('indiscore', 'indiscorep'); 		break;
			case 2: $perms = array('indiscore2', 'indiscore2p'); 	break;
			case 3: $perms = array('indiscore3', 'indiscore3p'); 	break;
		}
		foreach($perms as $item){
			if ( $this->checkPerm($item) ){
				$perm = true;
				break;
			}
		}
		if ($perm === false) {
			$this->sendError('0902');
		}

		$accesDist=true;
		$nivComment=2;
		if ($niveau==1){
			$result->Indiscore = $this->getIndiScore($siren, 0, $nivComment, $plus, $ref, $encours, $email);
		} elseif ($niveau==2) {
			$result->Identite = $this->getIdentite($siren, $id=0);
			$result->Indiscore = $this->getIndiScore($siren, 0, $nivComment, $plus, $ref, $encours, $email);
			$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);
			$result->Indiscore = $this->getIndiScore($siren, 0, $nivComment, $plus, $ref, $encours, $email);
			$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);
		}
		return $result;
	}

	/**
	 * Retourne la liste des banques connues pour une entreprise
 	 * @param string $siren Siren de l'entreprise
	 * @return BanquesReturn
	 **/
	public function getBanques($siren)
	{
		$this->authenticate();
		$this->permission('banque');

		//Initialisation
		$iDb = new WDB();
		$tabRet = array();
		debugLog('I',"Liste des banques demandée pour siren $siren",__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		if (intval($siren)<=1000) {
			$this->sendError('1010');
		}

		$res=$iDb->select('sdv1.banques', 'codeBanque, codeGuichet, libBanqueGuichet, precis, dateSource*1 AS dateSource', "siren=$siren", true, MYSQL_ASSOC);
		$tmp=$iDb->select('sdv1.fedRib', "codeBanque, codeGuichet, CONCAT(libBanque,' ',libGuichet) AS libBanqueGuichet, 0 AS precis, IF (dateInfo='0000-00-00', dateDispo*1, dateInfo*1) AS dateSource", "siren=$siren", true, MYSQL_ASSOC);
		$res=array_merge($res, $tmp);
		foreach ($res as $tabBanque)
		{
			$dateSource = $tabBanque['dateSource'];
			$codBanque = $tabBanque['codeBanque'];
			$codGuichet = $tabBanque['codeGuichet'];
			$libBanque = trim($tabBanque['libBanqueGuichet']);
			$found = false;
			$adrBanque1=$adrBanque2=$adrBanqueCP=$adrBanqueVille='';

			if ( $codBanque>0 && $codGuichet>0 ) {
				$tmp = $iDb->select('insee.BDF_Etabs b, insee.BDF_Guichets g',
					'g.bdfFibCodeEtab AS banque, g.bdfFibCodeGuichet AS guichet, b.bdfFibDenom40 AS nomBanque, b.bdfFibDenom10 AS sigleBanque, g.bdfFibDenom20 AS nomGuichet, g.bdfFibAdresse1 AS adresse1, g.bdfFibAdresse2 AS adresse2, g.bdfFibAdresse3 AS adresse3, g.CP, g.Ville', "g.bdfFibCodeEtab=$codBanque AND g.bdfFibCodeGuichet=$codGuichet AND b.bdfFibCodeEtab=g.bdfFibCodeEtab",
					true, MYSQL_ASSOC);
				if (count($tmp)>0) {
					$found = true;

					$banque = new Banque();
					$banque->codeBanque = $codBanque;
					$banque->codeGuichet = $codGuichet;
					$banque->libBanque = trim($tmp[0]['nomBanque'].' '.$tmp[0]['nomGuichet']);
					$banque->adresse1 = $tmp[0]['adresse1'];
					$banque->adresse2 = trim($tmp[0]['adresse2'].' '.$tmp[0]['adresse3']);
					$banque->cp = $tmp[0]['CP'];
					$banque->ville = $tmp[0]['Ville'];
					$tabRet[] = $banque;
				}
			}

			if ($found===false && $codBanque>0 ) {
				$tmp = $iDb->select('insee.BDF_Etabs', "bdfFibCodeEtab AS banque, '' AS guichet, bdfFibDenom40 AS nomBanque, '' AS nomGuichet, '' AS adresse1, '' AS adresse2, '' AS adresse3, '' AS CP, '' AS Ville", "bdfFibCodeEtab=$codBanque", true, MYSQL_ASSOC);
				if (count($tmp)>0) {
					$banque = new Banque();
					$banque->codeBanque = $codBanque;
					$banque->codeGuichet = $codGuichet;
					$banque->libBanque = trim($tmp[0]['nomBanque'].' '.$tmp[0]['nomGuichet']);
					$banque->adresse1 = $tmp[0]['adresse1'];
					$banque->adresse2 = trim($tmp[0]['adresse2'].' '.$tmp[0]['adresse3']);
					$banque->cp = $tmp[0]['CP'];
					$banque->ville = $tmp[0]['Ville'];
					$tabRet[] = $banque;
				}
			}

		}
		debugLog('I',"Liste des banques pour siren $siren : ".count($tabRet).' banques',__LINE__,__FILE__, __FUNCTION__, __CLASS__);

		$this->wsLog('banque', $siren);
		$output = new BanquesReturn();
		$output->result = $tabRet;
		return $output;
	}

	/**
	 * Retourne la liste des compétences territoriales pour un établissement à une adresse donnée.
	 * @param string $siret		Siret de l'établissement
	 * @param string $type		Type de compétence (pre:prefectures et s/prefectures, jal;journaux d'annonces légales, tri:tribunaux, adm:administrateurs et mandataires judiciaires, hui:huissiers, cfe:centres de formalités des entreprises)
	 * @param string $codeInsee	Code Insee de la commune de l'établissement
	 * @return ListeCompetencesReturn
	 */
	public function getListeCompetences($siret, $type, $codeInsee)
	{
		$this->authenticate();
		$this->permission('competences');

		//Initialisation
		$error = new ErrorType();
		$type = strtolower($type);

		debugLog('I',"Liste des compétences $type demandée pour la commune $codeInsee",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		$tabRet = array();
		$iBodacc = new MBodacc();
		$cp=$codeInsee*1;
		$dep=false;
		if (substr($codeInsee,0,2)=='2A' || substr($codeInsee,0,2)=='2B')
		{
			$dep=20;	$cp=20000+(substr($codeInsee,2,3))*1;
		}
		elseif ($cp>0 && $cp<100)			$dep=$cp;
		elseif ($cp>970 && $cp<977)			$dep=$cp;
		elseif ($cp>999 && $cp<10000)		$dep='0'.substr($cp,0,1);
		elseif ($cp>=10000 && $cp<96000)	$dep=substr($cp,0,2);
		elseif ($cp>=99000)					$dep=substr($cp,0,2);
		elseif ($cp>=98000)					$dep=substr($cp,0,3);
		elseif ($cp>=97100 && $cp<97700)	$dep=substr($cp,0,3);

		if ($type=='pre') {

			$iDb = new WDB();
			$tabTmp2 = $iDb->select('jo.villes', 'DEP, COM, AR, CT', 'codeInsee='.$codeInsee, false, MYSQL_ASSOC);
			$arrond = $tabTmp2[0]['AR'];

			$tabTmp2 = $iDb->select('insee.insee_tabArrond', 'CHEFLIEU, ARTMAJ, NCC', "DEP='$dep' AND AR='$arrond'", false, MYSQL_ASSOC);
			$nomSousPref = trim(strtr($tabTmp2[0]['ARTMAJ'],array('('=>'',')'=>'',' '=>'', "'"=>'')).' '.$tabTmp2[0]['NCC']);

			$tabTmp = $iBodacc->getTribunauxParDep($dep);

			foreach ($tabTmp as $i=>$tribunal)
			{
				if ($tribunal['triType']=='A' || $tribunal['triType']=='B')
				{
					$pref = levenshtein($tribunal['triNom'], 'PREFECTURE DE '.$nomSousPref);
					$spref = levenshtein($tribunal['triNom'], 'SOUS PREFECTURE DE '.$nomSousPref);

					if ($tribunal['triType']=='B' && ($pref>7 || $spref>5))	continue;

					$competence = new Competence();
					$competence->Id = $tribunal['triId'];
					$competence->IdSup = $tribunal['triIdSup'];
					$competence->Code = $tribunal['triCode'];
					$competence->Type = $tribunal['triType'].$typeP;
					$competence->Nom = strtoupper($tribunal['triNom']);
					$competence->Siret = $tribunal['triSiret'];
					$competence->Adr = strtoupper(
						preg_replace('/ +/',' ',$tribunal['triAdrNum'].' '.
							$tribunal['triAdrIndRep'].' '.
							$tribunal['triAdrTypeVoie'].' '.
							$tribunal['triAdrVoie']));
					$competence->AdrComp = strtoupper($tribunal['triAdrComp']);
					$competence->CP = $tribunal['triCP'];
					$competence->Ville = strtoupper($tribunal['triVille']);
					$competence->CodeInsee = $tribunal['CodeInsee'];
					$competence->Tel = $tribunal['triTel'];
					$competence->Fax = $tribunal['triFax'];
					$competence->Web = $tribunal['triWeb'];
					$competence->Mail = $tribunal['triMail'];
					$competence->Statut = $tribunal['triStatut'];
					$competence->DateCessation = $tribunal['triDateCessation'];		//@todo : date
					$competence->Remarque = $tribunal['triCommentaire'];
					$tabRet[] = $competence;

				}
			}

		} elseif ($type=='jal') {

			$tabTmp = $iBodacc->getJALparDep($dep);
			foreach ($tabTmp as $i=>$comp)
			{
				$infos='';
				if (trim($comp['parution'])<>'')	$infos.='Parution '.$comp['parution'].'. ';
				if (trim($comp['aboAnnuel'])>0)		$infos.='Abonnement Annuel : '.$comp['aboAnnuel'].' euros. ';
				if (trim($comp['infos'])<>'')	$infos.=$comp['infos'];

				$competence = new Competence();
				$competence->Id = 9000+$comp['id']*1;
				$competence->IdSup = 0;
				$competence->Code = '';
				$competence->Type = '';
				$competence->Nom = strtoupper($comp['nomJal']);
				$competence->Siret = '';
				$competence->Adr = strtoupper($comp['adresse']);
				$competence->AdrComp = '';
				$competence->CP = $comp['cp'];
				$competence->Ville = strtoupper($comp['ville']);
				$competence->CodeInsee = '';
				$competence->Tel = $comp['tel'];
				$competence->Fax = $comp['fax'];
				$competence->Web = $comp['siteWeb'];
				$competence->Mail = $comp['email'];
				$competence->Statut = 'Actif';
				$competence->DateCessation = '';
				$competence->Remarque = trim($infos);
				$tabRet[] = $competence;
			}

		} elseif ($type=='tri' || $type=='adm' || $type=='hui') {

			$tabTmp = $iBodacc->getTribunauxParCommune($codeInsee);
			foreach ($tabTmp as $i=>$tribunal)
			{
				if (//$tribunal['triType']=='C' ||
					$tribunal['triType']=='G'// ||
					/*$tribunal['triType']=='I'*/) {
						$idCA = $tribunal['triIdSup'];
						$codeTGI = $tribunal['triCode'];
						$code = strtoupper(substr($tribunal['triCode'],0,3));
				}
				debugLog('D',"Liste des compétences $type demandée pour la commune $codeInsee ($dep) : ".
					"Type=".$tribunal['triType'].', '.
					"Code=".$tribunal[$codeTGI],__LINE__,__FILE__, __FUNCTION__, __CLASS__);

				if ($tribunal['triType']<>'E' && $tribunal['triType']<>'O' &&
					$tribunal['triType']<>'T' && $tribunal['triType']<>'R' &&
					$tribunal['triType']<>'N' && $tribunal['triType']<>'U' &&
					$tribunal['triType']<>'Z')
				{
					$competence = new Competence();
					$competence->Id = $tribunal['triId'];
					$competence->IdSup = $tribunal['triIdSup'];
					$competence->Code = $tribunal['triCode'];
					$competence->Type = $tribunal['triType'];
					$competence->Nom = strtoupper(Scores_Locale_String::cleanstring($tribunal['triNom']));
					$competence->Siret = $tribunal['triSiret'];
					$competence->Adr = strtoupper(Scores_Locale_String::cleanstring(preg_replace('/ +/',' ',
						$tribunal['triAdrNum'].' '.
						$tribunal['triAdrIndRep'].' '.
						$tribunal['triAdrTypeVoie'].' '.
						$tribunal['triAdrVoie'])));
					$competence->AdrComp = strtoupper($tribunal['triAdrComp']);
					$competence->CP = $tribunal['triCP'];
					$competence->Ville = strtoupper($tribunal['triVille']);
					$competence->CodeInsee = $tribunal['CodeInsee'];
					$competence->Tel = $tribunal['triTel'];
					$competence->Fax = $tribunal['triFax'];
					$competence->Web = $tribunal['triWeb'];
					$competence->Mail = $tribunal['triMail'];
					$competence->Statut = $tribunal['triStatut'];
					$competence->DateCessation = $tribunal['triDateCessation'];		//@todo : date
					$competence->Remarque = $tribunal['triCommentaire'];
					if ($tribunal['triNumGreffe']*1>0)
					{
						$competence->IdentifiantGreffe = $tribunal['triNumGreffe'];
					}
					$tabRet[] = $competence;
				}
			}
		}

		if ($type=='adm')
		{
			$iInsee = new MInsee();
			$tabTmp = $iInsee->getMandataires(array($idCA), false);
			$tabRet = array();
			$nbAff=0;
			foreach ($tabTmp as $i=>$tribunal)
			{ /** @todo A revoir Debut **/
				if (stripos($tribunal['tribunal'], $code)!==false ||
					stripos($tribunal['tribunal'], 'SAINT')!==false)
				{
					$competence = new Competence();
					$competence->Id = $tribunal['id'];
					$competence->IdSup = $tribunal['sirenGrp'];
					$competence->Code = $tribunal['tribunal'].'/'.$code;
					$competence->Type = $tribunal['type'];
					$competence->Nom = $tribunal['Nom'].' '.$tribunal['Prenom'];
					$competence->Siret = $tribunal['sirenMand'];
					$competence->Adr = strtoupper($tribunal['adresse']);
					$competence->AdrComp = strtoupper($tribunal['adresseComp']);
					$competence->CP = $tribunal['cp'];
					$competence->Ville = strtoupper($tribunal['ville']);
					//'CodeInsee'=>$tribunal['CodeInsee'],
					$competence->Tel = $tribunal['tel'];
					$competence->Fax = $tribunal['fax'];
					$competence->Web = $tribunal['web'];
					$competence->Mail = $tribunal['email'];
					$competence->Statut = $tribunal['Statut'];
					//'DateCessation'=>$tribunal['triDateCessation'],
					$competence->Remarque = $tribunal['contact'];
					//,,,,Prenom,,,Statut,,,cp,ville,tel,fax,email,web,contact
					$tabRet[] = $competence;
					$nbAff++;
				}
			}
			if ($nbAff==0)
			{
				foreach ($tabTmp as $i=>$tribunal)
			  	{
					$competence = new Competence();
			  		$competence->Id = $tribunal['id'];
					$competence->IdSup = $tribunal['sirenGrp'];
					$competence->Code = $tribunal['tribunal'].'/'.$code;
					$competence->Type = $tribunal['type'];
					$competence->Nom = $tribunal['Nom'].' '.$tribunal['Prenom'];
					$competence->Siret = $tribunal['sirenMand'];
					$competence->Adr = strtoupper($tribunal['adresse']);
					$competence->AdrComp = strtoupper($tribunal['adresseComp']);
					$competence->CP = $tribunal['cp'];
					$competence->Ville = strtoupper($tribunal['ville']);
					//'CodeInsee'=>$tribunal['CodeInsee'],
					$competence->Tel = $tribunal['tel'];
					$competence->Fax = $tribunal['fax'];
					$competence->Web = $tribunal['web'];
					$competence->Mail = $tribunal['email'];
					$competence->Statut = $tribunal['Statut'];
					//'DateCessation'=>$tribunal['triDateCessation'],
					$competence->Remarque = $tribunal['contact'];
					//,,,,Prenom,,,Statut,,,cp,ville,tel,fax,email,web,contact
					$tabRet[] = $competence;
			  	}
			}/** @todo A revoir Fin : Lier correctement les mandataires à un TI principal **/
		}
		elseif ($type=='hui')
		{
			$iInsee = new MInsee();
			$tabTmp = $iInsee->getHuissiers(array($codeTGI), false);

			$tabRet = array();
			$nbAff = 0;
			foreach ($tabTmp as $i=>$tribunal)
			{
				$adr = $iInsee->structureVoie($tribunal['adresse']);
				$competence = new Competence();
				$competence->Id = $tribunal['id'];
				$competence->IdSup = $tribunal['sirenGrp'];
				$competence->Code = $tribunal['tribunal'].'/'.$code;
				$competence->Type = $tribunal['type'];
				$competence->Nom = $tribunal['Nom'].' '.$tribunal['Prenom'];
				$competence->Siret = $tribunal['sirenMand'];
				$competence->Adr = strtoupper($adr['num'].' '.$adr['adr_btq'].' '.
												$adr['typeVoie'].' '.$adr['libVoie']);
				$competence->AdrComp = strtoupper($tribunal['adresseComp']);
				$competence->CP = $adr['cp'];
				$competence->Ville = strtoupper($tribunal['ville']);
				//'CodeInsee'=>$tribunal['CodeInsee'],
				$competence->Tel = $tribunal['tel'];
				$competence->Fax = $tribunal['fax'];
				$competence->Web = $tribunal['web'];
				$competence->Mail = $tribunal['email'];
				$competence->Statut = $tribunal['Statut'];
				//'DateCessation'=>$tribunal['triDateCessation'];
				$competence->Remarque = strtr($tribunal['contact'],
									array(	'<br/>'=>', ',	'<br>'=>', ',
											'<br />'=>', ',
									 ));
				$tabRet[] = $competence;
			}
			$nbComp = count($tabTmp);
			debugLog('I',"$nbComp compétences $type trouvées pour le tribunal $codeTGI",__LINE__,__FILE__, __FUNCTION__, __CLASS__);
		}
		elseif ($type=='cfe')
		{
			$tabTmp = $iBodacc->getTribunauxParCommune($codeInsee);
			foreach ($tabTmp as $i=>$tribunal)
			{
				if ($tribunal['triType']=='C' || $tribunal['triType']=='O' ||
					$tribunal['triType']=='T' || $tribunal['triType']=='R' ||
					$tribunal['triType']=='N' || $tribunal['triType']=='U' ||
					$tribunal['triType']=='Z')
				{
					if (strlen($tribunal['triCommentaire'])==32 &&
						strpos($tribunal['triCommentaire'], ' ')===false)
						 $remarque='';
					else $remarque=$tribunal['triCommentaire'];

					$competence = new Competence();
					$competence->Id = $tribunal['triId'];
					$competence->IdSup = $tribunal['triIdSup'];
					$competence->Code = $tribunal['triCode'];
					$competence->Type = $tribunal['triType'];
					$competence->Nom = strtoupper($tribunal['triNom']);
					$competence->Siret = $tribunal['triSiret'];
					$competence->Adr = strtoupper(preg_replace('/ +/',' ',$tribunal['triAdrNum'].' '.$tribunal['triAdrIndRep'].' '.
											$tribunal['triAdrTypeVoie'].' '.$tribunal['triAdrVoie']));
					$competence->AdrComp = strtoupper($tribunal['triAdrComp']);
					$competence->CP = $tribunal['triCP'];
					$competence->Ville = strtoupper($tribunal['triVille']);
					$competence->CodeInsee = $tribunal['CodeInsee'];
					$competence->Tel = $tribunal['triTel'];
					$competence->Fax = $tribunal['triFax'];
					$competence->Web = $tribunal['triWeb'];
					$competence->Mail = $tribunal['triMail'];
					$competence->Statut = $tribunal['triStatut'];
					$competence->DateCessation = $tribunal['triDateCessation'];		//@todo : date
					$competence->Remarque = $remarque;
					$tabRet[] = $competence;
				}
		  	}
		}
		$this->wsLog('competences',$siret,$type.'/'.$codeInsee);
		$output = new ListeCompetencesReturn();
		$output->result = $tabRet;
		$output->nbReponses = count($tabRet);
		return $output;
	}

	/**
	 * Liste des subventions
	 * @param string $companyId
	 * 	SIREN
	 * @param string $type
	 * 	Type de subvention reçues (IN) ou versées (OUT)
	 * @param int $offset
	 * @param int $nbItems
	 * @throws SoapFault
	 * @return SubventionList[]
	 */
	public function getSubventionList($companyId, $type = null, $offset = 0, $nbItems = 100)
	{
		$this->authenticate();

		//Init
		if ( intval($companyId) == 0 ) {
			$this->sendError('1010');
		} elseif ( strlen($companyId)!=9 ) {
			$this->sendError('1020');
		}
		if ( empty($offset) ) { $offset = 0; }
		if ( empty($nbItems) || $nbItems > 100 ) { $nbItems = 100; }
		if ( !empty($type) ) { $type = strtoupper($type); }

		//SQL
		$listM = new Application_Model_JoAssoSubventions();
		$countsql = $listM->select()->from($listM, array('COUNT(*) AS num'));
		$sql = $listM->select()->from($listM, array(
				'id',
				'millesime', //Annee
				'sirenAsso', //sirenIn
				'nomAsso',
				'sirenOrigine', //sirenOut
				'libOrigine', //Origine
				'libImputation', //Programme
				'mtSubvention', //Montant
 		));

		//Subvention reçues => sirenAsso = companyId
		if ($type == 'IN') {
			$sql->where('sirenAsso=?', $companyId);
			$countsql->where('sirenAsso=?', $companyId);
		}
		//Subvention reçues => sirenOrigine = companyId
		elseif ($type == 'OUT') {
			$sql->where('sirenOrigine=?', $companyId);
			$countsql->where('sirenOrigine=?', $companyId);
		}
		//All
		else {
			$sql->where('sirenAsso=?', $companyId)
				->orWhere('sirenOrigine=?', $companyId);
			$countsql->where('sirenAsso=?', $companyId)
					->orWhere('sirenOrigine=?', $companyId);
		}
		$sql->order('millesime DESC')->limit($nbItems, $offset);

		$count = $listM->fetchRow($countsql);
		$nbReponsesTotal = 0;
		if ( $count!==null ) {
			$nbReponsesTotal = $count->num;
		}

		if ( $nbReponsesTotal != 0 ) {

			$rows = $listM->fetchAll($sql);

			$output = new SubventionList();
			$output->nbReponsesTotal = $nbReponsesTotal;
			$result = array();

			if ( $rows !== null ) {
				foreach ( $rows as $row ) {

					$item = new Subvention();
					$item->Id = $row->id;
					if ( $row->sirenAsso == $companyId ) {
						$item->Type = 'IN';
					} elseif ( $row->sirenOrigine == $companyId ) {
						$item->Type = 'OUT';
					}
					$item->Millesime = $row->millesime;
					$item->AssoSiren = $row->sirenAsso;
					$item->AssoNom = $row->nomAsso;
					$item->OrigineSiren = $row->sirenOrigine;
					$item->OrigineLib = $row->libOrigine;
					$item->Programme  = $row->libImputation;
					$item->Montant = $row->mtSubvention;

					$result[] = $item;
				}
				$output->result = $result;
				$this->wsLog('subventionlist', $companyId);
			}

		}

		return $output;
	}

	/**
	 * Détail d'une subvention
	 * @param int $id
	 * @throws SoapFault
	 * @return SubventionDetail
	 */
	public function getSubventionDetail($id)
	{
		$this->authenticate();

		$subventionM = new Application_Model_JoAssoSubventions();
		$row = $subventionM->find($id);

		if (null === row) {
			throw new SoapFault('MSG', "Aucun résultat");
		}

		$data = $row->current();

    	$item = new SubventionDetail();
    	$item->Millesime = $data->millesime;
    	$item->Budget = $data->typeBudget;
    	$item->AssoSiren = $data->sirenAsso;
    	$item->AssoNom = $data->nomAsso;
    	$item->OrigineSiren = $data->sirenOrigine;
    	$item->OrigineLib = $data->libOrigine;
    	$item->Programme  = $data->libImputation;
    	$item->Montant = $data->mtSubvention;
		$item->SubventionObjet = $data->objetSubvention;
		$item->SubventionEval = $data->evalSubvention;
		$item->Mission = $data->mission;

		$this->wsLog('subventiondetail', $item->AssoSiren, 'id:'.$id);

		return $item;
	}

	/**
	 * 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();
		if (!$db) {
			$error->statusCode = 9000;
			$error->statusMsg = $this->listError['9000'];
		} else {
			$error->statusCode = 3000;
			$error->statusMsg = $this->listError['3000'];
		}
		return $error;
	}

}

?>