256 lines
7.1 KiB
PHP
256 lines
7.1 KiB
PHP
<?php
|
|
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
|
|
|
|
// Define path to application directory
|
|
defined('APPLICATION_PATH')
|
|
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));
|
|
|
|
// Define application environment
|
|
define('APPLICATION_ENV', 'production');
|
|
|
|
// Ensure library/ is on include_path
|
|
set_include_path(implode(PATH_SEPARATOR, array(
|
|
realpath(APPLICATION_PATH . '/../library'),
|
|
get_include_path(),
|
|
)));
|
|
/** Zend_Application */
|
|
require_once 'Zend/Application.php';
|
|
|
|
// Create application, bootstrap, and run
|
|
$application = new Zend_Application(
|
|
APPLICATION_ENV,
|
|
APPLICATION_PATH . '/configs/application.ini'
|
|
);
|
|
|
|
try {
|
|
$opts = new Zend_Console_Getopt(
|
|
//Options
|
|
array(
|
|
'help|?' => "Aide.",
|
|
'id=s' => "Identifiant du traitement",
|
|
'file=s' => "Identifiant pour les traitements par fichier"
|
|
)
|
|
);
|
|
$opts->parse();
|
|
} catch (Zend_Console_Getopt_Exception $e) {
|
|
echo $e->getUsageMessage();
|
|
exit;
|
|
}
|
|
|
|
//Usage
|
|
if(isset($opts->help) || !isset($opts->id) && !isset($opts->file) )
|
|
{
|
|
echo $opts->getUsageMessage(); exit;
|
|
}
|
|
|
|
$config = new Zend_Config($application->getOptions());
|
|
|
|
//MetadataCache pour la base de données
|
|
$frontendOptions = array(
|
|
'lifetime' => 14400,
|
|
'automatic_serialization' => true
|
|
);
|
|
$backendOptions = array();
|
|
$cache = Zend_Cache::factory('Core','Apc', $frontendOptions, $backendOptions);
|
|
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
|
|
|
|
//Définition bdd
|
|
try {
|
|
$db = Zend_Db::factory($config->profil->db->metier);
|
|
Zend_Db_Table::setDefaultAdapter($db);
|
|
} catch ( Exception $e ) {
|
|
exit ( $e->getMessage() );
|
|
}
|
|
|
|
$liste = array();
|
|
|
|
if ($opts->id)
|
|
{
|
|
//Read SIRETs
|
|
$commandesM = new Application_Model_CiblageEnrichissementIdentifiants();
|
|
$commande = $commandesM->find(intval($opts->id))->current();
|
|
$identifiants = json_decode($commande->identifiants, true);
|
|
|
|
//Read profil for data extract
|
|
$profilM = new Application_Model_CiblageEnrichissementProfils();
|
|
$profil = $profilM->find(intval($commande->idProfil))->current();
|
|
$dataProfil = json_decode($profil->criteres, true);
|
|
}
|
|
else if ($opts->file)
|
|
{
|
|
|
|
}
|
|
|
|
//Something is needed
|
|
if ( count($identifiants)==0 || count($dataProfil)==0 ) {
|
|
echo "Identifiants:".count($identifiants).", profil:".$count($profil)."\n";
|
|
exit;
|
|
}
|
|
|
|
//Let's go
|
|
$mois = substr($commande->dateAdded,0,4).substr($commande->dateAdded,5,2);
|
|
|
|
$path = $config->profil->path->data.'/'.$mois;
|
|
if(!file_exists($path))
|
|
mkdir($path);
|
|
|
|
$outFile = $profil->login.'_'.$opts->id.'_'.date('YmdHis').'.csv';
|
|
|
|
require_once 'Scores/Enrichissement.php';
|
|
$dico = new Enrichissement();
|
|
$fields = $dico->getFields();
|
|
|
|
//Entete, Valeur de remplacement et Requete SQL
|
|
$tabEntete = array('siren', 'nic');
|
|
$tabEnteteLabel = array('SIREN', 'NIC');
|
|
$sql = 'SELECT LPAD(siren, 9, 000000000) AS siren, LPAD(nic,5,00000) AS nic,';
|
|
$from = 'jo.etablissements_act';
|
|
$addWhere = '';
|
|
foreach ( $dataProfil as $item ) {
|
|
//Définition de l'entete
|
|
$tabEnteteLabel[] = $fields[$item]['label'];
|
|
$tabEntete[] = $item;
|
|
|
|
//Construction de la requete SQL
|
|
if ( array_key_exists('sql', $fields[$item]) ) {
|
|
$sql.= ' '.$fields[$item]['sql'].', ';
|
|
} else {
|
|
$sql.= ' '.$fields[$item]['column'].' AS '.$item.',';
|
|
}
|
|
|
|
//Pour les champs de type "code", ajouter le libellé
|
|
if ( array_key_exists('join', $fields[$item]) ) {
|
|
//Automatic column name .Lib
|
|
$joinColumn = $item.'Lib';
|
|
$tabEntete[] = $joinColumn;
|
|
//label
|
|
$tabEnteteLabel[] = $fields[$item]['join']['label'];
|
|
//Sql
|
|
$tableAlias = $item.'T';
|
|
$sql.= $tableAlias.'.'.$fields[$item]['join']['column'].' AS '.$joinColumn;
|
|
$from.= ','.$fields[$item]['join']['column'].' AS '.$tableAlias;
|
|
$addWhere = ' AND WHERE '.$fields[$item]['column'].'='.$tableAlias.'.'.$fields[$item]['join']['column'];
|
|
}
|
|
|
|
}
|
|
//Ajouter le champ presentRcs
|
|
$tabEntete[] = 'presentRcs';
|
|
$tabEnteteLabel[] = 'RCS';
|
|
$sql .= ' presentRcs';
|
|
|
|
//Pour chaque identifiant traiter les données
|
|
$row = 0;
|
|
$fp = fopen($path.'/'.$outFile, 'w');
|
|
//Ecrire l'entete
|
|
if (count($tabEnteteLabel)>0){
|
|
fputcsv($fp, $tabEnteteLabel, ',', '"');
|
|
}
|
|
//Mise à jour des éléments
|
|
if ($opts->id) {
|
|
$commandesM->update(array(
|
|
'dateStart'=>date('Y-m-d H:i:s'),
|
|
'fichier' => basename($outFile)
|
|
),
|
|
"id = ".$commande->id);
|
|
}
|
|
|
|
$model = $sql;
|
|
$traite = 0;
|
|
//Date de debut de traitement.
|
|
$dateStart = date('YmdHms');
|
|
foreach ($identifiants as $siret )
|
|
{
|
|
$sql = $model.' FROM jo.etablissements_act WHERE siren='.substr($siret,0,9).' AND nic='.substr($siret,9,5);
|
|
try {
|
|
$result = $db->fetchAll($sql);
|
|
$traite++;
|
|
} catch(Exception $e) {
|
|
echo $sql;
|
|
}
|
|
$tabData = $result[0];
|
|
//Trier pour la sortie
|
|
$tabSortie = array();
|
|
foreach($tabEntete as $key){
|
|
$tabSortie[] = isset($tabData[$key]) ? $tabData[$key] : '';
|
|
}
|
|
fputcsv($fp, $tabSortie, ',', '"');
|
|
|
|
//Mise à jour des lignes traitées dans la base
|
|
if ($opts->id) {
|
|
$commandesM->update(array('nbLigneTraites'=>$row), "id = ".$commande->id);
|
|
}
|
|
|
|
$row++;
|
|
}
|
|
fclose($fp);
|
|
if ($opts->id) {
|
|
$commandesM->update( array('dateStop' => date('Y-m-d H:i:s')) , "id = ".$commande->id);
|
|
}
|
|
|
|
|
|
/* == FUNCTION == */
|
|
|
|
/**
|
|
* Verifie si un SIREN est valide
|
|
* @param Le code SIREN dont on veut vérifier la validité.
|
|
* @return Un booléen qui vaut 'true' si le code SIREN passé en
|
|
* paramètre est valide, false sinon.
|
|
*/
|
|
function sirenValide($siren) {
|
|
if ( (strlen($siren) != 9) || (is_nan($siren)) )
|
|
$estValide = false;
|
|
else {
|
|
// Donc le SIREN est un numérique à 9 chiffres
|
|
$somme = 0;
|
|
$tmp = 0;
|
|
for ($cpt = 0; $cpt<strlen($siren); $cpt++) {
|
|
if (($cpt % 2) == 1) { // Les positions paires : 2ème, 4ème, 6ème et 8ème chiffre
|
|
$tmp = substr($siren, $cpt, 1) * 2; // On le multiplie par 2
|
|
if ($tmp > 9)
|
|
$tmp-= 9; // Si le résultat est supérieur à 9, on lui soustrait 9
|
|
}
|
|
else
|
|
$tmp = substr($siren, $cpt, 1);
|
|
$somme+= intval($tmp);
|
|
}
|
|
if (($somme % 10) == 0)
|
|
$estValide = true; // Si la somme est un multiple de 10 alors le SIREN est valide
|
|
else
|
|
$estValide = false;
|
|
}
|
|
return $estValide;
|
|
}
|
|
|
|
/**
|
|
* Verifie si un SIRET est valide
|
|
* @param Le code SIRET dont on veut vérifier la validité.
|
|
* @return Un booléen qui vaut 'true' si le code SIRET passé en
|
|
* paramètre est valide, false sinon.
|
|
*/
|
|
function siretValide($siret) {
|
|
if ( (strlen($siret) != 14) || (is_nan($siret)) )
|
|
$estValide = false;
|
|
else {
|
|
// Donc le SIRET est un numérique à 14 chiffres
|
|
// Les 9 premiers chiffres sont ceux du SIREN (ou RCS), les 4 suivants
|
|
// correspondent au numéro d'établissement
|
|
// et enfin le dernier chiffre est une clef de LUHN.
|
|
$somme = 0;
|
|
$tmp = 0;
|
|
for ($cpt = 0; $cpt<strlen($siret); $cpt++) {
|
|
if (($cpt % 2) == 0) { // Les positions impaires : 1er, 3è, 5è, etc...
|
|
$tmp = substr($siret, $cpt, 1) * 2; // On le multiplie par 2
|
|
if ($tmp > 9)
|
|
$tmp-= 9; // Si le résultat est supérieur à 9, on lui soustrait 9
|
|
}
|
|
else
|
|
$tmp = substr($siret, $cpt, 1);
|
|
$somme+= intval($tmp);
|
|
}
|
|
if (($somme % 10) == 0)
|
|
$estValide = true; // Si la somme est un multiple de 10 alors le SIRET est valide
|
|
else
|
|
$estValide = false;
|
|
}
|
|
return $estValide;
|
|
} |