2013-11-05 11:18:30 +00:00
< ? php
2014-06-02 08:41:24 +00:00
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
2013-11-05 11:18:30 +00:00
private $siren ;
2015-01-20 16:32:59 +00:00
protected $iDb ;
2013-11-05 11:18:30 +00:00
2015-01-20 16:32:59 +00:00
public function __construct ( $siren , $accesDist = true , $db = null )
2013-11-05 11:18:30 +00:00
{
2014-06-02 08:41:24 +00:00
$sirenIn = $siren * 1 ;
if ( $sirenIn < 000001000 ) {
$this -> vatNumber = 'FR00000000000' ;
$this -> vatDefined = false ;
2013-11-05 11:18:30 +00:00
return false ;
}
2015-01-20 16:32:59 +00:00
if ( $db === null ) {
$this -> iDb = new WDB ();
} else {
$this -> iDb = $db ;
}
2013-11-05 11:18:30 +00:00
$siren = str_pad ( $siren , 9 , '0' , STR_PAD_LEFT );
2014-06-02 08:41:24 +00:00
$this -> siren = $siren ;
2013-11-05 11:18:30 +00:00
$cleAlgo = $this -> genereCleFr ();
if ( $cleAlgo < 10 ) $cleAlgo = '0' . $cleAlgo ;
else $cleAlgo = '' . $cleAlgo ;
2014-06-02 08:41:24 +00:00
2013-11-05 11:18:30 +00:00
$tabRep = array ();
if ( ! $this -> valideSiren ( $siren ) && substr ( $siren , 0 , 4 ) <> '0000' ) {
$this -> errnum = 102 ;
$this -> errmsg = 'Siren invalide' ;
return false ;
}
2014-06-02 08:41:24 +00:00
2015-01-20 16:32:59 +00:00
$info = $this -> iDb -> select ( 'sdv1.siren_tva' , " cle, DATE_FORMAT(dateMod,'%Y%m%d') as DateMAJ " , " siren= $siren " , false , MYSQL_ASSOC );
2013-11-05 11:18:30 +00:00
$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 );
2015-01-20 16:32:59 +00:00
if ( ! $this -> iDb -> insert ( 'sdv1.siren_tva' , $tabInsert ))
if ( ! $this -> iDb -> update ( 'sdv1.siren_tva' , $tabUpdate , " siren= $siren " ))
2013-11-05 11:18:30 +00:00
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 );
2015-01-20 16:32:59 +00:00
if ( ! $this -> iDb -> insert ( 'sdv1.siren_tva' , $tabInsert ))
if ( ! $this -> iDb -> update ( 'sdv1.siren_tva' , $tabUpdate , " siren= $siren " ))
2013-11-05 11:18:30 +00:00
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 );
2015-01-20 16:32:59 +00:00
if ( ! $this -> iDb -> insert ( 'sdv1.siren_tva' , $tabInsert ))
if ( ! $this -> iDb -> update ( 'sdv1.siren_tva' , $tabUpdate , " siren= $siren " ))
2013-11-05 11:18:30 +00:00
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 < 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
if ( substr ( $siren , 0 , 3 ) != '200' ) // Les siren débutant par 200 sont toujours valides (sirens provisoires de la BDF?!)
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 ;
}
2014-06-02 08:41:24 +00:00
}