Jump to content

[Résolu] Module Numéro de TVA Européen - Numéros espagnols


GuillaumeCW

Recommended Posts

Quelqu'un utilise t'il (avec succès) le module de Prestashop "Numéro de TVA Européen" ?
 
Le lien de validation sur le site de la CE européenne qu'il utilise ne semble plus être fonctionnel. Je n'ai pas non plus réussi à le faire fonctionner sur l'URL actuelle du validateur en ligne, que ce soit avec file_get_contents ou cURL. Le site de la CE européenne indique d'utiliser leur service SOAP avec un lien WSDL qui quant à lui ne semble pas être le bon. Mais il est fonctionnel avec ce lien WSDL : http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
 
La dernière MAJ du module date du 2 Septembre 2016. Un PR faisant usage de l'extension SOAP serait-il refusé au motif d'une indisponibilité de l'extension sur certains hébergements ?

Edited by GuillaumeCW (see edit history)
Link to comment
Share on other sites

Merci du retour, ça marche effectivement avec un numéro français. Vous avez déjà validé un numéro espagnol à tout hasard ?

 

Ce lien de validation, reprenant le chemin d'URL utilisé par le module et utilisant un numéro espagnol, m'indique que le service est indisponible (depuis presque 24 h désormais). Ce numéro utilisé est pourtant validé en utilisant le service "public" interactif. Mais la validation fonctionne aussi (testé de nouveau ce matin) en utilisant leur service SOAP.

 

Cela doit probablement vouloir dire que leurs données ne sont pas centralisées.

 

Update : c'est même indiqué ici. Du coup, le problème est donc localisé aux numéros espagnols.

 

Cette vérification s'opère par rapport à la base de données TVA nationale correspondant à l'Etat membre sélectionné. Il n'y a pas de base de données TVA à l'échelle de la Communauté.

Edited by GuillaumeCW (see edit history)
Link to comment
Share on other sites

Je partage mon code de surcharge du module du module "Numéro de TVA Européen" pour les utilisateurs qui sont confrontés à des erreurs de type "Service indisponible" et qui souhaitent utiliser le service SOAP VIES, tel que conseillé par ce service de la CE. C'est ce que j'ai trouvé de plus "propre"...

 

Donc dans /override/modules/vatnumber/vatnumber.php : voir la version corrigée dans ce post (même page)

Et dans /override/classes/Address.php :

/**
 * Use overriden `WebServiceCheck` method. *
 * @see ObjectModel::validateController()
 */
public function validateController($htmlentities = true)
{
    $errors = ObjectModel::validateController($htmlentities);
    if (!Configuration::get('VATNUMBER_MANAGEMENT') or !Configuration::get('VATNUMBER_CHECKING')) {
        return $errors;
    }
    include_once(_PS_MODULE_DIR_.'vatnumber/vatnumber.php');
    include_once(_PS_OVERRIDE_DIR_.'modules/vatnumber/vatnumber.php');
    if (class_exists('VatNumber', false) and class_exists('VatNumberOverride', false)) {
        return array_merge($errors, VatNumberOverride::WebServiceCheck($this->vat_number));
    }
}
Edited by GuillaumeCW
Correction d'une coquille dans le code de la solution (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 1 year later...

Bonjour, cette override ne marche pas, pour deux raisons: 1) vous n'avez pas écrit "class... extends..." et 2) même en ajoutant ces fichiers correctement, en fait, vous pouvez ajouter n'importe quel nombre, même invalide mais avec prefix (exemple ES45839048503)  ... et rien ne se passe, c’est-à-dire que chaque numéro de fantaisie peut être ajouté avec le prefix, donc la vérification n’est pas effectuée. s'il vous plaît, vérifiez et corrigez (sauf si cela ne fonctionne que sur 1.7, j'ai testé sur 1.6...et si oui, quels sont les changements à faire sur 1.6?) Merci

Edited by mmsh (see edit history)
Link to comment
Share on other sites

4 minutes ago, GuillaumeCW said:

Bonjour,

Le code est toujours fonctionnel de mon côté. J'espère que vous trouverez la solution. Courage.

Bonjour, Je suis sur prestashop 1.6

si j'insère ces remplacements (override), le formulaire d'inscription renvoie une erreur uniquement si J'écris quelque chose comme 45839048503 car il ne commence pas par le préfixe ES, mais si J'écris ES45839048503

bien que le nombre ne soit pas valide dans le VIES il n'y a pas d'erreur et vous pouvez enregistrer ce mauvais numéro ...

merci

Link to comment
Share on other sites

Et je dois rajouter <php aussi ? Je pense que l'extrait est suffisant pour aider tous ceux qui le méritent.

J'ai plusieurs sites en 1.6.1.20 où 45839048503 est refusé mais ES45839048503 est accepté. Supprimer votre fichier cache/class_index.php... je ne sais pas. Comment je peux savoir ce que vous faîtes de vos copier/coller ?

Link to comment
Share on other sites

