Jump to content

Désactivation des taxes pour les clients professionnels étrangers


Recommended Posts

Bonjour,

Dans le cadre de la configuration d'un site sous Prestashop 1.7.6 pour un client je rencontre un problème dans la configuration.

Mon client souhaiterait que les clients qui entrent un numéro de TVA et/ou de Siret d'un pays étranger (hors France) ne soit pas soumis à la TVA sur les prix et donc puissent payer leurs commandes en Hors Taxes. Les clients particuliers doivent cependant continuer à payer les taxes.

J'ai pu mettre en place l'ajout automatique des clients professionnels étrangers à un groupe spécifique mais cela ne m'avance pas beaucoup plus. Il est certes possible de modifier l'affichage des prix en TTC ou HT dans la configuration du groupe client mais cela ne semble pas affecter le prix effectivement payé lors de la transaction.

Ce n'est pas le premier client à me demander cette spécifié et cela semble bien être le fonctionnement normal pour les transactions en Europe il me semblait donc étrange qu'il n'y ait pas de solution native sur Prestashop pour la gestion de ce cas ?

Merci d'avance pour votre aide.

Link to comment
Share on other sites

On 2/25/2022 at 5:03 PM, sergeksl2 said:

Bonjour,

Moi j'utilise le module "facturation HT pour les professionnels (v. 1.7.2) par MassonVincent"

Ce module vous permet de facturer hors taxe certains groupes de clients.

Voir sur https://www.ksl.eu

Je cherche dans un premier temps une solution gratuite si possible mais effectivement le module semble correspondre à mes besoins je le garde de côté merci.

On 2/25/2022 at 5:46 PM, Mediacom87 said:

Bonjour,

c'était un module de base de Prestashop qui .. fut abandonné par Prestashop dans la version 1.7

https://github.com/PrestaShop/vatnumber

Vous pouvez néanmoins le tester pour savoir si il répond encore au besoin.

D'après la description le module semble permettre l'ajout de la TVA mais est-ce qu'il permet aussi de gérer le fait que les taxes soient facturées ou non pour les professionnels qui l'aurait renseigné ? Je ne vois rien à ce propos à première vu.

Link to comment
Share on other sites

il y a une heure, MeoDelta a dit :

est-ce qu'il permet aussi de gérer le fait que les taxes soient facturées ou non pour les professionnels qui l'aurait renseigné ?

Le module en question facture la TVA ou non en fonction des groupes de clients, il faut donc soit changer manuellement les groupes de clients soit avoir un module qui change les groupes de clients.

 

Sinon il y a ce module qui vérifie les numéros de TVA sur VIES et facture HT les clients professionnels étrangers :

https://www.coeos.pro/fr/modules-prestashop/122-numéro-de-tva.html

https://addons.prestashop.com/fr/comptabilite-facturation/27158-numero-de-tva-europeen.html

Link to comment
Share on other sites

2 minutes ago, coeos.pro said:

Le module en question facture la TVA ou non en fonction des groupes de clients, il faut donc soit changer manuellement les groupes de clients soit avoir un module qui change les groupes de clients.

 

Sinon il y a ce module qui vérifie les numéros de TVA sur VIES et facture HT les clients professionnels étrangers :

https://www.coeos.pro/fr/modules-prestashop/122-numéro-de-tva.html

https://addons.prestashop.com/fr/comptabilite-facturation/27158-numero-de-tva-europeen.html

D'accord merci beaucoup, effectivement j'ai déjà ce qu'il faut pour l'attribution des clients à un groupe en fonction du pays et du numéro du TVA donc le module conviendrait parfaitement. Je prends bien notes des deux autres qui tu me recommandes si jamais j'ai besoin de quelque chose de plus poussé à l'avenir.

Link to comment
Share on other sites

Il y a 1 heure, MeoDelta a dit :

D'après la description le module semble permettre l'ajout de la TVA mais est-ce qu'il permet aussi de gérer le fait que les taxes soient facturées ou non pour les professionnels qui l'aurait renseigné ? Je ne vois rien à ce propos à première vu.

