<?php
/**
 * Diffusion Insee Spécifique A6CMO
 * - Executer tous les lundi
 * - Lire la tables des prestations de type A6CMO, récupérer les paramètres et le numéro d'incrément de fichier
 *
 * Options d'execution à paramètrer dans la base
 * nomClient                => Libellé du client pour la prestation
 * typePrestation           => diffusionInsee
 * (prestaActive            => depuis paramètres)
 * (clientIdentifiant       => Code prestation, depuis paramètres)
 * clientNumTourFichier     => Numéro de tour du fichier pour le client
 * nbBilansMax              => Nombre de bilans max
 * typeLigneBilan           => 401
 * CodeCom                  => Liste des codes communes séparés par des virgules
 * CJ                       =>
 * CJEx                     => Liste des CJ séparés par des virgules
 * NAF                      =>
 * NAFEx                    => Liste des NAF séparés par des virgules
 * freqenvois               => Fréquence des envois H:Hebdo, M=Mensuel, Q=Quotidien
 * mailTo                   => Liste des emails séparés par des virgules
 * EOL                      => Linux : LF (\n), Windows CRLF (\r\n)
 */

error_reporting(E_ALL ^ E_STRICT ^ E_NOTICE ^ E_WARNING ^ E_DEPRECATED);

// --- Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// --- Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// --- Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

// --- Use classmap autoloader - useful with opcode and realpath cache
require_once 'Zend/Loader/AutoloaderFactory.php';
require_once 'Zend/Loader/ClassMapAutoloader.php';
Zend_Loader_AutoloaderFactory::factory(array(
    'Zend_Loader_ClassMapAutoloader' => array(
        __DIR__ . '/../library/autoload_classmap.php',
    ),
    'Zend_Loader_StandardAutoloader' => array(
        'prefixes' => array(
            'Zend'          => __DIR__ . '/../library/Zend',
            'Application'   => __DIR__ . '/../library/Application',
            'Scores'        => __DIR__ . '/../library/Scores',
            'SdMetier'      => __DIR__ . '/../library/SdMetier',
            'Metier'        => __DIR__ . '/../library/Metier',
        ),
        'fallback_autoloader' => true
    )
));

//  ---Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

// --- Options
try {
    $opts = new Zend_Console_Getopt(array(
        'help|?'        => "Displays usage information.",
        'debug'         => "Debuggage, genere un fichier test.",
        'cron'          => "Execution par cron, automatique",
        'liste|l'       => "Affichage de la liste des prestations",
        'stock|s'       => "Generation du stock",
        'date=s'        => "Depuis la date AAAAMMDD[HHIISS]",
        'presta|p=s'    => "Execution de la prestation id",
        'force|f'       => "Forcer l'execution",
        'nomail'        => "Ne pas envoyer l'email",
    ));
    $opts->parse();
} catch (Zend_Console_Getopt_Exception $e) {
    echo $e->getUsageMessage();
    exit;
}

// --- Usage
if( isset($opts->help) || count($opts->getOptions())==0 )
{
    echo "Production de Stock/Diffusion des bases A6CMO (ce traitement ce lance automatiquement pour les diffusions le lundi).\n";
    echo $opts->getUsageMessage();
    exit;
}

require_once APPLICATION_PATH.'/configs/config.php';
require_once 'framework/fwk.php';
require_once 'framework/common/chiffres.php';
require_once 'framework/common/dates.php';
require_once 'framework/mail/sendMail.php';
require_once 'Metier/bodacc/classMBodacc.php';
require_once 'Metier/insee/classMInsee.php';
//require_once 'Metier/conversion/bilAltares.php';
require_once 'Metier/partenaires/classMRnvp.php';



$c = new Zend_Config($application->getOptions());
$db = Zend_Db::factory($c->profil->db->metier);
Zend_Db_Table_Abstract::setDefaultAdapter($db);

// --- Liste des paramètres
$defineParams = array(
    'nomClient',
    'typePrestation',
    'clientIdentifiant',
    'clientNumTourFichier',
    'nbBilansMax',
    'typeLigneBilan',
    'CodeCom',
    'CJ',
    'CJEx',
    'NAF',
    'NAFEx',
    'freqenvois',
    'mailTo',
    'EOL'
);

// --- Liste des prestations : CLIENT | PRESTATION | ACTIVE
if ($opts->liste) {
    $prestaM = new Application_Model_Sdv1ClientsPresta();
    $prestaSql = $prestaM->select(true)->setIntegrityCheck(false)
                    ->join('sdv1.clients', 'clients_presta.clientId = clients.id', array('nom'))
                    ->where('clients_presta.type=?', 'a6cmo');
    $prestaResult = $prestaM->fetchAll($prestaSql);
    if (count($prestaResult) == 0) {
        echo date('Y-m-d H:i:s')." - Aucune prestation.\n";
    } else {
        foreach ($prestaResult as $p) {
            echo $p->code;
            echo "\t";
            if ($p->actif==1) {
                echo "ACTIF";
            } else {
                echo "INACTIF";
            }
            echo "\t";
            echo $p->label;
            echo "\t";
            echo $p->nom;
            echo "\n";
        }
    }
    exit;
}


// --- Liste des prestations pour execution
$prestaM = new Application_Model_Sdv1ClientsPresta();
$prestaSql = $prestaM->select(true)->setIntegrityCheck(false)
                ->join('sdv1.clients', 'clients_presta.clientId = clients.id', array('nom'))
                ->where('clients_presta.type=?', 'a6cmo');
$prestaResult = $prestaM->fetchAll($prestaSql);
if (count($prestaResult) == 0) {
    echo date('Y-m-d H:i:s')." - Aucune prestation.\n"; exit;
}

$tabPresta = array();
foreach ($prestaResult as $p) {
    $tabPresta[$p->code] = $p;
}

// --- Cron : Liste des prestations actives + execution
if ($opts->cron) {

}
// --- Execution prestation unitaire
elseif ($opts->presta) {
    if (array_key_exists($opts->presta, $tabPresta)) {
        $tabPresta = array($opts->presta => $tabPresta[$opts->presta]);
    } else {
        echo date('Y-m-d H:i:s')." - Prestation inconnue\n";
    }
}
// --- Stop
else {
    echo date('Y-m-d H:i:s')." - Aucune execution...\n";
}

$tabProduction = array();
$tTime = array();

