#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini 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; } ?>