C'était le module officiel Prestashop qui permettait de retirer la TVA des clients ayant un n° de tva intracommunautaire renseigné.

pas besoin de groupe ou autre il gère cela sur la base du n° de tva intra communautaire et donc en accord avec les règles européennes.

Link to comment
Share on other sites

  • 2 years later...
Posted (edited)

Bonjour,

Pour Prestashop 1.7, il faut surcharger les classes TaxRulesTaxManagerCore et CartCore.

1) Créer le fichier /override/classes/tax/TaxRulesTaxManager.php (ou créer un module dédié) et ajouter le code suivant :

class TaxRulesTaxManager extends TaxRulesTaxManagerCore
{
	public function getTaxCalculator()
	{
		if ($this->address->id_country != Configuration::get('PS_COUNTRY_DEFAULT')) {
			$vatNumber = $this->address->vat_number;

			if (empty($vatNumber)) {
				$id_customer = $this->address->id_customer;
				
				$context = Context::getContext();
				
				if (isset($context->cart)) {
					$billingAddress = new Address((int)$context->cart->id_address_invoice);
					
					if  ($billingAddress->id_country != Configuration::get('PS_COUNTRY_DEFAULT')) {
						$vatNumber = $billingAddress->vat_number;
					}
				}
			}

			if (!empty($vatNumber) && preg_match('/^[A-Z]{2}[A-Z0-9]{2,14}$/', $vatNumber)) 
				return new TaxCalculator(array());
		}
		
		return parent::getTaxCalculator();
	}	
}

La vérification du numéro de TVA intracommunautaire repose sur un REGEX sommaire.

Vérifier le numéro de TVA à l'aide du service VIES avec la fonction suivante (fonction  à exécuter de façon asynchrone en raison du temps de latence élevé du service VIES) :

private function isVATValid($countryCode, $vatNumber) {
        $url = "http://ec.europa.eu/taxation_customs/vies/services/checkVatService";

        $xmlRequest = '<?xml version="1.0" encoding="UTF-8"?>
                        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
                            <SOAP-ENV:Body>
                                <ns1:checkVat>
                                    <ns1:countryCode>'.$countryCode.'</ns1:countryCode>
                                    <ns1:vatNumber>'.$vatNumber.'</ns1:vatNumber>
                                </ns1:checkVat>
                            </SOAP-ENV:Body>
                        </SOAP-ENV:Envelope>';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));

        $response = curl_exec($ch);
        curl_close($ch);

        $xmlResponse = simplexml_load_string($response);

        $valid = (string)$xmlResponse->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children()->checkVatResponse->valid;

        return ($valid === 'true');
    }

2) Créer le fichier /override/classes/Cart.php (ou créer un module dédié) et ajouter le code suivant :

class Cart extends CartCore
{
    public function getOrderTotal($withTaxes = true, $type = Cart::BOTH, $products = null, $id_carrier = null, $use_cache = true, $keepOrderPrices = false)
    {
        $address_delivery = new Address((int)$this->id_address_delivery);
        if ($address_delivery->id_country != Configuration::get('PS_COUNTRY_DEFAULT')) {
            $vatNumber = $address_delivery->vat_number;

            if (empty($vatNumber)) {
                $address_invoice = new Address((int)$this->id_address_invoice);
                if ($address_invoice->id_country != Configuration::get('PS_COUNTRY_DEFAULT')) {
                    $vatNumber = $address_invoice->vat_number;
                }
            }
            
            // Ajouter une vérification supplémentaire avec isVATValid()
            if (!empty($vatNumber) && preg_match('/^[A-Z]{2}[A-Z0-9]{2,14}$/', $vatNumber)) {
                $withTaxes = false;
            }
        }

        return parent::getOrderTotal($withTaxes, $type, $products, $id_carrier, $use_cache, $keepOrderPrices);
    }
}

 

Edited by ynocquet (see edit history)
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...