batch/1.1/old/repriseSirenBodaccHisto.php

300 lines
13 KiB
PHP
Raw Normal View History

#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini
<?php
error_reporting(E_ALL & ~E_NOTICE);
include_once(FWK_PATH.'common/chiffres.php');
include_once(FWK_PATH.'common/dates.php');
include_once(INCLUDE_PATH.'insee/classMInsee.php');
include_once(INCLUDE_PATH.'partenaires/classMGreffes.php');
include_once(FWK_PATH.'mail/sendMail.php');
$strInfoScript='Usage : '.basename($argv[0]). " [OPTION]
Cr<EFBFBD>ation des fiches d'identit<EFBFBD> en historique.
Options :
-o Traiter l'historique BODACC/BORC OCR
-h Traiter l'historique BODACC BDD
-s Traiter les siren pass<EFBFBD>s en argument
-v Mode verbose
";/* -i:XXX Reprendre <20> la ligne XXX
-c Mettre <EFBFBD> jour le cache
(*) Option par d<EFBFBD>faut si aucun argument n'est pass<EFBFBD>.
";/* -e:X Calculer pour les X derniers exercices (3 par d<>faut)
-f Calculer les scores financiers
*/
$iDeb=0;
$updateCache=$modeDebug=$modeCmd=false;
$base='historiques';
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 'o': $base='histobodacc'; break;
case 'v': $modeDebug=true; break;
case 'h': $modeHisto=true;$tabSiren=array(); break;
case 's': $modeCmd=true; $tabSiren=array(); break;
case '-':
case '?': die($strInfoScript); break;
default: die('Option '. $argv[$i] . ' inconnue !'.EOL); break;
}
} else {
$tabSiren[]=$argv[$i];
}
}
$iDb=new WDB($base);
$iInsee=new MInsee();
$iGreffe=new MGreffes();
if (!$modeCmd && !$modeHisto) {
$nbRows=$iDb->select( 'siren_uniques_bodacc', 'siren', 'sirenValide IS NULL', false, MYSQL_ASSOC, true);
$tabSiren=array();
while($entrep=$iDb->fetch(MYSQL_ASSOC))
$tabSiren[]=$entrep['siren'];
shuffle($tabSiren);
} elseif ($modeHisto) {
$nbRows=$iDb->select( 'historiques.siren_uniques', 'siren', 'siren NOT IN (SELECT DISTINCT siren FROM jo.etablissements)', false, MYSQL_ASSOC, true);
$tabSiren=array();
while($entrep=$iDb->fetch(MYSQL_ASSOC))
$tabSiren[]=$entrep['siren'];
shuffle($tabSiren);
} else
$nbRows=count($tabSiren);
if ($nbRows>0)
echo date('Y/m/d - H:i:s') ." - Il reste $nbRows siren pour lesquels il faut reprendre les SIREN Bodacc...".EOL;
foreach($tabSiren as $k=>$siren) {
//$siren=$entrep['siren'];
echo date('Y/m/d - H:i:s') ." - $k/$nbRows - $siren ... ";
if (!$iInsee->valideSiren($siren)) {
$iDb->update('siren_uniques_bodacc', array('sirenValide'=>0), "siren=$siren");
echo 'KO'.EOL;
continue;
}
$tabId=$iGreffe->getIdentite($siren);
if ($tabId) {
echo " Trouv<75>".EOL;
print_r($tabId);
$iDb->update('siren_uniques_bodacc', array('sirenValide'=>1, 'sirenTrouve'=>1), "siren=$siren");
} else {
echo " inconnu (".$iGreffe->libErreur.')'.EOL;
$iDb->update('siren_uniques_bodacc', array('sirenValide'=>1, 'sirenTrouve'=>0), "siren=$siren");
}
if ($modeDebug) randsleep(1,2);
elseif (date('w')==0) randsleep(55,245);
elseif (date('w')==6) randsleep(45,145);
else randsleep(15,45);
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;
if (!$modeDebug && date('Hi')*1>1830) die();
}
die();
if ($updateCache) {
include_once(INCLUDE_PATH.'scores/classMRatios.php');
if (genereCacheRatios())
echo date('Y/m/d - H:i:s') ." - Le cache des ratios a <20>t<EFBFBD> g<>n<EFBFBD>r<EFBFBD> avec succ<63>s !".EOL;
else
echo date('Y/m/d - H:i:s') ." - Erreur lors de la g<>n<EFBFBD>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<70>sence du cache de calcul des ratios **/
if (!file_exists(INCLUDE_PATH.'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 <20> mettre dans le cache de calcul des ratios **/
elseif (strtr($lastUpdate, array(':'=>'','-'=>'', ' '=>''))>date('YmdHis',filectime(INCLUDE_PATH.'tmp/configMRatios.php'))) {
sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "ERREUR FATALE, le cache ratio n'est pas <20> jour !", date('Y/m/d - H:i:s') ." - ERREUR FATALE : Le cache des calculs de ratio n'est pas <20> jour (nouvelles formules ?). Relancer <20> l'option -c !");
die(date('Y/m/d - H:i:s') ." - ERREUR FATALE : Le cache des calculs de ratio n'est pas <20> jour (nouvelles formules ?). Relancer <20> l'option -c !".EOL);
}
/** On v<>rifie que le programme de MAJ du cache n'a pas <20>t<EFBFBD> modifi<66> **/
elseif (date('YmdHis',filectime(INCLUDE_PATH.'scores/classMRatios.php'))>date('YmdHis',filectime(INCLUDE_PATH.'tmp/configMRatios.php'))) // Le fichier de cache est d<>pr<70>ci<63>
die(date('Y/m/d - H:i:s') ." - ERREUR FATALE : Le cache des calculs de ratio n'est pas <20> jour (programme modifi<66>). Relancer <20> l'option -c !".EOL);
include_once(INCLUDE_PATH.'tmp/configMRatios.php');
echo date('Y/m/d - H:i:s') ." - Formules de calcul des ratios d<>j<EFBFBD> en cache.".EOL;
/** Recherche de la derni<6E>re mise <20> 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'];
echo(date('Y/m/d - H:i:s') ." - La derni<6E>re mise <20> 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 <20> jour les ratios secteurs...".EOL;
} else {
/** On met en table temporaire les siren en cas de plantage du script **/
$modeSuite=false;
$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<63>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, 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<63>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));
}
echo date('Y/m/d - H:i:s') ." - Les <20>l<EFBFBD>ments ont <20>t<EFBFBD> mis en table temporaire en cas de reprise sur erreur !".EOL;
$nbRows=$iDb->select( 'ratios_tmp', 'siren, lastUpdate', "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<75>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 <20> 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 > <EFBFBD> la date de derni<EFBFBD>re Mise <EFBFBD> jour
** car les ratios secteurs des autres bilans on d<EFBFBD>j<EFBFBD> <EFBFBD>t<EFBFBD> calcul<EFBFBD>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 <20> 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<6E>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<6E>rieur : $mt<".$formule['min']." pour le siren $siren et l'ann<6E>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<75>rieur : $mt>".$formule['max']." pour le siren $siren et l'ann<6E>e $annee".EOL;
continue;
} //else
//echo "Ratio n<>$id compris entre bornes ".$formule['min']." < $mt < ".$formule['max']." pour le siren $siren et l'ann<6E>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<75> le 14 mai 2009
$tabInsert=array_merge($tabUpdate, array( 'id'=>$id,
'naf4'=>$naf4,
'naf5'=>$naf5,
'annee'=>$annee,
'dateInsert'=>date('YmdHis'),
));
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 <20>t<EFBFBD> calcul<75>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 <20>t<EFBFBD> calcul<75>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 <20>t<EFBFBD> mis <20> 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);
?>