Jump to content

TVA transporteur differente si tva produit different


Recommended Posts

Bonjour,

Je suis sous prestashop 8.05.

Mon comptable me demande la chose suivante :

 

La tva sur les frais de port doit être la même que sur les produits, ainsi sur des épices à 5.5 % la tva des frais de port doit être à 5.5% 

Sur des produits à 20% la tva sur les frais de port doit être à 20%

Mais si dans une même commande il y a des produits à 20% et des produits à 5.5%, la tva sur les frais de port doit être au prorata.

 

Y aurait-il un module pour faire cela ?

Ets-ce que nativement prestashop le fait ? si oui comment le parametrer ?

Si ni l'un ni l'autre, dois-je faire appel a un Dev ou je peux faire des scripts moi meme avec votre aide ?

 

Merci 

Link to comment
Share on other sites

  • 2 weeks later...
  • 5 months later...
  • 2 weeks later...
On 9/27/2023 at 9:58 PM, brouzeng pascal said:

Bonjour,

Je suis sous prestashop 8.05.

Mon comptable me demande la chose suivante :

 

La tva sur les frais de port doit être la même que sur les produits, ainsi sur des épices à 5.5 % la tva des frais de port doit être à 5.5% 

Sur des produits à 20% la tva sur les frais de port doit être à 20%

Mais si dans une même commande il y a des produits à 20% et des produits à 5.5%, la tva sur les frais de port doit être au prorata.

 

Y aurait-il un module pour faire cela ?

Ets-ce que nativement prestashop le fait ? si oui comment le parametrer ?

Si ni l'un ni l'autre, dois-je faire appel a un Dev ou je peux faire des scripts moi meme avec votre aide ?

 

Merci 

Si jamais quelqu'un chercherait à faire la même chose, voici ce que j'ai mis en place. C'est un peu différent de la demande initiale, voici le comportement:

  • si le panier contient des produits à 5.5%, n'affiche que les transporteurs avec une taxe à 5.5%
  • si le panier contient des produits à 5.5%, n'affiche que les transporteurs avec une taxe à 20%
  • si le panier contient des produits à 5.5% et 20%, affiche les transporteurs avec la taxe la plus élevée (donc 20%)
// override/classes/checkout/DeliveryOptionsFinder.php
<?php

class DeliveryOptionsFinder extends DeliveryOptionsFinderCore
{
    public function getDeliveryOptions()
    {
        $carriers_available = parent::getDeliveryOptions();
        Hook::exec('actionFilterCarrierList', ['carriers_available' => &$carriers_available]);
        return $carriers_available;
    }
}
public function hookActionFilterCarrierList($params)
{
	/** @var Cart $cart */
	$cart = $params['cart'];
	$tax = array_reduce($cart->getProducts(), static function ($carry, array $product) {
		return max((float)$product['rate'], $carry);
	}, 0.0);

	$params['carriers_available'] = array_filter($params['carriers_available'], static function (array $carrier) use ($tax) {
		return Tax::getCarrierTaxRate($carrier['id']) === $tax;
	});
}

Dans mon cas j'ai un module custom donc j'ai rajouté un hook dans le `DeliveryOptionsFinder` mais la logique dans la fonction `hookActionFilterCarrierList` peut être directement intégrée dans la classe `DeliveryOptionsFinder` de cette manière

// classes/checkout/DeliveryOptionsFinder.php
// ...
public function getDeliveryOptions()
{
	// ...
	$tax = array_reduce($this->context->cart->getProducts(), static function ($carry, array $product) {
		return max((float)$product['rate'], $carry);
	}

	$carriers_available = array_filter($carriers_available, static function (array $carrier) use ($tax) {
		return Tax::getCarrierTaxRate($carrier['id']) === $tax;
	});

	return $carriers_available;
}

 

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...