353 lines
8.7 KiB
PHP
353 lines
8.7 KiB
PHP
|
#!/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);
|
||
|
}
|
||
|
|