2010-11-04 11:05:01 +00:00
< ?
2010-11-29 14:17:26 +00:00
//ini_set('soap.wsdl_cache_enabled', 1); // 0 en d<> v
2010-11-04 11:05:01 +00:00
class MTvaOld {
2010-11-29 14:17:26 +00:00
public $vatNumber = '' ; // Num<75> ro de TVA retourn<72>
public $vatDefined = false ; // Le num<75> ro de TVA est il valid<69> ?
public $errnum = 0 ; // Num<75> ro de l'erreur en cas d'erreur
2010-11-04 11:05:01 +00:00
public $errmsg = '' ; // Message de l'erreur en cas d'erreur
private $siren ;
function __construct ( $siren , $accesDist = true ) {
//$accesDist=false;
if ( $accesDist == true ) {
/* $fp = fopen ( '/var/www/log/infoVat.log' , 'a' );
fwrite ( $fp , " MTva->__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 ;
2010-11-29 14:17:26 +00:00
$this -> errmsg = " Pas d'acc<63> s <20> la base TVA " ;
2010-11-04 11:05:01 +00:00
$this -> vatNumber = '' ;
$this -> vatDefined = false ;
return false ;
}
}
}
class MTva {
2010-11-29 14:17:26 +00:00
public $vatNumber = '' ; // Num<75> ro de TVA retourn<72>
public $vatDefined = false ; // Le num<75> ro de TVA est il valid<69> ?
public $errnum = 0 ; // Num<75> ro de l'erreur en cas d'erreur
2010-11-04 11:05:01 +00:00
public $errmsg = '' ; // Message de l'erreur en cas d'erreur
private $siren ;
function __construct ( $siren , $accesDist = true ) {
$sirenIn = $siren * 1 ;
if ( $sirenIn < 000001000 ) {
/* $this -> errnum = 0 ;
$this -> errmsg = $O -> error -> errmsg ;
return false ;
} else {
$val = $O -> result ;
$this -> vatNumber = $val -> vatNumber ;
$this -> vatDefined = $val -> vatDefined ; */
$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 ;
$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 ;
}
2010-11-29 14:17:26 +00:00
$iDb = new WDB ( 'sdv1' );
2010-11-04 11:05:01 +00:00
$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 ) {
2010-11-29 14:17:26 +00:00
//sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "classMTva sur $siren en cache", print_r($tab, true));
2010-11-04 11:05:01 +00:00
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 ;
}
2010-11-29 14:17:26 +00:00
//sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "classMTva sur $siren REVALIDATION", print_r($tab, true));
2010-11-04 11:05:01 +00:00
}
$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 );
2010-11-29 14:17:26 +00:00
//sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "classMTva sur $siren en $duree", print_r($page, true));
2010-11-04 11:05:01 +00:00
if ( $page [ 'err_num' ] <> 0 ) {
2010-11-29 14:17:26 +00:00
debugLog ( 'W' , 'TVA Erreur CURL n<> ' . $page [ 'err_num' ] . ', ' . $page [ 'err_msg' ] . " sur le Siren $siren , num<75> ro de TVA = FR $cle $siren . Dur<75> e = $duree s ! " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
$this -> vatNumber = " FR $cle $siren " ;
$this -> vatDefined = false ;
return true ;
}
2010-11-29 14:17:26 +00:00
$code = $page [ 'code' ]; // Code r<> ponse Serveur
2010-11-04 11:05:01 +00:00
$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 " ))
2010-11-29 14:17:26 +00:00
debugLog ( 'W' , " Siren $siren , num<75> 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<69> .".$eol;
debugLog ( 'I' , " Siren $siren , num<75> ro de TVA = FR $cle $siren ( $duree s) " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
$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;
2010-11-29 14:17:26 +00:00
debugLog ( 'I' , " TVA Siren $siren , Service de l'<27> tat membre indisponible. Mise en sommeil... " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
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 );
2010-11-29 14:17:26 +00:00
$tabUpdate = array ( 'cle' => 'NULL' , 'duree' => $duree );
2010-11-04 11:05:01 +00:00
if ( ! $iDb -> insert ( 'siren_tva' , $tabInsert ))
2010-11-29 14:17:26 +00:00
if ( ! $iDb -> update ( 'siren_tva' , $tabUpdate , " siren= $siren " ))
debugLog ( 'W' , " Siren $siren , num<75> 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<75> ro de TVA = FR $cle $siren v<> rification non disponible ( $duree s) " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
$this -> vatNumber = " FR $cle $siren " ;
$this -> vatDefined = false ;
return true ;
}
2010-11-29 14:17:26 +00:00
//echo date ('Y/m/d - H:i:s') .' - Temporisation n<> '.$nbIndispo . $eol;
2010-11-04 11:05:01 +00:00
} else {
$tabInsert = array ( 'siren' => $siren , 'cle' => 'NULL' , 'duree' => $duree );
2010-11-29 14:17:26 +00:00
$tabUpdate = array ( 'cle' => 'NULL' , 'duree' => $duree );
2010-11-04 11:05:01 +00:00
if ( ! $iDb -> insert ( 'siren_tva' , $tabInsert ))
2010-11-29 14:17:26 +00:00
if ( ! $iDb -> update ( 'siren_tva' , $tabUpdate , " siren= $siren " ))
debugLog ( 'W' , " Siren $siren , num<75> 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<75> ro de TVA = FR $cle $siren non attribu<62> ( $duree s) " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
$this -> vatNumber = " FR $cle $siren " ;
$this -> vatDefined = false ;
return true ;
}
}
} else {
$this -> errnum = 999 ;
2010-11-29 14:17:26 +00:00
$this -> errmsg = " Pas d'acc<63> s <20> la base TVA " ;
2010-11-04 11:05:01 +00:00
$this -> vatNumber = " FR $cle $siren " ;
$this -> vatDefined = false ;
return true ;
}
2010-11-29 14:17:26 +00:00
debugLog ( 'W' , " Erreur impossible (car l'algo ne devrait pas passer par ici) sur le Siren $siren , num<75> ro de TVA = FR $cle $siren . Dur<75> e = $duree s. Cas impossible ! " , __LINE__ , __FILE__ , __FUNCTION__ , __CLASS__ );
2010-11-04 11:05:01 +00:00
return true ; //array('error'=>array('errnum'=>800, 'errmsg'=>'Erreur SGBDR'), 'result'=>$tabRet);
}
/**
2010-11-29 14:17:26 +00:00
** G<EFBFBD> n<EFBFBD> re la cl<EFBFBD> du num<EFBFBD> ro de TVA pour le siren fournit
** ( la validit<EFBFBD> du num<EFBFBD> ro de siren et son existance n ' est pas effectu<EFBFBD> par cette m<EFBFBD> thode )
2010-11-04 11:05:01 +00:00
**
2010-11-29 14:17:26 +00:00
** @ param integer $siren Siren dont il faut g<EFBFBD> n<EFBFBD> rer la cl<EFBFBD>
** @ return La cl<EFBFBD> du num<EFBFBD> ro de TVA
2010-11-04 11:05:01 +00:00
**/
private function genereCleFr () {
$siren = $this -> siren ;
2010-11-29 14:17:26 +00:00
// Position du chiffre SIREN (1 <20> 9)
2010-11-04 11:05:01 +00:00
$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 );
2010-11-29 14:17:26 +00:00
// Chiffre 0 <20> 9
2010-11-04 11:05:01 +00:00
$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 );
}
2010-11-29 14:17:26 +00:00
/** Test de la validit<EFBFBD> du siren demand<EFBFBD>
** @ param int SIREN <EFBFBD> tester
2010-11-04 11:05:01 +00:00
** @ param int NIC ( facultatif )
2010-11-29 14:17:26 +00:00
** @ param mixed Message textuel d 'erreur <20> afficher en cas d' erreur ou false
** @ return mixed true , false ou Message d ' erreur pass<EFBFBD> en param<EFBFBD> tre
2010-11-04 11:05:01 +00:00
**/
private function valideSiren ( $siren , $nic = '' , $erreur = false ) {
2010-11-29 14:17:26 +00:00
/** Si le siren est de taille < <20> 9, on ajoute des 0 significatifs **/
2010-11-04 11:05:01 +00:00
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 ;
}
}
2010-11-29 14:17:26 +00:00
if ( ! valideData ( $siren , 9 , 9 , 'N' )) //Siren non pr<70> cis<69> ou incorrect.
2010-11-04 11:05:01 +00:00
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 < strlen ( $var_tmp ); $j ++ )
$som_tmp += ( integer ) substr ( $var_tmp , $j , 1 );
$somme += $som_tmp ;
}
if (( integer )( $somme / 10 ) != ( $somme / 10 ))
{ // Le Siren est faux
2010-11-29 14:17:26 +00:00
if ( substr ( $siren , 0 , 3 ) != '200' ) // Les siren d<> butant par 200 sont toujours valides (sirens provisoires de la BDF?!)
2010-11-04 11:05:01 +00:00
return $erreur ;
}
} else {
if ( ! valideData ( $nic , 1 , 5 , 'N' )) // Nic de format incorrect.
return $erreur ;
$SIRET = $siren . $nic ;
$somme = 0 ;
for ( $i = 0 ; $i <= 12 ; $i += 2 )
{ // Traitement PAIR
$var_tmp = ( string )( 2 * (( integer ) substr ( $SIRET , $i , 1 )));
$som_tmp = 0 ;
for ( $j = 0 ; $j < strlen ( $var_tmp ); $j ++ )
$som_tmp += ( integer ) substr ( $var_tmp , $j , 1 );
$somme += $som_tmp ;
}
for ( $i = 1 ; $i <= 13 ; $i += 2 ) // Traitement IMPAIR
$somme += ( integer ) substr ( $SIRET , $i , 1 );
if (( integer )( $somme / 10 ) != ( $somme / 10 )) // Le Siret est faux
return $erreur ;
}
}
return true ;
}
}
?>