webservice/batch/enrichissement.php

353 lines
8.7 KiB
PHP
Raw Normal View History

2011-11-15 13:58:10 +00:00
#!/usr/bin/php
<?php
//error_reporting(E_ALL & ~E_NOTICE);
// 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(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
require_once realpath(dirname(__FILE__)).'/../config/config.php';
try {
$opts = new Zend_Console_Getopt(
//Options
array(
'help|?' => "Aide.",
'ignore=i' => "Nombre de ligne à ignoré.",
'file=s' => "Définir le chemin du fichier",
)
);
$opts->parse();
} catch (Zend_Console_Getopt_Exception $e) {
echo $e->getUsageMessage();
exit;
}
//Usage
if(isset($opts->help) || !isset($opts->file))
{
echo $opts->getUsageMessage();
exit;
}
//Définition bdd
$dbConfig = array(
'host' => '192.168.78.230',
'username' => 'wsuser',
'password' => 'scores',
'dbname' => 'jo',
);
$db = Zend_Db::factory('PDO_MYSQL', $dbConfig);
$tabExtract = array();
$tabIdentifiant = array();
$tabData = array();
$posKeySiren = $posKeySiret = $posKeyNic = false;
//Lire le fichier csv
$row = 0;
if (($handle = fopen($opts->file, 'r')) !== FALSE) {
while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
$num = count($data);
//Traitement de la première ligne
if ($row == 0) {
for ($c=0; $c < $num; $c++) {
//Détection clé importante
switch(strtolower($data[$c])) {
case 'siren':
$posKeySiren = $c;
break;
case 'nic':
$posKeyNic = $c;
break;
case 'siret':
$posKeySiret = $c;
break;
}
$tabExtract[] = $data[$c];
}
if ($posKeySiren!==false && $posKeyNic!==false && $posKeySiret!==false || $posKeySiren!==false && $posKeySiret!==false ){
die("Trop de clé!");
}
//Traitement des identifiants
} else {
if ( $posKeySiret!==false ){
$tabIdentifiant[] = $data[$posKeySiret];
} elseif ( $posKeySiren!==false && $posKeyNic!==false ){
$tabIdentifiant[] = $data[$posKeySiren].$data[$posKeyNic];
} elseif ( $posKeySiren !==false ){
$tabIdentifiant[] = $data[$posKeySiren];
}
for ($c=0; $c < $num; $c++) {
$colname = $tabExtract[$c];
if (!in_array(strtolower($colname), array('siren', 'siret', 'nic'))){
$tabData[][$colname] = $data[$c];
}
}
}
$row++;
}
fclose($handle);
}
$nbIdentifiant = count($tabIdentifiant);
echo "Chargement de $row lignes dont $nbIdentifiant lignes avec identifiants.\n";
$rowTotal = $nbIdentifiant;
//Traiter la demande en créant les requetes sql nécessaires
$tabDico = array(
'etablissements' => array(
'db' => 'jo.etablissements',
'cle' => array(
'idSd', 'source', 'triCode', 'autre_id', 'actif', 'siege', 'raisonSociale', 'enseigne', 'sigle',
'marques', 'adr_num', 'adr_btq', 'adr_typeVoie', 'adr_libVoie', 'adr_comp', 'adr_cp', 'adr_ville',
'adr_dep', 'adr_codeCom', 'tel', 'fax', 'cj', 'capital', 'capitalDev', 'ape_etab', 'ape_entrep'
)
),
);
//Liste des champs SQL
foreach($tabExtract as $key)
{
$strKey = false;
//Traitement spécial pour le champs
switch($key){
case 'idSd':
break;
case 'adr_codeCom':
break;
}
//Ajout à la requete
foreach($tabDico as $element => $select)
{
if (in_array($key, $select['cle']))
{
if (isset(${$element.'Fields'})){ ${$element.'Fields'}.= ', '; }
if ($strKey!==false){
${$element.'Fields'}.= $strKey;
} else {
${$element.'Fields'}.= $key;
}
break;
}
}
}
//Vérification et création des données
$row = 1;
foreach($tabIdentifiant as $item)
{
echo "Traitement de $row / $rowTotal lignes";
$siretValide = false;
$sirenValide = false;
//Vérification par algorithme
if ($posKeySiret!==false){
$siretValide = siretValide($item);
if ($siretValide===false){
$sirenValide = sirenValide(substr($siren,0,9));
} else {
$sirenValide = true;
}
}
if ($posKeySiren!==false && $posKeyNic!==false) {
$sirenValide = sirenValide($siren);
}
$siren = substr($item, 0, 9);
$nic = substr($item, 9);
//On définit le tableau de retour
if ( $posKeySiret!==false ){
$tabData[$row-1]['siret'] = $item;
} elseif ( $posKeySiren!==false && $posKeyNic!==false ){
$tabData[$row-1]['siren'] = $siren;
$tabData[$row-1]['nic'] = $nic;
} elseif ( $posKeySiren !==false ){
$tabData[$row-1]['siren'] = $siren;
}
if ($sirenValide===false){
//@todo : Assigner une valeur vide au tableau de sortie
echo " - Siren Invalide -";
echo "\n";
$row++;
continue;
}
//Vérifier les nic, ou sélectionner le nic du siege actif
$nicTmp = 0;
$strNic = '';
$sqlNic = 'SELECT nic as nicTmp, cj as cjTmp FROM jo.etablissements WHERE siren='.$siren;
if (strlen($item)==14 && intval($nic)>0){
$stmt = $db->query($sqlNic.' AND nic='.$nic);
$result = $stmt->fetchAll();
if (count($result)==0){
$nic = 0;
}
}
if (intval($nic)==0){
$strNic = ' AND nic>-1 AND actif>-1 ORDER BY siege DESC, actif DESC, nicTmp DESC LIMIT 0,1';
$stmt = $db->query($sqlNic.$strNic);
$result = $stmt->fetchAll();
if (count($result)>0){
$nic = $result[0]['nicTmp'];
} else {
$nic = '00000';
}
}
if ( $posKeySiren!==false && $posKeyNic!==false ){
$tabData[$row-1]['siren'] = $siren;
$tabData[$row-1]['nic'] = $nic;
}
//Création de la condition pour la requete SQL
$where = ' WHERE siren='.$siren.' AND nic='.$nic;
//Création des requêtes SQL
foreach($tabDico as $element => $select)
{
if (isset(${$element.'Fields'})){
${$element.'SQL'} = 'SELECT '.${$element.'Fields'}.' FROM '.$select['db'].$where;
$stmt = $db->query(${$element.'SQL'});
$result = $stmt->fetchAll();
if (count($result)>0){
$tabData[$row-1] = array_merge( $tabData[$row-1] , $result[0]);
}
}
}
echo "\n";
$row++;
}
//Pour chaque tabExtract (column) on crée un tableau pour la ligne CSV dans le bon ordre
//Entete
$tabEntete = array();
$tabEntete = $tabExtract;
//Mettre dans l'ordre les données
$tabSortie = array();
$row = 0;
foreach($tabData as $data){
foreach($tabExtract as $key){
$tabSortie[$row][] = $tabData[$row][$key];
}
$row++;
}
writeCSV($tabSortie, $tabEntete, 'enrichissement.csv');
/* 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;
}
function writeCSV($list, $entete, $filename)
{
$fp = fopen($filename, 'w');
if (count($entete)>0){
fputcsv($fp, $entete, ',');
}
foreach ($list as $fields) {
fputcsv($fp, $fields, ',');
}
fclose($fp);
}