__construct pour $siren $accesDist\n"); fclose($fp); */ $this->siren=$siren; $client = new SoapClient('http://ws1.scores-decisions.com/entreprise/vat.wsdl', array( 'trace' => 1, 'soap_version' => SOAP_1_1, 'login' => 'TESTTVA', 'password' => 'TVATESTPW')); try { $O = $client->getCompanyVat($this->siren); if ($O->error->errnum) { //echo 'Erreur : '. $O->error->errmsg .' ('. $O->error->errnum .")\n"; //echo $client->__getLastResponse()."\n"; $this->errnum=$O->error->errnum; $this->errmsg=$O->error->errmsg; return false; } else { $val=$O->result; $this->vatNumber=$val->vatNumber; $this->vatDefined=$val->vatDefined; } } catch (SoapFault $fault) { //echo $client->__getLastResponse()."\n"; //echo 'ERREUR SOAP :'.EOL; //print_r($fault); return false; } } else { $this->errnum=999; $this->errmsg="Pas d'accès à la base TVA"; $this->vatNumber=''; $this->vatDefined=false; return false; } } } class MTva { public $vatNumber=''; // Numéro de TVA retourné public $vatDefined=false; // Le numéro de TVA est il validé ? public $errnum=0; // Numéro de l'erreur en cas d'erreur public $errmsg=''; // Message de l'erreur en cas d'erreur private $siren; function __construct($siren, $accesDist=true) { $sirenIn=$siren*1; if ($sirenIn<000001000) { $this->vatNumber='FR00000000000'; $this->vatDefined=false; return false; } elseif($sirenIn<000010000) $siren='00000'.$sirenIn; elseif ($sirenIn<000100000) $siren='0000'.$sirenIn; elseif ($sirenIn<001000000) $siren='000'.$sirenIn; elseif ($sirenIn<010000000) $siren='00'.$sirenIn; elseif ($sirenIn<100000000) $siren='0'.$sirenIn; else $siren=''.$sirenIn; $siren = str_pad($siren, 9, '0', STR_PAD_LEFT); $this->siren=$siren; $cleAlgo=$this->genereCleFr(); if ($cleAlgo<10) $cleAlgo='0'.$cleAlgo; else $cleAlgo=''.$cleAlgo; $tabRep=array(); if (!$this->valideSiren($siren) && substr($siren,0,4)<>'0000') { $this->errnum=102; $this->errmsg='Siren invalide'; return false; } $iDb=new WDB('sdv1'); $info=$iDb->select('siren_tva', "cle, DATE_FORMAT(dateMod,'%Y%m%d') as DateMAJ", "siren=$siren", false, MYSQL_ASSOC); $tab=$info[0]; if (count($tab)>0) { //sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "classMTva sur $siren en cache", print_r($tab, true)); if ( $tab['cle']<>NULL || ( $tab['cle']==NULL && $tab['DateMAJ']>=date('Ymd',mktime(0,0,0,date('m')-6,date('d'),date('Y'))) )) { $cle=$tab['cle']; if ($cle==NULL) { $attribue=false; $cle=$cleAlgo; } else $attribue=true; $this->vatNumber="FR$cle$siren"; $this->vatDefined=$attribue; return true; } //sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "classMTva sur $siren REVALIDATION", print_r($tab, true)); } $cle=$cleAlgo; $nbIndispo=0; if ($accesDist) { while(true) { $postData=array( //'Lang'=>'FR', 'ms'=>'FR', 'iso'=>'FR', 'vat'=>$cle.$siren, 'BtnSubmitVat'=>'Verify'); /*$postData=array( * 'Lang'=>'FR', 'VAT'=>$cle.$siren, 'ISO'=>'FR', 'MS'=>'FR' );*/ $tdeb = microtime_float(); // $url='http://ec.europa.eu/taxation_customs/vies/cgi-bin/viesquer'; // $referer='http://ec.europa.eu/taxation_customs/vies/fr/vieshome.htm'; $url='http://ec.europa.eu/taxation_customs/vies/viesquer.do'; $referer='http://ec.europa.eu/taxation_customs/vies/'; $page=getUrl($url, '', $postData, $referer, false, 'ec.europa.eu', '', 15); $duree = round(microtime_float()-$tdeb, 3); //sendMail('production@scores-decisions.com', 'mricois@scores-decisions.com', "classMTva sur $siren en $duree", print_r($page, true)); if ($page['err_num']<>0) { debugLog('W', 'TVA Erreur CURL n°'. $page['err_num'] .', '. $page['err_msg'] ." sur le Siren $siren, numéro de TVA = FR $cle $siren. Durée = $duree s !", __LINE__, __FILE__, __FUNCTION__, __CLASS__); $this->vatNumber="FR$cle$siren"; $this->vatDefined=false; return true; } $code=$page['code'];// Code réponse Serveur $body=$page['body']; $header=$page['header']; if (preg_match('/Yes, valid VAT number/i', $body)) { $tabInsert=array('siren'=>$siren,'cle'=>$cle, 'duree'=>$duree); $tabUpdate=array('cle'=>$cle, 'duree'=>$duree); if (!$iDb->insert('siren_tva', $tabInsert)) if (!$iDb->update('siren_tva', $tabUpdate, "siren=$siren")) debugLog('W', "Siren $siren, numéro de TVA = FR $cle $siren, impossible de MAJ la clef ($duree s) - ERREUR MySql n°". mysql_errno() .' : '. mysql_error(), __LINE__, __FILE__, __FUNCTION__, __CLASS__); //echo date ('Y/m/d - H:i:s') ." - Ligne $k/$nbk, N°TVA FR $cle $siren validé .".$eol; debugLog('I', "Siren $siren, numéro de TVA = FR $cle $siren ($duree s)", __LINE__, __FILE__, __FUNCTION__, __CLASS__); $this->vatNumber="FR$cle$siren"; $this->vatDefined=true; return true; //return array('error'=>array('errnum'=>0, 'errmsg'=>''), 'result'=>array('siren'=>$siren, 'vatNumber'=>"FR$cle$siren", 'vatDefined'=>true)); } elseif (strpos($body, 'Service non disponible')>0 || strpos($body, 'ponse trop long.')>0) { $nbIndispo++; if ($nbIndispo<3) { //echo date ('Y/m/d - H:i:s') .' - '.$eol; debugLog('I', "TVA Siren $siren, Service de l'état membre indisponible. Mise en sommeil...", __LINE__, __FILE__, __FUNCTION__, __CLASS__); randsleep(1,2); $nbIndispo=0; //echo date ('Y/m/d - H:i:s') .' - Reprise du Siren = '. $siren . $eol; } else { $tabInsert=array('siren'=>$siren,'cle'=>'NULL', 'duree'=>$duree); $tabUpdate=array('cle'=>'NULL', 'duree'=>$duree); if (!$iDb->insert('siren_tva', $tabInsert)) if (!$iDb->update('siren_tva', $tabUpdate, "siren=$siren")) debugLog('W', "Siren $siren, numéro de TVA = FR $cle $siren, impossible de MAJ la clef ($duree s) - ERREUR MySql n°". mysql_errno() .' : '. mysql_error(), __LINE__, __FILE__, __FUNCTION__, __CLASS__); debugLog('I', "Siren $siren, numéro de TVA = FR $cle $siren vérification non disponible ($duree s)", __LINE__, __FILE__, __FUNCTION__, __CLASS__); $this->vatNumber="FR$cle$siren"; $this->vatDefined=false; return true; } //echo date ('Y/m/d - H:i:s') .' - Temporisation n°'.$nbIndispo . $eol; } else { $tabInsert=array('siren'=>$siren,'cle'=>'NULL', 'duree'=>$duree); $tabUpdate=array('cle'=>'NULL', 'duree'=>$duree); if (!$iDb->insert('siren_tva', $tabInsert)) if (!$iDb->update('siren_tva', $tabUpdate, "siren=$siren")) debugLog('W', "Siren $siren, numéro de TVA = FR $cle $siren, impossible de MAJ la clef ($duree s) - ERREUR MySql n°". mysql_errno() .' : '. mysql_error(), __LINE__, __FILE__, __FUNCTION__, __CLASS__); debugLog('I', "Siren $siren, numéro de TVA = FR $cle $siren non attribué ($duree s)", __LINE__, __FILE__, __FUNCTION__, __CLASS__); $this->vatNumber="FR$cle$siren"; $this->vatDefined=false; return true; } } } else { $this->errnum=999; $this->errmsg="Pas d'accès à la base TVA"; $this->vatNumber="FR$cle$siren"; $this->vatDefined=false; return true; } debugLog('W', "Erreur impossible (car l'algo ne devrait pas passer par ici) sur le Siren $siren, numéro de TVA = FR $cle $siren. Durée = $duree s. Cas impossible !", __LINE__, __FILE__, __FUNCTION__, __CLASS__); return true;//array('error'=>array('errnum'=>800, 'errmsg'=>'Erreur SGBDR'), 'result'=>$tabRet); } /** ** Génère la clé du numéro de TVA pour le siren fournit ** (la validité du numéro de siren et son existance n'est pas effectué par cette méthode) ** ** @param integer $siren Siren dont il faut générer la clé ** @return La clé du numéro de TVA **/ private function genereCleFr() { $siren=$this->siren; // Position du chiffre SIREN (1 à 9) $tabFirst=array(); $tabFirst[0]=array( 0, 0, 0, 0, 0, 0, 0, 0, 0); $tabFirst[1]=array(62,47,94,89,40,06,22,43,16); $tabFirst[2]=array(14,81,78,68,67,96,31,73,19); $tabFirst[3]=array(63,18,62,47,94,89,40,06,22); $tabFirst[4]=array(15,52,46,26,24,82,49,36,25); $tabFirst[5]=array(64,86,30,05,51,75,58,66,28); $tabFirst[6]=array(16,23,14,81,78,68,67,96,31); $tabFirst[7]=array(65,57,95,60,08,61,76,29,34); $tabFirst[8]=array(17,91,79,39,35,54,85,59,37); $tabFirst[9]=array(66,28,63,18,62,47,94,89,40); // Chiffre 0 à 9 $tabPoids=array(1,34,-16,-21,27,-7,9,30,3); $cle=$first=0; for($pos=0; $pos<9; $pos++) { $chiffre=$siren[$pos]; if ($first==0) { $first=$cle=$tabFirst[$chiffre][$pos]; } else { $cle+=$tabPoids[$pos]*$chiffre; } } while(true) { if ($cle>96) $cle=$cle-97; elseif ($cle<0) $cle=$cle+97; else break; } if ($cle==0) return 96; return ($cle-1); } /** Test de la validité du siren demandé ** @param int SIREN à tester ** @param int NIC (facultatif) ** @param mixed Message textuel d'erreur à afficher en cas d'erreur ou false ** @return mixed true, false ou Message d'erreur passé en paramètre **/ private function valideSiren($siren, $nic='', $erreur=false) { /** Si le siren est de taille < à 9, on ajoute des 0 significatifs **/ switch (strlen($siren)) { case 1: $siren='00000000'.$siren; break; case 2: $siren='0000000'.$siren; break; case 3: $siren='000000'.$siren; break; case 4: $siren='00000'.$siren; break; case 5: $siren='0000'.$siren; break; case 6: $siren='000'.$siren; break; case 7: $siren='00'.$siren; break; case 8: $siren='0'.$siren; break; } if (strlen($nic)>0) { switch (strlen($nic)) { case 1: $nic='0000'.$nic; break; case 2: $nic='000'.$nic; break; case 3: $nic='00'.$nic; break; case 4: $nic='0'.$nic; break; } } if (!valideData($siren, 9, 9,'N')) //Siren non précisé ou incorrect. return $erreur; elseif ($siren*1==0) // Siren vide return $erreur; else { if (!isset($nic) || trim($nic)=='') { $somme=0; for ($i=0; $i<=8; $i+=2) // Traitement IMPAIR $somme+=(integer)substr($siren,$i,1); for ($i=1; $i<=7; $i+=2) { // Traitement PAIR $var_tmp=(string)(2*((integer)substr($siren,$i,1))); $som_tmp=0; for($j=0;$j