2010-12-14 15:37:38 +00:00
#!/usr/bin/php
2010-12-14 15:02:37 +00:00
< ? php
2010-12-14 15:37:38 +00:00
ini_set ( 'memory_limit' , '1024M' );
2010-12-14 15:02:37 +00:00
error_reporting ( E_ALL & ~ E_NOTICE );
2010-12-14 15:37:38 +00:00
// Define path to application directory
defined ( 'APPLICATION_PATH' )
|| define ( 'APPLICATION_PATH' , realpath ( dirname ( __FILE__ ) . '/../application' ));
// 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' ;
2010-12-14 15:02:37 +00:00
$strInfoScript = 'Usage : ' . basename ( $argv [ 0 ]) . " [OPTION]
Mise à jour des ratios en fonction de l ' arrivée de nouveaux Bilans dans la base entreprise S & D .
Options :
- t Calculer tous les ratios ( * )
- i : XXX Reprendre à la ligne XXX
- c Mettre à jour le cache
- d : SSAAMMJJhhiiss Forcer la date de dernière MAJ à ...
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
( * ) Option par défaut si aucun argument n ' est passé .
" ;
$iDeb = 0 ;
$updateCache = false ;
for ( $i = 1 ; isset ( $argv [ $i ]); $i ++ ) {
if ( substr ( $argv [ $i ], 0 , 1 ) == '-' ) {
switch ( strtolower ( substr ( $argv [ $i ], 1 , 1 ))) {
case 't' :
break ;
case 'i' :
$iDeb = substr ( $argv [ $i ], 3 ) * 1 ;
break ;
case 'd' :
$dateDeb = substr ( $argv [ $i ], 3 ) * 1 ;
break ;
case 'c' :
$updateCache = true ;
break ;
case '-' :
case '?' :
die ( $strInfoScript );
break ;
default :
die ( 'Option ' . $argv [ $i ] . ' inconnue !' . EOL );
break ;
}
}
}
//$iDbI=new WDB('insee');
$iDb = new WDB ( 'jo' );
$iDb2 = new WDB ( 'jo' );
$iInsee = new MInsee ();
if ( $updateCache ) {
2010-12-14 15:37:38 +00:00
include_once 'Metier/scores/classMRatios.php' ;
2010-12-14 15:02:37 +00:00
if ( genereCacheRatios ())
echo date ( 'Y/m/d - H:i:s' ) . " - Le cache des ratios a été généré avec succès ! " . EOL ;
else
echo date ( 'Y/m/d - H:i:s' ) . " - Erreur lors de la génération du cache des ratios ! " . EOL ;
die ();
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
echo date ( 'Y/m/d - H:i:s' ) . " - DEBUT du programme de calcul des ratios... " . EOL ;
$tabLast = $iDb -> select ( 'ratios_formules' ,
'max(dateUpdate) AS lastUpdate, max(dateInsert) AS lastInsert' ,
'1' );
$lastUpdate = $tabLast [ 0 ][ 'lastInsert' ];
if ( $tabLast [ 0 ][ 'lastUpdate' ] > $lastUpdate ) $lastUpdate = $tabLast [ 0 ][ 'lastUpdate' ];
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
/** On vérifie la présence du cache de calcul des ratios **/
2010-12-14 15:37:38 +00:00
$pathMetier = realpath ( APPLICATION_PATH . '/../library/Metier' );
if ( ! file_exists ( $pathMetier . '/tmp/configMRatios.php' ))
2010-12-14 15:02:37 +00:00
die ( date ( 'Y/m/d - H:i:s' ) . " - ERREUR FATALE : Le cache des calculs de ratio n'existe pas ! " . EOL );
/** On vérifie qu'il n'y a pas de nouvelles formules à mettre dans le cache de calcul des ratios **/
2010-12-14 15:37:38 +00:00
elseif ( strtr ( $lastUpdate , array ( ':' => '' , '-' => '' , ' ' => '' )) > date ( 'YmdHis' , filectime ( $pathMetier . '/tmp/configMRatios.php' ))) {
sendMail ( 'production@scores-decisions.com' , 'ylenaour@scores-decisions.com' , " ERREUR FATALE, le cache ratio n'est pas à jour ! " , date ( 'Y/m/d - H:i:s' ) . " - ERREUR FATALE : Le cache des calculs de ratio n'est pas à jour (nouvelles formules ?). Relancer à l'option -c ! " );
2010-12-14 15:02:37 +00:00
die ( date ( 'Y/m/d - H:i:s' ) . " - ERREUR FATALE : Le cache des calculs de ratio n'est pas à jour (nouvelles formules ?). Relancer à l'option -c ! " . EOL );
}
/** On vérifie que le programme de MAJ du cache n'a pas été modifié **/
2010-12-14 15:37:38 +00:00
elseif ( date ( 'YmdHis' , filectime ( $pathMetier . '/scores/classMRatios.php' )) > date ( 'YmdHis' , filectime ( $pathMetier . '/tmp/configMRatios.php' ))) // Le fichier de cache est déprécié
2010-12-14 15:02:37 +00:00
die ( date ( 'Y/m/d - H:i:s' ) . " - ERREUR FATALE : Le cache des calculs de ratio n'est pas à jour (programme modifié). Relancer à l'option -c ! " . EOL );
2010-12-14 15:37:38 +00:00
include_once 'Metier/tmp/configMRatios.php' ;
echo date ( 'Y/m/d - H:i:s' ) . " - Formules de calcul des ratios déjà en cache. " . EOL ;
2010-12-14 15:02:37 +00:00
/** Recherche de la dernière mise à jour des ratios secteurs **/
$tabLast = $iDb -> select ( 'ratios_secteurs' ,
'max(dateUpdate) AS lastUpdate, max(dateInsert) AS lastInsert' ,
'1' );
$lastUpdate = $tabLast [ 0 ][ 'lastInsert' ];
if ( $tabLast [ 0 ][ 'lastUpdate' ] > $lastUpdate ) $lastUpdate = $tabLast [ 0 ][ 'lastUpdate' ];
if ( $dateDeb > 20000101123000 ) $lastUpdate = $dateDeb ;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
echo ( date ( 'Y/m/d - H:i:s' ) . " - La dernière mise à jour des ratios secteurs date du $lastUpdate ... " . EOL );
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$nbRows = $iDb -> select ( 'ratios_tmp' , 'siren, lastUpdate' , " 1 " , false , MYSQL_ASSOC , true );
if ( $nbRows > 0 ) {
$modeSuite = true ;
echo date ( 'Y/m/d - H:i:s' ) . " - Il reste $nbRows entreprises pour lesquels il faut mettre à jour les ratios secteurs... " . EOL ;
} else {
/** On met en table temporaire les siren en cas de plantage du script **/
$modeSuite = false ;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
// Date du dernier bilan inseré
$tabLast = $iDb -> select ( 'bilans' ,
'MAX(dateInsert) AS lastDateInsert' ,
" siren>100 AND dateInsert>=' $lastUpdate ' AND typeBilan IN ('N','',' ','A','B') ORDER BY dateInsert DESC " );
$lastDateBilan = strtr ( $tabLast [ 0 ][ 'lastDateInsert' ], array ( ' ' => '' , ':' => '' , '-' => '' ));
echo ( date ( 'Y/m/d - H:i:s' ) . " - Le dernier bilan inséré en base date du $lastDateBilan ... " . EOL );
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
// Liste des derniers Bilans insérés depuis le dernier calcul des ratios
$nbRows = $iDb -> select ( 'bilans' , 'DISTINCT siren' , " siren>100 AND dateInsert>=' $lastUpdate ' AND typeBilan IN ('N','',' ','A','B') ORDER BY dateInsert DESC " , false , MYSQL_ASSOC , true );
$lastDate = strtr ( $lastUpdate , array ( ' ' => '' , ':' => '' , '-' => '' ));
echo date ( 'Y/m/d - H:i:s' ) . " - Il y a $nbRows entreprises avec nouveaux bilans pour calcul des ratios secteurs... " . EOL ;
$iDb2 -> query ( 'DROP TABLE IF EXISTS ratios_tmp;' );
if ( mysql_errno () > 0 ) echo date ( 'Y/m/d - H:i:s' ) . ' - ERREUR SQL lors de la création de la table temporaires, n°' . mysql_errno () . ' : ' . mysql_error () . EOL ;
$strSQL = " CREATE TABLE IF NOT EXISTS ratios_tmp ( siren int(9) unsigned zerofill NOT NULL, lastUpdate bigint(14) unsigned zerofill NOT NULL, lastBilan bigint(14) unsigned zerofill NOT NULL, PRIMARY KEY(siren) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; " ;
$iDb2 -> query ( $strSQL );
if ( mysql_errno () > 0 ) echo date ( 'Y/m/d - H:i:s' ) . ' - ERREUR SQL lors de la création de la table temporaires, n°' . mysql_errno () . ' : ' . mysql_error () . EOL ;
while ( $entrep = $iDb -> fetch ( MYSQL_ASSOC )) {
$iDb2 -> insert ( 'ratios_tmp' , array ( 'siren' => $entrep [ 'siren' ], 'lastUpdate' => $lastDate , 'lastBilan' => $lastDateBilan ));
}
echo date ( 'Y/m/d - H:i:s' ) . " - Les éléments ont été mis en table temporaire en cas de reprise sur erreur ! " . EOL ;
$nbRows = $iDb -> select ( 'ratios_tmp' , 'siren, lastUpdate, lastBilan' , " 1 " , false , MYSQL_ASSOC , true );
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$k = 0 ; // Compteur d'entreprises
$b = 0 ; // Compteur total de bilans
while ( $entrep = $iDb -> fetch ( MYSQL_ASSOC )) {
if ( $modeSuite && $k == 0 ) $lastDate = $entrep [ 'lastUpdate' ];
$k ++ ;
if ( $k < $iDeb ) continue ;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$siren = $entrep [ 'siren' ];
if ( $siren < 100 ) continue ;
// else echo "$siren\n";
$naf4 = $naf5 = '' ;
unset ( $mBil );
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$mBil = new MBilans ( $siren );
/** Récupération des informations Identitaires **/
$tabIdentite =@ $iInsee -> getIdentiteLight ( $siren );
$naf = $tabIdentite [ 'NafEnt' ];
$nafLib = $tabIdentite [ 'NafEntLib' ];
$efftr = $tabIdentite [ 'Effectif' ];
$fj = $tabIdentite [ 'FJ' ];
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
/** On Recherche le dernier Bilan mis à jour **/
$tabBilans = $mBil -> listeBilans ();
$nbBilansTot = count ( $tabBilans );
$tabBilans2 = array ();
foreach ( $tabBilans as $mil => $infosBilan ) {
/** On vérifie s'il n'y a pas de Bilans vides **/
if ( $infosBilan [ 'dureeExercice' ] == 0 ) {
print_r ( $infosBilan );
echo date ( 'Y/m/d - H:i:s' ) . " - Erreur : Bilans vide en base pour le siren $siren ! " . EOL ;
continue ( 2 );
}
/** On ne garde que les Bilans dont la date de provenance est > à la date de dernière Mise à jour
** car les ratios secteurs des autres bilans on déjà été calculés ! **/
if ( $infosBilan [ 'dateInsert' ] >= $lastDate )
$tabBilans2 [ $mil ] = $infosBilan ;
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$nbBilans = count ( $tabBilans2 );
$tabBilan = $tabBil = array ();
2010-12-14 15:37:38 +00:00
if ( $nbBilans == 0 ) {
2010-12-14 15:02:37 +00:00
print_r ( $tabBilans2 );
echo date ( 'Y/m/d - H:i:s' ) . " - Erreur : Aucun nouveau bilan en base pour le siren $siren sur les $nbBilansTot bilans ! " . EOL ;
print_r ( $tabBilans );
//die();
continue ;
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$tabRatios =@ calculRatios ( $tabBilans2 , $tabIdentite , false );
if ( strlen ( $naf ) > 4 ) $naf5 = $naf ; else $naf4 = $naf ;
if ( $tabBilan [ 0 ][ 'CONSOLIDE' ] == 'A' ) $naf4 = 'ASSU' ;
elseif ( $tabBilan [ 0 ][ 'CONSOLIDE' ] == 'B' ) $naf4 = 'BANQ' ;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
if ( $naf4 == 'ASSU' || $naf4 == 'BANQ' ) {
sendMail ( 'production@scores-decisions.com' , 'ylenaour@scores-decisions.com' , " Calcul des ratios : Attention bilan de Banque ou Assurance " , " Siren $siren , bilan $naf4 " . EOL . print_r ( $tabBilans ));
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
foreach ( $tabFormules as $f => $formule ) {
foreach ( $tabRatios as $i => $R ) {
if ( $f == 0 ) $b ++ ;
$id = $formule [ 'id' ];
// Si on n'est pas une banque/assurance, on ne calcul pas les ratios 700 à 799
if ( $naf4 <> 'ASSU' && $naf4 <> 'BANQ' && $id >= 700 && $id < 800 )
continue ;
$annee = substr ( $tabBilan [ $i ][ 'DATE_CLOTURE' ], 0 , 4 );
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
if ( $R [ $id ] === 'NS' || $R [ $id ] === false )
//echo "Le ratio n°$id est non significatif (".$R[$id].") pour le siren $siren et l'année $annee !".EOL;
continue ;
2010-12-14 15:37:38 +00:00
/** Si c'est un ratio EUR, on le passe en K€ **/
2010-12-14 15:02:37 +00:00
if ( $formule [ 'unite' ] == 'EUR' ) $mt = $R [ $id ] / 1000 ;
else $mt = $R [ $id ];
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
/** On vérifie les bornes MIN et MAX **/
if ( $formule [ 'min' ] <> '' && $mt < $formule [ 'min' ]) {
echo " Ratio n° $id , borne Mini non nulle ( " . $formule [ 'min' ] . " ) et le montant est inférieur : $mt < " . $formule [ 'min' ] . " pour le siren $siren et l'année $annee " . EOL ;
continue ;
} elseif ( $formule [ 'max' ] <> '' && $mt > $formule [ 'max' ]) {
echo " Ratio n° $id , borne Maxi non nulle ( " . $formule [ 'max' ] . " ) et le montant est supérieur : $mt > " . $formule [ 'max' ] . " pour le siren $siren et l'année $annee " . EOL ;
2010-12-14 15:37:38 +00:00
continue ;
2010-12-14 15:02:37 +00:00
} //else
//echo "Ratio n°$id compris entre bornes ".$formule['min']." < $mt < ".$formule['max']." pour le siren $siren et l'année $annee".EOL;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
/** Lecture des chiffres existants dans la table ratios_secteurs **/
$tabTmp = $iDb2 -> select ( 'ratios_secteurs' ,
'montant, nombre, id, naf4, naf5, annee' ,
" id= $id AND naf4=' $naf4 ' AND naf5=' $naf5 ' AND annee= $annee " ,
false , MYSQL_ASSOC );
if ( count ( $tabTmp ) > 0 ) {
$mt2 = $mt + $tabTmp [ 0 ][ 'montant' ];
$nb2 = $tabTmp [ 0 ][ 'nombre' ] + 1 ;
} else {
$mt2 = $mt ;
$nb2 = 1 ;
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$tabUpdate = array ( 'montant' => $mt2 ,
'nombre' => $nb2 ,
);
if ( ! $iDb2 -> update ( 'ratios_secteurs' , $tabUpdate , " id= $id AND naf4=' $naf4 ' AND naf5=' $naf5 ' AND annee= $annee " ) || $iDb2 -> getAffectedRows () == 0 ) { // getAffectedRows ajouté le 14 mai 2009
$tabInsert = array_merge ( $tabUpdate , array ( 'id' => $id ,
'naf4' => $naf4 ,
'naf5' => $naf5 ,
'annee' => $annee ,
'dateInsert' => $lastDateBilan ,
));
if ( ! $iDb2 -> insert ( 'ratios_secteurs' , $tabInsert ) && mysql_errno () <> 1062 ) {
$pct = round (( $k / $nbRows ) * 100 , 2 );
echo date ( 'Y/m/d - H:i:s' ) . " - $k entreprises ( $pct %) dont les ratios ont été calculés pour un total de $b bilans ( $siren )... " . EOL ;
echo date ( 'Y/m/d - H:i:s' ) . ' - ERREUR SQL n°' . mysql_errno () . ' : ' . mysql_error () . EOL ;
die ();
}
}
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
if ( $k % 1000 == 0 && $f == 0 && $i == 0 ) {
$pct = round (( $k / $nbRows ) * 100 , 2 );
echo date ( 'Y/m/d - H:i:s' ) . " - $k entreprises ( $pct %) dont les ratios ont été calculés pour un total de $b bilans ( $siren )... " . EOL ;
}
}
}
$iDb2 -> delete ( 'ratios_tmp' , " siren= $siren " );
if ( mysql_errno () > 0 ) echo date ( 'Y/m/d - H:i:s' ) . ' - ERREUR SQL lors de la suppression des informations temporaires, n°' . mysql_errno () . ' : ' . mysql_error () . EOL ;
}
echo date ( 'Y/m/d - H:i:s' ) . " - Les ratios ont été mis à jour ; suppression des informations temporaires. " . EOL ;
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
$iDb2 -> query ( 'DROP TABLE IF EXISTS jo.ratios_tmp;' );
2010-12-14 15:37:38 +00:00
2010-12-14 15:02:37 +00:00
die ( date ( 'Y/m/d - H:i:s' ) . " - Fin du programme. " . EOL );
?>