#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini 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 **/ 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 à 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 à 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(INCLUDE_PATH.'scores/classMRatios.php'))>date('YmdHis',filectime(INCLUDE_PATH.'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(INCLUDE_PATH.'tmp/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); ?>