315 lines
13 KiB
PHP
315 lines
13 KiB
PHP
<?php
|
|
ini_set('memory_limit', '1024M');
|
|
error_reporting(E_ALL & ~E_NOTICE);
|
|
|
|
// 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(),
|
|
)));
|
|
|
|
//Use classmap autoloader - useful with opcode and realpath cache
|
|
require_once 'Zend/Loader/AutoloaderFactory.php';
|
|
require_once 'Zend/Loader/ClassMapAutoloader.php';
|
|
Zend_Loader_AutoloaderFactory::factory(array(
|
|
'Zend_Loader_ClassMapAutoloader' => array(
|
|
__DIR__ . '/../../library/Zend/autoload_classmap.php',
|
|
__DIR__ . '/../../library/Application/autoload_classmap.php',
|
|
__DIR__ . '/../../library/Scores/autoload_classmap.php',
|
|
__DIR__ . '/../../application/autoload_classmap.php',
|
|
),
|
|
'Zend_Loader_StandardAutoloader' => array(
|
|
'prefixes' => array(
|
|
'Zend' => __DIR__ . '/../../library/Zend',
|
|
'Application' => __DIR__ . '/../../library/Application',
|
|
'Scores' => __DIR__ . '/../../library/Scores',
|
|
'SdMetier' => __DIR__ . '/../../library/SdMetier',
|
|
'Metier' => __DIR__ . '/../../library/Metier',
|
|
),
|
|
'fallback_autoloader' => true
|
|
)
|
|
));
|
|
|
|
// Zend_Application - Use it if you don't have autoloaders
|
|
//require_once 'Zend/Application.php';
|
|
|
|
// Create application, bootstrap, and run
|
|
$application = new Zend_Application(
|
|
APPLICATION_ENV,
|
|
APPLICATION_PATH . '/configs/application.ini'
|
|
);
|
|
|
|
$c = new Zend_Config($application->getOptions());
|
|
Zend_Registry::set('config', $c);
|
|
|
|
require_once 'WsScore/Configure.php';
|
|
$oldconfig = new Configure();
|
|
|
|
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]). " [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 à ...
|
|
|
|
(*) 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) {
|
|
include_once 'Metier/scores/classMRatios.php';
|
|
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();
|
|
}
|
|
|
|
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'];
|
|
|
|
/** On vérifie la présence du cache de calcul des ratios **/
|
|
$pathMetier = realpath(APPLICATION_PATH . '/../library/Metier');
|
|
if (!file_exists($pathMetier.'/tmp/configMRatios.php'))
|
|
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 **/
|
|
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 !");
|
|
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é **/
|
|
elseif (date('YmdHis',filectime($pathMetier.'/scores/classMRatios.php'))>date('YmdHis',filectime($pathMetier.'/tmp/configMRatios.php'))) // Le fichier de cache est déprécié
|
|
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);
|
|
|
|
include_once 'Metier/scores/Variables/configMRatios.php';
|
|
|
|
echo date('Y/m/d - H:i:s') ." - Formules de calcul des ratios déjà en cache.".EOL;
|
|
|
|
/** 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;
|
|
|
|
echo(date('Y/m/d - H:i:s') ." - La dernière mise à jour des ratios secteurs date du $lastUpdate...".EOL);
|
|
|
|
$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;
|
|
|
|
// 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);
|
|
|
|
// 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);
|
|
}
|
|
|
|
$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;
|
|
|
|
$siren=$entrep['siren'];
|
|
if ($siren<100) continue;
|
|
// else echo "$siren\n";
|
|
$naf4=$naf5='';
|
|
unset($mBil);
|
|
|
|
$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'];
|
|
|
|
/** 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;
|
|
}
|
|
|
|
$nbBilans=count($tabBilans2);
|
|
$tabBilan=$tabBil=array();
|
|
if ($nbBilans==0) {
|
|
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;
|
|
}
|
|
|
|
$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';
|
|
|
|
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));
|
|
}
|
|
|
|
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);
|
|
|
|
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;
|
|
|
|
|
|
/** Si c'est un ratio EUR, on le passe en K€ **/
|
|
if ($formule['unite']=='EUR') $mt=$R[$id]/1000;
|
|
else $mt=$R[$id];
|
|
|
|
/** 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;
|
|
continue;
|
|
} //else
|
|
//echo "Ratio n°$id compris entre bornes ".$formule['min']." < $mt < ".$formule['max']." pour le siren $siren et l'année $annee".EOL;
|
|
|
|
/** 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;
|
|
}
|
|
|
|
$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();
|
|
}
|
|
}
|
|
|
|
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;
|
|
|
|
$iDb2->query('DROP TABLE IF EXISTS jo.ratios_tmp;');
|
|
|
|
die(date('Y/m/d - H:i:s') ." - Fin du programme.".EOL);
|
|
|
|
?>
|