330 lines
12 KiB
PHP
330 lines
12 KiB
PHP
<?
|
|
|
|
//ini_set('soap.wsdl_cache_enabled', 1); // 0 en dév
|
|
|
|
class MTvaOld {
|
|
|
|
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) {
|
|
//$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;
|
|
$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->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;
|
|
}
|
|
$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', 'ylenaour@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<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;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|