// --- Execution
foreach($tabPresta as $prestaId => $prestaDetail) {
    echo date('Y-m-d H:i:s')." - Prestation ".$prestaId."\n";

    // --- Définition des paramètres par defaut
    foreach ($defineParams as $d) {
        ${'Option'.ucfirst($d)} = null;
    }
    $OptionEOL = "\n";
    $OptionFreqenvois = 'H';

    // --- Lire les paramètres de la prestation
    $paramsM = new Application_Model_Sdv1ClientsPrestaParams();
    $paramsSql = $paramsM->select()->where('code=?', $prestaId);
    $paramsResult = $paramsM->fetchAll($paramsSql);
    if (count($paramsResult) == 0) {
        echo date('Y-m-d H:i:s')." - Aucun paramètres.\n";
        continue;
    } else {
        // --- Un paramètre est enregistré dans une variable $Option{Name}
        foreach ($paramsResult as $p) {
            if (in_array($p->name, $defineParams)) {
                ${'Option'.ucfirst($p->name)} = trim($p->value);
            }
        }
    }

    // --- Tableau de valeur
    $tabFJ = array();
    if ($OptionCJ !== null) {
        $tabFJ = explode(',', $OptionCJ);
    }
    $tabFJexclus = array();
    if ($OptionCJEx !== null) {
        $tabFJexclus = explode(',', $OptionCJEx);
    }
    $tabNAF = array();
    if ($OptionNAF !== null) {
        $tabNAF = explode(',', $OptionNAF);
    }
    $tabNAFexclus = array();
    if ($OptionNAFEx !== null) {
        $tabNAFexclus = explode(',', $OptionNAFEx);
    }
    $tabDepCom = array();
    if ($OptionCodeCom !== null) {
        $tabDepCom = explode(',', $OptionCodeCom);
    }

    $prestaActive = $prestaDetail->actif;

    // --- Lire la dernière execution
    $execM = new Application_Model_Sdv1PrestaOut();
    $execSql = $execM->select()
                ->where('code=?', $prestaId)
                ->where('dateEnd!="0000-00-00 00:00:00"')
                ->order('dateEnd DESC')->limit(1);
    $execResult = $execM->fetchRow($execSql);
    $dateLastExec = false;
    if ($execResult !== null) {
        $dateLastExec = new Zend_Date($execResult->dateEnd, Zend_Date::ISO_8601);
    }
    $dateNow  = new Zend_Date();

    // --- Surcharge date
    if (strlen($opts->date) == 8) {
        $dateLastExec = new Zend_Date($opts->date, 'yyyyMMdd');
    } elseif (strlen($opts->date) == 14) {
        $dateLastExec = new Zend_Date($opts->date, 'yyyyMMddHHmmss');
    }

    // --- Livraison d'un stock
    if ($opts->stock) {

    }
    // --- Suivi
    elseif (!$opts->force) {
        // --- Est ce que la prestation doit s'executer... freqenvois ?
        // Fréquence Mensuelle : le 1er lundi du mois
        if ($OptionFreqenvois == 'M') {
            if ($dateNow->get(Zend_Date::DAY_SHORT) < 8 && $dateNow->get(Zend_Date::WEEKDAY_DIGIT) == 1) {
                if ($dateLastExec === false) {
                    $dateLastExec = $dateNow;
                    $dateLastExec->subDay(31);
                }
            } else {
                echo date('Y-m-d H:i:s')." - Pas d'execution ce jour.\n";
                continue;
            }
        }
        // Fréquence Hebdomadaire (par défaut) : le lundi
        elseif ($OptionFreqenvois == 'H') {
            if ($dateNow->get(Zend_Date::WEEKDAY_DIGIT) == '1') {
                if ($dateLastExec === false) {
                    $dateLastExec = $dateNow;
                    $dateLastExec->subDay(7);
                }
            } else {
                echo date('Y-m-d H:i:s')." - Pas d'execution ce jour.\n";
                continue;
            }
        }
        // Fréquence Quotidienne : du lundi au vendredi
        elseif ($OptionFreqenvois == 'Q') {
            if (in_array($dateNow->get(Zend_Date::WEEKDAY_DIGIT), array(1,2,3,4,5))) {
                if ($dateLastExec === false) {
                    $dateLastExec = $dateNow;
                    $dateLastExec->subDay(1);
                }
            } else {
                echo date('Y-m-d H:i:s')." - Pas d'execution ce jour.\n";
                continue;
            }
        }
    }

    // Si pas de date
    if ($dateLastExec === false) {
        echo date('Y-m-d H:i:s')." - Pas de date.\n";
        continue;
    }
    $dateDebut = $dateLastExec->toString('yyyy-MM-dd HH:mm:ss');

    if (!defined('VERSION_FICHIER_IDENTITE'))
        define('VERSION_FICHIER_IDENTITE','0106');

    $tLibFreq = array(
        'Q' => 'Quotidien',
        'H' => 'Hebdo',
        'M' => 'Mensuel'
    );

    $iDb = new WDB();
    $iInsee = new MInsee($iDb);
    $iBodacc = new MBodacc($iDb);
    $iRnvp = new MRnvp();

    $dateDeb = date('YmdHis');

    $file = $OptionTypePrestation.'_'.$prestaId.'_'.$dateDeb.'.txt';
    $filepath = $c->profil->path->storage . '/clients/A6CMO/'.$file;

    if (empty($opts->debug)) {
        $suiviM = new Application_Model_Sdv1PrestaOut();
        $suiviId = $suiviM->insert(array(
            'code' => $prestaId,
            'dateStart' => $dateDeb,
        ));
    }

    // --- Ligne d'entete
    $str =  initstr('001',                           3, '0', ALIGN_RIGHT). // Type de ligne
    initstr($dateDeb,                               14                  ). // Date de génération du fichier
    initstr($OptionClientNumTourFichier,            10, '0', ALIGN_RIGHT). // Numéro de tour du fichier pour le client
    initstr($prestaId,                              36                  ). // Identifiant Client
    initstr($OptionTypePrestation,                  32                  ). // Type de prestation
    initstr(VERSION_FICHIER_IDENTITE,                4                  ). // Type de prestation
    initstr(FILLER,                               1901                  ). // FILLER
    '';

    // --- Ecriture fichier
    $isWrite = file_put_contents($filepath, initstr($str,LONGUEUR_LIGNE_SORTIE).$OptionEOL);
    if ($isWrite === false) {
        echo date('Y-m-d H:i:s')." - Impossible d'écrire le fichier $filepath\n";
        continue;
    }
    $nbLignes = 1;

    $tabProduction[$prestaId]['nomClient']  = $OptionNomClient;
    $tabProduction[$prestaId]['dateDeb']    = $dateDeb;
    $tabProduction[$prestaId]['dateRetro']  = $dateLastExec->toString('yyyy-MM-dd hh:ii:ss');
    $tabProduction[$prestaId]['frequence']  = $OptionFreqenvois;
    $timeDeb = microtime(true);

    if (count($tabFJ)>0 && $tabFJ[0]<>'') {
        $strFJ =' AND cj IN('.implode(',',$tabFJ).') ';
    } elseif (count($tabFJexclus)>0 && $tabFJexclus[0]<>'') {
        $strFJ =' AND cj NOT IN('.implode(',',$tabFJexclus).') ';
    } else {
        $strFJ ='';
    }

    if (count($tabNAF)>0 && $tabNAF[0]<>'') {
        $strNAF=" AND ape_etab IN('".implode("','",$tabNAF)."') ";
    } elseif (count($tabNAFexclus)>0 && $tabNAFexclus[0]<>'') {
        $strNAF=" AND ape_etab NOT IN('".implode("','",$tabNAFexclus)."') ";
    } else {
        $strNAF ='';
    }

    $strDepCom=$strDepComStock='';
    foreach ($tabDepCom as $idepcom=>$depcom) {
        /** @todo Vérifier si les DOM fonctionnent **/
        if ($idepcom==0) {
            $strDepCom.="AND (";
            $strDepComStock.="AND (";
        }
        $strDepCom.="(insDEPET IN ('".substr($depcom,0,2)."','0".substr($depcom,0,2)."'";
        $strDepComStock.="(adr_dep IN ('".substr($depcom,0,2)."','0".substr($depcom,0,2)."'";
        if (substr($depcom,0,2)>96)	{
            $strDepCom.=",'".substr($depcom,0,3)."'";
            $strDepComStock.=",'".substr($depcom,0,3)."'";
        }
        $strDepCom.=") ";		$strDepComStock.=") ";
        if (substr($depcom,2,3)*1==0)	$depSeul=true;
        else {
            $depSeul=false;
            $strDepCom.="AND insCOMET=".substr($depcom,2,3);
            $strDepComStock.="AND adr_com=".substr($depcom,2,3);
            // On test si il y a présence d'un code rivoli séparé par un point "."
            if (substr($depcom,5,1)=='.') {
                $strDepCom.=" AND insCODEVOIE LIKE '".substr($depcom,6,4)."%'";
                $strDepComStock.=" AND rivoli LIKE '".substr($depcom,6,4)."%'";
            }
        }
        $strDepCom.=") ";	$strDepComStock.=") ";
        if (isset($tabDepCom[$idepcom+1]))		{ $strDepCom.=' OR ';	$strDepComStock.=' OR '; }
        elseif (trim(substr($depcom,3,2))<>'')	{ $strDepCom.=')';		$strDepComStock.=')';	 }
        elseif ($depSeul)						{ $strDepCom.=')';		$strDepComStock.=')';	 }
    }


    if ($opts->stock) {
        echo date('Y-m-d H:i:s') ." - Sélection du stock pour '$OptionNomClient' (dernier $OptionFreqenvois le $dateDebut)\n";
    } else {
        echo date('Y-m-d H:i:s') ." - Sélection de la cible $OptionFreqenvois pour '$OptionNomClient' depuis $dateDebut...\n";
    }

    if ($opts->stock) {
        $field = 'siren, nic';
        $table = 'etablissements_old';
        $where = "source=2 AND actif=1 AND siege IN (0,1) $strDepComStock $strFJ $strNAF";
        $etab = $iDb->select($table, $field, $where, false, MYSQL_ASSOC);
        if ($iDb->getLastErrorNum() == 1146) {
            // Table don't exist ?
            $table = 'etablissements';
            $etab = $iDb->select($table, $field, $where, false, MYSQL_ASSOC);
        }
    }
    else {
        $strFJ = str_replace(' cj ',' insCJ ', $strFJ);
        $strNAF = str_replace(' ape_etab ',' insAPET700 ', $strNAF);
        $field = 'LPAD(insSIREN,9,0) AS siren, LPAD(insNIC,5,0) AS nic,
		insDESTINAT, insEVE, insDATEVE, insTYPETAB, insSIRETPS, insSIRETASS, MAX(insMNICSIEGE) AS insMNICSIEGE, MAX(insMNOMEN) AS insMNOMEN, MAX(insMCJ) AS insMCJ,
		MAX(insMAPEN) AS insMAPEN, MAX(insMENSEIGNE) AS insMENSEIGNE, MAX(insMAPET) AS insMAPET, MAX(insMADRESSE) AS insMADRESSE, MAX(insMAUXILT) AS insMAUXILT,
		MAX(insMSIGLE) AS insMSIGLE, MAX(insMEXPLEN) AS insMEXPLEN, MAX(insMEXPLET) AS insMEXPLET, insDREACTET, insDREACTEN';
        $table = 'insee.insee_even';
        $where = "1 $strDepCom $strFJ $strNAF AND dateInsert>='$dateDebut' AND (insVMAJ NOT IN ('I','F') OR insVMAJ2=1 OR insVMAJ3=1) GROUP BY insSIREN, insNIC";
        $etab = $iDb->select($table, $field, $where, false, MYSQL_ASSOC);
    }

    echo "SELECT $field FROM $table WHERE $where;";
    echo date('Y-m-d H:i:s')." - ".$iDb->getLastErrorMsg()."\n";
    $nbEtab = count($etab);
    echo date('Y-m-d H:i:s')." - Nombre d'établissement en sortie : ".$nbEtab."\n";

    if (empty($opts->debug)) {
        $suiviM->update(array('unitTotal' => $nbEtab), 'id='.$suiviId);
    }
    //@todo :

    $tabProduction[$prestaId]['nbEtabs']=$nbEtab;
    $unit = 0;
    $nbLignes200 = $nbLignesBil = 0;
    foreach ($etab as $lSiret)
    {
        $unit++;

        // Réinitialisation de zones
        $ev_EVE=$ev_TYPETAB=$ev_DESTINAT='';
        $ev_SIRETLIE=$ev_SIRETLIETYPE=$ev_MNICSIEGE=$ev_MNOMEN=$ev_MCJ=$ev_MAPEN=$ev_DREACTEN=$ev_DATEFEREN=$ev_DATEVE=0;
        $ev_MENSEIGNE=$ev_MAPET=$ev_MADRESSE=$ev_MAUXILT=$ev_MSIGLE=$ev_MEXPLEN=$ev_MEXPLET=0;

        $siren=$lSiret['siren'];
        $nic=$lSiret['nic'];
        $t1=microtime(1);
        $a=$iInsee->getIdentiteEntreprise($siren, $nic);
        $t2=microtime(1);
        $tTime['Identite']+=$t2-$t1;
        $b=$iInsee->getInfosNotice($siren, $nic);
        $t3=microtime(1);
        $tTime['Notice']+=$t3-$t2;
        $c=$iInsee->getAdresse($siren, $nic);
        $t4=microtime(1);
        $tTime['Adresse']+=$t4-$t3;

        echo date ('Y/m/d - H:i:s')." - Entité $unit/$nbEtab - Siret $siren $nic\n";

        if ($opts->stock === null) {
            $ev_EVE=trim($lSiret['insEVE']);
            // Conversion de sirene4 en sirene3
            switch($ev_EVE) {
                case 'CE':			// Création établissement
                case 'CC':			// Création par le calage
                    $ev_EVE=130;	// Création de l'établissement
                    break;
                case 'CS':			// Création siège
                    $ev_EVE=110;	// Création de l'entreprise
                    break;
                case 'SU':			// Cessation juridique
                    $ev_EVE=410;	// Cessation juridique de l'entreprise
                    break;
                case 'O':			// Sortie du champ de la diffusion commerciale
                    $ev_EVE=795;	// Personne radiée à sa demande de de la base SIRENE diffusion
                    break;
                case 'RI':			// Refus d'immatriculation au RCS
                    $ev_EVE=810;	// Suppression du SIREN suite au refus d'inscription au RCS
                    break;
                case 'I':			// Entrée dans le champ de la diffusion commerciale
                    $ev_EVE=125;	// Réactivation de l'entreprise suite à une mise à jour du répertoire SIRENE
                    break;
                case 'RE':			// Réactivation établissement
                    $ev_EVE=145;	// Reprise d'activité de l'établissement suite à une mise à jour du répertoire SIRENE
                    break;
                case 'RS':			// Réactivation siège
                    $ev_EVE=120;	// Réactivation de l'entreprise
                    break;
                case 'SE':			// Fermeture (ou désactivation) établissement
                    $ev_EVE=430;	// Fermeture de l'établissement
                    break;
                case 'SS':			// Fermeture (ou désactivation) siège
                    $ev_EVE=425;	// Absence d'activité d'une entreprise suite à une mise à jour au répertoire SIRENE
                    break;
                case 'MC':			// Modification par le calage
                    $ev_EVE=781;	// Modification de l'établissement suite à correction d'erreur
                    break;
                case 'SC':			// Suppression par le calage
                    $ev_EVE=435;	// Fermeture de l'établissement suite à une mise à jour au répertoire SIRENE
                    break;
                case 'ME':			// Modification établissement
                    $ev_EVE=780;	// Modification de l'établissement
                    break;
                case 'MS':			// Modification siège
                    $ev_EVE=610;	// Modification d'activité au niveau du SIREN associé à une activation économique par adjonction de moyens de production
                    break;
                case 'MU':			// Modification entreprise
                    $ev_EVE=631;	// Modification d'activité du SIREN
                    break;
                case 'MTDE':		// Modification établissement départ (transfert)
                case 'MTAE':		// Modification établissement arrivée (transfert)
                case 'MTDS':		// Modification siège départ (transfert)
                case 'MTAS':		// Modification siège arrivée (transfert)
                    $ev_EVE=540;	// Modification de l'établissement d'arrivée et modification de l'établissement de départ dans le cadre d'un transfert
                    break;
                case 'CTE':			// Création établissement (transfert)
                case 'CTS':			// Création siège (transfert)
                    $ev_EVE=520;	// Création de l'établissement d'arrivée et modification de l'établissement de départ dans le cadre d'un transfert
                    break;
                case 'STE':			// Fermeture établissement (transfert)
                case 'STS':			// Fermeture siège (transfert)
                    $ev_EVE=530;	// Modification de l'établissement d'arrivée et cessation de l'établissement de départ dans le cadre d'un transfert
                    break;
                default:
                    $ev_EVE=substr($ev_EVE,0,3);
                    break;
            }
            $ev_DATEVE=$lSiret['insDATEVE'];
            $ev_TYPETAB=$lSiret['insTYPETAB'];
            $ev_DESTINAT=$lSiret['insDESTINAT'];
            switch($ev_EVE*1) {
                case 410:
                case 420:
                case 425:
                    $ev_DATEFEREN=substr(strtr($ev_DATEVE,array('-'=>'',':'=>'')),0,8);
                    break;
            }
            $ev_SIRETLIE=$lSiret['insSIRETPS']*1;
            if ($ev_SIRETLIE<1000) {
                $ev_SIRETLIE=$lSiret['insSIRETASS']*1;
                if ($ev_SIRETLIE<1000)	$ev_SIRETLIETYPE='';
                else					$ev_SIRETLIETYPE='A';
            } else
                $ev_SIRETLIETYPE='P';
            $ev_MNICSIEGE=$lSiret['insMNICSIEGE'];
            $ev_MNOMEN=$lSiret['insMNOMEN'];
            $ev_MCJ=$lSiret['insMCJ'];
            $ev_MAPEN=$lSiret['insMAPEN'];
            $ev_MENSEIGNE=$lSiret['insMENSEIGNE'];
            $ev_MAPET=$lSiret['insMAPET'];
            $ev_MADRESSE=$lSiret['insMADRESSE'];
            $ev_MAUXILT=$lSiret['insMAUXILT'];
            $ev_MSIGLE=$lSiret['insMSIGLE'];
            $ev_MEXPLEN=$lSiret['insMEXPLEN'];
            $ev_MEXPLET=$lSiret['insMEXPLET'];
            $ev_DREACTEN=$lSiret['insDREACTEN'];
        }

        $tmp = $iDb->select('jo.etablissements_act', 'bilType, bilAnnee, bilTca, bilFL', "siren=$siren LIMIT 0,1", false, MYSQL_ASSOC, false);
        if (count($tmp)>0) {
            $tcaSED=$tmp[0]['bilTca'];
            $tcaSEDtype=$tmp[0]['bilType'];
            $tcaSEDannee=$tmp[0]['bilAnnee'];
            $tcaSEDmt=$tmp[0]['bilFL'];
        } else {
            $tcaSED=' ';
            $tcaSEDtype='I';
            $tcaSEDannee='0000';
            $tcaSEDmt=0;
        }

        // @todo : Forcage pour idclient=3 nimes metropole !!!
        if ($prestaId=='DIFINSPRDFTSA6CMONIMESMETRO' && $tcaSED<>' ')	$a['TrancheCA']=$tcaSED;

        $tabRnvp=$iRnvp->getAdresseRnvpSource(2, $a['SourceId']);
        $codeRnvp=$tabRnvp['CQAdrRnvp']*1;
        if ($codeRnvp>0) {
            $L1rnvp=strtr($tabRnvp['L1rnvp'],'/*','  ');
            $L2rnvp=$tabRnvp['L2rnvp'];
            $L3rnvp=$tabRnvp['L3rnvp'];
            $L4rnvp=$tabRnvp['L4rnvp'];
            $L5rnvp=$tabRnvp['L5rnvp'];
            $L6rnvp=$tabRnvp['L6rnvp'];
            $L7rnvp=$tabRnvp['L7rnvp'];
        } elseif (trim($a['L1_NOMEN'])<>'' && trim($a['L4_VOIE'])<>'' && trim($a['L6_POST'])<>'') {
            // On prend l'adresse RNVP origine INSEE (Syracuse)
            $L1rnvp=strtr($a['L1_NOMEN'],'/*','  ');
            $L2rnvp=$a['L2_COMP'];
            $L3rnvp=$a['L3_CADR'];
            $L4rnvp=$a['L4_VOIE'];
            $L5rnvp=$a['L5_DISP'];
            $L6rnvp=$a['L6_POST'];
            $L7rnvp=$a['L7_ETRG'];
        } else {
            // Historique Insee Notice 80
            $L1rnvp=strtr($c['L1_NOM'],'/*','  ');
            $L2rnvp=$c['L2_NOM2'];
            $L3rnvp=$c['L3_ADRCOMP'];
            $L4rnvp=$c['L4_VOIE'];
            $L5rnvp=$c['L5_DISTSP'];
            $L6rnvp=$c['L6_POST'];
            $L7rnvp=$c['L7_PAYS'];
        }

        // 1 (3) : Obligatoire	CODE_ENTETE	Ligne de description structurée de l'identité
        $str = initstr(200,                 3) .
        // 4 (10) : Obligatoire	ID	Numéro unique d'identification interne d'un établissement S&D
        initstr($a['SourceId'],             10	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	SIREN	Siren de l'entreprise
        initstr($siren,                     9	, '0', ALIGN_RIGHT) .
        // 14 (5) : Obligatoire	NIC	Nic de l'établissement
        initstr($nic,                       5	, '0', ALIGN_RIGHT) .
        // 14 (3) : Obligatoire	SOURCE	Source de la fiche d'identité
        initstr($a['Source'],               3	, '0', ALIGN_RIGHT) .
        // 14 (1) : Obligatoire	SIRETVALIDE	Siren/siret valide
        initstr($iInsee->valideSiren($siren,$nic),	1	, '0', ALIGN_RIGHT) .
        // 14 (10) : Facultatif	NUMRCS	Numéro de Registre du Commerce et des Sociétés
        initstr($a['numRC'],                10	) .
        // 14 (6) : Facultatif	TRIBUNAL	Identifiant du Tribunal
        initstr($a['Tribunal'],             6	) .
        // 14 (9) : Obligatoire	DATEMAJ	Date de la dernière mise à jour dans la base S&D
        initstr(str_replace('-', '', $a['dateMajIdentite']),	8	, '0', ALIGN_RIGHT) .                                // @todo : Erreur date 20150730 vs 20150803 ?
        // 14 (9) : Obligatoire	ACTIF	Établissement juridiquement actif
        initstr($a['Actif'],                1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	ACTIFECO	Établissement économiquement actif
        initstr($a['ActifEco'],             1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	SITJUR	Situation Juridique de l'entreprise
        initstr($a['SituationJuridique'],	2	) .
        // 14 (9) : Facultatif	EVE	Dernier événement Insee recensé
        initstr($ev_EVE,                    3	) .
        // 14 (9) : Facultatif	DATEVE	Date du dernier événement Insee recensé
        initstr(str_replace('-','', $a['DateMajINSEE']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TYPETAB	Type d'établissement concerné par l'événement
        initstr($ev_TYPETAB,                2	) .
        // 14 (9) : Obligatoire	SIEGE	Établissement siège, secondaire ou principal
        initstr($a['Siege'],                1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	NOM	Raison Sociale
        initstr($a['Nom'],                  160	) .                                                                     // @todo : pas de raison sociale sur certaines entités
        // 14 (9) : Facultatif	NOMCOM	Nom commercial
        initstr($a['NomCommercial'],        160	) .
        // 14 (9) : Facultatif	ENSEIGNE	Enseigne de l'établissement
        initstr($a['Enseigne'],             80	) .
        // 14 (9) : Facultatif	SIGLE	sigle de l'entreprise
        initstr($a['Sigle'],                40	) .
        // 14 (9) : Facultatif	ADR_NUMVOIE	Numéro dans la voie
        initstr($a['AdresseNum'],           4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ADR_BTQ	Indicateur de répétition (Bis, Ter, etc...)
        initstr($a['AdresseBtq'],           1	) .
        // 14 (9) : Facultatif	ADR_TYPVOIE	Type de voie
        initstr($a['AdresseVoie'],          4	) .
        // 14 (9) : Obligatoire	ADR_LIBVOIE	Libellé de la voie
        initstr($a['AdresseRue'],           32	) .
        // 14 (9) : Obligatoire	ADR_LIBCOM	Commune
        initstr($a['Ville'],                32	) .
        // 14 (9) : Obligatoire	ADR_CP	Code postal
        initstr($a['CP'],                   5	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ADR_COMP	Complément d'adresse
        initstr($a['Adresse2'],             38	) .
        // 14 (9) : Facultatif	ADR_DISTSP	Distribution spéciale
        initstr('',                         38	) .
        // 14 (9) : Facultatif	PAYS	Pays
        initstr($a['Pays'],                 38	) .
        // 14 (9) : Facultatif	PAYSISO2	Code Pays au format ISO2
        initstr($a['PaysIso2'],             2	) .
        // 14 (9) : Obligatoire	ADR_DEP	Département de l'établissement
        initstr($a['Dept'],                 2	) .
        // 14 (9) : Obligatoire	ADR_COM	Code commune de l'établissement
        initstr($a['codeCommune'],          3	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	CODEVOIE	Code voie de l'établissement
        initstr(str_replace(' ', '', $a['Rivoli']),	5	) .
        // 14 (9) : Facultatif	CODEIRIS	Code Iris de l'établissement
        initstr($a['codIris'],              4	) .
        // 14 (9) : Facultatif	CODEILOT	Code Ilot de l'établissement
        initstr('',                         5	) .
        // 14 (9) : Facultatif	ADRESSEDOM	Indicateur d'adresse de domiciliation
        initstr($a['AdresseDom'],           1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TEL	Numéro de téléphone
        initstr($a['Tel'],                  15	) .                                                                      // @todo : Différence dans les téléphones ou absent
        // 14 (9) : Facultatif	FAX	Numéro de télécopie
        initstr($a['Fax'],                  15	) .
        // 14 (9) : Facultatif	WEB	Site Web
        initstr($a['Web'],                  80	) .
        // 14 (9) : Facultatif	MAIL	Adresse Email de contact générique
        initstr($a['Mail'],                 80	) .                                                                      // @todo : Absence email
        // 14 (9) : Facultatif	AUXILT	Auxiliarité de l'activité de l'établissement
        initstr($a['Auxiliaire'],           1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	SAISONAT	Saisonnalité de l'établissement
        initstr($a['Saisonnalite'],	        1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ACTIVNAT	Nature de l'activité de l'établissement
        initstr($a['NatureActivite'],       2	, '0', ALIGN_RIGHT) .
        // P 922 - L 2 : Facultatif	ORIGINE	Origine de la création de l'établissement
        initstr($a['OrigineCreation'],      2	) .                                                                       // @todo : aberrant 2 cas
        // 14 (9) : Facultatif	TYPEXPLOIT	Type d'exploitation
        initstr($a['TypeExploitation'],     2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	LIEUACT	Lieu de l'activité de l'établissement
        initstr($a['LIEUACT'],              2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ACTISURF	Type de magasin
        initstr($a['ACTISURF'],             2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	PRODPART	Participation particulière à la production de l'établissement
        initstr($a['PRODPART'],             1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ARRONET	Arrondissement de l'établissement
        initstr($b['insARRONET'],           2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	CTONET	Canton
        initstr($b['insCTONET'],            3	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TCD	Tranche de commune détaillée
        initstr($b['insTCD'],               2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ZEMET	Zone d'emploi
        initstr($b['insZEMET'],             2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DU	Département de l'unité urbaine de localisation
        initstr($b['insDU'],                2	) .
        // 14 (9) : Facultatif	TU	Taille de l'unité urbaine
        initstr($b['insTU'],                1	) .
        // 14 (9) : Facultatif	UU	Numéro de l'untié urbaine
        initstr($b['insUU'],                2	) .
        // 14 (9) : Facultatif	DCRET	Date de création de l'établissement
        initstr(str_replace('-', '', $a['DateCreaEt']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	APE_ETAB	Code activité dans la NAF rév2 de l'établissement
        initstr($a['NafEtab'],              5	) .
        // 14 (9) : Facultatif	NACE_ETAB	Code activité NACE de l'établissement
        initstr($a['NaceEtab'],         5	) .
        // 14 (9) : Facultatif	DAPET	Année de validité de l'activité principale de l'établissement
        initstr(0,                      4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	EFF_ET	Effectif de l'établissement
        initstr($a['EffectifEtab'],	    7	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TEFF_ET	Tranche d'effectif de l'établissement
        initstr($a['EffEtTr'],          2	) .
        // 14 (9) : Facultatif	DEFET	Année de mise à jour de l'effectif établissement
        initstr($a['AnneeEffEt'],       4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	MODET	Modalité de l'activité pricipale de l'établissement
        initstr('',                     1	) .
        // 14 (9) : Facultatif	EXPLET	Etablissement exploitant tout ou partie des moyens de production
        initstr($a['EXPLET'],           1	) .
        // 14 (9) : Facultatif	RPET	Région de localisation de l'établissement
        initstr($b['insRPET'],          2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DREACTET	Date de réactivation de l'établissement
        initstr(str_replace('-','',0),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DATEFERET	Date de fermeture de l'établissement
        initstr(str_replace('-','',0),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	EAEANT	Année de validité des rubriques de niveau Etab provenant des EAE*
        initstr($b['insEAEANT'],	4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	EAEAPET	Activité principale de l'établissement issue des EAE
        initstr($b['insEAEAPET'],	5	) .
        // 14 (9) : Facultatif	EAESEC1T	Activité secondaire de l'établissement issue des EAE
        initstr($b['insEAESEC1T'],	5	) .
        // 14 (9) : Facultatif	EAESEC2T	Autre activité secondaire de l'établissement issue des EAE
        initstr($b['insEAESEC2T'],	5	) .
        // 14 (9) : Facultatif	DCREN	Date de création de l'entreprise
        initstr(str_replace('-','',$a['DateCreaEn']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Obligatoire	APE_ENT	Code activité dans la NAF rév2 de l'entreprise
        initstr($a['NafEnt'],	5	) .
        // 14 (9) : Facultatif	NACE_ENT	Code activité NACE de l'entreprise
        initstr($a['NaceEnt'],	5	) .
        // 14 (9) : Facultatif	DAPEN	Année de validité de l'activité principale de l'entreprise
        initstr(0,	4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	EFF_ENT	Effectif de l'entreprise
        initstr($a['Effectif'],	7	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TEFF_ENT	Tranche d'effectif de l'entreprise
        initstr($a['EffEnTr'],	2	) .
        // 14 (9) : Facultatif	DEFEN	Année de mise à jour de l'effectif entreprise
        initstr($a['AnneeEffEn'],	4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	MODEN	Modalité de l'activité pricipale de l'entreprise
        initstr($a['MODEN'],	1	) .
        // 14 (9) : Facultatif	EXPLEN	Entreprise exploitant tout ou partie des moyens de production
        initstr($a['EXPLEN'],	1	) .
        // 14 (9) : Facultatif	RPEN	Région de localisation du siège de l'entreprise
        initstr($b['insRPEN'],	2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DREACTEN	Date de réactivation de l'entreprise
        initstr(str_replace('-','',$ev_DREACTEN),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DATEFEREN	Date de fermeture de l'entreprise
        initstr(str_replace('-','',$ev_DATEFEREN),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DATEIMMAT	Date d'immatriculation de l'entreprise au RCS
        initstr(str_replace('-','',$a['dateImmat']),8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	DATERAD	Date de radiation de l'entreprise du RCS
        initstr(str_replace('-','',$a['dateRad']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	CAPITAL	Montant du capital de l'entreprise
        initstr($a['Capital'],	15	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	CAPITALTYPE	Type de capital
        initstr($a['CapitalType'],	1	) .
        // 14 (9) : Facultatif	CAPITALDEV	Devise du capital
        initstr($a['CapitalDev'],	3	) .
        // P 1109 - L 4 : Obligatoire, CJ Catégorie Juridique de l'entreprise
        initstr($a['FJ'],           4	, '0', ALIGN_RIGHT) .                                                                   // @todo non definie
        // 14 (9) : Facultatif	CIVILITE	Civilité de l'entreprise si Personne Physique
        initstr($a['Civilite'],     1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	NBETAB	Nombre d'établissements actifs de l'entreprise
        initstr($a['NbEtab'],       4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TCA	Tranche de chiffre d'affaire
        initstr($a['TrancheCA'],	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	TCAEXP	Tranche de chiffre d'affaire à l'export
        initstr($a['TrancheCAexp'],	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	APRM	Activité principale au registre des métiers
        initstr($a['APRM'],         6	) .
        // 14 (9) : Facultatif	MONOREG	Mono-régionalité de l'entreprise
        initstr($a['MONOREG'],      1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	REGIMP	Principale région d'implantation de l'entreprise
        initstr($a['REGIMP'],       2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	MONOACT	Mono-activité de l'entreprise
        initstr($a['MONOACT'],      1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	NICSIEGE	Nic de l'établissement siège
        initstr(substr($a['SiretSiege'],-5),	5	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	RECME	Répertoire des Entreprises Contrôlées Majoritairement par l'État
        initstr($a['RECME'],        1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	SIRETLIE	Siret lié : prédécesseur, successeur, doublon, autre
        initstr($ev_SIRETLIE,	14	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	SIRETLIETYPE	Type de sitet lié
        initstr($ev_SIRETLIETYPE,	1) .
        // 1151 (5) : Facultatif	NICPREC	Nic de l'établissement prédécesseur (dans le cadre d'un transfert)
        initstr($a['AutreSiret']['pre']['nic'],	5	, '0', ALIGN_RIGHT) .                                                 // @todo non definie
        // 14 (9) : Facultatif	NICSUIV	Nic de l'établissement successeur (dans le cadre d'un transfert)
        initstr($a['AutreSiret']['suc']['nic'],	5	, '0', ALIGN_RIGHT) .                                                 // @todo non definie
        // 14 (9) : Facultatif	insDESTINAT	Destination Insee
        initstr($ev_DESTINAT,	2	) .
        // 14 (9) : Facultatif	insDEPCOMEN	Code commune Insee du siège de l'entreprise
        initstr($b['insDEPCOMEN'],	5	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMNICSIEGE	Indicateur de MAJ du NIC SIEGE
        initstr($ev_MNICSIEGE,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMNOMEN	Indicateur de MAJ de la Raison Sociale
        initstr($ev_MNOMEN,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMCJ	Indicateur de MAJ de la Forme Juridique
        initstr($ev_MCJ,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMAPEN	Indicateur de MAJ du NAF entreprise
        initstr($ev_MAPEN,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMENSEIGNE	Indicateur de MAJ de l'ENSEIGNE
        initstr($ev_MENSEIGNE,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMAPET	Indicateur de MAJ du NAF établissement
        initstr($ev_MAPET,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMADRESSE	Indicateur de MAJ de l'ADRESSE de l'établissement
        initstr($ev_MADRESSE,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMAUXILT	Indicateur de MAJ de l'AUXILIARITE
        initstr($ev_MAUXILT,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMSIGLE	Indicateur de MAJ du SIGLE
        initstr($ev_MSIGLE,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMEXPLEN	Indicateur de MAJ du caractère EXPLOITANT entrep
        initstr($ev_MEXPLEN,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	insMEXPLET	Indicateur de MAJ du caractère EXPLOITANT étab
        initstr($ev_MEXPLET,	1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	ADR_RNVP	Type de Prestation RNVP si RNVP
        initstr($codeRnvp,		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	L1_nomen	Ligne 1 : Nom de l'entreprise
        initstr($L1rnvp,        38	) .
        // 14 (9) : Facultatif	L2_COMP	Ligne 2 : Complément de nom
        initstr($L2rnvp,        38	) .
        // 14 (9) : Facultatif	L3_CADR	Ligne 3 : Complément d'adresse
        initstr($L3rnvp,        38	) .
        // 14 (9) : Facultatif	L4_VOIE	Ligne 4 : Adresse
        initstr($L4rnvp,        38	) .
        // 14 (9) : Facultatif	L5_DISP	Ligne 5 : Distribution spéciale
        initstr($L5rnvp,        38	) .
        // 14 (9) : Facultatif	L6_POST	Ligne 6 : Code Postal, commune, etc..
        initstr($L6rnvp,        38	) .
        initstr($L7rnvp,        38	) .
        // 14 (9) : Facultatif	EAEANN	Année de validité des rubriques de niveau ENTREP provenant des EAE*
        initstr($b['insEAEANN'],	4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	EAEAPEN	Activité principale de l'entreprise issue des EAE
        initstr($b['insEAEAPEN'],	5	) .
        // 14 (9) : Facultatif	inseaesec1n	Activité secondaire n°1 de l'entreprise issue des EAE
        initstr($b['insEAESEC1N'],	5	) .
        // 14 (9) : Facultatif	inseaesec2n	Activité secondaire n°2 de l'entreprise issue des EAE
        initstr($b['insEAESEC2N'],	5	) .
        // 14 (9) : Facultatif	inseaesec3n	Activité secondaire n°3 de l'entreprise issue des EAE
        initstr($b['insEAESEC3N'],	5	) .
        // 14 (9) : Facultatif	inseaesec4n	Activité secondaire n°4 de l'entreprise issue des EAE
        initstr($b['insEAESEC4N'],	5	) .
        // P 1475 - L 12 :	Facultatif	GPSX	Latitude en ° et décimales de ° (format WGS1984)
        initstr($a['GeoLat'],	12	, ' ', ALIGN_RIGHT) .                                                                // @todo : format
        // 14 (9) : Facultatif	GPSY	Longitude en ° et décimales de ° (format WGS1984)
        initstr($a['GeoLon'],	12	, ' ', ALIGN_RIGHT) .                                                                // @todo : format
        // P 1499 - L 1 : Facultatif	GPSP	Niveau de précision du géocodage
        initstr($a['GeoPrecis'], 1	, '0', ALIGN_RIGHT) .                                                                // @todo : format
        // 14 (9) : Facultatif	ZUS	Identifiant de la Zone Urbaine Sensible
        initstr($a['GeoInfos']['NZUS'],	10	) .
        // 14 (9) : Facultatif	ZRU	Identifiant de la Zone de Rénovation Urbaine
        initstr($a['GeoInfos']['NZRU'],	10	) .
        // 14 (9) : Facultatif	ZFU	Identifiant de la Zone Franche Urbaine
        initstr($a['GeoInfos']['NZFU'],	10	) .
        // 14 (9) : Facultatif	CUCS	Identifiant de la Zone Contrat Urbain de Cohésion Social
        initstr($a['GeoInfos']['NCUCS'],10	) .
        // 14 (9) : Facultatif	AFR	Identifiant de la Zone AFR
        initstr($a['GeoInfos']['NAFR'],	10	) .
        // 14 (9) : Facultatif	ZRR	Identifiant de la ZRR
        initstr($a['GeoInfos']['NZRR'],	10	) .
        // P 160 - L 15	Facultatif	TVA	Numéro de TVA Intracommunataire
        initstr($a['TvaNumero'],		15	) .
        // P 1575 - L 1	: Facultatif	TVAVALIDE	Numéro de TVA validé
        initstr($a['TvaAttribue'],		1	, '0', ALIGN_RIGHT) .
        // P 1576 - L 1	: Facultatif	ANCIENSIEGE	Ancien siège
        initstr($a['AncienSiege'],		1	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	CODEISIN	Code ISIN de l'entreprise si cotation en bourse
        initstr($a['Isin'],				12	) .
        // 14 (9) : Facultatif	PPDIR1NOM	Nom du principal dirigeant
        initstr($a['dir1Nom'],			40	) .

        // 14 (9) : Facultatif	PPDIR1PRENOM	Prénom du principal dirigeant
        initstr(preg_replace('/,?\s.*$/','',$a['dir1Prenom']),		30	) .
        // 14 (9) : Facultatif	PPDIR1NNAISS	Nom de naissance du ppl dirigeant
        initstr($a['dir1NomUsage'],		40	) .
        // 14 (9) : Facultatif	PPDIR1DNAISS	Date de naissance
        initstr(str_replace('-','',$a['dir1DateNaiss']),	8	, '0', ALIGN_RIGHT).
        // 14 (9) : Facultatif	PPDIR1LNAISS	Lieu de Naissance
        initstr($a['dir1LieuNaiss'],	35	) .
        // P 1742 - L 4 : Facultatif	PPDIR1FONC	Code Fonction
        initstr($a['dir1Code'],			4	, '0', ALIGN_RIGHT) .                                                           // @todo : Pas les mêmes code - correction dans lib
        // 14 (9) : Facultatif	PPDIR1MAJ	Date de MAJ du ppl dirigeant
        initstr(str_replace('-', '', $a['dir1DateFct']),	8	, '0', ALIGN_RIGHT) .

        // 14 (9) : Facultatif	PPDIR2NOM	Nom du seconde principal dirigeant
        initstr($a['dir2Nom'],			40	) .
        // 14 (9) : Facultatif	PPDIR2PRENOM	Prénom du 2ème principal dirigeant
        initstr(preg_replace('/,?\s.*$/', '', $a['dir2Prenom']),		30	) .
        // 14 (9) : Facultatif	PPDIR2NNAISS	Nom de naissance du 2ème ppl dirigeant
        initstr($a['dir2NomUsage'],		40	) .
        // 14 (9) : Facultatif	PPDIR2DNAISS	Date de naissance du 2ème ppl dirigeant
        initstr(str_replace('-','',$a['dir2DateNaiss']),	8	, '0', ALIGN_RIGHT).
        // 14 (9) : Facultatif	PPDIR2LNAISS	Lieu de Naissance du 2ème ppl dirigeant
        initstr($a['dir2LieuNaiss'],	35	) .
        // 14 (9) : Facultatif	PPDIR2FONC	Code Fonction du 2ème ppl dirigeant
        initstr($a['dir2Code'],	        4	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	PPDIR2MAJ	Date de MAJ du 2ème ppl dirigeant
        initstr(str_replace('-','', $a['dir2DateFct']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	BILANCLOT	Date de dernière clôture de bilan disponible
        initstr(str_replace('-','', $a['bilanDate']),	8	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	BILANDUREE	Durée du dernier exercice disponible
        initstr($a['bilanMois'],        2	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	BILANCA	Chiffre d'affaires au dernier bilan disponible
        initstr($tcaSEDmt,              15	, '0', ALIGN_RIGHT) .
        // 14 (9) : Facultatif	BILANRES	Résultat au dernier bilan disponible
        initstr($a['bilanHN'],          15	, '0', ALIGN_RIGHT) .
        // 14 (9) : Tranche de CA SED
        initstr($tcaSED,                1	) .
        // 14 (9) : Type de tranche de CA : (R)éel, (I)nconnu ou (E)stimé
        initstr($tcaSEDtype,            1	) .
        // 14 (9) : Année du CA
        initstr($tcaSEDannee,           4	) .
        // 14 (9) : PPDIR1 Genre
        initstr($a['dir1Genre'],        1	) .                                                                            // @todo : De temps en temps non délivrés
        // 14 (9) : PPDIR2 Genre
        initstr($a['dir2Genre'],        1	) .                                                                            // @todo : De temps en temps non délivrés
        // 14 (9) : Indicateur du champ de publipostage
        initstr($a['IND_PUBLIPO']*1,    1	) .
        // 14 (9) : Facultatif	FILLER1	Zone libre
        initstr(' ',		 			32	) ;

        /*
         AnneeTCA
         CapitalNbActions
         CapitalMtActions
        */
        // --- Ecriture ligne 200
        if ($opts->debug && mb_strlen($str)>LONGUEUR_LIGNE_SORTIE) {
            echo date('Y-m-d H:i:s')." - Ligne supérieur à LONGUEUR MAX";
        }
        file_put_contents($filepath, initstr($str,LONGUEUR_LIGNE_SORTIE).$OptionEOL, FILE_APPEND);
        $nbLignes++;
        $nbLignes200++;

        $mBil=new MBilans($siren);
        $tabBilans = $mBil->listeBilans();
        $iBil=0;
        if ($OptionNbBilansMax>0) {
            foreach ($tabBilans as $idxBilan=>$derBilan) {
                $iBil++;
                $t5=microtime(1);
                $p = $mBil->getBilan(WDate::dateT('Ymd','d/m/Y',$derBilan['dateExercice']), $derBilan['typeBilan']);
                $t6=microtime(1);
                $tTime['Bilan']+=$t6-$t5;

                //print_r($p);
                if ($p['CONSOLIDE']=='S')	$numLiasse='2033';
                else						$numLiasse='2050';
                $unite=strtoupper($p['MONNAIE_LIV_UNITE']);
                if ($unite=='')	$unite='U';
                $nbLignesBil++;
                // 14 (9) : Obligatoire	CODE_ENTETE	Ligne de description structurée de l'identité
                $strIni = initstr($OptionTypeLigneBilan,	 3) .
                // 14 (9) : Obligatoire	ID	Numéro unique d'identification interne d'un établissement S&D
                initstr($a['SourceId'],		    10, '0', ALIGN_RIGHT) .
                // 14 (9) : Obligatoire	SIREN	Siren de l'entreprise
                initstr($siren,				     9, '0', ALIGN_RIGHT) .
                // 14 (9) : Obligatoire	NIC	Nic de l'établissement
                initstr($nic,				     5, '0', ALIGN_RIGHT) .
                // 14 (9) : Obligatoire	SOURCE	Source de la fiche d'identité
                initstr($a['Source'],            3, '0', ALIGN_RIGHT) .
                // 14 (9) : Obligatoire	SIRETVALIDE	Siren/siret valide
                initstr($iInsee->valideSiren($siren,$nic),	1	, '0', ALIGN_RIGHT) .
                // 14 (9) : Facultatif	NUMRCS	Numéro de Registre du Commerce et des Sociétés
                initstr($a['numRC'],	10	) .
                // 14 (9) : Facultatif	TRIBUNAL	Identifiant du Tribunal
                initstr($a['Tribunal'],	6	) .
                // DATEMAJ	Date de la dernière mise à jour du bilan dans la base S&D	Format AAAAMMJJ
                initstr(str_replace('-','',$p['DATE_FRAICHE_BILAN']), 8, '0', ALIGN_RIGHT) .
                // MILLESIME	Année du bilan
                initstr(substr($p['DATE_FRAICHE_BILAN'],0,4), 4, '0', ALIGN_RIGHT) .
                // BILAN_DATE	Date de clôture du bilan	Format AAAAMMJJ
                initstr(str_replace('-','',$p['DATE_CLOTURE']), 8, '0', ALIGN_RIGHT) .
                //	BILAN_DUREE	Durée de l'exercice en mois
                initstr($p['DUREE_MOIS'], 2, '0', ALIGN_RIGHT) .
                // BILAN_DATEP	Date de clôture du bilan précédent	Format AAAAMMJJ
                initstr(str_replace('-','',$p['DATE_CLOTURE_PRE']), 8, '0', ALIGN_RIGHT) .
                //	BILAN_DUREEP	Durée de l'exercice précédent en mois
                initstr($p['DUREE_MOIS_PRE'], 2, '0', ALIGN_RIGHT) .
                // BILAN_LIASSE	Numéro de la première liasse du bilan	2033,2050
                initstr($numLiasse,4) .
                //	BILAN_TYPE	Type de bilan	S=Réel Normal Simplifié, C=Consolidé, N=Réel Normal
                initstr($p['CONSOLIDE'], 1) .
                //	BILAN_MONNAIE	Code devise de livraison selon la norme ISO 4217 (3 lettres)
                initstr($p['MONNAIE'], 3) .
                //	BILAN_MONNAIEO	Code devise d'origine du bilan selon la norme ISO 4217*
                initstr($p['MONNAIE_ORI'], 3) .
                //	BILAN_UNITE	Unité du bilan livré	U=en unité de devise, K=en milliers, M=en millions
                initstr($unite, 1);

                unset($p['SIREN']);
                unset($p['SOURCE']);
                unset($p['devise']);
                unset($p['DATE_FRAICHE_BILAN']);
                unset($p['DATE_CLOTURE']);
                unset($p['DATE_CLOTURE_PRE']);
                unset($p['DUREE_MOIS']);
                unset($p['DUREE_MOIS_PRE']);
                unset($p['MONNAIE']);
                unset($p['CONSOLIDE']);
                unset($p['MONNAIE_ORI']);
                unset($p['MONNAIE_LIV_UNITE']);
                $strIni.=initstr(count($p), 4, '0', ALIGN_RIGHT); // BILAN_NBPOSTES	Nombre de postes livrés
                $nbP=0;
                $strP='';
                if ($OptionTypeLigneBilan==400) {
                    foreach ($p as $code=>$valeur) {
                        $nbP++;
                        if ($valeur>=0)	$signe='+';
                        else			$signe='-';
                        $strP.= initstr($code, 4).$signe.initstr(abs($valeur), 20, '0', ALIGN_RIGHT);
                        if($nbP<76)	continue;

                        // --- Ecriture ligne 400
                        file_put_contents($filepath, initstr($strIni.$strP,LONGUEUR_LIGNE_SORTIE).$OptionEOL, FILE_APPEND);
                        $nbLignes++;
                        $nbLignesBil++;
                        $nbP=0;$strP='';
                    }
                    if($nbP<76) {	// Ecriture de la dernière ligne sauf s'il y a dejà 76 postes
                        // --- Ecriture ligne 400
                        file_put_contents($filepath, initstr($strIni.$strP,LONGUEUR_LIGNE_SORTIE).$OptionEOL, FILE_APPEND);
                        $nbLignes++;
                        $nbLignesBil++;
                    }
                } else {
                    $uniteMultiple=1;
                    switch (strtoupper($unite)) {
                        case 'K':	$uniteMultiple=1000;	break;
                        case 'M':	$uniteMultiple=1000000;	break;
                    }
                    if ($p['CONSOLIDE']=='S')		$tabPostes=$iBilan->bilanSimplifie2Normal($p);
                    else							$tabPostes=$p;

                    // Chiffre d'affaires - Poste FL au format 2050
                    $strP.=	@exporteRatio($p['FL']);
                    // Chiffre d'affaires Export - Poste FK
                    $strP.=	@exporteRatio($p['FK']);
                    // Valeur Ajoutée - R130 = FL + FM+FN - (FS+FU) - (FT+FV) - (FW-HP-HQ)
                    $va=$p['FL'] + $p['FM'] + $p['FN'] - ($p['FS'] + $p['FU']) - ($p['FT'] + $p['FV']) - ($p['FW']-$p['HP']-$p['HQ']);
                    $strP.=	@exporteRatio($va);
                    // Masse salariale - R132 = FY + FZ
                    $ms=$p['FY'] + $p['FZ'];
                    $strP.=	@exporteRatio($ms);
                    // EBE - R140 = R130-R132 - FX + FO
                    $strP.=	@exporteRatio($va-$ms - $p['FX'] + $p['FO']);
                    // Personnel extérieur à l'entreprise, Intérim = Poste YU
                    $strP.=	@exporteRatio($p['YU']);
                    // Sous-traitance
                    $strP.=	@exporteRatio($p['YT']);
                    // Effectif
                    $strP.=	@exporteRatio($p['YP']);
                    // Capital - Poste DA
                    $strP.=	@exporteRatio($p['DA']);
                    // Montant des Immo. Corp. Terrains Brut	Poste AN
                    $strP.=	@exporteRatio($p['AN']);
                    // Montant des Immo. Corp. Constructions	Poste AP
                    $strP.=	@exporteRatio($p['AP']);
                    // Montant des Installations Techniques, matériel et outillage industriels	Poste AR
                    $strP.=	@exporteRatio($p['AR']);
                    // Montant des Immo. Corp. Brut	=AN+AP+AR+AT+AV+AX
                    $strP.=	@exporteRatio($p['AN'] + $p['AP'] + $p['AR'] + $p['AT'] + $p['AV'] + $p['AX']);
                    // Montant des Immo. Corp. Net	=AN-AO + AP-AQ + AR-AS + AT-AU + AV-AW + AX-AY
                    $strP.=	@exporteRatio($p['AN']-$p['AO'] + $p['AP']-$p['AQ'] + $p['AR']-$p['AS'] + $p['AT']-$p['AU'] + $p['AV']-$p['AW'] + $p['AX']-$p['AY']);
                    // Montant des Immo. Incorp. Brut	=AB+AD+AF+AH+AJ+AL
                    $strP.=	@exporteRatio($p['AB'] + $p['AD'] + $p['AF'] + $p['AH'] + $p['AJ'] + $p['AL']);
                    // Montant des Immo. Incorp. Net	=AB-AC + AD-AE + AF-AG + AH-AI + AJ-AK + AL-AM
                    $strP.=	@exporteRatio($p['AB']-$p['AC'] + $p['AD']-$p['AE'] + $p['AF']-$p['AG'] + $p['AH']-$p['AI'] + $p['AJ']-$p['AK'] + $p['AL']-$p['AM']);
                    // Montant des Taxe professionnelle	Poste YW
                    $strP.=	@exporteRatio($p['YW']);

                    // --- Ecriture ligne
                    file_put_contents($filepath, initstr($strIni.$strP,LONGUEUR_LIGNE_SORTIE).$OptionEOL, FILE_APPEND);
                    $nbLignes++;
                    $nbLignesBil++;
                    $strP='';
                }
                if ($iBil==$OptionNbBilansMax)	break;
            }
        }

        if (empty($opts->debug)) {
            $suiviM->update(array(
                'unitIncrement' => $unit,
                'unitExec' => date('YmdHis'),
            ), 'id='.$suiviId);
        }
        echo date ('Y/m/d - H:i:s')." - Fin ligne $unit/$nbEtab\n";
    }

    // --- Fin de ligne du fichier
    $nbLignes++;
    $dateFin=date('YmdHis');
    $str=	initstr('999',                    3, '0', ALIGN_RIGHT)	. // Type de ligne
    initstr($dateFin,                        14)					. // Date & Heure de fin génération du fichier
    initstr($OptionClientNumTourFichier,     10, '0', ALIGN_RIGHT)	. // Numéro de tour du fichier pour le client
    initstr($prestaId,                       36)					. // Identifiant Client
    initstr($OptionTypePrestation,           32)					. // Type de prestation
    initstr($nbLignes,                       10, '0', ALIGN_RIGHT)	. // Nombre de lignes Total du fichier
    '';

    // Pas de fin de ligne sur la dernière ligne
    file_put_contents($filepath, initstr($str,LONGUEUR_LIGNE_SORTIE), FILE_APPEND);

    $tabProduction[$prestaId]['dateFin']=$dateFin;
    $duree=round(microtime(true)-$timeDeb,3);
    $dureeD=floor($duree/86400);
    $reste=$duree%86400;
    $dureeH=floor($reste/3600);
    $reste=$reste%3600;
    $dureeM=floor($reste/60);
    $dureeS=$reste%60;

    $tabProduction[$prestaId]['duree']=$duree.' secondes';
    if ($dureeD==0 && $dureeH==0)	$tabProduction[$prestaId]['dureeLisible']="$dureeM m. $dureeS s.";
    elseif ($dureeD==0)				$tabProduction[$prestaId]['dureeLisible']="$dureeH h. $dureeM m. $dureeS s.";
    else							$tabProduction[$prestaId]['dureeLisible']="$dureeD j. $dureeH h. $dureeM m. $dureeS s.";
    $tabProduction[$prestaId]['nbLignes']=$nbLignes;

    echo date ('Y/m/d - H:i:s')." - Prestation $prestaId, Client $OptionNomClient : Fichier client terminé.\n";

    // --- Envoi du fichier produit par mail
    if (!empty($OptionMailTo)) {
        $OptionMailTo.= ',';
    }
    $OptionMailTo.= 'suivi@scores-decisions.com';

    if ($opts->nomail === null && !empty($OptionMailTo)) {
        $tabAttached = array($filepath);
        $messageInfo="Bonjour,

	Veuillez trouver le fichier d'établissements Scores & Décisions relatifs à votre abonnement.

	Bien Cordialement,
	Le service Support.


	ATTENTION : Cet email est un message automatique. Merci de ne pas y répondre. Pour toute question nous vous invitons à contacter notre support à l'adresse support@scores-decisions.com.

	---

	SCORES & DECISIONS
	Service support
	1, rue de Clairefontaine - 78120 RAMBOUILLET
	tél : 33 (0)1 75 43 80 10
	fax : 33 (0)1 75 43 85 74
	support@scores-decisions.com
	http://www.scores-decisions.com/
	Scores & Décisions est l'acteur nouvelle génération de l'information et de l'évaluation des entreprises

	Pensez à l'environnement avant d'imprimer ce message !
	Save paper - think before you print";


        if(sendMail('production@scores-decisions.com', $OptionMailTo, "Diffusion A6CMO S&D", $messageInfo, '', $tabAttached)) {
            echo date ('Y/m/d - H:i:s')." - Prestation $prestaId, Client $OptionNomClient : Fichier envoyé à ".$OptionMailTo."\n";
        } else {
            echo date ('Y/m/d - H:i:s')." - Prestation $prestaId, Client $OptionNomClient : Erreur lors de l'envoi du fichier à ".$OptionMailTo."\n";
        }
    } else {

    }

    if (empty($opts->debug)) {
        $suiviparamM = new Application_Model_Sdv1PrestaOutDetail();
        $suiviparamM->insert(array(
            'execId' => $suiviId,
            'code' => $prestaId,
            'name' => 'fichier',
            'value' => $file,
        ));

        $suiviM->update(array('dateEnd' => date('YmdHis')), 'id='.$suiviId);
    }

    echo date ('Y/m/d - H:i:s')." - Prestation $prestaId, Client $OptionNomClient : Fin.\n";

} // --- Fin boucle presta

if ($opts->stock)	$strStock="des stocks";
else                $strStock="des fichiers hebdos";
$messageFinObj="FIN de la diffusion $strStock A6CMO";
$messageFinMsg=print_r($tabProduction, true);
$messageFinMsg.=print_r($tTime, true);
if ($opts->nomail === null) {
    sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com,suivi@scores-decisions.com', $messageFinObj, $messageFinMsg);
}

function exporteRatio($valeur) {
    $signe='+';
    if($valeur<0)	$signe='-';
    return	''.$signe.initstr(abs($valeur), 20, '0', ALIGN_RIGHT);
}