2010-12-06 18:13:56 +01:00
#!/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 ];
}
2011-02-17 18:33:25 +01:00
function kbisLog ( $siren , $piece , $message , $typeLog = 'DEBUG' )
{
2010-12-06 18:13:56 +01:00
global $heureDemande ;
if ( $typeLog == 'DEBUG' ) {
2011-02-17 18:33:25 +01:00
$fp = fopen ( " kbis.log " , 'a' );
2010-12-06 18:13:56 +01:00
fwrite ( $fp , date ( 'Y-m-d H:i:s' ) . " - $siren ( $heureDemande ) $piece $message " . EOL );
fclose ( $fp );
} else {
2011-02-17 18:33:25 +01:00
$fp = fopen ( " kbis-error.log " , 'a' );
2010-12-06 18:13:56 +01:00
fwrite ( $fp , date ( 'Y-m-d H:i:s' ) . " - $siren ( $heureDemande ) $piece $message " . EOL );
fclose ( $fp );
}
}
2011-02-17 18:33:25 +01:00
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 ;
}
2010-12-06 18:13:56 +01:00
if ( $siren < 100 || ! $iInsee -> valideSiren ( $siren )) {
kbisLog ( $siren , $piece , " IN : Siren $siren Invalide ! " );
2011-02-17 18:33:25 +01:00
exit ;
2010-12-06 18:13:56 +01:00
} 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 ! " );
2011-02-17 18:33:25 +01:00
exit ;
2010-12-06 18:13:56 +01:00
}
2011-02-17 18:33:25 +01:00
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 );
2010-12-06 18:13:56 +01:00
2011-02-17 18:33:25 +01:00
$tabListInit = ftp_nlist ( $conn_id , strtolower ( FORMAT ) . '/' );
$nbList = count ( $tabListInit );
$nbEssais = 0 ; // Nombre de tentatives de récupération
2010-12-06 18:13:56 +01:00
2011-02-17 18:33:25 +01:00
// 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 ;
}
2010-12-06 18:13:56 +01:00
fclose ( $fp );
kbisLog ( $siren , $piece , " IN : Fichier déposé en commande sur le FTP " );
2011-02-17 18:33:25 +01:00
// Surveillance du FTP pour récupération du fichier
while ( true )
{
2010-12-06 18:13:56 +01:00
$nbEssais ++ ;
sleep ( $dureeInterval );
2011-02-17 18:33:25 +01:00
$tabList = ftp_nlist ( $conn_id , strtolower ( FORMAT ) . '/' );
if ( count ( $tabList ) > $nbList )
{
2010-12-06 18:13:56 +01:00
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 !!!
2011-02-17 18:33:25 +01:00
$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 ))
{
2010-12-06 18:13:56 +01:00
// Problème FTP --> STOP
kbisLog ( $siren , $piece , " OUT : Problème FTP " );
2011-02-17 18:33:25 +01:00
exit ;
2010-12-06 18:13:56 +01:00
}
2011-02-17 18:33:25 +01:00
//Traitement en fonction du format
if ( FORMAT == 'PDF' )
{
shell_exec ( PDFTOTEXT . ' ' . $kbisLocalPDF . ' ' . $kbisLocalTXT );
$str = file_get_contents ( $kbisLocalTXT );
$sirenLu = checkSiren ( $siren , $str );
if ( $sirenLu ){
2010-12-06 18:13:56 +01:00
kbisLog ( $siren , $piece , " OUT : Le nouveau fichier est celui attendu ( $sirenLu = $siren ) " );
2011-02-17 18:33:25 +01:00
} else {
2010-12-06 18:13:56 +01:00
kbisLog ( $siren , $piece , " OUT : Le nouveau fichier n'est pas celui attendu ( $sirenLu <> $siren ) " );
2011-02-17 18:33:25 +01:00
unlink ( $kbisLocalPDF );
}
break ;
2010-12-06 18:13:56 +01:00
}
2011-02-17 18:33:25 +01:00
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
{
2010-12-06 18:13:56 +01:00
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 );
2011-02-17 18:33:25 +01:00
exit ;
2010-12-06 18:13:56 +01:00
}
}
}
// 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 );
2011-02-17 18:33:25 +01:00
exit ;