370 lines
17 KiB
PHP
370 lines
17 KiB
PHP
#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini
|
|
<?php
|
|
|
|
include_once(FWK_PATH.'common/chiffres.php');
|
|
include_once(FWK_PATH.'common/dates.php');
|
|
include_once(INCLUDE_PATH.'insee/classMInsee.php');
|
|
include_once(INCLUDE_PATH.'scores/classMSolvabilite.php');
|
|
include_once(INCLUDE_PATH.'partenaires/classMBourse.php');
|
|
include_once(FWK_PATH.'mail/sendMail.php');
|
|
|
|
$strInfoScript='Usage : '.basename($argv[0]). " <option> <fichier>
|
|
Chargement d'un fichier de mise sous surveillance d'un fichier Client (pour l'instant uniquement en annule/remplace).
|
|
";
|
|
|
|
$argv=$_SERVER['argv'];
|
|
if ($_SERVER['argc']>1)
|
|
{
|
|
for ($i=1; isset($argv[$i]); $i++) {
|
|
if (substr($argv[$i],0,1)=='-') {
|
|
switch (substr($argv[$i],1,1)) {
|
|
case '-':
|
|
case '?': die($strInfoScript); break;
|
|
default: die('Option '. $argv[$i] . " inconnue !".EOL);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$iDb=new WDB('insee');
|
|
$iDbSurv=new WDB('jo');
|
|
$iInsee=new MInsee();
|
|
|
|
echo date ('Y/m/d - H:i:s') . " - Début du traitement".EOL;
|
|
flush();
|
|
$ftpDir='/home/data/ftp/';
|
|
|
|
$tabDir=array();
|
|
$dh = opendir($ftpDir);
|
|
while (false !== ($filename = readdir($dh))) {
|
|
/** On scan chaque répertoire FTP client à la recherche d'un fichier send.fmt
|
|
**/
|
|
if ($filename<>'.' && $filename<>'..' && is_dir($ftpDir.$filename) && file_exists($ftpDir.$filename."/send.fmt"))
|
|
$tabDir[] = $filename;
|
|
}
|
|
sort($tabDir);
|
|
|
|
echo date ('Y/m/d - H:i:s')." - Liste des répertoires avec un fichier send.fmt : ".implode(', ',$tabDir).EOL;
|
|
|
|
foreach ($tabDir as $nbDir=>$dirToCheck) /** On scan chaque répertoire send des FTP clients à la recherche de nouveaux fichiers **/
|
|
{
|
|
$tabFichier=array();
|
|
$dh = opendir($ftpDir.$dirToCheck.'/send/');
|
|
while (false !== ($filename = readdir($dh))) {
|
|
if ($filename<>'.' && $filename<>'..') {
|
|
$tabFichier[] = $filename;
|
|
echo date ('Y/m/d - H:i:s')." - Le fichier $filename du client $dirToCheck est en cours de chargement !".EOL;
|
|
}
|
|
}
|
|
if (count($tabFichier)>0) {
|
|
/** On lit le fichier send.fmt afin de savoir le traitement courant
|
|
**/
|
|
$tabFmt=parse_ini_file($ftpDir.$dirToCheck."/send.fmt", true);
|
|
print_r($tabFmt);
|
|
if (!isset($tabFmt['Infos']) || !is_array($tabFmt['Infos']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La section [Infos] est incorrecte pour le client $dirToCheck !".EOL);
|
|
$tabInfos=$tabFmt['Infos'];
|
|
|
|
$idClientDef='';
|
|
if (isset($tabInfos['idClient']))
|
|
//die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'idClient' n'est pas définie pour le client $dirToCheck !".EOL);
|
|
$idClientDef=$tabInfos['idClient'];
|
|
|
|
if (!isset($tabInfos['format']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'format' n'est pas définie pour le client $dirToCheck !".EOL);
|
|
$format=$tabInfos['format'];
|
|
if (strtolower($format)=='csv')
|
|
$format='csv';
|
|
elseif (strtolower($format)=='plat')
|
|
$format='plat';
|
|
elseif (strtolower($format)=='sdin')
|
|
$format='sdin';
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'format' doit être 'csv', 'plat' ou 'stdin' et non '$format' pour le client $dirToCheck !".EOL);
|
|
|
|
|
|
if (!isset($tabInfos['chargement']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'chargement' n'est pas définie pour le client $dirToCheck !".EOL);
|
|
$chargement=$tabInfos['chargement'];
|
|
if (strtoupper($chargement)=='AR')
|
|
$chargement='AR';
|
|
elseif (strtoupper($chargement)=='MAJ')
|
|
$chargement='MAJ';
|
|
elseif (strtoupper($chargement)=='AJOUT')
|
|
$chargement='AJOUT';
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'chargement' doit être 'AR', 'MAJ' ou 'AJOUT' et non '$chargement' pour le client $dirToCheck !".EOL);
|
|
|
|
if (!isset($tabInfos['frequence']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'frequence' n'est pas définie pour le client $dirToCheck !".EOL);
|
|
$frequence=$tabInfos['frequence'];
|
|
if (strtoupper($frequence)=='Q')
|
|
$frequence='Q';
|
|
elseif (strtoupper($frequence)=='H')
|
|
$frequence='H';
|
|
elseif (strtoupper($frequence)=='M')
|
|
$frequence='M';
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'frequence' doit être 'Q', 'H' ou 'M' et non '$frequence' pour le client $dirToCheck !".EOL);
|
|
|
|
$retro=@$tabInfos['retro'].'';
|
|
if ($retro=='' || $retro==0) {
|
|
echo (date ('Y/m/d - H:i:s')." - Pas de rétroactivité pour le client $dirToCheck !".EOL);
|
|
$retro=NULL;
|
|
}
|
|
$dateFluxDef=@$tabInfos['dateFlux'];
|
|
if (isset($tabInfos['dateFlux']) && @$tabInfos['dateFmt']<>'Ymd')
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : Le format de 'dateFlux' doit être 'Ymd' pour le client $dirToCheck !".EOL);
|
|
|
|
$mailClient=false;
|
|
if (isset($tabInfos['mailClient']) && $tabInfos['mailClient']<>'')
|
|
$mailClient=$tabInfos['mailClient'];
|
|
|
|
$concatenerRef=false;
|
|
if (isset($tabInfos['concatenerRef']) && ($tabInfos['concatenerRef']==true || $tabInfos['concatenerRef']*1==1))
|
|
$concatenerRef=true;
|
|
|
|
// Liste des zones
|
|
$tabZones=$tabFmt['Zones'];
|
|
|
|
foreach ($tabFichier as $numFic=>$fichier_csv) {
|
|
$fp=fopen($ftpDir.$dirToCheck."/send/$fichier_csv", 'r');
|
|
if (!$fp) {
|
|
echo date ('Y/m/d - H:i:s')." - ERREUR : Impossible d'ouvrir le fichier : ".$fichier_csv." !".EOL;
|
|
die();
|
|
}
|
|
$dateFlux='';
|
|
|
|
if ($dateFluxDef<>'' && preg_match('/^n(\d*),(\d*)$/', trim($dateFluxDef), $z))
|
|
$dateFlux=trim(substr($fichier_csv, ($z[1])-1, $z[2]));
|
|
elseif ($dateFluxDef<>'' && preg_match('/^dateDepot$/i', trim($dateFluxDef), $z))
|
|
$dateFlux=date('Ymd', filemtime ($ftpDir.$dirToCheck."/send/$fichier_csv"));
|
|
|
|
if ($dateFlux*1<20071231) $dateFlux=date('Ymd');
|
|
|
|
echo date ('Y/m/d - H:i:s')." - Début du traitement du fichier ". $fichier_csv ."...".EOL;
|
|
$numLigne=$nbConfs=$nbAjouts=0;
|
|
$nbSirenValide=$nbSirenErreur=0;
|
|
$tabIdClients=$erreurSiren=array();
|
|
while(!feof($fp)) {
|
|
$line=fgets($fp, 4096);
|
|
if (trim($line)=='') break;
|
|
|
|
$numLigne++;
|
|
//$ligne, $format='sdin', $tabZones=array(), $idClientDef='') {
|
|
$data=@getLigneFormat($line, $format, $tabZones, $idClientDef, $dateFlux);
|
|
|
|
if (!isset($tabInfos['idClient']) && $idClientDef=='')
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La variable 'idClient' n'est pas définie pour le client $dirToCheck !".EOL);
|
|
|
|
$data['indTrt'] = 1;
|
|
$idClient=$data['idClient'];
|
|
|
|
$dateFichier=$data['dateFlux'];
|
|
$dateDerEnvoi=WDate::period2Days($dateFichier, $retro, true);
|
|
if ($dateDerEnvoi==NULL) $dateDerEnvoi=WDate::period2Days($dateFichier, '5 jours', true);
|
|
//die($dateFichier.EOL.$dateDerEnvoi.EOL);
|
|
unset($data['dateFlux']);
|
|
|
|
if ($chargement<>'AJOUT' && ($numLigne==1 || !in_array($idClient, $tabIdClients))) {
|
|
/** Passage à 0 de l'indicateur ligne traitée **/
|
|
$res=$iDbSurv->update('surveillances_listes', array('indTrt'=>0), "idClient='$idClient'");
|
|
if ($res) echo date ('Y/m/d - H:i:s')." - Toutes les lignes du client $idClient ont été positionnées à non traitées !".EOL;
|
|
else die (date ('Y/m/d - H:i:s')." - ERREUR : Impossible de positionner les lignes du client $idClient à non traitées !!!".EOL);
|
|
$tabIdClients[]=$idClient;
|
|
}
|
|
|
|
/** Contrôle de la validité du siren **/
|
|
if ($iInsee->valideSiren($data['siren'])) {
|
|
$data['sirenValide']=1;
|
|
$nbSirenValide++;
|
|
} else {
|
|
$data['sirenValide']=0;
|
|
$nbSirenErreur++;
|
|
if (trim($data['siren'])=='') @$erreurSiren['vide']++;
|
|
elseif (trim($data['siren'])*1==0) @$erreurSiren['zero']++;
|
|
}
|
|
|
|
if ($concatenerRef) $data['ref']=$data['ref'].'-'.$data['refInfos'];
|
|
|
|
/** Ajout ou mise à jour de la référence **/
|
|
$res=$iDbSurv->select('surveillances_listes', 'count(*)', "idClient='$idClient' AND ref='".$data['ref']."'");
|
|
if (@$res[0][0] > 0) {
|
|
/** Cette référence est déjà sous surveillance pour ce client **/
|
|
$dataUpdate=array_merge($data, array('dateConf'=>$dateFichier));
|
|
$res=$iDbSurv->update('surveillances_listes', $dataUpdate, "idClient='$idClient' AND ref='".$data['ref']."'");
|
|
if (!$res) die (date ('Y/m/d - H:i:s')." - ERREUR : Ligne $idClient, ".$data['siren'].", ".$data['ref']." mise à jour IMPOSSIBLE !!!".EOL);
|
|
else $nbConfs++;
|
|
} else {
|
|
$dataInsert=array_merge($data, array('dateAjout'=>$dateFichier,'dateDerEnvoi'=>$dateDerEnvoi));
|
|
$res=$iDbSurv->insert('surveillances_listes', $dataInsert);
|
|
if (!$res) {
|
|
echo date ('Y/m/d - H:i:s')." - Lignes $idClient, ".$data['siren'].", ".$data['ref']." ERREUR LORS DE L'AJOUT !!!".EOL;
|
|
die(mysql_error());
|
|
}
|
|
else $nbAjouts++;
|
|
}
|
|
}
|
|
|
|
echo date ('Y/m/d - H:i:s')." - Nombre de lignes à surveiller ajoutées pour $idClient = $nbAjouts.".EOL;
|
|
$mailInfo =" - Nombre de lignes à surveiller ajoutées : $nbAjouts".EOL;
|
|
if ($chargement<>'AJOUT') {
|
|
$res=$iDbSurv->select('surveillances_listes', 'count(*)', "idClient='$idClient' AND indTrt=0 AND dateSuppr=0");
|
|
$nbSuppr=$res[0][0];
|
|
$nbConfs=$nbConfs-$nbSuppr;
|
|
echo date ('Y/m/d - H:i:s')." - Nombre de lignes à surveiller confirmées pour $idClient = $nbConfs.".EOL;
|
|
$mailInfo.=" - Nombre de lignes à surveiller confirmées : $nbConfs".EOL;
|
|
echo date ('Y/m/d - H:i:s')." - Nombre de lignes à surveiller supprimées pour $idClient = $nbSuppr.".EOL;
|
|
$mailInfo.=" - Nombre de lignes à surveiller supprimées : $nbSuppr".EOL;
|
|
|
|
$res=$iDbSurv->update('surveillances_listes', array('dateSuppr'=>$dateFichier), "idClient='$idClient' AND indTrt=0 AND dateSuppr=0",true);
|
|
if (!$res) die (date ('Y/m/d - H:i:s')." - ERREUR : Impossible de supprimer les surveillances obsolètes du client $idClient !!!".EOL);
|
|
|
|
$res=$iDbSurv->update('surveillances_listes', array('dateSuppr'=>0), "idClient='$idClient' AND dateConf>dateSuppr AND dateSuppr<>0");
|
|
$nbReact=$res[0][0];
|
|
if ($nbReact>0) {
|
|
echo date ('Y/m/d - H:i:s')." - Attention, $nbReact ligne(s) ont été réactivées !".EOL;
|
|
$mailInfo.="Attention, $nbReact ligne(s) ont été réactivées !".EOL;
|
|
}
|
|
}
|
|
if ($mailClient) {
|
|
$mailInfo.="$nbSirenValide SIREN sont valides et $nbSirenErreur invalides dont :".EOL;
|
|
$mailInfo.=print_r($erreurSiren,true).EOL;
|
|
sendMail('production@scores-decisions.com', $mailClient, "Scores & Décisions - Chargement du stock en surveillance", "Résumé du traitement de chargement du stock pour $idClient,".EOL.EOL."Fichier de type $chargement ($frequence) horodatage $dateFlux contenant $numLigne ligne(s) :".EOL.$mailInfo);
|
|
sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "Scores & Décisions - Chargement du stock en surveillance", "Résumé du traitement de chargement du stock pour $idClient,".EOL.EOL."Fichier de type $chargement ($frequence) horodatage $dateFlux contenant $numLigne ligne(s) :".EOL.$mailInfo);
|
|
}
|
|
|
|
if (!move($ftpDir.$dirToCheck."/send/$fichier_csv", "/home/data/clients/$dirToCheck/$fichier_csv"))
|
|
echo date ('Y/m/d - H:i:s')." - ERREUR : Déplacement du fichier $fichier_csv dans client/$dirToCheck/ impossible !".EOL;
|
|
}
|
|
} else
|
|
echo date ('Y/m/d - H:i:s')." - Aucun fichier a intégrer pour le client $dirToCheck.".EOL;
|
|
}
|
|
echo date ('Y/m/d - H:i:s') . " - Fin du traitement.".EOL;
|
|
|
|
|
|
function getLigneFormat($line, $format='sdin', $tabZones=array(), $idClientDef='', $dateFluxDef='') {
|
|
$data=array();
|
|
global $idClientDef;
|
|
|
|
if ($format=='sdin') {
|
|
$data['idClient'] = trim(substr($line, 27, 36)); // Identifiant Client
|
|
if ($data['idClient']=='' && $idClientDef<>'')
|
|
$data['idClient']=$idClientDef;
|
|
$data['siren'] = trim(substr($line, 98, 9)); // SIREN
|
|
$data['nic'] = trim(substr($line, 107, 5)); // NIC
|
|
$data['rs'] = trim(substr($line, 112, 60)); // RS
|
|
$data['cp'] = trim(substr($line, 332, 5)); // CP
|
|
$data['ville'] = trim(substr($line, 337, 40)); // Ville
|
|
$data['ref'] = trim(substr($line, 417, 18)); // Référence Client
|
|
$data['dateFlux'] = trim(substr($line, 3, 8)); // Date du fichier
|
|
if ($data['idClient']=='SURBODPRDFTSMEDERIC') {
|
|
$data['ref'] = substr($data['ref'], 0, 9); // Référence Client Fixe
|
|
$data['refInfos']= substr($data['ref'], 9, 9); // Référence Client à titre d'information
|
|
}
|
|
|
|
} elseif ($format=='plat') {
|
|
$data['idClient']=trim($idClientDef);
|
|
// Zone idClient
|
|
if (isset($tabZones['idClient']) && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['idClient']), $z))
|
|
$data['idClient'].=trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif (!isset($tabZones['idClient']) && $idClientDef=='')
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'idClient' est incorrecte !".EOL);
|
|
// Zone siren
|
|
if (preg_match('/^c(\d*),(\d*)$/', trim($tabZones['siren']), $z))
|
|
$data['siren'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'siren' est incorrecte !".EOL);
|
|
// Zone ref
|
|
if (preg_match('/^c(\d*),(\d*)$/', trim($tabZones['ref']), $z))
|
|
$data['ref'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'ref' est incorrecte !".EOL);
|
|
// Zone refInfos
|
|
if (isset($tabZones['refInfos']) && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['refInfos']), $z))
|
|
$data['refInfos'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif (isset($tabZones['refInfos']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'refInfos' est incorrecte !".EOL);
|
|
|
|
// Zone rs
|
|
if (isset($tabZones['rs']) && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['rs']), $z))
|
|
$data['rs'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif (isset($tabZones['rs']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'rs' est incorrecte !".EOL);
|
|
// Zone cp
|
|
if (isset($tabZones['cp']) && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['cp']), $z))
|
|
$data['cp'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif (isset($tabZones['cp']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'cp' est incorrecte !".EOL);
|
|
// Zone ville
|
|
if (isset($tabZones['ville']) && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['ville']), $z))
|
|
$data['ville'] = trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif (isset($tabZones['ville']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'ville' est incorrecte !".EOL);
|
|
|
|
// Zone dateFlux
|
|
if ($dateFluxDef=='' && preg_match('/^c(\d*),(\d*)$/', trim($tabZones['dateFlux']), $z))
|
|
$data['dateFlux']= trim(substr($line, ($z[1])-1, $z[2]));
|
|
elseif ($dateFluxDef=='')
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'dateFlux' est incorrecte !".EOL);
|
|
else $data['dateFlux']=$dateFluxDef;
|
|
|
|
} elseif ($format=='csv') {
|
|
|
|
$data['idClient']=trim($idClientDef);
|
|
$tabLine=explode(',', $line);
|
|
|
|
// Zone idClient
|
|
if (isset($tabZones['idClient']) && preg_match('/^z(\d*)$/', trim($tabZones['idClient']), $z))
|
|
$idClientDef=$data['idClient']=trim($tabLine[$z[1]-1]);
|
|
// elseif (!isset($tabZones['idClient']) && $idClientDef=='')
|
|
// die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'idClient' est incorrecte !".EOL);
|
|
|
|
// Zone siren
|
|
if (preg_match('/^z(\d*)$/', trim($tabZones['siren']), $z))
|
|
$data['siren'] = trim($tabLine[$z[1]-1]);
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'siren' est incorrecte !".EOL);
|
|
|
|
// Zone ref
|
|
if (preg_match('/^z(\d*)$/', trim($tabZones['ref']), $z))
|
|
$data['ref'] = trim($tabLine[$z[1]-1]);
|
|
else
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'ref' est incorrecte !".EOL);
|
|
|
|
// Zone refInfos
|
|
if (isset($tabZones['refInfos']) && preg_match('/^z(\d*)$/', trim($tabZones['refInfos']), $z))
|
|
$data['refInfos'] = trim($tabLine[$z[1]-1]);
|
|
elseif (isset($tabZones['refInfos']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'refInfos' est incorrecte !".EOL);
|
|
|
|
// Zone rs
|
|
if (isset($tabZones['rs']) && preg_match('/^z(\d*)$/', trim($tabZones['rs']), $z))
|
|
$data['rs'] = trim($tabLine[$z[1]-1]);
|
|
elseif (isset($tabZones['rs']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'rs' est incorrecte !".EOL);
|
|
|
|
// Zone cp
|
|
if (isset($tabZones['cp']) && preg_match('/^z(\d*)$/', trim($tabZones['cp']), $z))
|
|
$data['cp'] = trim($tabLine[$z[1]-1]);
|
|
elseif (isset($tabZones['cp']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'cp' est incorrecte !".EOL);
|
|
|
|
// Zone ville
|
|
if (isset($tabZones['ville']) && preg_match('/^z(\d*)$/', trim($tabZones['ville']), $z))
|
|
$data['ville'] = trim($tabLine[$z[1]-1]);
|
|
elseif (isset($tabZones['ville']))
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'ville' est incorrecte !".EOL);
|
|
|
|
// Zone dateFlux
|
|
if ($dateFluxDef=='' && preg_match('/^z(\d*)$/', trim($tabZones['dateFlux']), $z))
|
|
$data['dateFlux']= trim($tabLine[$z[1]-1]);
|
|
elseif ($dateFluxDef=='')
|
|
die(date ('Y/m/d - H:i:s')." - ERREUR : La zone 'dateFlux' est incorrecte !".EOL);
|
|
else $data['dateFlux']=$dateFluxDef;
|
|
|
|
}
|
|
return $data;
|
|
}
|
|
?>
|