batch/1.1/old/getInfosFin.php
2013-06-19 08:24:49 +00:00

319 lines
14 KiB
PHP

#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini
<?php
include_once(FWK_PATH.'common/chiffres.php');
include_once(FWK_PATH.'common/dates.php');
include_once(INCLUDE_PATH.'bodacc/classMBodacc.php');
include_once(INCLUDE_PATH.'insee/classMInsee.php');
include_once(INCLUDE_PATH.'partenaires/classMBourse.php');
include_once(FWK_PATH.'mail/sendMail.php');
function getNextDate($dateCour, $nbJours=7) {
$nextDate=date('Ymd', mktime(0, 0, 0, WDate::dateT('Ymd','m', $dateCour), WDate::dateT('Ymd','d', $dateCour)+$nbJours, WDate::dateT('Ymd','Y', $dateCour)));
return $nextDate;
}
$repPdf='/home/data/infosreg/djo_infos_fi/'; // Avec slash final SVP !!!
$strObjet="Mise à jour des informations financières";
function getInfosAnnonce($annonceHtml) {
$tabRet=array();
$tabRet['raisonSociale']=trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml,'<dt class="listingInfo">Société :</dt><dd class="listingInfo">', '<strong>', '</strong>'))));
$tabRet['isin']=strtoupper(trim(strtr(@getTextInHtml($annonceHtml, '<dt class="listingInfo">ISIN :</dt>', '<dd class="listingInfo">', '</dd>'), array(':'=>'',' '=>''))));
$tabRet['docDesc']='';//trim(@getTextInHtml($annonceHtml, '<div class="r_desc">', 'class="r_desc">', '</div>'));
$tabRet['docDate']=WDate::DateT('d/m/Y','Y-m-d', trim(@getTextInHtml($annonceHtml, '<span class="date">', 'class="date">', '</span>'))).' '.trim(@getTextInHtml($annonceHtml, '<span class="heure">', 'class="heure">', '</span>')).':00';
$tabRet['docCategorie']=trim(utf8_decode(strip_tags(trim(str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Type d\'information&nbsp;:</dt>', '</dt>','</dd>')))).'</dd>')));
/*<dd class="listingInfo">
<!---Pour les types d'informations -->
<a href="search.php?c=eJxlzc1Og0AUBeD7KCxcuRmGpsayG9uQVKCNUrFdNXS4qC3Mv1j6ND6LT9aRhRtX5!TLSY4GLo2SpnJInEGMN1IFAVstgv9OWNfsM9lvBoVL0Ujy8z0uq8ahiSeU0JBEIQ1HPGAjDcahVzoqtIACBLA8AfUuBboPDl6x6yqflVJGnn2xUPtTsL9okQMFyzsQ2KOB!q*dfFnUgI*DZc7v!!KtXWfF!VXnx9VQfEbli3ZF9pxe7G3JZsup3p0UitP0YWvap8U20bsyrY!Hu3xdRiyZpUlu93AFpW1Ung__&amp;cref=cAmf_LovTypeInfo/11326321999005412800&amp;action=refine&amp;descip=Uniquement les r&eacute;sultats de '002004'&amp;tri=" title="Sélectionner uniquement 'Modalités de mise à disposition de l'information financière trimestrielle'">Communiqués de mise à disposition de documents / Modalités de mise à disposition de l'information financière trimestrielle</a>
</dd>*/
$tabRet['docTitre']=utf8_decode(strip_tags(trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Titre du document : </dt>', '</dt><dd class="listingInfo">', '</dd>'))))));
//<dt class="listingInfo">Titre du document : </dt><dd class="listingInfo"><a href="http://logc20.xiti.com/go.click?xts=397225&amp;s2=4&amp;p=BWR/2010/10/FCBWR062778_20101029.pdf&amp;clic=T&amp;type=click&amp;url=http://www.info-financiere.fr/upload/BWR/2010/10/FCBWR062778_20101029.pdf" target="_blank" title="Télécharger le document 'Cliffs Natural Resources inc. enregistre un formulaire 10-Q' au format PDF - Nouvelle fenêtre">Cliffs Natural Resources inc. enregistre un formulaire 10-Q</a></dd>
$tabRet['docLangue']=trim(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Langue :</dt>', '<dd class="listingInfo">', '</dd>'));
$tabRet['pdfLink']=str_replace('https://', 'http://', str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '&amp;url=http://www.info-financiere.fr/', 'url=', '" target="'))));
//print_r($tabRet);
//die($annonceHtml);
return $tabRet;
}
$tempsMinEntreRequetes=5;
$tempsMaxEntreRequetes=30;
set_time_limit(0);
$lastJO=$dateDebut=$dateFin=$dateF=$dateCour=false;
$iDb=new WDB();
$iInsee=new MInsee();
$iBourse=new MBourse();
$strInfoProg='Usage : '.basename($argv[0]). " [OPTION]
Recupère les dernières annonces Infos financières sur le site de la DJO.
Sans aucun paramètre, récupération des dernières Annonces.
Sinon:
-d:JJ/MM/AAAA Date de début de publication
-f:JJ/MM/AAAA Date de fin de publication
-l Dernières parutions uniquement (*)
-n:X Intervalle MIN en secondes entre les requêtes sur le site des JO (défaut=$tempsMinEntreRequetes)
-i:X \" MAX \" \" \" \" \" \" \" \" \" \" (défaut=$tempsMaxEntreRequetes)
";
$argv=$_SERVER['argv'];
if ($_SERVER['argc']==1) $lastJO=true;
else {
for ($i=1; isset($argv[$i]); $i++) {
if (substr($argv[$i],0,1)=='-') {
switch (substr($argv[$i],1,1)) {
case 'd':
$dateDebut=substr($argv[$i],3,10);
$dateDeb=WDate::dateT('d/m/Y', 'Ymd', $dateDebut);
$lastJO=false;
break;
case 'f':
$dateFin=substr($argv[$i],3,10);
$dateF=WDate::dateT('d/m/Y', 'Ymd', $dateFin);
$lastJO=false;
break;
case 'n':
$tempsMinEntreRequetes=trim(substr($argv[$i],3))*1;
if ($tempsMinEntreRequetes<0) $tempsMinEntreRequetes=0;
break;
case 'i':
$tempsMaxEntreRequetes=trim(substr($argv[$i],3))*1;
if ($tempsMaxEntreRequetes<5) $tempsMaxEntreRequetes=2;
break;
case 'l':
$lastJO=true;
break;
case '-':
die($strInfoProg);
break;
default: die('Option '. $argv[$i] . " inconnue !\n");
}
}
}
}
echo date('Y/m/d - H:i:s') .' - DEBUT du script'. EOL;
if ($lastJO) {
// Voir pour callibrer correctement les dates
$dateDeb=getNextDate(date('Ymd'), -4);
$dateF =getNextDate(date('Ymd'), 0);
} else {
if ($dateFin==false) {
$dateFin=date('d/m/Y');
$dateF=WDate::dateT('d/m/Y', 'Ymd', $dateFin);
}
if ($dateDebut==false)
die($strInfoProg);
}
$dateCour=$dateDeb;
$tabSansSiren=array();
$nbDeja=$nbInsert=$nbErreur=0;
$message=date('Y/m/d - H:i:s') ." - Début de la récupération des informations financières du $dateDebut au $dateFin...".EOL;
$strMessage.=$message;
echo $message;
echo date('Y/m/d - H:i:s') ." - La durée maximum entre chaque requête est de $tempsMaxEntreRequetes secondes.". EOL;
while ($dateCour<=$dateF/* || $lastJO*/) { // Boucle sur les dates
$dateDebut = WDate::dateT('Ymd', 'd/m/Y', $dateCour);
$dateFrom = str_replace('/','%2F', $dateDebut);
$dateFin = WDate::dateT('Ymd', 'd/m/Y', getNextDate($dateCour,1));
$dateTo = str_replace('/','%2F', $dateFin);
echo date('Y/m/d - H:i:s') ." - Traitement des annonces d'informations financières du $dateDebut au $dateFin...".EOL;
/** Cookie de session **/
$url='http://www.info-financiere.fr/search.php';
$referer='';
$page=getUrl($url, '', '', $referer, false);
$body=$page['body'];
$cookie=@$page['header']['Set-Cookie'];
$referer=$url;
echo date('Y/m/d - H:i:s') .' - Cookie = "'. trim($cookie) .'"' . EOL;
/** Première page de la recherche **/
$url="http://www.info-financiere.fr/search.php?action=search&by=avancee&type=&stype=%C2%A0&datefrom=$dateFrom&dateto=$dateTo&societe=&q=&x=0&y=0";
$page=getUrl($url, $cookie, '', $referer);
$body=$page['body'];
if (preg_match('/<div id="rappel"><p><strong>Nombre de résultats :<\/strong>(.*)<\/p>/Uim', $body, $matches))
$nbAnnonces=trim($matches[1]);
else {
print_r($page);
die('Erreur : Aucun résultat trouvé'.EOL);
}
$nbPages=round($nbAnnonces/10);
echo date('Y/m/d - H:i:s') . " - Nombre du publication du $dateDebut au $dateFin : $nbAnnonces soit $nbPages page(s)...". EOL;
if ($nbPages>100) {
echo date('Y/m/d - H:i:s') . " - ERREUR : Arrêt du traitement car il y a plus de 100 pages d'annonces !". EOL;
die();
}
if ($nbAnnonces>0) {
/* <a class="actif" href="search.php?action=changepage&amp;c=eJxlz
c1ugkAUBeD7KCxcdTMMiU1lN5aQWEBTsagrg8OlrcL8S8Wn8Vl8slKTdtPVOflykqOBS6OkKR0SZxDDlVSex!aR998Ja!tdKrtVr3Amaklu1*uyrB2a0KeEUhL41L*jHmtpMPSDX4UGUIAAlsWgPqRA98lhUG
zbcshSKSPPQ7FQDadgf9AiBwqWtyCwQwPVXxt9WdSAL*3lmT91!XuzSPPzWmeHeZ!fguJNuzxdJhf7ULDJbKy3R4XiOJ5uTPMabWK9LZLqsH*MFkXA4kkSZ3YH36SRVJ0_&amp;page=2"
*/
if (preg_match('/ href="search\.php\?action=changepage&amp;c=(.*)&amp;page=/mUis', $body, $matches)) {
$c=$matches[1];
echo date('Y/m/d - H:i:s') . " - Identifiant Sesssion = $c". EOL;
}
elseif ($nbAnnonces<=10)
// - de 10 annonces, pas de multipage
$c='...';
else {
print_r($page);
die('Erreur : Aucun numéro de session trouvé'.EOL);
}
$dateDb=WDate::DateT('Ymd','Y-m-d',$dateCour);
$AnnDb=$iDb->select('balo_ireg', 'count(*) AS nb', "docDate BETWEEN '$dateDb 00:00:00' AND '$dateDb 23:59:59'", false, MYSQL_ASSOC);
$nbAnnDb=$AnnDb[0]['nb'];
if ($nbAnnDb>=$nbAnnonces) {
$message=date('Y/m/d - H:i:s') ." - Les $nbAnnonces annonces DJO infos financières du $dateDebut ($dateDb) sont en base ($nbAnnDb) !". EOL;
$strMessage.=$message;
echo $message;
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
$dateCour=getNextDate($dateCour,1);
continue;
}
elseif ($nbAnnDb>0 && $nbAnnDb<$nbAnnonces) {
$message=date('Y/m/d - H:i:s') ." - ATTENTION : Il n'y a que $nbAnnDb annonce(s) DJO infos financières en base sur les $nbAnnonces annonces présentes au JO du $dateDebut !". EOL;
$strMessage.=$message;
echo $message;
echo date('Y/m/d - H:i:s') .' - Tentative de récupération des annonces...'. EOL;
}
else {
$message=date('Y/m/d - H:i:s') ." - Il y a $nbAnnDb annonce(s) DJO infos financières en base sur les $nbAnnonces annonces présentes au JO du $dateDebut !". EOL;
$strMessage.=$message;
echo $message;
}
$tabAnnonces=explode('<ul class="annonce">', $page['body']);
//print_r($tabAnnonces);
//die();
for ($j=1; $j<11 && isset($tabAnnonces[$j]); $j++)
$tabAnnBalo[($j-1)]=$tabAnnonces[$j];
if ($nbPages>=2)
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
/** Traitement des pages suivantes
**/
for ($i=2; $i<=$nbPages; $i++)
{
$url='http://www.info-financiere.fr/search.php?action=changepage&c='. $c .'&page='.$i;
$page=getUrl($url, $cookie, '', $referer);
$referer=$url;
$tabAnnonces=explode('<ul class="annonce">', $page['body']);
for ($j=1; $j<11; $j++) {
$k=10*($i-1)+($j-1);
if ($k<$nbAnnonces)
$tabAnnBalo[$k]=$tabAnnonces[$j];
}
if ($i==2)
echo date('Y/m/d - H:i:s') ." - Page $i/$nbPages";
else
echo ", $i/$nbPages";
if ($i==$nbPages)
echo '.'.EOL;
else
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
}
/** On parse les annonces et on les stocks **/
for ($i=0; $i<$nbAnnonces; $i++){
$infoAnnBalo=getInfosAnnonce($tabAnnBalo[$i]);
$i2=$i+1;
$AnnDb=$iDb->select('balo_ireg', 'count(*) AS nb', "isin='".$infoAnnBalo['isin']."' AND docDate='".$infoAnnBalo['docDate']."' AND docLangue='".$infoAnnBalo['docLangue']."' AND pdfLink='".$infoAnnBalo['pdfLink']."'", false, MYSQL_ASSOC);
$nbAnnDb=$AnnDb[0]['nb'];
$tabPdf=getPdfInfo($repPdf.basename($infoAnnBalo['pdfLink']));
if (!$tabPdf) {
$page=getUrl($infoAnnBalo['pdfLink'], '', '', '', false);
@mkdir($repPdf);
$fp=@fopen($repPdf.basename($infoAnnBalo['pdfLink']), 'w');
if (!fwrite($fp, $page['body']) || !$fp) {
print_r($infoAnnBalo);
echo date('Y/m/d - H:i:s') .' - ERREUR : Problème de création du PDF '. basename($infoAnnBalo['pdfLink']) ." pour la parution du $dateAff, annonce n°$i2/$nbAnnonces, Isin = ". $infoAnnBalo['isin']." : \"". $infoAnnBalo['raisonSociale'] .'" !'.EOL;
}
@fclose($fp);
$tabPdf=getPdfInfo($repPdf.basename($infoAnnBalo['pdfLink']));
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
}
$infoAnnBalo['pdfSize'] = $tabPdf['pdfSize'];
$infoAnnBalo['pdfVer'] = $tabPdf['version'];
$infoAnnBalo['pdfPage'] = $tabPdf['nbPages'];
// Infos de debug
$infoAnnBalo['sitePage']= round($i2/10);
$infoAnnBalo['siteId'] = $i2;
$isin=$infoAnnBalo['isin'];
if (strlen($isin)==12)
$infoAnnBalo['siren'] = @$iBourse->getCodeSiren($isin);
elseif (strlen($isin)==11) {
for($iIsin=0;$iIsin<10;$iIsin++) {
$siren=@$iBourse->getCodeSiren($isin.$iIsin);
if ($siren>0) {
$infoAnnBalo['siren'] = $siren;
break;
}
}
}
if (strtoupper(substr($isin,0,2))=='FR' && $infoAnnBalo['siren']==0)
$tabSansSiren[$isin]=array( 'isin'=>$isin,
'nom'=>$infoAnnBalo['raisonSociale'],
'pdf'=>$infoAnnBalo['pdfLink'],
'url'=>"http://www.google.fr/#hl=fr&source=hp&q=$isin+rcs&btnG=Recherche+Google&meta=&aq=f"
);
$dateAff=WDate::dateT('Y-m-d H:i:s', 'd/m/Y', $infoAnnBalo['docDate']);
if ($nbAnnDb==1) {
echo date('Y/m/d - H:i:s') ." - Parution du $dateAff, annonce n°$i2/$nbAnnonces, ". $infoAnnBalo['isin']."/".$infoAnnBalo['siren']." : \"". $infoAnnBalo['raisonSociale'] .'" déjà en base ('.$infoAnnBalo['docLangue'].') !'.EOL;
$nbDeja++;
// L'annonce est déjà en base !
continue;
} else {
echo date('Y/m/d - H:i:s') ." - Parution du $dateAff, annonce n°$i2/$nbAnnonces, ". $infoAnnBalo['isin']."/".$infoAnnBalo['siren']." : \"". $infoAnnBalo['raisonSociale'] .'"... enregistrement ('.$infoAnnBalo['docLangue'].') !'.EOL;
$nbInsert++;
}
if (!$iDb->insert('balo_ireg', $infoAnnBalo) && mysql_error()<>1062) {
echo date ('Y/m/d - H:i:s') .' - ERREUR : MySql n°'. mysql_errno() .') : '. mysql_error() . EOL;
$nbErreur++;
}
}
}
$dateCour=getNextDate($dateCour,1);
}
$message=date('Y/m/d - H:i:s') ." - Fin de la récupération des informations financières : $nbInsert ajouts, $nbDeja déjà en base et $nbErreur erreurs.".EOL;
$strMessage.=$message;
echo $message;
// Ajout d'informations au mail de traitement et envoi !
if (count($tabSansSiren)>0) {
$strObjet.=" avec ISIN sans SIREN !!!";
$strMessage.=EOL.EOL."--------------------------------------------------------------------".EOL.EOL;
$strMessage.="Les entreprises suivantes n'ont pas de correspondance ISIN / SIREN dans la base Scores & Décisions.".EOL.
"Penser à mettre à jour les informations sur la base...".EOL.EOL;
$strMessage.="ISIN\tRaison Sociale\tLien\tPDF".EOL;
foreach ($tabSansSiren as $tabMarche)
$strMessage.= $tabMarche['isin']."\t".
$tabMarche['nom']."\t".
$tabMarche['url']."\t".
$tabMarche['pdf'].EOL;
}
sendMail('production@scores-decisions.com', 'jmartory@scores-decisions.com,ylenaour@scores-decisions.com', $strObjet, $strMessage);
die();
?>