Ok, après avoir relu, j'ai compris le malentendu dans votre esprit car vous dites que la chaîne qui est rentrée côté e-commerce est composée du préfixe, mais sur le site de validation de l'UE, on rentre une chaîne sans préfixe. C'est ça ?

Si oui : si vous regardez le bout de code partagé, la chaîne entrée par le client est découpée de son préfixe et l'API de VIES reçoit les informations comme elle l'attend. C'est cette API qui fait sa validation pas nous. Vous avez bien un numéro de TVA validé et l'autre non.

Si non : je ne sais vraiment pas donc encore une fois, bon courage.

Link to comment
Share on other sites

2 minutes ago, GuillaumeCW said:

Et je dois rajouter <php aussi ? Je pense que l'extrait est suffisant pour aider tous ceux qui le méritent.

J'ai plusieurs sites en 1.6.1.20 où 45839048503 est refusé mais ES45839048503 est accepté. Supprimer votre fichier cache/class_index.php... je ne sais pas. Comment je peux savoir ce que vous faîtes de vos copier/coller ?

"...où 45839048503 est refusé mais ES45839048503 est accepté"

précisément...et c'est une erreur parce que ES45839048503 ce n'est pas un numéro de TVA valide dans la base de données VIES

Link to comment
Share on other sites

21 minutes ago, coeos.pro said:

ok, cela fonctionne mais quelque chose comme ça 

http://ec.europa.eu/taxation_customs/vies/vatResponse.html?locale=EN&memberStateCode=ES&number=B61031100

renvoie une erreur d'application. Pour cette raison, J'ai envoyé un courrier électronique au support technique de la base de données VIES, mais si, entre-temps, vous avez la solution avec SOAP ou une autre solution, je vous serais reconnaissant. Merci 

Link to comment
Share on other sites

Le bout de code en haut a une coquille car il commence mais ne va pas au bout de la validation du numéro mais seulement de celle du préfixe. Zappé de répliquer la modification ici car j'avais fais la modification en production. Donc merci de l'avoir fait remarquer.

Je poste le code complet dans ce post et le référence depuis le premier car je dois apparemment être déjà trop vieux pour comprendre comment éditer son code...

<?php

class VatNumberOverride extends VatNumber
{
    /**
     * Use overriden `WebServiceCheck` method.
     *
     * @see VatNumber::hookActionValidateCustomerAddressForm ()
     */
    public function hookActionValidateCustomerAddressForm(&$params): bool
    {
        if ($vatNumber = $params['form']->getField('vat_number')) {
            $errors = static::WebServiceCheck($vatNumber->getValue());
            if (!empty($errors)) {
                $vatNumber->addError($errors[0]);

                return false;
            }
        }

        return true;
    }

    /**
     * Use SOAP service to validate VAT number.
     *
     * @see VaTNumber::WebServiceCheck()
     * @throw SoapFault
     */
    public static function WebServiceCheck($vat_number): array
    {
        if (empty($vat_number)) {
            return [];
        }

        $vat_number = str_replace(' ', '', $vat_number);
        $vat    = Tools::substr($vat_number, 2);
        $prefix = Tools::substr($vat_number, 0, 2);

        // Validate country prefix.
        if (!in_array($prefix, static::getPrefixIntracomVAT(), true)) {
            return [Tools::displayError('Invalid VAT number')];
        }

        // Validate number in corresponding country database via VIES.
        try {

            $soap = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
            $is_valid = $soap->checkVat(['countryCode' => $prefix, 'vatNumber' => $vat])->valid;

        } catch (SoapFault $e) {

            return [Tools::displayError('Error from validation service: '.$e->getMessage())];
        }

        if (!$is_valid) {
            return [Tools::displayError('Invalid VAT number')];
        }

        return [];
    }
}

 

Link to comment
Share on other sites

  • 1 month later...

Bonsoir, il y a un problème avec cette méthode... la vérification est également effectuée si le client vient de votre pays (ex. France...)  dans ce cas, comment exclure le chèque si le client est français? Merci

Link to comment
Share on other sites

Bonjour,

La seule chose qu'apporte cette méthode, c'est de remplacer une requête avec file_get_content et l'URL http://ec.europa.eu/taxation_customs/vies/viesquer.do par une connexion Soap et l'URL http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl. La seconde méthode est celle préconisée par l'UE.

Pour empêcher l'exemption de TVA d'un client dans le même pays que la boutique, il faut configurer le module (cf. pièce jointe). La traduction est pas terrible, mais cf. classes/pdf/HTMLTemplateInvoice::getTaxTabContent :

//...
$tax_exempt = Configuration::get('VATNUMBER_MANAGEMENT')
                            && !empty($address->vat_number)
                            && $address->id_country != Configuration::get('VATNUMBER_COUNTRY');
//...

VATNUMBER_COUNTRY est le nom de la valeur configurée pour le "Pays du client", c'est à dire le pays de votre boutique.

vat.jpg

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...