webservice/batch/getPieces.php
2011-02-17 17:33:25 +00:00

265 lines
9.0 KiB
PHP

#!/usr/bin/php
<?php
ini_set('memory_limit', '1024M');
//Durée maximale du script
$dureeMaxi=300; // secondes (soit 5 minutes)
//Interval entre chaque tentative de récupération des Kbis sur le FTP
$dureeInterval=5; // secondes
set_time_limit(($dureeMaxi+10));
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(),
)));
require_once realpath(dirname(__FILE__)).'/../config/config.php';
require_once 'framework/fwk.php';
require_once 'framework/common/chiffres.php';
require_once 'framework/common/dates.php';
require_once 'framework/mail/sendMail.php';
require_once 'Metier/insee/classMInsee.php';
require_once 'Metier/partenaires/classMGreffes.php';
require_once 'Metier/partenaires/classMBilans.php';
$strInfoScript='Usage : '.basename($argv[0]). " SIREN [PIECE='kbis'] [TYPE=''] [VISU=1] [COURRIER=0] [REF='']
Récupération d'une pièce (kbis par défaut) pour un SIREN.
[PIECE]
kbis Seul pièce possible pour l'instant
";
$siren=0;
$piece='kbis';
$type='';
$visu=1;
$courrier=0;
$ref='';
$heureDemande = date('Hi');
$iInsee = new MInsee();
for ($i=1; isset($argv[$i]); $i++) {
if (substr($argv[$i],0,1)=='-') {
switch (strtolower(substr($argv[$i],1,1))) {
case '-':
case '?':
die($strInfoScript);
break;
default:
die('Option '. $argv[$i] . ' inconnue !'.EOL);
break;
}
}
elseif ($i==1) $siren=$argv[$i]*1;
elseif ($i==2) $piece=$argv[$i];
elseif ($i==3) $type=$argv[$i];
elseif ($i==4) $visu=$argv[$i];
elseif ($i==5) $courrier=$argv[$i];
elseif ($i==6) $ref=$argv[$i];
}
function kbisLog($siren,$piece,$message,$typeLog='DEBUG')
{
global $heureDemande;
if ($typeLog=='DEBUG') {
$fp = fopen("kbis.log", 'a');
fwrite($fp, date('Y-m-d H:i:s')." - $siren ($heureDemande) $piece $message".EOL);
fclose($fp);
} else {
$fp = fopen("kbis-error.log", 'a');
fwrite($fp, date('Y-m-d H:i:s')." - $siren ($heureDemande) $piece $message".EOL);
fclose($fp);
}
}
function checkSiren($siren, $str)
{
$pattern = "/((?:\s[0-9]{9,9})|(?:\s[0-9]{3,3}\s[0-9]{3,3}\s[0-9]{3,3})|(?:\s[0-9]{3,3}\.[0-9]{3,3}\.[0-9]{3,3})|(?:\s[0-9]{3,3}-[0-9]{3,3}-[0-9]{3,3}))/U";
if (preg_match($pattern, $str, $matches))
{
$sirenLu = trim(str_replace(' ','', $matches[1]));
if ($sirenLu == $siren)
{
return $sirenLu;
}
}
return false;
}
if ($siren<100 || !$iInsee->valideSiren($siren)) {
kbisLog($siren, $piece, "IN : Siren $siren Invalide !");
exit;
} else {
switch (strlen($siren)) {
case 1: $siren='00000000'.$siren; break;
case 2: $siren='0000000'.$siren; break;
case 3: $siren='000000'.$siren; break;
case 4: $siren='00000'.$siren; break;
case 5: $siren='0000'.$siren; break;
case 6: $siren='000'.$siren; break;
case 7: $siren='00'.$siren; break;
case 8: $siren='0'.$siren; break;
}
}
if ($piece<>'kbis') {
kbisLog($siren, $piece, "IN : Piece $piece inexistante !");
exit;
}
define('FORMAT', 'PDF'); //HTML ou PDF
define('PKBIS_HOST', '192.168.3.4');
define('PKBIS_USER', 'kbis');
define('PKBIS_PASS', 'kbis');
define('PDFTOTEXT', '/usr/bin/pdftotext'); // Vérifier que l'executable existe
define('WKHTMLTOPDF', '/usr/bin/wkhtmltopdf'); // Vérifier que l'executable existe....
/*
Principe de fonctionnement
- Vérifier en local que le fichier n'existe pas déjà et qu'il a moins d'un jour
- Envoi dun fichier portant le nom de $pieces-$siren.txt sur le ftp pour le
début de la récupération du kbis
- Vérifier sur le FTP que le fichier est disponible
Comparaison avec un ftp_nlist sur dossier /pdf ou /html
- Vérifier la date du fichier HTML (qui est le fichier source) afin d'écrire dans les logs
- Vérifier que le fichier PDF ou HTML correspond bien au SIREN demandé
Pour le fichier PDF, transformation avec pdftotext, et on parcours le fichier
texte à la recherche du SIREN
Pour le fichier HTML, on parcours le fichier à la recherche du siren et
on le tranforme en PDF grâce à wkhtmltopdf
*/
$kbisLocalPDF = DOC_WEB_LOCAL."kbis/$piece-$siren.pdf";
$kbisLocalHTML = DOC_WEB_LOCAL."kbis/$piece-$siren.html";
$kbisLocalTXT = DOC_WEB_LOCAL."kbis/$piece-$siren.txt";
if (file_exists($kbisLocalPDF)
&& date('Ymd',filectime($kbisLocalPDF))==date('Ymd')){
exit;
} else {
if (file_exists($kbisLocalHTML)) unlink($kbisLocalHTML);
if (file_exists($kbisLocalPDF)) unlink($kbisLocalPDF);
if (file_exists($kbisLocalTXT)) unlink($kbisLocalTXT);
}
// Ouverture de la connexion FTP
$conn_id = ftp_connect(PKBIS_HOST);
$login_result = ftp_login($conn_id, PKBIS_USER, PKBIS_PASS);
$tabListInit = ftp_nlist($conn_id, strtolower(FORMAT).'/');
$nbList = count($tabListInit);
$nbEssais = 0; // Nombre de tentatives de récupération
// Fichier à déposer sur le FTP pour débuter la commande
$fp = fopen(DOC_WEB_LOCAL."kbis/$piece-$siren", 'w+');
fwrite($fp, "$siren;$piece;$type;$visu;$courrier;$ref");
rewind($fp);
if (!ftp_fput($conn_id, "in/$piece-$siren.txt", $fp, FTP_ASCII)){
//Envoi mail pour erreur
exit;
}
fclose($fp);
kbisLog($siren, $piece, "IN : Fichier déposé en commande sur le FTP");
// Surveillance du FTP pour récupération du fichier
while (true)
{
$nbEssais++;
sleep($dureeInterval);
$tabList = ftp_nlist($conn_id, strtolower(FORMAT).'/');
if (count($tabList)>$nbList)
{
kbisLog($siren, $piece, "WAIT : Essai $nbEssais, des nouveaux fichiers sont disponibles sur le FTP !");
sleep($dureeInterval); // Laisse le temps au serveur de K-Bis de finir le fichier PDF !!!
$tabNom = array_diff($tabList,$tabListInit);
//Récupération du fichier
ftp_chdir($conn_id, strtolower(FORMAT));
$ficDist = str_replace(strtolower(FORMAT).'/', '', reset($tabNom));
if (!ftp_get($conn_id,DOC_WEB_LOCAL."kbis/$piece-$siren.".strtolower(FORMAT), $ficDist, FTP_BINARY))
{
// Problème FTP --> STOP
kbisLog($siren, $piece, "OUT : Problème FTP");
exit;
}
//Traitement en fonction du format
if (FORMAT == 'PDF')
{
shell_exec(PDFTOTEXT.' '.$kbisLocalPDF.' '.$kbisLocalTXT);
$str = file_get_contents($kbisLocalTXT);
$sirenLu = checkSiren($siren, $str);
if ($sirenLu){
kbisLog($siren, $piece, "OUT : Le nouveau fichier est celui attendu ($sirenLu=$siren)");
} else {
kbisLog($siren, $piece, "OUT : Le nouveau fichier n'est pas celui attendu ($sirenLu<>$siren)");
unlink($kbisLocalPDF);
}
break;
}
elseif (FORMAT == 'HTML')
{
$str = file_get_contents($kbisLocalHTML);
$str = preg_replace('@<DIV class=no-print>.*?</DIV>@si', '', $str);
file_put_contents($kbisLocalHTML, $str);
$sirenLu = checkSiren($siren, $str);
if ($sirenLu){
kbisLog($siren, $piece, "OUT : Le nouveau fichier est celui attendu ($sirenLu=$siren)");
shell_exec(WKHTMLTOPDF.' '.$kbisLocalHTML.' '.$kbisLocalPDF);
} else {
kbisLog($siren, $piece, "OUT : Le nouveau fichier n'est pas celui attendu ($sirenLu<>$siren)");
unlink($kbisLocalHTML);
}
break;
}
//Log ?
ftp_chdir($conn_id, '/html');
$tabListHtml = ftp_nlist($conn_id, $siren.'*');
foreach ($tabListHtml as $fichierHtml)
{
$ficDist2 = str_replace('html/', '', $fichierHtml);
$buff = ftp_mdtm($conn_id, $ficDist2);
if ($buff!=-1 && date("Ymd", $buff)==date("Ymd")) {
$fp = fopen(LOG_PATH."/$piece-commande.log", 'a+');
fwrite($fp, date('Y/m/d H:i:s')." - $siren - Nb fichier HTML : ".count($tabListHtml).print_r($tabListHtml));
fclose($fp);
}
}
}
else
{
kbisLog($siren, $piece, "WAIT : Essai $nbEssais, aucun nouveau fichier disponible sur le FTP !");
if (($nbEssais*$dureeInterval)>$dureeMaxi) {
kbisLog($siren, $piece, "OUT : Essai $nbEssais, ERREUR aucun kbis trouvé en $dureeMaxi secondes sur le FTP !");
kbisLog($siren, $piece, "OUT : Essai $nbEssais, ERREUR aucun kbis trouvé en $dureeMaxi secondes sur le FTP !", 'ERROR');
$message="ERREUR lors de la récupération du '$piece' pour le siren $siren (aucun PDF sur le serveur FTP au bout de $nbEssais essais en $dureeMaxi secondes)".EOL;
$message.=EOL."Si vous obtenez régulièrement ce message avec des siren différents, il faut probablement relancer la passerelle de commandes de pièces officielles.".EOL;
sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com,mricois@scores-decisions.com', 'ERREUR KBIS entre la passerelle et le WebService', $message);
exit;
}
}
}
// Fermeture de la connexion et du pointeur de fichier
ftp_close($conn_id);
kbisLog($siren, $piece, "OUT : Fin normale de la récupération du kbis".EOL);
exit;